Token Fantom Underground
Overview ERC-721
Total Supply:
7,539 FUGLY
Holders:
950 addresses
Contract:
Balance
9 FUGLY
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FantomUnderground
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-06-21 */ //SPDX-License-Identifier: Unlicense pragma solidity ^0.8.4; // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File contracts/FantomUnderground.sol struct Nominee { uint128 id; uint128 votes; string name; string metadataUrl; } contract FantomUnderground is ERC721Enumerable, Ownable { using Counters for Counters.Counter; event VoteReceived(uint season, string category, uint128 nomineeId); Counters.Counter _tokenIds; Counters.Counter _currentSeason; bool public votingIsOpen; mapping (uint => string) metadataUrlByTokenId; mapping(uint => mapping(string => Nominee[])) public nomineesBySeasonAndCategory; // => season => category => nominees mapping(uint => string[]) public categoriesBySeason; mapping(uint => mapping(address => mapping(string => bool))) public voterCategoriesVotedForBySeason; // season => voter => category => has voted constructor() ERC721("Fantom Underground", "FUGLY") {} function currentSeason() public view returns (uint) { return _currentSeason.current(); } function thisSeasonsCategories() public view returns (string[] memory) { return categoriesBySeason[_currentSeason.current()]; } function thisSeasonsNomineesForCategory(string calldata category) public view returns (Nominee[] memory) { return nomineesBySeasonAndCategory[_currentSeason.current()][category]; } function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return metadataUrlByTokenId[tokenId]; } function vote(string calldata category, uint nomineeId) public { require(votingIsOpen, "Voting is not open"); uint season = _currentSeason.current(); require(voterCategoriesVotedForBySeason[season][msg.sender][category] == false, "You already voted for this category"); voterCategoriesVotedForBySeason[season][msg.sender][category] = true; nomineesBySeasonAndCategory[season][category][nomineeId].votes++; _tokenIds.increment(); uint tokenId = _tokenIds.current(); // this isn't super efficient, but the alternative is 2 lookup tables metadataUrlByTokenId[tokenId] = nomineesBySeasonAndCategory[season][category][nomineeId].metadataUrl; _safeMint(msg.sender, tokenId); emit VoteReceived(season, category, uint128(nomineeId)); } function startNextSeason() external onlyOwner { _currentSeason.increment(); } function addCategory(string calldata category) external onlyOwner { uint thisSeason = _currentSeason.current(); categoriesBySeason[thisSeason].push(category); } function addCategories(string[] memory categories) external onlyOwner { uint thisSeason = _currentSeason.current(); for(uint i = 0; i < categories.length; i++) { categoriesBySeason[thisSeason].push(categories[i]); } } function addNomineeToCategory(string calldata category, string calldata name, string calldata metadataUrl) external onlyOwner { uint thisSeason = _currentSeason.current(); uint nextNomineeId = nomineesBySeasonAndCategory[thisSeason][category].length; nomineesBySeasonAndCategory[thisSeason][category].push(Nominee(uint128(nextNomineeId), 0, name, metadataUrl)); } function addNomineesToCategory(string calldata category, string[] memory names, string[] memory metadataUrls) external onlyOwner { require(names.length == metadataUrls.length, "Names and metadataUrls must be the same length"); uint thisSeason = _currentSeason.current(); for(uint i = 0; i < names.length; i++) { uint nextNomineeId = nomineesBySeasonAndCategory[thisSeason][category].length; nomineesBySeasonAndCategory[thisSeason][category].push(Nominee(uint128(nextNomineeId), 0, names[i], metadataUrls[i])); } } function setVotingIsOpen(bool isOpen) external onlyOwner { votingIsOpen = isOpen; } }
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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"season","type":"uint256"},{"indexed":false,"internalType":"string","name":"category","type":"string"},{"indexed":false,"internalType":"uint128","name":"nomineeId","type":"uint128"}],"name":"VoteReceived","type":"event"},{"inputs":[{"internalType":"string[]","name":"categories","type":"string[]"}],"name":"addCategories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"category","type":"string"}],"name":"addCategory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"category","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"metadataUrl","type":"string"}],"name":"addNomineeToCategory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"category","type":"string"},{"internalType":"string[]","name":"names","type":"string[]"},{"internalType":"string[]","name":"metadataUrls","type":"string[]"}],"name":"addNomineesToCategory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"categoriesBySeason","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSeason","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"string","name":"","type":"string"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"nomineesBySeasonAndCategory","outputs":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint128","name":"votes","type":"uint128"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"metadataUrl","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isOpen","type":"bool"}],"name":"setVotingIsOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startNextSeason","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":[],"name":"thisSeasonsCategories","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"category","type":"string"}],"name":"thisSeasonsNomineesForCategory","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint128","name":"votes","type":"uint128"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"metadataUrl","type":"string"}],"internalType":"struct Nominee[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"category","type":"string"},{"internalType":"uint256","name":"nomineeId","type":"uint256"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"string","name":"","type":"string"}],"name":"voterCategoriesVotedForBySeason","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingIsOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280601281526020017f46616e746f6d20556e64657267726f756e6400000000000000000000000000008152506040518060400160405280600581526020017f4655474c59000000000000000000000000000000000000000000000000000000815250816000908051906020019062000096929190620001a6565b508060019080519060200190620000af929190620001a6565b505050620000d2620000c6620000d860201b60201c565b620000e060201b60201c565b620002bb565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001b49062000256565b90600052602060002090601f016020900481019282620001d8576000855562000224565b82601f10620001f357805160ff191683800117855562000224565b8280016001018555821562000224579182015b828111156200022357825182559160200191906001019062000206565b5b50905062000233919062000237565b5090565b5b808211156200025257600081600090555060010162000238565b5090565b600060028204905060018216806200026f57607f821691505b602082108114156200028657620002856200028c565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61523f80620002cb6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806365daf0861161011a578063a22cb465116100ad578063bcb396211161007c578063bcb39621146105ac578063c87b56dd146105ca578063e985e9c5146105fa578063ecfdd6ae1461062a578063f2fde38b1461065d576101fb565b8063a22cb46514610528578063a638580314610544578063b88d4fde14610560578063b93168841461057c576101fb565b806380df2af4116100e957806380df2af4146104b45780638da5cb5b146104d057806395d89b41146104ee5780639d29c2501461050c576101fb565b806365daf08614610454578063676e12d41461047057806370a082311461047a578063715018a6146104aa576101fb565b80632e0dcbf7116101925780633e4ed3d1116101615780633e4ed3d1146103ba57806342842e0e146103d85780634f6ccce7146103f45780636352211e14610424576101fb565b80632e0dcbf7146103225780632f745c591461033e578063331e424e1461036e57806338b4e0fa1461039e576101fb565b8063130f25c9116101ce578063130f25c91461029a57806318160ddd146102b857806323b872dd146102d657806323c8aa3b146102f2576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a60048036038101906102159190613a44565b610679565b604051610227919061440d565b60405180910390f35b6102386106f3565b6040516102459190614428565b60405180910390f35b61026860048036038101906102639190613c73565b610785565b6040516102759190614362565b60405180910390f35b6102986004803603810190610293919061399e565b61080a565b005b6102a2610922565b6040516102af91906143c9565b60405180910390f35b6102c0610a15565b6040516102cd919061473d565b60405180910390f35b6102f060048036038101906102eb9190613898565b610a22565b005b61030c60048036038101906103079190613d6a565b610a82565b6040516103199190614428565b60405180910390f35b61033c60048036038101906103379190613a96565b610b3b565b005b6103586004803603810190610353919061399e565b610c19565b604051610365919061473d565b60405180910390f35b61038860048036038101906103839190613c9c565b610cbe565b604051610395919061440d565b60405180910390f35b6103b860048036038101906103b391906139da565b610d10565b005b6103c2610e4b565b6040516103cf919061440d565b60405180910390f35b6103f260048036038101906103ed9190613898565b610e5e565b005b61040e60048036038101906104099190613c73565b610e7e565b60405161041b919061473d565b60405180910390f35b61043e60048036038101906104399190613c73565b610f15565b60405161044b9190614362565b60405180910390f35b61046e60048036038101906104699190613b77565b610fc7565b005b610478611276565b005b610494600480360381019061048f9190613833565b6112fe565b6040516104a1919061473d565b60405180910390f35b6104b26113b6565b005b6104ce60048036038101906104c99190613a1b565b61143e565b005b6104d86114d7565b6040516104e59190614362565b60405180910390f35b6104f6611501565b6040516105039190614428565b60405180910390f35b61052660048036038101906105219190613adb565b611593565b005b610542600480360381019061053d9190613962565b61189c565b005b61055e60048036038101906105599190613c1b565b6118b2565b005b61057a600480360381019061057591906138e7565b611c40565b005b61059660048036038101906105919190613a96565b611ca2565b6040516105a391906143eb565b60405180910390f35b6105b4611ef4565b6040516105c1919061473d565b60405180910390f35b6105e460048036038101906105df9190613c73565b611f05565b6040516105f19190614428565b60405180910390f35b610614600480360381019061060f919061385c565b611ff2565b604051610621919061440d565b60405180910390f35b610644600480360381019061063f9190613d03565b612086565b60405161065494939291906146ea565b60405180910390f35b61067760048036038101906106729190613833565b61223e565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ec57506106eb82612336565b5b9050919050565b60606000805461070290614a6d565b80601f016020809104026020016040519081016040528092919081815260200182805461072e90614a6d565b801561077b5780601f106107505761010080835404028352916020019161077b565b820191906000526020600020905b81548152906001019060200180831161075e57829003601f168201915b5050505050905090565b600061079082612418565b6107cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107c69061462a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081582610f15565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087d9061468a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108a5612484565b73ffffffffffffffffffffffffffffffffffffffff1614806108d457506108d3816108ce612484565b611ff2565b5b610913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090a906145aa565b60405180910390fd5b61091d838361248c565b505050565b606060106000610932600c612545565b8152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b82821015610a0c57838290600052602060002001805461097f90614a6d565b80601f01602080910402602001604051908101604052809291908181526020018280546109ab90614a6d565b80156109f85780601f106109cd576101008083540402835291602001916109f8565b820191906000526020600020905b8154815290600101906020018083116109db57829003601f168201915b505050505081526020019060010190610960565b50505050905090565b6000600880549050905090565b610a33610a2d612484565b82612553565b610a72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a69906146aa565b60405180910390fd5b610a7d838383612631565b505050565b60106020528160005260406000208181548110610a9e57600080fd5b90600052602060002001600091509150508054610aba90614a6d565b80601f0160208091040260200160405190810160405280929190818152602001828054610ae690614a6d565b8015610b335780601f10610b0857610100808354040283529160200191610b33565b820191906000526020600020905b815481529060010190602001808311610b1657829003601f168201915b505050505081565b610b43612484565b73ffffffffffffffffffffffffffffffffffffffff16610b616114d7565b73ffffffffffffffffffffffffffffffffffffffff1614610bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bae9061464a565b60405180910390fd5b6000610bc3600c612545565b905060106000828152602001908152602001600020838390918060018154018082558091505060019003906000526020600020016000909192909192909192909192509190610c1392919061344a565b50505050565b6000610c24836112fe565b8210610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c9061444a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b601160205282600052604060002060205281600052604060002081805160208101820180518482526020830160208501208183528095505050505050600092509250509054906101000a900460ff1681565b610d18612484565b73ffffffffffffffffffffffffffffffffffffffff16610d366114d7565b73ffffffffffffffffffffffffffffffffffffffff1614610d8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d839061464a565b60405180910390fd5b6000610d98600c612545565b905060005b8251811015610e465760106000838152602001908152602001600020838281518110610df2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610e329291906134d0565b508080610e3e90614b09565b915050610d9d565b505050565b600d60009054906101000a900460ff1681565b610e7983838360405180602001604052806000815250611c40565b505050565b6000610e88610a15565b8210610ec9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec0906146ca565b60405180910390fd5b60088281548110610f03577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb5906145ea565b60405180910390fd5b80915050919050565b610fcf612484565b73ffffffffffffffffffffffffffffffffffffffff16610fed6114d7565b73ffffffffffffffffffffffffffffffffffffffff1614611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a9061464a565b60405180910390fd5b600061104f600c612545565b90506000600f60008381526020019081526020016000208888604051611076929190614349565b9081526020016040518091039020805490509050600f600083815260200190815260200160002088886040516110ad929190614349565b90815260200160405180910390206040518060800160405280836fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200188888080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550604082015181600101908051906020019061124c9291906134d0565b5060608201518160020190805190602001906112699291906134d0565b5050505050505050505050565b61127e612484565b73ffffffffffffffffffffffffffffffffffffffff1661129c6114d7565b73ffffffffffffffffffffffffffffffffffffffff16146112f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e99061464a565b60405180910390fd5b6112fc600c612898565b565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561136f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611366906145ca565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6113be612484565b73ffffffffffffffffffffffffffffffffffffffff166113dc6114d7565b73ffffffffffffffffffffffffffffffffffffffff1614611432576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114299061464a565b60405180910390fd5b61143c60006128ae565b565b611446612484565b73ffffffffffffffffffffffffffffffffffffffff166114646114d7565b73ffffffffffffffffffffffffffffffffffffffff16146114ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b19061464a565b60405180910390fd5b80600d60006101000a81548160ff02191690831515021790555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461151090614a6d565b80601f016020809104026020016040519081016040528092919081815260200182805461153c90614a6d565b80156115895780601f1061155e57610100808354040283529160200191611589565b820191906000526020600020905b81548152906001019060200180831161156c57829003601f168201915b5050505050905090565b61159b612484565b73ffffffffffffffffffffffffffffffffffffffff166115b96114d7565b73ffffffffffffffffffffffffffffffffffffffff161461160f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116069061464a565b60405180910390fd5b8051825114611653576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164a906144ea565b60405180910390fd5b600061165f600c612545565b905060005b8351811015611894576000600f60008481526020019081526020016000208787604051611692929190614349565b9081526020016040518091039020805490509050600f600084815260200190815260200160002087876040516116c9929190614349565b90815260200160405180910390206040518060800160405280836fffffffffffffffffffffffffffffffff16815260200160006fffffffffffffffffffffffffffffffff16815260200187858151811061174c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001868581518110611792577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815250908060018154018082558091505060019003906000526020600020906003020160009091909190915060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060408201518160010190805190602001906118609291906134d0565b50606082015181600201908051906020019061187d9291906134d0565b50505050808061188c90614b09565b915050611664565b505050505050565b6118ae6118a7612484565b8383612974565b5050565b600d60009054906101000a900460ff16611901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f89061454a565b60405180910390fd5b600061190d600c612545565b9050600015156011600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208585604051611973929190614349565b908152602001604051809103902060009054906101000a900460ff161515146119d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c89061458a565b60405180910390fd5b60016011600083815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208585604051611a33929190614349565b908152602001604051809103902060006101000a81548160ff021916908315150217905550600f60008281526020019081526020016000208484604051611a7b929190614349565b90815260200160405180910390208281548110611ac1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600001601081819054906101000a90046fffffffffffffffffffffffffffffffff1680929190611afe90614ad0565b91906101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050611b3f600b612898565b6000611b4b600b612545565b9050600f60008381526020019081526020016000208585604051611b70929190614349565b90815260200160405180910390208381548110611bb6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060030201600201600e6000838152602001908152602001600020908054611be690614a6d565b611bf1929190613556565b50611bfc3382612ae1565b7f02e44b6abca84c55157ac6799da0ee150bc85f47078a3f62f6e45ceb9dd8cbda82868686604051611c319493929190614758565b60405180910390a15050505050565b611c51611c4b612484565b83612553565b611c90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c87906146aa565b60405180910390fd5b611c9c84848484612aff565b50505050565b6060600f6000611cb2600c612545565b81526020019081526020016000208383604051611cd0929190614349565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015611ee857838290600052602060002090600302016040518060800160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001600182018054611dc590614a6d565b80601f0160208091040260200160405190810160405280929190818152602001828054611df190614a6d565b8015611e3e5780601f10611e1357610100808354040283529160200191611e3e565b820191906000526020600020905b815481529060010190602001808311611e2157829003601f168201915b50505050508152602001600282018054611e5790614a6d565b80601f0160208091040260200160405190810160405280929190818152602001828054611e8390614a6d565b8015611ed05780601f10611ea557610100808354040283529160200191611ed0565b820191906000526020600020905b815481529060010190602001808311611eb357829003601f168201915b50505050508152505081526020019060010190611cfe565b50505050905092915050565b6000611f00600c612545565b905090565b6060611f1082612418565b611f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f469061466a565b60405180910390fd5b600e60008381526020019081526020016000208054611f6d90614a6d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f9990614a6d565b8015611fe65780601f10611fbb57610100808354040283529160200191611fe6565b820191906000526020600020905b815481529060010190602001808311611fc957829003601f168201915b50505050509050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600f6020528260005260406000208280516020810182018051848252602083016020850120818352809550505050505081815481106120c457600080fd5b906000526020600020906003020160009250925050508060000160009054906101000a90046fffffffffffffffffffffffffffffffff16908060000160109054906101000a90046fffffffffffffffffffffffffffffffff169080600101805461212d90614a6d565b80601f016020809104026020016040519081016040528092919081815260200182805461215990614a6d565b80156121a65780601f1061217b576101008083540402835291602001916121a6565b820191906000526020600020905b81548152906001019060200180831161218957829003601f168201915b5050505050908060020180546121bb90614a6d565b80601f01602080910402602001604051908101604052809291908181526020018280546121e790614a6d565b80156122345780601f1061220957610100808354040283529160200191612234565b820191906000526020600020905b81548152906001019060200180831161221757829003601f168201915b5050505050905084565b612246612484565b73ffffffffffffffffffffffffffffffffffffffff166122646114d7565b73ffffffffffffffffffffffffffffffffffffffff16146122ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b19061464a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561232a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123219061448a565b60405180910390fd5b612333816128ae565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061240157507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612411575061241082612b5b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166124ff83610f15565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b600061255e82612418565b61259d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125949061456a565b60405180910390fd5b60006125a883610f15565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061261757508373ffffffffffffffffffffffffffffffffffffffff166125ff84610785565b73ffffffffffffffffffffffffffffffffffffffff16145b8061262857506126278185611ff2565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661265182610f15565b73ffffffffffffffffffffffffffffffffffffffff16146126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269e906144aa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270e9061450a565b60405180910390fd5b612722838383612bc5565b61272d60008261248c565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461277d9190614967565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127d49190614911565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612893838383612cd9565b505050565b6001816000016000828254019250508190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129da9061452a565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612ad4919061440d565b60405180910390a3505050565b612afb828260405180602001604052806000815250612cde565b5050565b612b0a848484612631565b612b1684848484612d39565b612b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4c9061446a565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612bd0838383612ed0565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c1357612c0e81612ed5565b612c52565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c5157612c508382612f1e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9557612c908161308b565b612cd4565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cd357612cd282826131ce565b5b5b505050565b505050565b612ce8838361324d565b612cf56000848484612d39565b612d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d2b9061446a565b60405180910390fd5b505050565b6000612d5a8473ffffffffffffffffffffffffffffffffffffffff16613427565b15612ec3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d83612484565b8786866040518563ffffffff1660e01b8152600401612da5949392919061437d565b602060405180830381600087803b158015612dbf57600080fd5b505af1925050508015612df057506040513d601f19601f82011682018060405250810190612ded9190613a6d565b60015b612e73573d8060008114612e20576040519150601f19603f3d011682016040523d82523d6000602084013e612e25565b606091505b50600081511415612e6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e629061446a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ec8565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612f2b846112fe565b612f359190614967565b905060006007600084815260200190815260200160002054905081811461301a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061309f9190614967565b90506000600960008481526020019081526020016000205490506000600883815481106130f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061313d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806131b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006131d9836112fe565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132b49061460a565b60405180910390fd5b6132c681612418565b15613306576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132fd906144ca565b60405180910390fd5b61331260008383612bc5565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133629190614911565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461342360008383612cd9565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b82805461345690614a6d565b90600052602060002090601f01602090048101928261347857600085556134bf565b82601f1061349157803560ff19168380011785556134bf565b828001600101855582156134bf579182015b828111156134be5782358255916020019190600101906134a3565b5b5090506134cc91906135e3565b5090565b8280546134dc90614a6d565b90600052602060002090601f0160209004810192826134fe5760008555613545565b82601f1061351757805160ff1916838001178555613545565b82800160010185558215613545579182015b82811115613544578251825591602001919060010190613529565b5b50905061355291906135e3565b5090565b82805461356290614a6d565b90600052602060002090601f01602090048101928261358457600085556135d2565b82601f1061359557805485556135d2565b828001600101855582156135d257600052602060002091601f016020900482015b828111156135d15782548255916001019190600101906135b6565b5b5090506135df91906135e3565b5090565b5b808211156135fc5760008160009055506001016135e4565b5090565b600061361361360e846147bd565b614798565b9050808382526020820190508285602086028201111561363257600080fd5b60005b8581101561367c57813567ffffffffffffffff81111561365457600080fd5b80860161366189826137f4565b85526020850194506020840193505050600181019050613635565b5050509392505050565b6000613699613694846147e9565b614798565b9050828152602081018484840111156136b157600080fd5b6136bc848285614a2b565b509392505050565b60006136d76136d28461481a565b614798565b9050828152602081018484840111156136ef57600080fd5b6136fa848285614a2b565b509392505050565b600081359050613711816151ad565b92915050565b600082601f83011261372857600080fd5b8135613738848260208601613600565b91505092915050565b600081359050613750816151c4565b92915050565b600081359050613765816151db565b92915050565b60008151905061377a816151db565b92915050565b600082601f83011261379157600080fd5b81356137a1848260208601613686565b91505092915050565b60008083601f8401126137bc57600080fd5b8235905067ffffffffffffffff8111156137d557600080fd5b6020830191508360018202830111156137ed57600080fd5b9250929050565b600082601f83011261380557600080fd5b81356138158482602086016136c4565b91505092915050565b60008135905061382d816151f2565b92915050565b60006020828403121561384557600080fd5b600061385384828501613702565b91505092915050565b6000806040838503121561386f57600080fd5b600061387d85828601613702565b925050602061388e85828601613702565b9150509250929050565b6000806000606084860312156138ad57600080fd5b60006138bb86828701613702565b93505060206138cc86828701613702565b92505060406138dd8682870161381e565b9150509250925092565b600080600080608085870312156138fd57600080fd5b600061390b87828801613702565b945050602061391c87828801613702565b935050604061392d8782880161381e565b925050606085013567ffffffffffffffff81111561394a57600080fd5b61395687828801613780565b91505092959194509250565b6000806040838503121561397557600080fd5b600061398385828601613702565b925050602061399485828601613741565b9150509250929050565b600080604083850312156139b157600080fd5b60006139bf85828601613702565b92505060206139d08582860161381e565b9150509250929050565b6000602082840312156139ec57600080fd5b600082013567ffffffffffffffff811115613a0657600080fd5b613a1284828501613717565b91505092915050565b600060208284031215613a2d57600080fd5b6000613a3b84828501613741565b91505092915050565b600060208284031215613a5657600080fd5b6000613a6484828501613756565b91505092915050565b600060208284031215613a7f57600080fd5b6000613a8d8482850161376b565b91505092915050565b60008060208385031215613aa957600080fd5b600083013567ffffffffffffffff811115613ac357600080fd5b613acf858286016137aa565b92509250509250929050565b60008060008060608587031215613af157600080fd5b600085013567ffffffffffffffff811115613b0b57600080fd5b613b17878288016137aa565b9450945050602085013567ffffffffffffffff811115613b3657600080fd5b613b4287828801613717565b925050604085013567ffffffffffffffff811115613b5f57600080fd5b613b6b87828801613717565b91505092959194509250565b60008060008060008060608789031215613b9057600080fd5b600087013567ffffffffffffffff811115613baa57600080fd5b613bb689828a016137aa565b9650965050602087013567ffffffffffffffff811115613bd557600080fd5b613be189828a016137aa565b9450945050604087013567ffffffffffffffff811115613c0057600080fd5b613c0c89828a016137aa565b92509250509295509295509295565b600080600060408486031215613c3057600080fd5b600084013567ffffffffffffffff811115613c4a57600080fd5b613c56868287016137aa565b93509350506020613c698682870161381e565b9150509250925092565b600060208284031215613c8557600080fd5b6000613c938482850161381e565b91505092915050565b600080600060608486031215613cb157600080fd5b6000613cbf8682870161381e565b9350506020613cd086828701613702565b925050604084013567ffffffffffffffff811115613ced57600080fd5b613cf9868287016137f4565b9150509250925092565b600080600060608486031215613d1857600080fd5b6000613d268682870161381e565b935050602084013567ffffffffffffffff811115613d4357600080fd5b613d4f868287016137f4565b9250506040613d608682870161381e565b9150509250925092565b60008060408385031215613d7d57600080fd5b6000613d8b8582860161381e565b9250506020613d9c8582860161381e565b9150509250929050565b6000613db28383613f61565b905092915050565b6000613dc683836142b2565b905092915050565b613dd78161499b565b82525050565b6000613de88261486b565b613df281856148b1565b935083602082028501613e048561484b565b8060005b85811015613e405784840389528151613e218582613da6565b9450613e2c83614897565b925060208a01995050600181019050613e08565b50829750879550505050505092915050565b6000613e5d82614876565b613e6781856148c2565b935083602082028501613e798561485b565b8060005b85811015613eb55784840389528151613e968582613dba565b9450613ea1836148a4565b925060208a01995050600181019050613e7d565b50829750879550505050505092915050565b613ed0816149ad565b82525050565b6000613ee182614881565b613eeb81856148d3565b9350613efb818560208601614a3a565b613f0481614bdf565b840191505092915050565b6000613f1b83856148f5565b9350613f28838584614a2b565b613f3183614bdf565b840190509392505050565b6000613f488385614906565b9350613f55838584614a2b565b82840190509392505050565b6000613f6c8261488c565b613f7681856148e4565b9350613f86818560208601614a3a565b613f8f81614bdf565b840191505092915050565b6000613fa58261488c565b613faf81856148f5565b9350613fbf818560208601614a3a565b613fc881614bdf565b840191505092915050565b6000613fe0602b836148f5565b9150613feb82614bf0565b604082019050919050565b60006140036032836148f5565b915061400e82614c3f565b604082019050919050565b60006140266026836148f5565b915061403182614c8e565b604082019050919050565b60006140496025836148f5565b915061405482614cdd565b604082019050919050565b600061406c601c836148f5565b915061407782614d2c565b602082019050919050565b600061408f602e836148f5565b915061409a82614d55565b604082019050919050565b60006140b26024836148f5565b91506140bd82614da4565b604082019050919050565b60006140d56019836148f5565b91506140e082614df3565b602082019050919050565b60006140f86012836148f5565b915061410382614e1c565b602082019050919050565b600061411b602c836148f5565b915061412682614e45565b604082019050919050565b600061413e6023836148f5565b915061414982614e94565b604082019050919050565b60006141616038836148f5565b915061416c82614ee3565b604082019050919050565b6000614184602a836148f5565b915061418f82614f32565b604082019050919050565b60006141a76029836148f5565b91506141b282614f81565b604082019050919050565b60006141ca6020836148f5565b91506141d582614fd0565b602082019050919050565b60006141ed602c836148f5565b91506141f882614ff9565b604082019050919050565b60006142106020836148f5565b915061421b82615048565b602082019050919050565b6000614233602f836148f5565b915061423e82615071565b604082019050919050565b60006142566021836148f5565b9150614261826150c0565b604082019050919050565b60006142796031836148f5565b91506142848261510f565b604082019050919050565b600061429c602c836148f5565b91506142a78261515e565b604082019050919050565b60006080830160008301516142ca600086018261431c565b5060208301516142dd602086018261431c565b50604083015184820360408601526142f58282613f61565b9150506060830151848203606086015261430f8282613f61565b9150508091505092915050565b614325816149e5565b82525050565b614334816149e5565b82525050565b61434381614a21565b82525050565b6000614356828486613f3c565b91508190509392505050565b60006020820190506143776000830184613dce565b92915050565b60006080820190506143926000830187613dce565b61439f6020830186613dce565b6143ac604083018561433a565b81810360608301526143be8184613ed6565b905095945050505050565b600060208201905081810360008301526143e38184613ddd565b905092915050565b600060208201905081810360008301526144058184613e52565b905092915050565b60006020820190506144226000830184613ec7565b92915050565b600060208201905081810360008301526144428184613f9a565b905092915050565b6000602082019050818103600083015261446381613fd3565b9050919050565b6000602082019050818103600083015261448381613ff6565b9050919050565b600060208201905081810360008301526144a381614019565b9050919050565b600060208201905081810360008301526144c38161403c565b9050919050565b600060208201905081810360008301526144e38161405f565b9050919050565b6000602082019050818103600083015261450381614082565b9050919050565b60006020820190508181036000830152614523816140a5565b9050919050565b60006020820190508181036000830152614543816140c8565b9050919050565b60006020820190508181036000830152614563816140eb565b9050919050565b600060208201905081810360008301526145838161410e565b9050919050565b600060208201905081810360008301526145a381614131565b9050919050565b600060208201905081810360008301526145c381614154565b9050919050565b600060208201905081810360008301526145e381614177565b9050919050565b600060208201905081810360008301526146038161419a565b9050919050565b60006020820190508181036000830152614623816141bd565b9050919050565b60006020820190508181036000830152614643816141e0565b9050919050565b6000602082019050818103600083015261466381614203565b9050919050565b6000602082019050818103600083015261468381614226565b9050919050565b600060208201905081810360008301526146a381614249565b9050919050565b600060208201905081810360008301526146c38161426c565b9050919050565b600060208201905081810360008301526146e38161428f565b9050919050565b60006080820190506146ff600083018761432b565b61470c602083018661432b565b818103604083015261471e8185613f9a565b905081810360608301526147328184613f9a565b905095945050505050565b6000602082019050614752600083018461433a565b92915050565b600060608201905061476d600083018761433a565b8181036020830152614780818587613f0f565b905061478f604083018461432b565b95945050505050565b60006147a26147b3565b90506147ae8282614a9f565b919050565b6000604051905090565b600067ffffffffffffffff8211156147d8576147d7614bb0565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561480457614803614bb0565b5b61480d82614bdf565b9050602081019050919050565b600067ffffffffffffffff82111561483557614834614bb0565b5b61483e82614bdf565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061491c82614a21565b915061492783614a21565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561495c5761495b614b52565b5b828201905092915050565b600061497282614a21565b915061497d83614a21565b9250828210156149905761498f614b52565b5b828203905092915050565b60006149a682614a01565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a58578082015181840152602081019050614a3d565b83811115614a67576000848401525b50505050565b60006002820490506001821680614a8557607f821691505b60208210811415614a9957614a98614b81565b5b50919050565b614aa882614bdf565b810181811067ffffffffffffffff82111715614ac757614ac6614bb0565b5b80604052505050565b6000614adb826149e5565b91506fffffffffffffffffffffffffffffffff821415614afe57614afd614b52565b5b600182019050919050565b6000614b1482614a21565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b4757614b46614b52565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e616d657320616e64206d6574616461746155726c73206d757374206265207460008201527f68652073616d65206c656e677468000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f566f74696e67206973206e6f74206f70656e0000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f596f7520616c726561647920766f74656420666f72207468697320636174656760008201527f6f72790000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6151b68161499b565b81146151c157600080fd5b50565b6151cd816149ad565b81146151d857600080fd5b50565b6151e4816149b9565b81146151ef57600080fd5b50565b6151fb81614a21565b811461520657600080fd5b5056fea2646970667358221220fac763c8e46c96ae81c2eacb4e2a6d3585aa354e86e73c6ac3ec0e48bea8e33564736f6c63430008040033
Deployed ByteCode Sourcemap
46931:3928:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36668:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22442:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24001:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23524:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47784:141;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37308:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24751:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47400:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49305:183;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36976:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47458:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49496:262;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47189:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25161:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37498:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22136:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49766:395;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49206:91;;;:::i;:::-;;21866:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45962:103;;;:::i;:::-;;50757:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45311:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22611:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50169:580;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24294:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48367:831;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25417:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47933:194;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47674:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48135:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24520:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47276:80;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;46220:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36668:224;36770:4;36809:35;36794:50;;;:11;:50;;;;:90;;;;36848:36;36872:11;36848:23;:36::i;:::-;36794:90;36787:97;;36668:224;;;:::o;22442:100::-;22496:13;22529:5;22522:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22442:100;:::o;24001:221::-;24077:7;24105:16;24113:7;24105;:16::i;:::-;24097:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24190:15;:24;24206:7;24190:24;;;;;;;;;;;;;;;;;;;;;24183:31;;24001:221;;;:::o;23524:411::-;23605:13;23621:23;23636:7;23621:14;:23::i;:::-;23605:39;;23669:5;23663:11;;:2;:11;;;;23655:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23763:5;23747:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23772:37;23789:5;23796:12;:10;:12::i;:::-;23772:16;:37::i;:::-;23747:62;23725:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23906:21;23915:2;23919:7;23906:8;:21::i;:::-;23524:411;;;:::o;47784:141::-;47838:15;47873:18;:44;47892:24;:14;:22;:24::i;:::-;47873:44;;;;;;;;;;;47866:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47784:141;:::o;37308:113::-;37369:7;37396:10;:17;;;;37389:24;;37308:113;:::o;24751:339::-;24946:41;24965:12;:10;:12::i;:::-;24979:7;24946:18;:41::i;:::-;24938:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25054:28;25064:4;25070:2;25074:7;25054:9;:28::i;:::-;24751:339;;;:::o;47400:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49305:183::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49382:15:::1;49400:24;:14;:22;:24::i;:::-;49382:42;;49435:18;:30;49454:10;49435:30;;;;;;;;;;;49471:8;;49435:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45602:1;49305:183:::0;;:::o;36976:256::-;37073:7;37109:23;37126:5;37109:16;:23::i;:::-;37101:5;:31;37093:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37198:12;:19;37211:5;37198:19;;;;;;;;;;;;;;;:26;37218:5;37198:26;;;;;;;;;;;;37191:33;;36976:256;;;;:::o;47458:99::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;49496:262::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49577:15:::1;49595:24;:14;:22;:24::i;:::-;49577:42;;49634:6;49630:121;49650:10;:17;49646:1;:21;49630:121;;;49689:18;:30;49708:10;49689:30;;;;;;;;;;;49725:10;49736:1;49725:13;;;;;;;;;;;;;;;;;;;;;;49689:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;49669:3;;;;;:::i;:::-;;;;49630:121;;;;45602:1;49496:262:::0;:::o;47189:24::-;;;;;;;;;;;;;:::o;25161:185::-;25299:39;25316:4;25322:2;25326:7;25299:39;;;;;;;;;;;;:16;:39::i;:::-;25161:185;;;:::o;37498:233::-;37573:7;37609:30;:28;:30::i;:::-;37601:5;:38;37593:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;37706:10;37717:5;37706:17;;;;;;;;;;;;;;;;;;;;;;;;37699:24;;37498:233;;;:::o;22136:239::-;22208:7;22228:13;22244:7;:16;22252:7;22244:16;;;;;;;;;;;;;;;;;;;;;22228:32;;22296:1;22279:19;;:5;:19;;;;22271:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22362:5;22355:12;;;22136:239;;;:::o;49766:395::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49903:15:::1;49921:24;:14;:22;:24::i;:::-;49903:42;;49956:18;49977:27;:39;50005:10;49977:39;;;;;;;;;;;50017:8;;49977:49;;;;;;;:::i;:::-;;;;;;;;;;;;;:56;;;;49956:77;;50044:27;:39;50072:10;50044:39;;;;;;;;;;;50084:8;;50044:49;;;;;;;:::i;:::-;;;;;;;;;;;;;50099:53;;;;;;;;50115:13;50099:53;;;;;;50131:1;50099:53;;;;;;50134:4;;50099:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50140:11;;50099:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;50044:109:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;45602:1;;49766:395:::0;;;;;;:::o;49206:91::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49263:26:::1;:14;:24;:26::i;:::-;49206:91::o:0;21866:208::-;21938:7;21983:1;21966:19;;:5;:19;;;;21958:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22050:9;:16;22060:5;22050:16;;;;;;;;;;;;;;;;22043:23;;21866:208;;;:::o;45962:103::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46027:30:::1;46054:1;46027:18;:30::i;:::-;45962:103::o:0;50757:97::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50840:6:::1;50825:12;;:21;;;;;;;;;;;;;;;;;;50757:97:::0;:::o;45311:87::-;45357:7;45384:6;;;;;;;;;;;45377:13;;45311:87;:::o;22611:104::-;22667:13;22700:7;22693:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22611:104;:::o;50169:580::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50333:12:::1;:19;50317:5;:12;:35;50309:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;50414:15;50432:24;:14;:22;:24::i;:::-;50414:42;;50471:6;50467:275;50487:5;:12;50483:1;:16;50467:275;;;50521:18;50542:27;:39;50570:10;50542:39;;;;;;;;;;;50582:8;;50542:49;;;;;;;:::i;:::-;;;;;;;;;;;;;:56;;;;50521:77;;50613:27;:39;50641:10;50613:39;;;;;;;;;;;50653:8;;50613:49;;;;;;;:::i;:::-;;;;;;;;;;;;;50668:61;;;;;;;;50684:13;50668:61;;;;;;50700:1;50668:61;;;;;;50703:5;50709:1;50703:8;;;;;;;;;;;;;;;;;;;;;;50668:61;;;;50713:12;50726:1;50713:15;;;;;;;;;;;;;;;;;;;;;;50668:61;;::::0;50613:117:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;50467:275;50501:3;;;;;:::i;:::-;;;;50467:275;;;;45602:1;50169:580:::0;;;;:::o;24294:155::-;24389:52;24408:12;:10;:12::i;:::-;24422:8;24432;24389:18;:52::i;:::-;24294:155;;:::o;48367:831::-;48449:12;;;;;;;;;;;48441:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;48495:11;48509:24;:14;:22;:24::i;:::-;48495:38;;48617:5;48552:70;;:31;:39;48584:6;48552:39;;;;;;;;;;;:51;48592:10;48552:51;;;;;;;;;;;;;;;48604:8;;48552:61;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:70;;;48544:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;48737:4;48673:31;:39;48705:6;48673:39;;;;;;;;;;;:51;48713:10;48673:51;;;;;;;;;;;;;;;48725:8;;48673:61;;;;;;;:::i;:::-;;;;;;;;;;;;;;:68;;;;;;;;;;;;;;;;;;48752:27;:35;48780:6;48752:35;;;;;;;;;;;48788:8;;48752:45;;;;;;;:::i;:::-;;;;;;;;;;;;;48798:9;48752:56;;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;:64;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;48827:21;:9;:19;:21::i;:::-;48859:12;48874:19;:9;:17;:19::i;:::-;48859:34;;49015:27;:35;49043:6;49015:35;;;;;;;;;;;49051:8;;49015:45;;;;;;;:::i;:::-;;;;;;;;;;;;;49061:9;49015:56;;;;;;;;;;;;;;;;;;;;;;;;;;:68;;48983:20;:29;49004:7;48983:29;;;;;;;;;;;:100;;;;;;:::i;:::-;;;;;;:::i;:::-;;49094:30;49104:10;49116:7;49094:9;:30::i;:::-;49140:50;49153:6;49161:8;;49179:9;49140:50;;;;;;;;;:::i;:::-;;;;;;;;48367:831;;;;;:::o;25417:328::-;25592:41;25611:12;:10;:12::i;:::-;25625:7;25592:18;:41::i;:::-;25584:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25698:39;25712:4;25718:2;25722:7;25731:5;25698:13;:39::i;:::-;25417:328;;;;:::o;47933:194::-;48020:16;48056:27;:53;48084:24;:14;:22;:24::i;:::-;48056:53;;;;;;;;;;;48110:8;;48056:63;;;;;;;:::i;:::-;;;;;;;;;;;;;48049:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47933:194;;;;:::o;47674:102::-;47720:4;47744:24;:14;:22;:24::i;:::-;47737:31;;47674:102;:::o;48135:222::-;48200:13;48234:16;48242:7;48234;:16::i;:::-;48226:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;48320:20;:29;48341:7;48320:29;;;;;;;;;;;48313:36;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48135:222;;;:::o;24520:164::-;24617:4;24641:18;:25;24660:5;24641:25;;;;;;;;;;;;;;;:35;24667:8;24641:35;;;;;;;;;;;;;;;;;;;;;;;;;24634:42;;24520:164;;;;:::o;47276:80::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46220:201::-;45542:12;:10;:12::i;:::-;45531:23;;:7;:5;:7::i;:::-;:23;;;45523:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46329:1:::1;46309:22;;:8;:22;;;;46301:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46385:28;46404:8;46385:18;:28::i;:::-;46220:201:::0;:::o;21497:305::-;21599:4;21651:25;21636:40;;;:11;:40;;;;:105;;;;21708:33;21693:48;;;:11;:48;;;;21636:105;:158;;;;21758:36;21782:11;21758:23;:36::i;:::-;21636:158;21616:178;;21497:305;;;:::o;27255:127::-;27320:4;27372:1;27344:30;;:7;:16;27352:7;27344:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27337:37;;27255:127;;;:::o;16772:98::-;16825:7;16852:10;16845:17;;16772:98;:::o;31401:174::-;31503:2;31476:15;:24;31492:7;31476:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31559:7;31555:2;31521:46;;31530:23;31545:7;31530:14;:23::i;:::-;31521:46;;;;;;;;;;;;31401:174;;:::o;43673:114::-;43738:7;43765;:14;;;43758:21;;43673:114;;;:::o;27549:348::-;27642:4;27667:16;27675:7;27667;:16::i;:::-;27659:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27743:13;27759:23;27774:7;27759:14;:23::i;:::-;27743:39;;27812:5;27801:16;;:7;:16;;;:51;;;;27845:7;27821:31;;:20;27833:7;27821:11;:20::i;:::-;:31;;;27801:51;:87;;;;27856:32;27873:5;27880:7;27856:16;:32::i;:::-;27801:87;27793:96;;;27549:348;;;;:::o;30658:625::-;30817:4;30790:31;;:23;30805:7;30790:14;:23::i;:::-;:31;;;30782:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30896:1;30882:16;;:2;:16;;;;30874:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30952:39;30973:4;30979:2;30983:7;30952:20;:39::i;:::-;31056:29;31073:1;31077:7;31056:8;:29::i;:::-;31117:1;31098:9;:15;31108:4;31098:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31146:1;31129:9;:13;31139:2;31129:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31177:2;31158:7;:16;31166:7;31158:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31216:7;31212:2;31197:27;;31206:4;31197:27;;;;;;;;;;;;31237:38;31257:4;31263:2;31267:7;31237:19;:38::i;:::-;30658:625;;;:::o;43795:127::-;43902:1;43884:7;:14;;;:19;;;;;;;;;;;43795:127;:::o;46581:191::-;46655:16;46674:6;;;;;;;;;;;46655:25;;46700:8;46691:6;;:17;;;;;;;;;;;;;;;;;;46755:8;46724:40;;46745:8;46724:40;;;;;;;;;;;;46581:191;;:::o;31717:315::-;31872:8;31863:17;;:5;:17;;;;31855:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31959:8;31921:18;:25;31940:5;31921:25;;;;;;;;;;;;;;;:35;31947:8;31921:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32005:8;31983:41;;31998:5;31983:41;;;32015:8;31983:41;;;;;;:::i;:::-;;;;;;;;31717:315;;;:::o;28239:110::-;28315:26;28325:2;28329:7;28315:26;;;;;;;;;;;;:9;:26::i;:::-;28239:110;;:::o;26627:315::-;26784:28;26794:4;26800:2;26804:7;26784:9;:28::i;:::-;26831:48;26854:4;26860:2;26864:7;26873:5;26831:22;:48::i;:::-;26823:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26627:315;;;;:::o;19943:157::-;20028:4;20067:25;20052:40;;;:11;:40;;;;20045:47;;19943:157;;;:::o;38344:589::-;38488:45;38515:4;38521:2;38525:7;38488:26;:45::i;:::-;38566:1;38550:18;;:4;:18;;;38546:187;;;38585:40;38617:7;38585:31;:40::i;:::-;38546:187;;;38655:2;38647:10;;:4;:10;;;38643:90;;38674:47;38707:4;38713:7;38674:32;:47::i;:::-;38643:90;38546:187;38761:1;38747:16;;:2;:16;;;38743:183;;;38780:45;38817:7;38780:36;:45::i;:::-;38743:183;;;38853:4;38847:10;;:2;:10;;;38843:83;;38874:40;38902:2;38906:7;38874:27;:40::i;:::-;38843:83;38743:183;38344:589;;;:::o;34479:125::-;;;;:::o;28576:321::-;28706:18;28712:2;28716:7;28706:5;:18::i;:::-;28757:54;28788:1;28792:2;28796:7;28805:5;28757:22;:54::i;:::-;28735:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28576:321;;;:::o;32597:799::-;32752:4;32773:15;:2;:13;;;:15::i;:::-;32769:620;;;32825:2;32809:36;;;32846:12;:10;:12::i;:::-;32860:4;32866:7;32875:5;32809:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32805:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33068:1;33051:6;:13;:18;33047:272;;;33094:60;;;;;;;;;;:::i;:::-;;;;;;;;33047:272;33269:6;33263:13;33254:6;33250:2;33246:15;33239:38;32805:529;32942:41;;;32932:51;;;:6;:51;;;;32925:58;;;;;32769:620;33373:4;33366:11;;32597:799;;;;;;;:::o;33968:126::-;;;;:::o;39656:164::-;39760:10;:17;;;;39733:15;:24;39749:7;39733:24;;;;;;;;;;;:44;;;;39788:10;39804:7;39788:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39656:164;:::o;40447:988::-;40713:22;40763:1;40738:22;40755:4;40738:16;:22::i;:::-;:26;;;;:::i;:::-;40713:51;;40775:18;40796:17;:26;40814:7;40796:26;;;;;;;;;;;;40775:47;;40943:14;40929:10;:28;40925:328;;40974:19;40996:12;:18;41009:4;40996:18;;;;;;;;;;;;;;;:34;41015:14;40996:34;;;;;;;;;;;;40974:56;;41080:11;41047:12;:18;41060:4;41047:18;;;;;;;;;;;;;;;:30;41066:10;41047:30;;;;;;;;;;;:44;;;;41197:10;41164:17;:30;41182:11;41164:30;;;;;;;;;;;:43;;;;40925:328;;41349:17;:26;41367:7;41349:26;;;;;;;;;;;41342:33;;;41393:12;:18;41406:4;41393:18;;;;;;;;;;;;;;;:34;41412:14;41393:34;;;;;;;;;;;41386:41;;;40447:988;;;;:::o;41730:1079::-;41983:22;42028:1;42008:10;:17;;;;:21;;;;:::i;:::-;41983:46;;42040:18;42061:15;:24;42077:7;42061:24;;;;;;;;;;;;42040:45;;42412:19;42434:10;42445:14;42434:26;;;;;;;;;;;;;;;;;;;;;;;;42412:48;;42498:11;42473:10;42484;42473:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42609:10;42578:15;:28;42594:11;42578:28;;;;;;;;;;;:41;;;;42750:15;:24;42766:7;42750:24;;;;;;;;;;;42743:31;;;42785:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41730:1079;;;;:::o;39234:221::-;39319:14;39336:20;39353:2;39336:16;:20::i;:::-;39319:37;;39394:7;39367:12;:16;39380:2;39367:16;;;;;;;;;;;;;;;:24;39384:6;39367:24;;;;;;;;;;;:34;;;;39441:6;39412:17;:26;39430:7;39412:26;;;;;;;;;;;:35;;;;39234:221;;;:::o;29233:439::-;29327:1;29313:16;;:2;:16;;;;29305:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29386:16;29394:7;29386;:16::i;:::-;29385:17;29377:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29448:45;29477:1;29481:2;29485:7;29448:20;:45::i;:::-;29523:1;29506:9;:13;29516:2;29506:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29554:2;29535:7;:16;29543:7;29535:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29599:7;29595:2;29574:33;;29591:1;29574:33;;;;;;;;;;;;29620:44;29648:1;29652:2;29656:7;29620:19;:44::i;:::-;29233:439;;:::o;8838:326::-;8898:4;9155:1;9133:7;:19;;;:23;9126:30;;8838:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;23:823:1:-;129:5;154:91;170:74;237:6;170:74;:::i;:::-;154:91;:::i;:::-;145:100;;265:5;294:6;287:5;280:21;328:4;321:5;317:16;310:23;;354:6;404:3;396:4;388:6;384:17;379:3;375:27;372:36;369:2;;;433:1;430;423:12;369:2;469:1;454:386;479:6;476:1;473:13;454:386;;;561:3;548:17;597:18;584:11;581:35;578:2;;;629:1;626;619:12;578:2;676:11;668:6;664:24;714:47;757:3;745:10;714:47;:::i;:::-;709:3;702:60;791:4;786:3;782:14;775:21;;825:4;820:3;816:14;809:21;;514:326;;501:1;498;494:9;489:14;;454:386;;;458:14;135:711;;;;;;;:::o;852:343::-;929:5;954:65;970:48;1011:6;970:48;:::i;:::-;954:65;:::i;:::-;945:74;;1042:6;1035:5;1028:21;1080:4;1073:5;1069:16;1118:3;1109:6;1104:3;1100:16;1097:25;1094:2;;;1135:1;1132;1125:12;1094:2;1148:41;1182:6;1177:3;1172;1148:41;:::i;:::-;935:260;;;;;;:::o;1201:345::-;1279:5;1304:66;1320:49;1362:6;1320:49;:::i;:::-;1304:66;:::i;:::-;1295:75;;1393:6;1386:5;1379:21;1431:4;1424:5;1420:16;1469:3;1460:6;1455:3;1451:16;1448:25;1445:2;;;1486:1;1483;1476:12;1445:2;1499:41;1533:6;1528:3;1523;1499:41;:::i;:::-;1285:261;;;;;;:::o;1552:139::-;1598:5;1636:6;1623:20;1614:29;;1652:33;1679:5;1652:33;:::i;:::-;1604:87;;;;:::o;1713:323::-;1794:5;1843:3;1836:4;1828:6;1824:17;1820:27;1810:2;;1861:1;1858;1851:12;1810:2;1901:6;1888:20;1926:104;2026:3;2018:6;2011:4;2003:6;1999:17;1926:104;:::i;:::-;1917:113;;1800:236;;;;;:::o;2042:133::-;2085:5;2123:6;2110:20;2101:29;;2139:30;2163:5;2139:30;:::i;:::-;2091:84;;;;:::o;2181:137::-;2226:5;2264:6;2251:20;2242:29;;2280:32;2306:5;2280:32;:::i;:::-;2232:86;;;;:::o;2324:141::-;2380:5;2411:6;2405:13;2396:22;;2427:32;2453:5;2427:32;:::i;:::-;2386:79;;;;:::o;2484:271::-;2539:5;2588:3;2581:4;2573:6;2569:17;2565:27;2555:2;;2606:1;2603;2596:12;2555:2;2646:6;2633:20;2671:78;2745:3;2737:6;2730:4;2722:6;2718:17;2671:78;:::i;:::-;2662:87;;2545:210;;;;;:::o;2775:352::-;2833:8;2843:6;2893:3;2886:4;2878:6;2874:17;2870:27;2860:2;;2911:1;2908;2901:12;2860:2;2947:6;2934:20;2924:30;;2977:18;2969:6;2966:30;2963:2;;;3009:1;3006;2999:12;2963:2;3046:4;3038:6;3034:17;3022:29;;3100:3;3092:4;3084:6;3080:17;3070:8;3066:32;3063:41;3060:2;;;3117:1;3114;3107:12;3060:2;2850:277;;;;;:::o;3147:273::-;3203:5;3252:3;3245:4;3237:6;3233:17;3229:27;3219:2;;3270:1;3267;3260:12;3219:2;3310:6;3297:20;3335:79;3410:3;3402:6;3395:4;3387:6;3383:17;3335:79;:::i;:::-;3326:88;;3209:211;;;;;:::o;3426:139::-;3472:5;3510:6;3497:20;3488:29;;3526:33;3553:5;3526:33;:::i;:::-;3478:87;;;;:::o;3571:262::-;3630:6;3679:2;3667:9;3658:7;3654:23;3650:32;3647:2;;;3695:1;3692;3685:12;3647:2;3738:1;3763:53;3808:7;3799:6;3788:9;3784:22;3763:53;:::i;:::-;3753:63;;3709:117;3637:196;;;;:::o;3839:407::-;3907:6;3915;3964:2;3952:9;3943:7;3939:23;3935:32;3932:2;;;3980:1;3977;3970:12;3932:2;4023:1;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3994:117;4150:2;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4121:118;3922:324;;;;;:::o;4252:552::-;4329:6;4337;4345;4394:2;4382:9;4373:7;4369:23;4365:32;4362:2;;;4410:1;4407;4400:12;4362:2;4453:1;4478:53;4523:7;4514:6;4503:9;4499:22;4478:53;:::i;:::-;4468:63;;4424:117;4580:2;4606:53;4651:7;4642:6;4631:9;4627:22;4606:53;:::i;:::-;4596:63;;4551:118;4708:2;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4679:118;4352:452;;;;;:::o;4810:809::-;4905:6;4913;4921;4929;4978:3;4966:9;4957:7;4953:23;4949:33;4946:2;;;4995:1;4992;4985:12;4946:2;5038:1;5063:53;5108:7;5099:6;5088:9;5084:22;5063:53;:::i;:::-;5053:63;;5009:117;5165:2;5191:53;5236:7;5227:6;5216:9;5212:22;5191:53;:::i;:::-;5181:63;;5136:118;5293:2;5319:53;5364:7;5355:6;5344:9;5340:22;5319:53;:::i;:::-;5309:63;;5264:118;5449:2;5438:9;5434:18;5421:32;5480:18;5472:6;5469:30;5466:2;;;5512:1;5509;5502:12;5466:2;5540:62;5594:7;5585:6;5574:9;5570:22;5540:62;:::i;:::-;5530:72;;5392:220;4936:683;;;;;;;:::o;5625:401::-;5690:6;5698;5747:2;5735:9;5726:7;5722:23;5718:32;5715:2;;;5763:1;5760;5753:12;5715:2;5806:1;5831:53;5876:7;5867:6;5856:9;5852:22;5831:53;:::i;:::-;5821:63;;5777:117;5933:2;5959:50;6001:7;5992:6;5981:9;5977:22;5959:50;:::i;:::-;5949:60;;5904:115;5705:321;;;;;:::o;6032:407::-;6100:6;6108;6157:2;6145:9;6136:7;6132:23;6128:32;6125:2;;;6173:1;6170;6163:12;6125:2;6216:1;6241:53;6286:7;6277:6;6266:9;6262:22;6241:53;:::i;:::-;6231:63;;6187:117;6343:2;6369:53;6414:7;6405:6;6394:9;6390:22;6369:53;:::i;:::-;6359:63;;6314:118;6115:324;;;;;:::o;6445:425::-;6539:6;6588:2;6576:9;6567:7;6563:23;6559:32;6556:2;;;6604:1;6601;6594:12;6556:2;6675:1;6664:9;6660:17;6647:31;6705:18;6697:6;6694:30;6691:2;;;6737:1;6734;6727:12;6691:2;6765:88;6845:7;6836:6;6825:9;6821:22;6765:88;:::i;:::-;6755:98;;6618:245;6546:324;;;;:::o;6876:256::-;6932:6;6981:2;6969:9;6960:7;6956:23;6952:32;6949:2;;;6997:1;6994;6987:12;6949:2;7040:1;7065:50;7107:7;7098:6;7087:9;7083:22;7065:50;:::i;:::-;7055:60;;7011:114;6939:193;;;;:::o;7138:260::-;7196:6;7245:2;7233:9;7224:7;7220:23;7216:32;7213:2;;;7261:1;7258;7251:12;7213:2;7304:1;7329:52;7373:7;7364:6;7353:9;7349:22;7329:52;:::i;:::-;7319:62;;7275:116;7203:195;;;;:::o;7404:282::-;7473:6;7522:2;7510:9;7501:7;7497:23;7493:32;7490:2;;;7538:1;7535;7528:12;7490:2;7581:1;7606:63;7661:7;7652:6;7641:9;7637:22;7606:63;:::i;:::-;7596:73;;7552:127;7480:206;;;;:::o;7692:395::-;7763:6;7771;7820:2;7808:9;7799:7;7795:23;7791:32;7788:2;;;7836:1;7833;7826:12;7788:2;7907:1;7896:9;7892:17;7879:31;7937:18;7929:6;7926:30;7923:2;;;7969:1;7966;7959:12;7923:2;8005:65;8062:7;8053:6;8042:9;8038:22;8005:65;:::i;:::-;7987:83;;;;7850:230;7778:309;;;;;:::o;8093:1011::-;8252:6;8260;8268;8276;8325:2;8313:9;8304:7;8300:23;8296:32;8293:2;;;8341:1;8338;8331:12;8293:2;8412:1;8401:9;8397:17;8384:31;8442:18;8434:6;8431:30;8428:2;;;8474:1;8471;8464:12;8428:2;8510:65;8567:7;8558:6;8547:9;8543:22;8510:65;:::i;:::-;8492:83;;;;8355:230;8652:2;8641:9;8637:18;8624:32;8683:18;8675:6;8672:30;8669:2;;;8715:1;8712;8705:12;8669:2;8743:88;8823:7;8814:6;8803:9;8799:22;8743:88;:::i;:::-;8733:98;;8595:246;8908:2;8897:9;8893:18;8880:32;8939:18;8931:6;8928:30;8925:2;;;8971:1;8968;8961:12;8925:2;8999:88;9079:7;9070:6;9059:9;9055:22;8999:88;:::i;:::-;8989:98;;8851:246;8283:821;;;;;;;:::o;9110:951::-;9223:6;9231;9239;9247;9255;9263;9312:2;9300:9;9291:7;9287:23;9283:32;9280:2;;;9328:1;9325;9318:12;9280:2;9399:1;9388:9;9384:17;9371:31;9429:18;9421:6;9418:30;9415:2;;;9461:1;9458;9451:12;9415:2;9497:65;9554:7;9545:6;9534:9;9530:22;9497:65;:::i;:::-;9479:83;;;;9342:230;9639:2;9628:9;9624:18;9611:32;9670:18;9662:6;9659:30;9656:2;;;9702:1;9699;9692:12;9656:2;9738:65;9795:7;9786:6;9775:9;9771:22;9738:65;:::i;:::-;9720:83;;;;9582:231;9880:2;9869:9;9865:18;9852:32;9911:18;9903:6;9900:30;9897:2;;;9943:1;9940;9933:12;9897:2;9979:65;10036:7;10027:6;10016:9;10012:22;9979:65;:::i;:::-;9961:83;;;;9823:231;9270:791;;;;;;;;:::o;10067:540::-;10147:6;10155;10163;10212:2;10200:9;10191:7;10187:23;10183:32;10180:2;;;10228:1;10225;10218:12;10180:2;10299:1;10288:9;10284:17;10271:31;10329:18;10321:6;10318:30;10315:2;;;10361:1;10358;10351:12;10315:2;10397:65;10454:7;10445:6;10434:9;10430:22;10397:65;:::i;:::-;10379:83;;;;10242:230;10511:2;10537:53;10582:7;10573:6;10562:9;10558:22;10537:53;:::i;:::-;10527:63;;10482:118;10170:437;;;;;:::o;10613:262::-;10672:6;10721:2;10709:9;10700:7;10696:23;10692:32;10689:2;;;10737:1;10734;10727:12;10689:2;10780:1;10805:53;10850:7;10841:6;10830:9;10826:22;10805:53;:::i;:::-;10795:63;;10751:117;10679:196;;;;:::o;10881:665::-;10968:6;10976;10984;11033:2;11021:9;11012:7;11008:23;11004:32;11001:2;;;11049:1;11046;11039:12;11001:2;11092:1;11117:53;11162:7;11153:6;11142:9;11138:22;11117:53;:::i;:::-;11107:63;;11063:117;11219:2;11245:53;11290:7;11281:6;11270:9;11266:22;11245:53;:::i;:::-;11235:63;;11190:118;11375:2;11364:9;11360:18;11347:32;11406:18;11398:6;11395:30;11392:2;;;11438:1;11435;11428:12;11392:2;11466:63;11521:7;11512:6;11501:9;11497:22;11466:63;:::i;:::-;11456:73;;11318:221;10991:555;;;;;:::o;11552:665::-;11639:6;11647;11655;11704:2;11692:9;11683:7;11679:23;11675:32;11672:2;;;11720:1;11717;11710:12;11672:2;11763:1;11788:53;11833:7;11824:6;11813:9;11809:22;11788:53;:::i;:::-;11778:63;;11734:117;11918:2;11907:9;11903:18;11890:32;11949:18;11941:6;11938:30;11935:2;;;11981:1;11978;11971:12;11935:2;12009:63;12064:7;12055:6;12044:9;12040:22;12009:63;:::i;:::-;11999:73;;11861:221;12121:2;12147:53;12192:7;12183:6;12172:9;12168:22;12147:53;:::i;:::-;12137:63;;12092:118;11662:555;;;;;:::o;12223:407::-;12291:6;12299;12348:2;12336:9;12327:7;12323:23;12319:32;12316:2;;;12364:1;12361;12354:12;12316:2;12407:1;12432:53;12477:7;12468:6;12457:9;12453:22;12432:53;:::i;:::-;12422:63;;12378:117;12534:2;12560:53;12605:7;12596:6;12585:9;12581:22;12560:53;:::i;:::-;12550:63;;12505:118;12306:324;;;;;:::o;12636:196::-;12725:10;12760:66;12822:3;12814:6;12760:66;:::i;:::-;12746:80;;12736:96;;;;:::o;12838:256::-;12957:10;12992:96;13084:3;13076:6;12992:96;:::i;:::-;12978:110;;12968:126;;;;:::o;13100:118::-;13187:24;13205:5;13187:24;:::i;:::-;13182:3;13175:37;13165:53;;:::o;13252:991::-;13391:3;13420:64;13478:5;13420:64;:::i;:::-;13500:96;13589:6;13584:3;13500:96;:::i;:::-;13493:103;;13622:3;13667:4;13659:6;13655:17;13650:3;13646:27;13697:66;13757:5;13697:66;:::i;:::-;13786:7;13817:1;13802:396;13827:6;13824:1;13821:13;13802:396;;;13898:9;13892:4;13888:20;13883:3;13876:33;13949:6;13943:13;13977:84;14056:4;14041:13;13977:84;:::i;:::-;13969:92;;14084:70;14147:6;14084:70;:::i;:::-;14074:80;;14183:4;14178:3;14174:14;14167:21;;13862:336;13849:1;13846;13842:9;13837:14;;13802:396;;;13806:14;14214:4;14207:11;;14234:3;14227:10;;13396:847;;;;;;;;;:::o;14293:1111::-;14462:3;14491:79;14564:5;14491:79;:::i;:::-;14586:111;14690:6;14685:3;14586:111;:::i;:::-;14579:118;;14723:3;14768:4;14760:6;14756:17;14751:3;14747:27;14798:81;14873:5;14798:81;:::i;:::-;14902:7;14933:1;14918:441;14943:6;14940:1;14937:13;14918:441;;;15014:9;15008:4;15004:20;14999:3;14992:33;15065:6;15059:13;15093:114;15202:4;15187:13;15093:114;:::i;:::-;15085:122;;15230:85;15308:6;15230:85;:::i;:::-;15220:95;;15344:4;15339:3;15335:14;15328:21;;14978:381;14965:1;14962;14958:9;14953:14;;14918:441;;;14922:14;15375:4;15368:11;;15395:3;15388:10;;14467:937;;;;;;;;;:::o;15410:109::-;15491:21;15506:5;15491:21;:::i;:::-;15486:3;15479:34;15469:50;;:::o;15525:360::-;15611:3;15639:38;15671:5;15639:38;:::i;:::-;15693:70;15756:6;15751:3;15693:70;:::i;:::-;15686:77;;15772:52;15817:6;15812:3;15805:4;15798:5;15794:16;15772:52;:::i;:::-;15849:29;15871:6;15849:29;:::i;:::-;15844:3;15840:39;15833:46;;15615:270;;;;;:::o;15915:304::-;16013:3;16034:71;16098:6;16093:3;16034:71;:::i;:::-;16027:78;;16115:43;16151:6;16146:3;16139:5;16115:43;:::i;:::-;16183:29;16205:6;16183:29;:::i;:::-;16178:3;16174:39;16167:46;;16017:202;;;;;:::o;16249:317::-;16365:3;16386:89;16468:6;16463:3;16386:89;:::i;:::-;16379:96;;16485:43;16521:6;16516:3;16509:5;16485:43;:::i;:::-;16553:6;16548:3;16544:16;16537:23;;16369:197;;;;;:::o;16572:344::-;16650:3;16678:39;16711:5;16678:39;:::i;:::-;16733:61;16787:6;16782:3;16733:61;:::i;:::-;16726:68;;16803:52;16848:6;16843:3;16836:4;16829:5;16825:16;16803:52;:::i;:::-;16880:29;16902:6;16880:29;:::i;:::-;16875:3;16871:39;16864:46;;16654:262;;;;;:::o;16922:364::-;17010:3;17038:39;17071:5;17038:39;:::i;:::-;17093:71;17157:6;17152:3;17093:71;:::i;:::-;17086:78;;17173:52;17218:6;17213:3;17206:4;17199:5;17195:16;17173:52;:::i;:::-;17250:29;17272:6;17250:29;:::i;:::-;17245:3;17241:39;17234:46;;17014:272;;;;;:::o;17292:366::-;17434:3;17455:67;17519:2;17514:3;17455:67;:::i;:::-;17448:74;;17531:93;17620:3;17531:93;:::i;:::-;17649:2;17644:3;17640:12;17633:19;;17438:220;;;:::o;17664:366::-;17806:3;17827:67;17891:2;17886:3;17827:67;:::i;:::-;17820:74;;17903:93;17992:3;17903:93;:::i;:::-;18021:2;18016:3;18012:12;18005:19;;17810:220;;;:::o;18036:366::-;18178:3;18199:67;18263:2;18258:3;18199:67;:::i;:::-;18192:74;;18275:93;18364:3;18275:93;:::i;:::-;18393:2;18388:3;18384:12;18377:19;;18182:220;;;:::o;18408:366::-;18550:3;18571:67;18635:2;18630:3;18571:67;:::i;:::-;18564:74;;18647:93;18736:3;18647:93;:::i;:::-;18765:2;18760:3;18756:12;18749:19;;18554:220;;;:::o;18780:366::-;18922:3;18943:67;19007:2;19002:3;18943:67;:::i;:::-;18936:74;;19019:93;19108:3;19019:93;:::i;:::-;19137:2;19132:3;19128:12;19121:19;;18926:220;;;:::o;19152:366::-;19294:3;19315:67;19379:2;19374:3;19315:67;:::i;:::-;19308:74;;19391:93;19480:3;19391:93;:::i;:::-;19509:2;19504:3;19500:12;19493:19;;19298:220;;;:::o;19524:366::-;19666:3;19687:67;19751:2;19746:3;19687:67;:::i;:::-;19680:74;;19763:93;19852:3;19763:93;:::i;:::-;19881:2;19876:3;19872:12;19865:19;;19670:220;;;:::o;19896:366::-;20038:3;20059:67;20123:2;20118:3;20059:67;:::i;:::-;20052:74;;20135:93;20224:3;20135:93;:::i;:::-;20253:2;20248:3;20244:12;20237:19;;20042:220;;;:::o;20268:366::-;20410:3;20431:67;20495:2;20490:3;20431:67;:::i;:::-;20424:74;;20507:93;20596:3;20507:93;:::i;:::-;20625:2;20620:3;20616:12;20609:19;;20414:220;;;:::o;20640:366::-;20782:3;20803:67;20867:2;20862:3;20803:67;:::i;:::-;20796:74;;20879:93;20968:3;20879:93;:::i;:::-;20997:2;20992:3;20988:12;20981:19;;20786:220;;;:::o;21012:366::-;21154:3;21175:67;21239:2;21234:3;21175:67;:::i;:::-;21168:74;;21251:93;21340:3;21251:93;:::i;:::-;21369:2;21364:3;21360:12;21353:19;;21158:220;;;:::o;21384:366::-;21526:3;21547:67;21611:2;21606:3;21547:67;:::i;:::-;21540:74;;21623:93;21712:3;21623:93;:::i;:::-;21741:2;21736:3;21732:12;21725:19;;21530:220;;;:::o;21756:366::-;21898:3;21919:67;21983:2;21978:3;21919:67;:::i;:::-;21912:74;;21995:93;22084:3;21995:93;:::i;:::-;22113:2;22108:3;22104:12;22097:19;;21902:220;;;:::o;22128:366::-;22270:3;22291:67;22355:2;22350:3;22291:67;:::i;:::-;22284:74;;22367:93;22456:3;22367:93;:::i;:::-;22485:2;22480:3;22476:12;22469:19;;22274:220;;;:::o;22500:366::-;22642:3;22663:67;22727:2;22722:3;22663:67;:::i;:::-;22656:74;;22739:93;22828:3;22739:93;:::i;:::-;22857:2;22852:3;22848:12;22841:19;;22646:220;;;:::o;22872:366::-;23014:3;23035:67;23099:2;23094:3;23035:67;:::i;:::-;23028:74;;23111:93;23200:3;23111:93;:::i;:::-;23229:2;23224:3;23220:12;23213:19;;23018:220;;;:::o;23244:366::-;23386:3;23407:67;23471:2;23466:3;23407:67;:::i;:::-;23400:74;;23483:93;23572:3;23483:93;:::i;:::-;23601:2;23596:3;23592:12;23585:19;;23390:220;;;:::o;23616:366::-;23758:3;23779:67;23843:2;23838:3;23779:67;:::i;:::-;23772:74;;23855:93;23944:3;23855:93;:::i;:::-;23973:2;23968:3;23964:12;23957:19;;23762:220;;;:::o;23988:366::-;24130:3;24151:67;24215:2;24210:3;24151:67;:::i;:::-;24144:74;;24227:93;24316:3;24227:93;:::i;:::-;24345:2;24340:3;24336:12;24329:19;;24134:220;;;:::o;24360:366::-;24502:3;24523:67;24587:2;24582:3;24523:67;:::i;:::-;24516:74;;24599:93;24688:3;24599:93;:::i;:::-;24717:2;24712:3;24708:12;24701:19;;24506:220;;;:::o;24732:366::-;24874:3;24895:67;24959:2;24954:3;24895:67;:::i;:::-;24888:74;;24971:93;25060:3;24971:93;:::i;:::-;25089:2;25084:3;25080:12;25073:19;;24878:220;;;:::o;25144:1021::-;25253:3;25289:4;25284:3;25280:14;25374:4;25367:5;25363:16;25357:23;25393:63;25450:4;25445:3;25441:14;25427:12;25393:63;:::i;:::-;25304:162;25549:4;25542:5;25538:16;25532:23;25568:63;25625:4;25620:3;25616:14;25602:12;25568:63;:::i;:::-;25476:165;25723:4;25716:5;25712:16;25706:23;25776:3;25770:4;25766:14;25759:4;25754:3;25750:14;25743:38;25802:73;25870:4;25856:12;25802:73;:::i;:::-;25794:81;;25651:235;25975:4;25968:5;25964:16;25958:23;26028:3;26022:4;26018:14;26011:4;26006:3;26002:14;25995:38;26054:73;26122:4;26108:12;26054:73;:::i;:::-;26046:81;;25896:242;26155:4;26148:11;;25258:907;;;;;:::o;26171:108::-;26248:24;26266:5;26248:24;:::i;:::-;26243:3;26236:37;26226:53;;:::o;26285:118::-;26372:24;26390:5;26372:24;:::i;:::-;26367:3;26360:37;26350:53;;:::o;26409:118::-;26496:24;26514:5;26496:24;:::i;:::-;26491:3;26484:37;26474:53;;:::o;26533:295::-;26675:3;26697:105;26798:3;26789:6;26781;26697:105;:::i;:::-;26690:112;;26819:3;26812:10;;26679:149;;;;;:::o;26834:222::-;26927:4;26965:2;26954:9;26950:18;26942:26;;26978:71;27046:1;27035:9;27031:17;27022:6;26978:71;:::i;:::-;26932:124;;;;:::o;27062:640::-;27257:4;27295:3;27284:9;27280:19;27272:27;;27309:71;27377:1;27366:9;27362:17;27353:6;27309:71;:::i;:::-;27390:72;27458:2;27447:9;27443:18;27434:6;27390:72;:::i;:::-;27472;27540:2;27529:9;27525:18;27516:6;27472:72;:::i;:::-;27591:9;27585:4;27581:20;27576:2;27565:9;27561:18;27554:48;27619:76;27690:4;27681:6;27619:76;:::i;:::-;27611:84;;27262:440;;;;;;;:::o;27708:413::-;27871:4;27909:2;27898:9;27894:18;27886:26;;27958:9;27952:4;27948:20;27944:1;27933:9;27929:17;27922:47;27986:128;28109:4;28100:6;27986:128;:::i;:::-;27978:136;;27876:245;;;;:::o;28127:473::-;28320:4;28358:2;28347:9;28343:18;28335:26;;28407:9;28401:4;28397:20;28393:1;28382:9;28378:17;28371:47;28435:158;28588:4;28579:6;28435:158;:::i;:::-;28427:166;;28325:275;;;;:::o;28606:210::-;28693:4;28731:2;28720:9;28716:18;28708:26;;28744:65;28806:1;28795:9;28791:17;28782:6;28744:65;:::i;:::-;28698:118;;;;:::o;28822:313::-;28935:4;28973:2;28962:9;28958:18;28950:26;;29022:9;29016:4;29012:20;29008:1;28997:9;28993:17;28986:47;29050:78;29123:4;29114:6;29050:78;:::i;:::-;29042:86;;28940:195;;;;:::o;29141:419::-;29307:4;29345:2;29334:9;29330:18;29322:26;;29394:9;29388:4;29384:20;29380:1;29369:9;29365:17;29358:47;29422:131;29548:4;29422:131;:::i;:::-;29414:139;;29312:248;;;:::o;29566:419::-;29732:4;29770:2;29759:9;29755:18;29747:26;;29819:9;29813:4;29809:20;29805:1;29794:9;29790:17;29783:47;29847:131;29973:4;29847:131;:::i;:::-;29839:139;;29737:248;;;:::o;29991:419::-;30157:4;30195:2;30184:9;30180:18;30172:26;;30244:9;30238:4;30234:20;30230:1;30219:9;30215:17;30208:47;30272:131;30398:4;30272:131;:::i;:::-;30264:139;;30162:248;;;:::o;30416:419::-;30582:4;30620:2;30609:9;30605:18;30597:26;;30669:9;30663:4;30659:20;30655:1;30644:9;30640:17;30633:47;30697:131;30823:4;30697:131;:::i;:::-;30689:139;;30587:248;;;:::o;30841:419::-;31007:4;31045:2;31034:9;31030:18;31022:26;;31094:9;31088:4;31084:20;31080:1;31069:9;31065:17;31058:47;31122:131;31248:4;31122:131;:::i;:::-;31114:139;;31012:248;;;:::o;31266:419::-;31432:4;31470:2;31459:9;31455:18;31447:26;;31519:9;31513:4;31509:20;31505:1;31494:9;31490:17;31483:47;31547:131;31673:4;31547:131;:::i;:::-;31539:139;;31437:248;;;:::o;31691:419::-;31857:4;31895:2;31884:9;31880:18;31872:26;;31944:9;31938:4;31934:20;31930:1;31919:9;31915:17;31908:47;31972:131;32098:4;31972:131;:::i;:::-;31964:139;;31862:248;;;:::o;32116:419::-;32282:4;32320:2;32309:9;32305:18;32297:26;;32369:9;32363:4;32359:20;32355:1;32344:9;32340:17;32333:47;32397:131;32523:4;32397:131;:::i;:::-;32389:139;;32287:248;;;:::o;32541:419::-;32707:4;32745:2;32734:9;32730:18;32722:26;;32794:9;32788:4;32784:20;32780:1;32769:9;32765:17;32758:47;32822:131;32948:4;32822:131;:::i;:::-;32814:139;;32712:248;;;:::o;32966:419::-;33132:4;33170:2;33159:9;33155:18;33147:26;;33219:9;33213:4;33209:20;33205:1;33194:9;33190:17;33183:47;33247:131;33373:4;33247:131;:::i;:::-;33239:139;;33137:248;;;:::o;33391:419::-;33557:4;33595:2;33584:9;33580:18;33572:26;;33644:9;33638:4;33634:20;33630:1;33619:9;33615:17;33608:47;33672:131;33798:4;33672:131;:::i;:::-;33664:139;;33562:248;;;:::o;33816:419::-;33982:4;34020:2;34009:9;34005:18;33997:26;;34069:9;34063:4;34059:20;34055:1;34044:9;34040:17;34033:47;34097:131;34223:4;34097:131;:::i;:::-;34089:139;;33987:248;;;:::o;34241:419::-;34407:4;34445:2;34434:9;34430:18;34422:26;;34494:9;34488:4;34484:20;34480:1;34469:9;34465:17;34458:47;34522:131;34648:4;34522:131;:::i;:::-;34514:139;;34412:248;;;:::o;34666:419::-;34832:4;34870:2;34859:9;34855:18;34847:26;;34919:9;34913:4;34909:20;34905:1;34894:9;34890:17;34883:47;34947:131;35073:4;34947:131;:::i;:::-;34939:139;;34837:248;;;:::o;35091:419::-;35257:4;35295:2;35284:9;35280:18;35272:26;;35344:9;35338:4;35334:20;35330:1;35319:9;35315:17;35308:47;35372:131;35498:4;35372:131;:::i;:::-;35364:139;;35262:248;;;:::o;35516:419::-;35682:4;35720:2;35709:9;35705:18;35697:26;;35769:9;35763:4;35759:20;35755:1;35744:9;35740:17;35733:47;35797:131;35923:4;35797:131;:::i;:::-;35789:139;;35687:248;;;:::o;35941:419::-;36107:4;36145:2;36134:9;36130:18;36122:26;;36194:9;36188:4;36184:20;36180:1;36169:9;36165:17;36158:47;36222:131;36348:4;36222:131;:::i;:::-;36214:139;;36112:248;;;:::o;36366:419::-;36532:4;36570:2;36559:9;36555:18;36547:26;;36619:9;36613:4;36609:20;36605:1;36594:9;36590:17;36583:47;36647:131;36773:4;36647:131;:::i;:::-;36639:139;;36537:248;;;:::o;36791:419::-;36957:4;36995:2;36984:9;36980:18;36972:26;;37044:9;37038:4;37034:20;37030:1;37019:9;37015:17;37008:47;37072:131;37198:4;37072:131;:::i;:::-;37064:139;;36962:248;;;:::o;37216:419::-;37382:4;37420:2;37409:9;37405:18;37397:26;;37469:9;37463:4;37459:20;37455:1;37444:9;37440:17;37433:47;37497:131;37623:4;37497:131;:::i;:::-;37489:139;;37387:248;;;:::o;37641:419::-;37807:4;37845:2;37834:9;37830:18;37822:26;;37894:9;37888:4;37884:20;37880:1;37869:9;37865:17;37858:47;37922:131;38048:4;37922:131;:::i;:::-;37914:139;;37812:248;;;:::o;38066:735::-;38283:4;38321:3;38310:9;38306:19;38298:27;;38335:71;38403:1;38392:9;38388:17;38379:6;38335:71;:::i;:::-;38416:72;38484:2;38473:9;38469:18;38460:6;38416:72;:::i;:::-;38535:9;38529:4;38525:20;38520:2;38509:9;38505:18;38498:48;38563:78;38636:4;38627:6;38563:78;:::i;:::-;38555:86;;38688:9;38682:4;38678:20;38673:2;38662:9;38658:18;38651:48;38716:78;38789:4;38780:6;38716:78;:::i;:::-;38708:86;;38288:513;;;;;;;:::o;38807:222::-;38900:4;38938:2;38927:9;38923:18;38915:26;;38951:71;39019:1;39008:9;39004:17;38995:6;38951:71;:::i;:::-;38905:124;;;;:::o;39035:553::-;39214:4;39252:2;39241:9;39237:18;39229:26;;39265:71;39333:1;39322:9;39318:17;39309:6;39265:71;:::i;:::-;39383:9;39377:4;39373:20;39368:2;39357:9;39353:18;39346:48;39411:88;39494:4;39485:6;39477;39411:88;:::i;:::-;39403:96;;39509:72;39577:2;39566:9;39562:18;39553:6;39509:72;:::i;:::-;39219:369;;;;;;;:::o;39594:129::-;39628:6;39655:20;;:::i;:::-;39645:30;;39684:33;39712:4;39704:6;39684:33;:::i;:::-;39635:88;;;:::o;39729:75::-;39762:6;39795:2;39789:9;39779:19;;39769:35;:::o;39810:321::-;39897:4;39987:18;39979:6;39976:30;39973:2;;;40009:18;;:::i;:::-;39973:2;40059:4;40051:6;40047:17;40039:25;;40119:4;40113;40109:15;40101:23;;39902:229;;;:::o;40137:307::-;40198:4;40288:18;40280:6;40277:30;40274:2;;;40310:18;;:::i;:::-;40274:2;40348:29;40370:6;40348:29;:::i;:::-;40340:37;;40432:4;40426;40422:15;40414:23;;40203:241;;;:::o;40450:308::-;40512:4;40602:18;40594:6;40591:30;40588:2;;;40624:18;;:::i;:::-;40588:2;40662:29;40684:6;40662:29;:::i;:::-;40654:37;;40746:4;40740;40736:15;40728:23;;40517:241;;;:::o;40764:142::-;40841:4;40864:3;40856:11;;40894:4;40889:3;40885:14;40877:22;;40846:60;;;:::o;40912:157::-;41004:4;41027:3;41019:11;;41057:4;41052:3;41048:14;41040:22;;41009:60;;;:::o;41075:124::-;41152:6;41186:5;41180:12;41170:22;;41159:40;;;:::o;41205:139::-;41297:6;41331:5;41325:12;41315:22;;41304:40;;;:::o;41350:98::-;41401:6;41435:5;41429:12;41419:22;;41408:40;;;:::o;41454:99::-;41506:6;41540:5;41534:12;41524:22;;41513:40;;;:::o;41559:123::-;41639:4;41671;41666:3;41662:14;41654:22;;41644:38;;;:::o;41688:138::-;41783:4;41815;41810:3;41806:14;41798:22;;41788:38;;;:::o;41832:194::-;41941:11;41975:6;41970:3;41963:19;42015:4;42010:3;42006:14;41991:29;;41953:73;;;;:::o;42032:209::-;42156:11;42190:6;42185:3;42178:19;42230:4;42225:3;42221:14;42206:29;;42168:73;;;;:::o;42247:168::-;42330:11;42364:6;42359:3;42352:19;42404:4;42399:3;42395:14;42380:29;;42342:73;;;;:::o;42421:159::-;42495:11;42529:6;42524:3;42517:19;42569:4;42564:3;42560:14;42545:29;;42507:73;;;;:::o;42586:169::-;42670:11;42704:6;42699:3;42692:19;42744:4;42739:3;42735:14;42720:29;;42682:73;;;;:::o;42761:148::-;42863:11;42900:3;42885:18;;42875:34;;;;:::o;42915:305::-;42955:3;42974:20;42992:1;42974:20;:::i;:::-;42969:25;;43008:20;43026:1;43008:20;:::i;:::-;43003:25;;43162:1;43094:66;43090:74;43087:1;43084:81;43081:2;;;43168:18;;:::i;:::-;43081:2;43212:1;43209;43205:9;43198:16;;42959:261;;;;:::o;43226:191::-;43266:4;43286:20;43304:1;43286:20;:::i;:::-;43281:25;;43320:20;43338:1;43320:20;:::i;:::-;43315:25;;43359:1;43356;43353:8;43350:2;;;43364:18;;:::i;:::-;43350:2;43409:1;43406;43402:9;43394:17;;43271:146;;;;:::o;43423:96::-;43460:7;43489:24;43507:5;43489:24;:::i;:::-;43478:35;;43468:51;;;:::o;43525:90::-;43559:7;43602:5;43595:13;43588:21;43577:32;;43567:48;;;:::o;43621:149::-;43657:7;43697:66;43690:5;43686:78;43675:89;;43665:105;;;:::o;43776:118::-;43813:7;43853:34;43846:5;43842:46;43831:57;;43821:73;;;:::o;43900:126::-;43937:7;43977:42;43970:5;43966:54;43955:65;;43945:81;;;:::o;44032:77::-;44069:7;44098:5;44087:16;;44077:32;;;:::o;44115:154::-;44199:6;44194:3;44189;44176:30;44261:1;44252:6;44247:3;44243:16;44236:27;44166:103;;;:::o;44275:307::-;44343:1;44353:113;44367:6;44364:1;44361:13;44353:113;;;44452:1;44447:3;44443:11;44437:18;44433:1;44428:3;44424:11;44417:39;44389:2;44386:1;44382:10;44377:15;;44353:113;;;44484:6;44481:1;44478:13;44475:2;;;44564:1;44555:6;44550:3;44546:16;44539:27;44475:2;44324:258;;;;:::o;44588:320::-;44632:6;44669:1;44663:4;44659:12;44649:22;;44716:1;44710:4;44706:12;44737:18;44727:2;;44793:4;44785:6;44781:17;44771:27;;44727:2;44855;44847:6;44844:14;44824:18;44821:38;44818:2;;;44874:18;;:::i;:::-;44818:2;44639:269;;;;:::o;44914:281::-;44997:27;45019:4;44997:27;:::i;:::-;44989:6;44985:40;45127:6;45115:10;45112:22;45091:18;45079:10;45076:34;45073:62;45070:2;;;45138:18;;:::i;:::-;45070:2;45178:10;45174:2;45167:22;44957:238;;;:::o;45201:201::-;45240:3;45263:24;45281:5;45263:24;:::i;:::-;45254:33;;45309:34;45302:5;45299:45;45296:2;;;45347:18;;:::i;:::-;45296:2;45394:1;45387:5;45383:13;45376:20;;45244:158;;;:::o;45408:233::-;45447:3;45470:24;45488:5;45470:24;:::i;:::-;45461:33;;45516:66;45509:5;45506:77;45503:2;;;45586:18;;:::i;:::-;45503:2;45633:1;45626:5;45622:13;45615:20;;45451:190;;;:::o;45647:180::-;45695:77;45692:1;45685:88;45792:4;45789:1;45782:15;45816:4;45813:1;45806:15;45833:180;45881:77;45878:1;45871:88;45978:4;45975:1;45968:15;46002:4;45999:1;45992:15;46019:180;46067:77;46064:1;46057:88;46164:4;46161:1;46154:15;46188:4;46185:1;46178:15;46205:102;46246:6;46297:2;46293:7;46288:2;46281:5;46277:14;46273:28;46263:38;;46253:54;;;:::o;46313:230::-;46453:34;46449:1;46441:6;46437:14;46430:58;46522:13;46517:2;46509:6;46505:15;46498:38;46419:124;:::o;46549:237::-;46689:34;46685:1;46677:6;46673:14;46666:58;46758:20;46753:2;46745:6;46741:15;46734:45;46655:131;:::o;46792:225::-;46932:34;46928:1;46920:6;46916:14;46909:58;47001:8;46996:2;46988:6;46984:15;46977:33;46898:119;:::o;47023:224::-;47163:34;47159:1;47151:6;47147:14;47140:58;47232:7;47227:2;47219:6;47215:15;47208:32;47129:118;:::o;47253:178::-;47393:30;47389:1;47381:6;47377:14;47370:54;47359:72;:::o;47437:233::-;47577:34;47573:1;47565:6;47561:14;47554:58;47646:16;47641:2;47633:6;47629:15;47622:41;47543:127;:::o;47676:223::-;47816:34;47812:1;47804:6;47800:14;47793:58;47885:6;47880:2;47872:6;47868:15;47861:31;47782:117;:::o;47905:175::-;48045:27;48041:1;48033:6;48029:14;48022:51;48011:69;:::o;48086:168::-;48226:20;48222:1;48214:6;48210:14;48203:44;48192:62;:::o;48260:231::-;48400:34;48396:1;48388:6;48384:14;48377:58;48469:14;48464:2;48456:6;48452:15;48445:39;48366:125;:::o;48497:222::-;48637:34;48633:1;48625:6;48621:14;48614:58;48706:5;48701:2;48693:6;48689:15;48682:30;48603:116;:::o;48725:243::-;48865:34;48861:1;48853:6;48849:14;48842:58;48934:26;48929:2;48921:6;48917:15;48910:51;48831:137;:::o;48974:229::-;49114:34;49110:1;49102:6;49098:14;49091:58;49183:12;49178:2;49170:6;49166:15;49159:37;49080:123;:::o;49209:228::-;49349:34;49345:1;49337:6;49333:14;49326:58;49418:11;49413:2;49405:6;49401:15;49394:36;49315:122;:::o;49443:182::-;49583:34;49579:1;49571:6;49567:14;49560:58;49549:76;:::o;49631:231::-;49771:34;49767:1;49759:6;49755:14;49748:58;49840:14;49835:2;49827:6;49823:15;49816:39;49737:125;:::o;49868:182::-;50008:34;50004:1;49996:6;49992:14;49985:58;49974:76;:::o;50056:234::-;50196:34;50192:1;50184:6;50180:14;50173:58;50265:17;50260:2;50252:6;50248:15;50241:42;50162:128;:::o;50296:220::-;50436:34;50432:1;50424:6;50420:14;50413:58;50505:3;50500:2;50492:6;50488:15;50481:28;50402:114;:::o;50522:236::-;50662:34;50658:1;50650:6;50646:14;50639:58;50731:19;50726:2;50718:6;50714:15;50707:44;50628:130;:::o;50764:231::-;50904:34;50900:1;50892:6;50888:14;50881:58;50973:14;50968:2;50960:6;50956:15;50949:39;50870:125;:::o;51001:122::-;51074:24;51092:5;51074:24;:::i;:::-;51067:5;51064:35;51054:2;;51113:1;51110;51103:12;51054:2;51044:79;:::o;51129:116::-;51199:21;51214:5;51199:21;:::i;:::-;51192:5;51189:32;51179:2;;51235:1;51232;51225:12;51179:2;51169:76;:::o;51251:120::-;51323:23;51340:5;51323:23;:::i;:::-;51316:5;51313:34;51303:2;;51361:1;51358;51351:12;51303:2;51293:78;:::o;51377:122::-;51450:24;51468:5;51450:24;:::i;:::-;51443:5;51440:35;51430:2;;51489:1;51486;51479:12;51430:2;51420:79;:::o
Swarm Source
ipfs://fac763c8e46c96ae81c2eacb4e2a6d3585aa354e86e73c6ac3ec0e48bea8e335