Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
4,878 MUNBUNZ
Holders
1,377
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MUNBUNZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Bunniez
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-26 */ // SPDX-License-Identifier: MIT // __ __ _ ____ _ // | \/ | | | | _ \ (_) // | \ / |_ _ _ __ __| | __ _ _ __ ___| |_) |_ _ _ __ _ __ _ ___ ____ // | |\/| | | | | '_ \ / _` |/ _` | '_ \ / _ \ _ <| | | | '_ \| '_ \| |/ _ \_ / // | | | | |_| | | | | (_| | (_| | | | | __/ |_) | |_| | | | | | | | | __// / // |_| |_|\__,_|_| |_|\__,_|\__,_|_| |_|\___|____/ \__,_|_| |_|_| |_|_|\___/___| pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /* * @dev 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; } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { 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 {} } pragma solidity ^0.8.0; interface IBunniezMetadata { function setContractURI(string calldata URI) external; function setBaseURI(string calldata URI) external; function setRevealedBaseURI(string calldata revealedBaseURI) external; function contractURI() external view returns(string memory); } pragma solidity ^0.8.0; interface IBunniez { function addToAllowList(address[] calldata addresses) external; function onAllowList(address addr) external returns (bool); function removeFromAllowList(address[] calldata addresses) external; function allowListClaimedBy(address owner) external returns (uint256); function purchase(uint256 numberOfTokens) external payable; function purchaseAllowList(uint256 numberOfTokens) external payable; function gift(address[] calldata to) external; function setIsActive(bool isActive) external; function setIsAllowListActive(bool isAllowListActive) external; function setAllowListMaxMint(uint256 maxMint) external; function setProof(string memory proofString) external; function withdraw() external; } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } pragma solidity ^0.8.0; contract Bunniez is ERC721Enumerable, Ownable, IBunniez, IBunniezMetadata { using Strings for uint256; uint256 public constant BN_GIFT = 37; uint256 public constant BN_PUBLIC = 4851; uint256 public constant BN_MAX = BN_GIFT + BN_PUBLIC; uint256 public constant PURCHASE_LIMIT = 20; uint256 public constant PRICE = 0.05 ether; bool public isActive = false; bool public isAllowListActive = false; string public proof; uint256 public allowListMaxMint = 2; /// @dev We will use these to be able to calculate remaining correctly. uint256 public totalGiftSupply; uint256 public totalPublicSupply; mapping(address => bool) private _allowList; mapping(address => uint256) private _allowListClaimed; string private _contractURI = ''; string private _tokenBaseURI = ''; string private _tokenRevealedBaseURI = ''; constructor() ERC721("MundaneBunniez", "MUNBUNZ") {} function addToAllowList(address[] calldata addresses) external override onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { require(addresses[i] != address(0), "Can't add the null address"); _allowList[addresses[i]] = true; /** * @dev We don't want to reset _allowListClaimed count * if we try to add someone more than once. */ _allowListClaimed[addresses[i]] > 0 ? _allowListClaimed[addresses[i]] : 0; } } function onAllowList(address addr) external view override returns (bool) { return _allowList[addr]; } function removeFromAllowList(address[] calldata addresses) external override onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { require(addresses[i] != address(0), "Can't add the null address"); /// @dev We don't want to reset possible _allowListClaimed numbers. _allowList[addresses[i]] = false; } } /** * @dev We want to be able to distinguish tokens bought during isAllowListActive * and tokens bought outside of isAllowListActive */ function allowListClaimedBy(address owner) external view override returns (uint256){ require(owner != address(0), 'Zero address not on Allow List'); return _allowListClaimed[owner]; } function purchase(uint256 numberOfTokens) external override payable { require(isActive, 'Contract is not active'); require(!isAllowListActive, 'Only allowing from Allow List'); require(totalSupply() < BN_MAX, 'All tokens have been minted'); require(numberOfTokens <= PURCHASE_LIMIT, 'Would exceed PURCHASE_LIMIT'); require(totalPublicSupply < BN_PUBLIC, 'Purchase would exceed BN_PUBLIC'); require(PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient'); for (uint256 i = 0; i < numberOfTokens; i++) { /** * @dev Since they can get here while exceeding the BN_MAX, * we have to make sure to not mint any additional tokens. */ if (totalPublicSupply < BN_PUBLIC) { //@dev Public token numbering starts after BN_GIFT. //And we don't want our tokens to start at 0 but at 1. uint256 tokenId = BN_GIFT + totalPublicSupply + 1; totalPublicSupply += 1; _safeMint(msg.sender, tokenId); } } } function purchaseAllowList(uint256 numberOfTokens) external override payable { require(isActive, 'Contract is not active'); require(isAllowListActive, 'Allow List is not active'); require(_allowList[msg.sender], 'You are not on the Allow List'); require(totalSupply() < BN_MAX, 'All tokens have been minted'); require(numberOfTokens <= allowListMaxMint, 'Cannot purchase this many tokens'); require(totalPublicSupply + numberOfTokens <= BN_PUBLIC, 'Purchase would exceed BN_PUBLIC'); require(_allowListClaimed[msg.sender] + numberOfTokens <= allowListMaxMint, 'Purchase exceeds max allowed'); require(PRICE * numberOfTokens <= msg.value, 'ETH amount is not sufficient'); for (uint256 i = 0; i < numberOfTokens; i++) { //@dev Public token numbering starts after BN_GIFT. //We don't want our tokens to start at 0 but at 1. uint256 tokenId = BN_GIFT + totalPublicSupply + 1; totalPublicSupply += 1; _allowListClaimed[msg.sender] += 1; _safeMint(msg.sender, tokenId); } } function gift(address[] calldata to) external override onlyOwner { require(totalSupply() < BN_MAX, 'All tokens have been minted'); require(totalGiftSupply + to.length <= BN_GIFT, 'Not enough tokens left to gift'); for(uint256 i = 0; i < to.length; i++) { // @dev We don't want our tokens to start at 0 but at 1. uint256 tokenId = totalGiftSupply + 1; totalGiftSupply += 1; _safeMint(to[i], tokenId); } } function setIsActive(bool _isActive) external override onlyOwner { isActive = _isActive; } function setIsAllowListActive(bool _isAllowListActive) external override onlyOwner { isAllowListActive = _isAllowListActive; } function setAllowListMaxMint(uint256 maxMint) external override onlyOwner { allowListMaxMint = maxMint; } function setProof(string calldata proofString) external override onlyOwner { proof = proofString; } function withdraw() external override onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } function setContractURI(string calldata URI) external override onlyOwner { _contractURI = URI; } function setBaseURI(string calldata URI) external override onlyOwner { _tokenBaseURI = URI; } function setRevealedBaseURI(string calldata revealedBaseURI) external override onlyOwner { _tokenRevealedBaseURI = revealedBaseURI; } function contractURI() public view override returns (string memory) { return _contractURI; } function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), 'Token does not exist'); // @dev Convert string to bytes so we can check if it's empty or not. string memory revealedBaseURI = _tokenRevealedBaseURI; return bytes(revealedBaseURI).length > 0 ? string(abi.encodePacked(revealedBaseURI, tokenId.toString())) : _tokenBaseURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BN_GIFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BN_MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BN_PUBLIC","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allowListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowListMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowListActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"addr","type":"address"}],"name":"onAllowList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"proof","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"purchaseAllowList","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"maxMint","type":"uint256"}],"name":"setAllowListMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isAllowListActive","type":"bool"}],"name":"setIsAllowListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"proofString","type":"string"}],"name":"setProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"revealedBaseURI","type":"string"}],"name":"setRevealedBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506002600c5560405180602001604052806000815250601190805190602001906200006692919062000259565b5060405180602001604052806000815250601290805190602001906200008e92919062000259565b506040518060200160405280600081525060139080519060200190620000b692919062000259565b50348015620000c457600080fd5b506040518060400160405280600e81526020017f4d756e64616e6542756e6e69657a0000000000000000000000000000000000008152506040518060400160405280600781526020017f4d554e42554e5a0000000000000000000000000000000000000000000000000081525081600090805190602001906200014992919062000259565b5080600190805190602001906200016292919062000259565b50505062000185620001796200018b60201b60201c565b6200019360201b60201c565b6200036e565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002679062000309565b90600052602060002090601f0160209004810192826200028b5760008555620002d7565b82601f10620002a657805160ff1916838001178555620002d7565b82800160010185558215620002d7579182015b82811115620002d6578251825591602001919060010190620002b9565b5b509050620002e69190620002ea565b5090565b5b8082111562000305576000816000905550600101620002eb565b5090565b600060028204905060018216806200032257607f821691505b602082108114156200033957620003386200033f565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6154bc806200037e6000396000f3fe60806040526004361061027c5760003560e01c8063718bc4af1161014f578063c87b56dd116100c1578063e985e9c51161007a578063e985e9c514610995578063efef39a1146109d2578063f23347f5146109ee578063f2fde38b14610a0a578063f72ec3c814610a33578063faf924cf14610a5e5761027c565b8063c87b56dd14610881578063d6f407c7146108be578063d75e6110146108e9578063e6a5931e14610914578063e8a3d4851461093f578063e917e1a41461096a5761027c565b80638da5cb5b116101135780638da5cb5b14610787578063938e3d7b146107b257806395d89b41146107db578063a22cb46514610806578063a51312c81461082f578063b88d4fde146108585761027c565b8063718bc4af146106b65780637263cfe2146106df5780637a6685f1146107085780637f44ab2f146107315780638d859f3e1461075c5761027c565b80632750fc78116101f35780634f6ccce7116101ac5780634f6ccce71461059657806355f804b3146105d35780636352211e146105fc5780636e83843a1461063957806370a0823114610662578063715018a61461069f5761027c565b80632750fc781461048857806329fc6bae146104b15780632f745c59146104dc5780633a065892146105195780633ccfd60b1461055657806342842e0e1461056d5761027c565b806315336f801161024557806315336f801461038c578063163e1e61146103b557806318160ddd146103de57806322f3e2d41461040957806323b872dd14610434578063264a0da71461045d5761027c565b806208ffdd1461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a39190613e2c565b610a89565b6040516102b59190615027565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190614041565b610b41565b6040516102f29190614c0a565b60405180910390f35b34801561030757600080fd5b50610310610bbb565b60405161031d9190614c25565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906140d8565b610c4d565b60405161035a9190614ba3565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613f97565b610cd2565b005b34801561039857600080fd5b506103b360048036038101906103ae9190614093565b610dea565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190613fd3565b610e7c565b005b3480156103ea57600080fd5b506103f361104e565b6040516104009190615027565b60405180910390f35b34801561041557600080fd5b5061041e61105b565b60405161042b9190614c0a565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613e91565b61106e565b005b34801561046957600080fd5b506104726110ce565b60405161047f9190615027565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614018565b6110e0565b005b3480156104bd57600080fd5b506104c6611179565b6040516104d39190614c0a565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190613f97565b61118c565b6040516105109190615027565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190613e2c565b611231565b60405161054d9190614c0a565b60405180910390f35b34801561056257600080fd5b5061056b611287565b005b34801561057957600080fd5b50610594600480360381019061058f9190613e91565b611352565b005b3480156105a257600080fd5b506105bd60048036038101906105b891906140d8565b611372565b6040516105ca9190615027565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614093565b611409565b005b34801561060857600080fd5b50610623600480360381019061061e91906140d8565b61149b565b6040516106309190614ba3565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190614093565b61154d565b005b34801561066e57600080fd5b5061068960048036038101906106849190613e2c565b6115df565b6040516106969190615027565b60405180910390f35b3480156106ab57600080fd5b506106b4611697565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190614018565b61171f565b005b3480156106eb57600080fd5b5061070660048036038101906107019190613fd3565b6117b8565b005b34801561071457600080fd5b5061072f600480360381019061072a91906140d8565b611ae6565b005b34801561073d57600080fd5b50610746611b6c565b6040516107539190615027565b60405180910390f35b34801561076857600080fd5b50610771611b72565b60405161077e9190615027565b60405180910390f35b34801561079357600080fd5b5061079c611b7d565b6040516107a99190614ba3565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d49190614093565b611ba7565b005b3480156107e757600080fd5b506107f0611c39565b6040516107fd9190614c25565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613f5b565b611ccb565b005b34801561083b57600080fd5b5061085660048036038101906108519190613fd3565b611e4c565b005b34801561086457600080fd5b5061087f600480360381019061087a9190613ee0565b612050565b005b34801561088d57600080fd5b506108a860048036038101906108a391906140d8565b6120b2565b6040516108b59190614c25565b60405180910390f35b3480156108ca57600080fd5b506108d3612257565b6040516108e09190615027565b60405180910390f35b3480156108f557600080fd5b506108fe61225d565b60405161090b9190615027565b60405180910390f35b34801561092057600080fd5b50610929612262565b6040516109369190615027565b60405180910390f35b34801561094b57600080fd5b50610954612268565b6040516109619190614c25565b60405180910390f35b34801561097657600080fd5b5061097f6122fa565b60405161098c9190615027565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b79190613e55565b6122ff565b6040516109c99190614c0a565b60405180910390f35b6109ec60048036038101906109e791906140d8565b612393565b005b610a086004803603810190610a0391906140d8565b6125db565b005b348015610a1657600080fd5b50610a316004803603810190610a2c9190613e2c565b612994565b005b348015610a3f57600080fd5b50610a48612a8c565b604051610a559190615027565b60405180910390f35b348015610a6a57600080fd5b50610a73612a92565b604051610a809190614c25565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190614ec7565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bb45750610bb382612b20565b5b9050919050565b606060008054610bca906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf6906152b1565b8015610c435780601f10610c1857610100808354040283529160200191610c43565b820191906000526020600020905b815481529060010190602001808311610c2657829003601f168201915b5050505050905090565b6000610c5882612c02565b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614e87565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cdd8261149b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590614f67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6d612c6e565b73ffffffffffffffffffffffffffffffffffffffff161480610d9c5750610d9b81610d96612c6e565b6122ff565b5b610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290614de7565b60405180910390fd5b610de58383612c76565b505050565b610df2612c6e565b73ffffffffffffffffffffffffffffffffffffffff16610e10611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d90614ea7565b60405180910390fd5b8181600b9190610e77929190613c24565b505050565b610e84612c6e565b73ffffffffffffffffffffffffffffffffffffffff16610ea2611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90614ea7565b60405180910390fd5b6112f36025610f0791906150e6565b610f0f61104e565b10610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690614fe7565b60405180910390fd5b602582829050600d54610f6291906150e6565b1115610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90614f27565b60405180910390fd5b60005b828290508110156110495760006001600d54610fc291906150e6565b90506001600d6000828254610fd791906150e6565b9250508190555061103584848481811061101a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061102f9190613e2c565b82612d2f565b508080611041906152e3565b915050610fa6565b505050565b6000600880549050905090565b600a60149054906101000a900460ff1681565b61107f611079612c6e565b82612d4d565b6110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b590614f87565b60405180910390fd5b6110c9838383612e2b565b505050565b6112f360256110dd91906150e6565b81565b6110e8612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611106611b7d565b73ffffffffffffffffffffffffffffffffffffffff161461115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614ea7565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b600a60159054906101000a900460ff1681565b6000611197836115df565b82106111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90614c87565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61128f612c6e565b73ffffffffffffffffffffffffffffffffffffffff166112ad611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90614ea7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561134e573d6000803e3d6000fd5b5050565b61136d83838360405180602001604052806000815250612050565b505050565b600061137c61104e565b82106113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490614fa7565b60405180910390fd5b600882815481106113f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611411612c6e565b73ffffffffffffffffffffffffffffffffffffffff1661142f611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c90614ea7565b60405180910390fd5b818160129190611496929190613c24565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90614e27565b60405180910390fd5b80915050919050565b611555612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611573611b7d565b73ffffffffffffffffffffffffffffffffffffffff16146115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c090614ea7565b60405180910390fd5b8181601391906115da929190613c24565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790614e07565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169f612c6e565b73ffffffffffffffffffffffffffffffffffffffff166116bd611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90614ea7565b60405180910390fd5b61171d6000613087565b565b611727612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611745611b7d565b73ffffffffffffffffffffffffffffffffffffffff161461179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179290614ea7565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b6117c0612c6e565b73ffffffffffffffffffffffffffffffffffffffff166117de611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90614ea7565b60405180910390fd5b60005b82829050811015611ae157600073ffffffffffffffffffffffffffffffffffffffff16838383818110611893577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906118a89190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1614156118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690614ee7565b60405180910390fd5b6001600f600085858581811061193e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906119539190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601060008585858181106119e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906119f89190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611a3f576000611acd565b60106000848484818110611a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611a919190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611ad9906152e3565b915050611837565b505050565b611aee612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611b0c611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614ea7565b60405180910390fd5b80600c8190555050565b600c5481565b66b1a2bc2ec5000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611baf612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611bcd611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90614ea7565b60405180910390fd5b818160119190611c34929190613c24565b505050565b606060018054611c48906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c74906152b1565b8015611cc15780601f10611c9657610100808354040283529160200191611cc1565b820191906000526020600020905b815481529060010190602001808311611ca457829003601f168201915b5050505050905090565b611cd3612c6e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3890614d67565b60405180910390fd5b8060056000611d4e612c6e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dfb612c6e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e409190614c0a565b60405180910390a35050565b611e54612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611e72611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf90614ea7565b60405180910390fd5b60005b8282905081101561204b57600073ffffffffffffffffffffffffffffffffffffffff16838383818110611f27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611f3c9190613e2c565b73ffffffffffffffffffffffffffffffffffffffff161415611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90614ee7565b60405180910390fd5b6000600f6000858585818110611fd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611fe79190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612043906152e3565b915050611ecb565b505050565b61206161205b612c6e565b83612d4d565b6120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790614f87565b60405180910390fd5b6120ac8484848461314d565b50505050565b60606120bd82612c02565b6120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614d87565b60405180910390fd5b60006013805461210b906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612137906152b1565b80156121845780601f1061215957610100808354040283529160200191612184565b820191906000526020600020905b81548152906001019060200180831161216757829003601f168201915b50505050509050600081511161222457601280546121a1906152b1565b80601f01602080910402602001604051908101604052809291908181526020018280546121cd906152b1565b801561221a5780601f106121ef5761010080835404028352916020019161221a565b820191906000526020600020905b8154815290600101906020018083116121fd57829003601f168201915b505050505061224f565b8061222e846131a9565b60405160200161223f929190614b7f565b6040516020818303038152906040525b915050919050565b600d5481565b601481565b600e5481565b606060118054612277906152b1565b80601f01602080910402602001604051908101604052809291908181526020018280546122a3906152b1565b80156122f05780601f106122c5576101008083540402835291602001916122f0565b820191906000526020600020905b8154815290600101906020018083116122d357829003601f168201915b5050505050905090565b602581565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60149054906101000a900460ff166123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990614e67565b60405180910390fd5b600a60159054906101000a900460ff1615612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990614ca7565b60405180910390fd5b6112f3602561244191906150e6565b61244961104e565b10612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614fe7565b60405180910390fd5b60148111156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490614d27565b60405180910390fd5b6112f3600e5410612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90614f47565b60405180910390fd5b348166b1a2bc2ec50000612527919061516d565b1115612568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255f90614da7565b60405180910390fd5b60005b818110156125d7576112f3600e5410156125c45760006001600e54602561259291906150e6565b61259c91906150e6565b90506001600e60008282546125b191906150e6565b925050819055506125c23382612d2f565b505b80806125cf906152e3565b91505061256b565b5050565b600a60149054906101000a900460ff1661262a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262190614e67565b60405180910390fd5b600a60159054906101000a900460ff16612679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267090614c47565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90614c67565b60405180910390fd5b6112f3602561271491906150e6565b61271c61104e565b1061275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275390614fe7565b60405180910390fd5b600c548111156127a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279890615007565b60405180910390fd5b6112f381600e546127b291906150e6565b11156127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea90614f47565b60405180910390fd5b600c5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284191906150e6565b1115612882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287990614fc7565b60405180910390fd5b348166b1a2bc2ec50000612896919061516d565b11156128d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ce90614da7565b60405180910390fd5b60005b818110156129905760006001600e5460256128f591906150e6565b6128ff91906150e6565b90506001600e600082825461291491906150e6565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461296b91906150e6565b9250508190555061297c3382612d2f565b508080612988906152e3565b9150506128da565b5050565b61299c612c6e565b73ffffffffffffffffffffffffffffffffffffffff166129ba611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0790614ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7790614ce7565b60405180910390fd5b612a8981613087565b50565b6112f381565b600b8054612a9f906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612acb906152b1565b8015612b185780601f10612aed57610100808354040283529160200191612b18565b820191906000526020600020905b815481529060010190602001808311612afb57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612beb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bfb5750612bfa82613356565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ce98361149b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612d498282604051806020016040528060008152506133c0565b5050565b6000612d5882612c02565b612d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8e90614dc7565b60405180910390fd5b6000612da28361149b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e1157508373ffffffffffffffffffffffffffffffffffffffff16612df984610c4d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e225750612e2181856122ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e4b8261149b565b73ffffffffffffffffffffffffffffffffffffffff1614612ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9890614f07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0890614d47565b60405180910390fd5b612f1c83838361341b565b612f27600082612c76565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f7791906151c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fce91906150e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613158848484612e2b565b6131648484848461352f565b6131a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319a90614cc7565b60405180910390fd5b50505050565b606060008214156131f1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613351565b600082905060005b6000821461322357808061320c906152e3565b915050600a8261321c919061513c565b91506131f9565b60008167ffffffffffffffff811115613265577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132975781602001600182028036833780820191505090505b5090505b6000851461334a576001826132b091906151c7565b9150600a856132bf919061532c565b60306132cb91906150e6565b60f81b818381518110613307577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613343919061513c565b945061329b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6133ca83836136c6565b6133d7600084848461352f565b613416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340d90614cc7565b60405180910390fd5b505050565b613426838383613894565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134695761346481613899565b6134a8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134a7576134a683826138e2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134eb576134e681613a4f565b61352a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613529576135288282613b92565b5b5b505050565b60006135508473ffffffffffffffffffffffffffffffffffffffff16613c11565b156136b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613579612c6e565b8786866040518563ffffffff1660e01b815260040161359b9493929190614bbe565b602060405180830381600087803b1580156135b557600080fd5b505af19250505080156135e657506040513d601f19601f820116820180604052508101906135e3919061406a565b60015b613669573d8060008114613616576040519150601f19603f3d011682016040523d82523d6000602084013e61361b565b606091505b50600081511415613661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365890614cc7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136be565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372d90614e47565b60405180910390fd5b61373f81612c02565b1561377f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377690614d07565b60405180910390fd5b61378b6000838361341b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137db91906150e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138ef846115df565b6138f991906151c7565b90506000600760008481526020019081526020016000205490508181146139de576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a6391906151c7565b9050600060096000848152602001908152602001600020549050600060088381548110613ab9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613b9d836115df565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613c30906152b1565b90600052602060002090601f016020900481019282613c525760008555613c99565b82601f10613c6b57803560ff1916838001178555613c99565b82800160010185558215613c99579182015b82811115613c98578235825591602001919060010190613c7d565b5b509050613ca69190613caa565b5090565b5b80821115613cc3576000816000905550600101613cab565b5090565b6000613cda613cd584615073565b615042565b905082815260208101848484011115613cf257600080fd5b613cfd84828561526f565b509392505050565b600081359050613d148161542a565b92915050565b60008083601f840112613d2c57600080fd5b8235905067ffffffffffffffff811115613d4557600080fd5b602083019150836020820283011115613d5d57600080fd5b9250929050565b600081359050613d7381615441565b92915050565b600081359050613d8881615458565b92915050565b600081519050613d9d81615458565b92915050565b600082601f830112613db457600080fd5b8135613dc4848260208601613cc7565b91505092915050565b60008083601f840112613ddf57600080fd5b8235905067ffffffffffffffff811115613df857600080fd5b602083019150836001820283011115613e1057600080fd5b9250929050565b600081359050613e268161546f565b92915050565b600060208284031215613e3e57600080fd5b6000613e4c84828501613d05565b91505092915050565b60008060408385031215613e6857600080fd5b6000613e7685828601613d05565b9250506020613e8785828601613d05565b9150509250929050565b600080600060608486031215613ea657600080fd5b6000613eb486828701613d05565b9350506020613ec586828701613d05565b9250506040613ed686828701613e17565b9150509250925092565b60008060008060808587031215613ef657600080fd5b6000613f0487828801613d05565b9450506020613f1587828801613d05565b9350506040613f2687828801613e17565b925050606085013567ffffffffffffffff811115613f4357600080fd5b613f4f87828801613da3565b91505092959194509250565b60008060408385031215613f6e57600080fd5b6000613f7c85828601613d05565b9250506020613f8d85828601613d64565b9150509250929050565b60008060408385031215613faa57600080fd5b6000613fb885828601613d05565b9250506020613fc985828601613e17565b9150509250929050565b60008060208385031215613fe657600080fd5b600083013567ffffffffffffffff81111561400057600080fd5b61400c85828601613d1a565b92509250509250929050565b60006020828403121561402a57600080fd5b600061403884828501613d64565b91505092915050565b60006020828403121561405357600080fd5b600061406184828501613d79565b91505092915050565b60006020828403121561407c57600080fd5b600061408a84828501613d8e565b91505092915050565b600080602083850312156140a657600080fd5b600083013567ffffffffffffffff8111156140c057600080fd5b6140cc85828601613dcd565b92509250509250929050565b6000602082840312156140ea57600080fd5b60006140f884828501613e17565b91505092915050565b61410a816151fb565b82525050565b6141198161520d565b82525050565b600061412a826150a3565b61413481856150b9565b935061414481856020860161527e565b61414d81615419565b840191505092915050565b6000614163826150ae565b61416d81856150ca565b935061417d81856020860161527e565b61418681615419565b840191505092915050565b600061419c826150ae565b6141a681856150db565b93506141b681856020860161527e565b80840191505092915050565b60006141cf6018836150ca565b91507f416c6c6f77204c697374206973206e6f742061637469766500000000000000006000830152602082019050919050565b600061420f601d836150ca565b91507f596f7520617265206e6f74206f6e2074686520416c6c6f77204c6973740000006000830152602082019050919050565b600061424f602b836150ca565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006142b5601d836150ca565b91507f4f6e6c7920616c6c6f77696e672066726f6d20416c6c6f77204c6973740000006000830152602082019050919050565b60006142f56032836150ca565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061435b6026836150ca565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c1601c836150ca565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614401601b836150ca565b91507f576f756c64206578636565642050555243484153455f4c494d495400000000006000830152602082019050919050565b60006144416024836150ca565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144a76019836150ca565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144e76014836150ca565b91507f546f6b656e20646f6573206e6f742065786973740000000000000000000000006000830152602082019050919050565b6000614527601c836150ca565b91507f45544820616d6f756e74206973206e6f742073756666696369656e74000000006000830152602082019050919050565b6000614567602c836150ca565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006145cd6038836150ca565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614633602a836150ca565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006146996029836150ca565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ff6020836150ca565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061473f6016836150ca565b91507f436f6e7472616374206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061477f602c836150ca565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147e56020836150ca565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614825601e836150ca565b91507f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c69737400006000830152602082019050919050565b6000614865601a836150ca565b91507f43616e27742061646420746865206e756c6c20616464726573730000000000006000830152602082019050919050565b60006148a56029836150ca565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061490b601e836150ca565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420746f206769667400006000830152602082019050919050565b600061494b601f836150ca565b91507f507572636861736520776f756c642065786365656420424e5f5055424c4943006000830152602082019050919050565b600061498b6021836150ca565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149f16031836150ca565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a57602c836150ca565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614abd601c836150ca565b91507f50757263686173652065786365656473206d617820616c6c6f776564000000006000830152602082019050919050565b6000614afd601b836150ca565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b6000614b3d6020836150ca565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736000830152602082019050919050565b614b7981615265565b82525050565b6000614b8b8285614191565b9150614b978284614191565b91508190509392505050565b6000602082019050614bb86000830184614101565b92915050565b6000608082019050614bd36000830187614101565b614be06020830186614101565b614bed6040830185614b70565b8181036060830152614bff818461411f565b905095945050505050565b6000602082019050614c1f6000830184614110565b92915050565b60006020820190508181036000830152614c3f8184614158565b905092915050565b60006020820190508181036000830152614c60816141c2565b9050919050565b60006020820190508181036000830152614c8081614202565b9050919050565b60006020820190508181036000830152614ca081614242565b9050919050565b60006020820190508181036000830152614cc0816142a8565b9050919050565b60006020820190508181036000830152614ce0816142e8565b9050919050565b60006020820190508181036000830152614d008161434e565b9050919050565b60006020820190508181036000830152614d20816143b4565b9050919050565b60006020820190508181036000830152614d40816143f4565b9050919050565b60006020820190508181036000830152614d6081614434565b9050919050565b60006020820190508181036000830152614d808161449a565b9050919050565b60006020820190508181036000830152614da0816144da565b9050919050565b60006020820190508181036000830152614dc08161451a565b9050919050565b60006020820190508181036000830152614de08161455a565b9050919050565b60006020820190508181036000830152614e00816145c0565b9050919050565b60006020820190508181036000830152614e2081614626565b9050919050565b60006020820190508181036000830152614e408161468c565b9050919050565b60006020820190508181036000830152614e60816146f2565b9050919050565b60006020820190508181036000830152614e8081614732565b9050919050565b60006020820190508181036000830152614ea081614772565b9050919050565b60006020820190508181036000830152614ec0816147d8565b9050919050565b60006020820190508181036000830152614ee081614818565b9050919050565b60006020820190508181036000830152614f0081614858565b9050919050565b60006020820190508181036000830152614f2081614898565b9050919050565b60006020820190508181036000830152614f40816148fe565b9050919050565b60006020820190508181036000830152614f608161493e565b9050919050565b60006020820190508181036000830152614f808161497e565b9050919050565b60006020820190508181036000830152614fa0816149e4565b9050919050565b60006020820190508181036000830152614fc081614a4a565b9050919050565b60006020820190508181036000830152614fe081614ab0565b9050919050565b6000602082019050818103600083015261500081614af0565b9050919050565b6000602082019050818103600083015261502081614b30565b9050919050565b600060208201905061503c6000830184614b70565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615069576150686153ea565b5b8060405250919050565b600067ffffffffffffffff82111561508e5761508d6153ea565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150f182615265565b91506150fc83615265565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151315761513061535d565b5b828201905092915050565b600061514782615265565b915061515283615265565b9250826151625761516161538c565b5b828204905092915050565b600061517882615265565b915061518383615265565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151bc576151bb61535d565b5b828202905092915050565b60006151d282615265565b91506151dd83615265565b9250828210156151f0576151ef61535d565b5b828203905092915050565b600061520682615245565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561529c578082015181840152602081019050615281565b838111156152ab576000848401525b50505050565b600060028204905060018216806152c957607f821691505b602082108114156152dd576152dc6153bb565b5b50919050565b60006152ee82615265565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153215761532061535d565b5b600182019050919050565b600061533782615265565b915061534283615265565b9250826153525761535161538c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615433816151fb565b811461543e57600080fd5b50565b61544a8161520d565b811461545557600080fd5b50565b61546181615219565b811461546c57600080fd5b50565b61547881615265565b811461548357600080fd5b5056fea2646970667358221220084cdabc52f6b478528cb14c34abf052e9086a513208c5e7c9592e5823f00cd664736f6c63430008000033
Deployed Bytecode
0x60806040526004361061027c5760003560e01c8063718bc4af1161014f578063c87b56dd116100c1578063e985e9c51161007a578063e985e9c514610995578063efef39a1146109d2578063f23347f5146109ee578063f2fde38b14610a0a578063f72ec3c814610a33578063faf924cf14610a5e5761027c565b8063c87b56dd14610881578063d6f407c7146108be578063d75e6110146108e9578063e6a5931e14610914578063e8a3d4851461093f578063e917e1a41461096a5761027c565b80638da5cb5b116101135780638da5cb5b14610787578063938e3d7b146107b257806395d89b41146107db578063a22cb46514610806578063a51312c81461082f578063b88d4fde146108585761027c565b8063718bc4af146106b65780637263cfe2146106df5780637a6685f1146107085780637f44ab2f146107315780638d859f3e1461075c5761027c565b80632750fc78116101f35780634f6ccce7116101ac5780634f6ccce71461059657806355f804b3146105d35780636352211e146105fc5780636e83843a1461063957806370a0823114610662578063715018a61461069f5761027c565b80632750fc781461048857806329fc6bae146104b15780632f745c59146104dc5780633a065892146105195780633ccfd60b1461055657806342842e0e1461056d5761027c565b806315336f801161024557806315336f801461038c578063163e1e61146103b557806318160ddd146103de57806322f3e2d41461040957806323b872dd14610434578063264a0da71461045d5761027c565b806208ffdd1461028157806301ffc9a7146102be57806306fdde03146102fb578063081812fc14610326578063095ea7b314610363575b600080fd5b34801561028d57600080fd5b506102a860048036038101906102a39190613e2c565b610a89565b6040516102b59190615027565b60405180910390f35b3480156102ca57600080fd5b506102e560048036038101906102e09190614041565b610b41565b6040516102f29190614c0a565b60405180910390f35b34801561030757600080fd5b50610310610bbb565b60405161031d9190614c25565b60405180910390f35b34801561033257600080fd5b5061034d600480360381019061034891906140d8565b610c4d565b60405161035a9190614ba3565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190613f97565b610cd2565b005b34801561039857600080fd5b506103b360048036038101906103ae9190614093565b610dea565b005b3480156103c157600080fd5b506103dc60048036038101906103d79190613fd3565b610e7c565b005b3480156103ea57600080fd5b506103f361104e565b6040516104009190615027565b60405180910390f35b34801561041557600080fd5b5061041e61105b565b60405161042b9190614c0a565b60405180910390f35b34801561044057600080fd5b5061045b60048036038101906104569190613e91565b61106e565b005b34801561046957600080fd5b506104726110ce565b60405161047f9190615027565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190614018565b6110e0565b005b3480156104bd57600080fd5b506104c6611179565b6040516104d39190614c0a565b60405180910390f35b3480156104e857600080fd5b5061050360048036038101906104fe9190613f97565b61118c565b6040516105109190615027565b60405180910390f35b34801561052557600080fd5b50610540600480360381019061053b9190613e2c565b611231565b60405161054d9190614c0a565b60405180910390f35b34801561056257600080fd5b5061056b611287565b005b34801561057957600080fd5b50610594600480360381019061058f9190613e91565b611352565b005b3480156105a257600080fd5b506105bd60048036038101906105b891906140d8565b611372565b6040516105ca9190615027565b60405180910390f35b3480156105df57600080fd5b506105fa60048036038101906105f59190614093565b611409565b005b34801561060857600080fd5b50610623600480360381019061061e91906140d8565b61149b565b6040516106309190614ba3565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190614093565b61154d565b005b34801561066e57600080fd5b5061068960048036038101906106849190613e2c565b6115df565b6040516106969190615027565b60405180910390f35b3480156106ab57600080fd5b506106b4611697565b005b3480156106c257600080fd5b506106dd60048036038101906106d89190614018565b61171f565b005b3480156106eb57600080fd5b5061070660048036038101906107019190613fd3565b6117b8565b005b34801561071457600080fd5b5061072f600480360381019061072a91906140d8565b611ae6565b005b34801561073d57600080fd5b50610746611b6c565b6040516107539190615027565b60405180910390f35b34801561076857600080fd5b50610771611b72565b60405161077e9190615027565b60405180910390f35b34801561079357600080fd5b5061079c611b7d565b6040516107a99190614ba3565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d49190614093565b611ba7565b005b3480156107e757600080fd5b506107f0611c39565b6040516107fd9190614c25565b60405180910390f35b34801561081257600080fd5b5061082d60048036038101906108289190613f5b565b611ccb565b005b34801561083b57600080fd5b5061085660048036038101906108519190613fd3565b611e4c565b005b34801561086457600080fd5b5061087f600480360381019061087a9190613ee0565b612050565b005b34801561088d57600080fd5b506108a860048036038101906108a391906140d8565b6120b2565b6040516108b59190614c25565b60405180910390f35b3480156108ca57600080fd5b506108d3612257565b6040516108e09190615027565b60405180910390f35b3480156108f557600080fd5b506108fe61225d565b60405161090b9190615027565b60405180910390f35b34801561092057600080fd5b50610929612262565b6040516109369190615027565b60405180910390f35b34801561094b57600080fd5b50610954612268565b6040516109619190614c25565b60405180910390f35b34801561097657600080fd5b5061097f6122fa565b60405161098c9190615027565b60405180910390f35b3480156109a157600080fd5b506109bc60048036038101906109b79190613e55565b6122ff565b6040516109c99190614c0a565b60405180910390f35b6109ec60048036038101906109e791906140d8565b612393565b005b610a086004803603810190610a0391906140d8565b6125db565b005b348015610a1657600080fd5b50610a316004803603810190610a2c9190613e2c565b612994565b005b348015610a3f57600080fd5b50610a48612a8c565b604051610a559190615027565b60405180910390f35b348015610a6a57600080fd5b50610a73612a92565b604051610a809190614c25565b60405180910390f35b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610afa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af190614ec7565b60405180910390fd5b601060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610bb45750610bb382612b20565b5b9050919050565b606060008054610bca906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054610bf6906152b1565b8015610c435780601f10610c1857610100808354040283529160200191610c43565b820191906000526020600020905b815481529060010190602001808311610c2657829003601f168201915b5050505050905090565b6000610c5882612c02565b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e90614e87565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cdd8261149b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4590614f67565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d6d612c6e565b73ffffffffffffffffffffffffffffffffffffffff161480610d9c5750610d9b81610d96612c6e565b6122ff565b5b610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd290614de7565b60405180910390fd5b610de58383612c76565b505050565b610df2612c6e565b73ffffffffffffffffffffffffffffffffffffffff16610e10611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614610e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5d90614ea7565b60405180910390fd5b8181600b9190610e77929190613c24565b505050565b610e84612c6e565b73ffffffffffffffffffffffffffffffffffffffff16610ea2611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90614ea7565b60405180910390fd5b6112f36025610f0791906150e6565b610f0f61104e565b10610f4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4690614fe7565b60405180910390fd5b602582829050600d54610f6291906150e6565b1115610fa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9a90614f27565b60405180910390fd5b60005b828290508110156110495760006001600d54610fc291906150e6565b90506001600d6000828254610fd791906150e6565b9250508190555061103584848481811061101a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b905060200201602081019061102f9190613e2c565b82612d2f565b508080611041906152e3565b915050610fa6565b505050565b6000600880549050905090565b600a60149054906101000a900460ff1681565b61107f611079612c6e565b82612d4d565b6110be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b590614f87565b60405180910390fd5b6110c9838383612e2b565b505050565b6112f360256110dd91906150e6565b81565b6110e8612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611106611b7d565b73ffffffffffffffffffffffffffffffffffffffff161461115c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115390614ea7565b60405180910390fd5b80600a60146101000a81548160ff02191690831515021790555050565b600a60159054906101000a900460ff1681565b6000611197836115df565b82106111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf90614c87565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61128f612c6e565b73ffffffffffffffffffffffffffffffffffffffff166112ad611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611303576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fa90614ea7565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f1935050505015801561134e573d6000803e3d6000fd5b5050565b61136d83838360405180602001604052806000815250612050565b505050565b600061137c61104e565b82106113bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b490614fa7565b60405180910390fd5b600882815481106113f7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b611411612c6e565b73ffffffffffffffffffffffffffffffffffffffff1661142f611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611485576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147c90614ea7565b60405180910390fd5b818160129190611496929190613c24565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611544576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153b90614e27565b60405180910390fd5b80915050919050565b611555612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611573611b7d565b73ffffffffffffffffffffffffffffffffffffffff16146115c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c090614ea7565b60405180910390fd5b8181601391906115da929190613c24565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790614e07565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61169f612c6e565b73ffffffffffffffffffffffffffffffffffffffff166116bd611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90614ea7565b60405180910390fd5b61171d6000613087565b565b611727612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611745611b7d565b73ffffffffffffffffffffffffffffffffffffffff161461179b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179290614ea7565b60405180910390fd5b80600a60156101000a81548160ff02191690831515021790555050565b6117c0612c6e565b73ffffffffffffffffffffffffffffffffffffffff166117de611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611834576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182b90614ea7565b60405180910390fd5b60005b82829050811015611ae157600073ffffffffffffffffffffffffffffffffffffffff16838383818110611893577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906118a89190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1614156118ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f690614ee7565b60405180910390fd5b6001600f600085858581811061193e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906119539190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000601060008585858181106119e3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90506020020160208101906119f89190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411611a3f576000611acd565b60106000848484818110611a7c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611a919190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b508080611ad9906152e3565b915050611837565b505050565b611aee612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611b0c611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5990614ea7565b60405180910390fd5b80600c8190555050565b600c5481565b66b1a2bc2ec5000081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611baf612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611bcd611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1a90614ea7565b60405180910390fd5b818160119190611c34929190613c24565b505050565b606060018054611c48906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054611c74906152b1565b8015611cc15780601f10611c9657610100808354040283529160200191611cc1565b820191906000526020600020905b815481529060010190602001808311611ca457829003601f168201915b5050505050905090565b611cd3612c6e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3890614d67565b60405180910390fd5b8060056000611d4e612c6e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611dfb612c6e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e409190614c0a565b60405180910390a35050565b611e54612c6e565b73ffffffffffffffffffffffffffffffffffffffff16611e72611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614611ec8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebf90614ea7565b60405180910390fd5b60005b8282905081101561204b57600073ffffffffffffffffffffffffffffffffffffffff16838383818110611f27577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611f3c9190613e2c565b73ffffffffffffffffffffffffffffffffffffffff161415611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a90614ee7565b60405180910390fd5b6000600f6000858585818110611fd2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611fe79190613e2c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080612043906152e3565b915050611ecb565b505050565b61206161205b612c6e565b83612d4d565b6120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209790614f87565b60405180910390fd5b6120ac8484848461314d565b50505050565b60606120bd82612c02565b6120fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f390614d87565b60405180910390fd5b60006013805461210b906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612137906152b1565b80156121845780601f1061215957610100808354040283529160200191612184565b820191906000526020600020905b81548152906001019060200180831161216757829003601f168201915b50505050509050600081511161222457601280546121a1906152b1565b80601f01602080910402602001604051908101604052809291908181526020018280546121cd906152b1565b801561221a5780601f106121ef5761010080835404028352916020019161221a565b820191906000526020600020905b8154815290600101906020018083116121fd57829003601f168201915b505050505061224f565b8061222e846131a9565b60405160200161223f929190614b7f565b6040516020818303038152906040525b915050919050565b600d5481565b601481565b600e5481565b606060118054612277906152b1565b80601f01602080910402602001604051908101604052809291908181526020018280546122a3906152b1565b80156122f05780601f106122c5576101008083540402835291602001916122f0565b820191906000526020600020905b8154815290600101906020018083116122d357829003601f168201915b5050505050905090565b602581565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600a60149054906101000a900460ff166123e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d990614e67565b60405180910390fd5b600a60159054906101000a900460ff1615612432576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242990614ca7565b60405180910390fd5b6112f3602561244191906150e6565b61244961104e565b10612489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248090614fe7565b60405180910390fd5b60148111156124cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c490614d27565b60405180910390fd5b6112f3600e5410612513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250a90614f47565b60405180910390fd5b348166b1a2bc2ec50000612527919061516d565b1115612568576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255f90614da7565b60405180910390fd5b60005b818110156125d7576112f3600e5410156125c45760006001600e54602561259291906150e6565b61259c91906150e6565b90506001600e60008282546125b191906150e6565b925050819055506125c23382612d2f565b505b80806125cf906152e3565b91505061256b565b5050565b600a60149054906101000a900460ff1661262a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262190614e67565b60405180910390fd5b600a60159054906101000a900460ff16612679576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267090614c47565b60405180910390fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90614c67565b60405180910390fd5b6112f3602561271491906150e6565b61271c61104e565b1061275c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275390614fe7565b60405180910390fd5b600c548111156127a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161279890615007565b60405180910390fd5b6112f381600e546127b291906150e6565b11156127f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127ea90614f47565b60405180910390fd5b600c5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461284191906150e6565b1115612882576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161287990614fc7565b60405180910390fd5b348166b1a2bc2ec50000612896919061516d565b11156128d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128ce90614da7565b60405180910390fd5b60005b818110156129905760006001600e5460256128f591906150e6565b6128ff91906150e6565b90506001600e600082825461291491906150e6565b925050819055506001601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461296b91906150e6565b9250508190555061297c3382612d2f565b508080612988906152e3565b9150506128da565b5050565b61299c612c6e565b73ffffffffffffffffffffffffffffffffffffffff166129ba611b7d565b73ffffffffffffffffffffffffffffffffffffffff1614612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0790614ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7790614ce7565b60405180910390fd5b612a8981613087565b50565b6112f381565b600b8054612a9f906152b1565b80601f0160208091040260200160405190810160405280929190818152602001828054612acb906152b1565b8015612b185780601f10612aed57610100808354040283529160200191612b18565b820191906000526020600020905b815481529060010190602001808311612afb57829003601f168201915b505050505081565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612beb57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612bfb5750612bfa82613356565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612ce98361149b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612d498282604051806020016040528060008152506133c0565b5050565b6000612d5882612c02565b612d97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8e90614dc7565b60405180910390fd5b6000612da28361149b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480612e1157508373ffffffffffffffffffffffffffffffffffffffff16612df984610c4d565b73ffffffffffffffffffffffffffffffffffffffff16145b80612e225750612e2181856122ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612e4b8261149b565b73ffffffffffffffffffffffffffffffffffffffff1614612ea1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9890614f07565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0890614d47565b60405180910390fd5b612f1c83838361341b565b612f27600082612c76565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f7791906151c7565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fce91906150e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613158848484612e2b565b6131648484848461352f565b6131a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319a90614cc7565b60405180910390fd5b50505050565b606060008214156131f1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613351565b600082905060005b6000821461322357808061320c906152e3565b915050600a8261321c919061513c565b91506131f9565b60008167ffffffffffffffff811115613265577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156132975781602001600182028036833780820191505090505b5090505b6000851461334a576001826132b091906151c7565b9150600a856132bf919061532c565b60306132cb91906150e6565b60f81b818381518110613307577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613343919061513c565b945061329b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6133ca83836136c6565b6133d7600084848461352f565b613416576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161340d90614cc7565b60405180910390fd5b505050565b613426838383613894565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134695761346481613899565b6134a8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146134a7576134a683826138e2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134eb576134e681613a4f565b61352a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613529576135288282613b92565b5b5b505050565b60006135508473ffffffffffffffffffffffffffffffffffffffff16613c11565b156136b9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613579612c6e565b8786866040518563ffffffff1660e01b815260040161359b9493929190614bbe565b602060405180830381600087803b1580156135b557600080fd5b505af19250505080156135e657506040513d601f19601f820116820180604052508101906135e3919061406a565b60015b613669573d8060008114613616576040519150601f19603f3d011682016040523d82523d6000602084013e61361b565b606091505b50600081511415613661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161365890614cc7565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506136be565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161372d90614e47565b60405180910390fd5b61373f81612c02565b1561377f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161377690614d07565b60405180910390fd5b61378b6000838361341b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546137db91906150e6565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016138ef846115df565b6138f991906151c7565b90506000600760008481526020019081526020016000205490508181146139de576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050613a6391906151c7565b9050600060096000848152602001908152602001600020549050600060088381548110613ab9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110613b01577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613b76577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613b9d836115df565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613c30906152b1565b90600052602060002090601f016020900481019282613c525760008555613c99565b82601f10613c6b57803560ff1916838001178555613c99565b82800160010185558215613c99579182015b82811115613c98578235825591602001919060010190613c7d565b5b509050613ca69190613caa565b5090565b5b80821115613cc3576000816000905550600101613cab565b5090565b6000613cda613cd584615073565b615042565b905082815260208101848484011115613cf257600080fd5b613cfd84828561526f565b509392505050565b600081359050613d148161542a565b92915050565b60008083601f840112613d2c57600080fd5b8235905067ffffffffffffffff811115613d4557600080fd5b602083019150836020820283011115613d5d57600080fd5b9250929050565b600081359050613d7381615441565b92915050565b600081359050613d8881615458565b92915050565b600081519050613d9d81615458565b92915050565b600082601f830112613db457600080fd5b8135613dc4848260208601613cc7565b91505092915050565b60008083601f840112613ddf57600080fd5b8235905067ffffffffffffffff811115613df857600080fd5b602083019150836001820283011115613e1057600080fd5b9250929050565b600081359050613e268161546f565b92915050565b600060208284031215613e3e57600080fd5b6000613e4c84828501613d05565b91505092915050565b60008060408385031215613e6857600080fd5b6000613e7685828601613d05565b9250506020613e8785828601613d05565b9150509250929050565b600080600060608486031215613ea657600080fd5b6000613eb486828701613d05565b9350506020613ec586828701613d05565b9250506040613ed686828701613e17565b9150509250925092565b60008060008060808587031215613ef657600080fd5b6000613f0487828801613d05565b9450506020613f1587828801613d05565b9350506040613f2687828801613e17565b925050606085013567ffffffffffffffff811115613f4357600080fd5b613f4f87828801613da3565b91505092959194509250565b60008060408385031215613f6e57600080fd5b6000613f7c85828601613d05565b9250506020613f8d85828601613d64565b9150509250929050565b60008060408385031215613faa57600080fd5b6000613fb885828601613d05565b9250506020613fc985828601613e17565b9150509250929050565b60008060208385031215613fe657600080fd5b600083013567ffffffffffffffff81111561400057600080fd5b61400c85828601613d1a565b92509250509250929050565b60006020828403121561402a57600080fd5b600061403884828501613d64565b91505092915050565b60006020828403121561405357600080fd5b600061406184828501613d79565b91505092915050565b60006020828403121561407c57600080fd5b600061408a84828501613d8e565b91505092915050565b600080602083850312156140a657600080fd5b600083013567ffffffffffffffff8111156140c057600080fd5b6140cc85828601613dcd565b92509250509250929050565b6000602082840312156140ea57600080fd5b60006140f884828501613e17565b91505092915050565b61410a816151fb565b82525050565b6141198161520d565b82525050565b600061412a826150a3565b61413481856150b9565b935061414481856020860161527e565b61414d81615419565b840191505092915050565b6000614163826150ae565b61416d81856150ca565b935061417d81856020860161527e565b61418681615419565b840191505092915050565b600061419c826150ae565b6141a681856150db565b93506141b681856020860161527e565b80840191505092915050565b60006141cf6018836150ca565b91507f416c6c6f77204c697374206973206e6f742061637469766500000000000000006000830152602082019050919050565b600061420f601d836150ca565b91507f596f7520617265206e6f74206f6e2074686520416c6c6f77204c6973740000006000830152602082019050919050565b600061424f602b836150ca565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006142b5601d836150ca565b91507f4f6e6c7920616c6c6f77696e672066726f6d20416c6c6f77204c6973740000006000830152602082019050919050565b60006142f56032836150ca565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061435b6026836150ca565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143c1601c836150ca565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614401601b836150ca565b91507f576f756c64206578636565642050555243484153455f4c494d495400000000006000830152602082019050919050565b60006144416024836150ca565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006144a76019836150ca565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b60006144e76014836150ca565b91507f546f6b656e20646f6573206e6f742065786973740000000000000000000000006000830152602082019050919050565b6000614527601c836150ca565b91507f45544820616d6f756e74206973206e6f742073756666696369656e74000000006000830152602082019050919050565b6000614567602c836150ca565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006145cd6038836150ca565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614633602a836150ca565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006146996029836150ca565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006146ff6020836150ca565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061473f6016836150ca565b91507f436f6e7472616374206973206e6f7420616374697665000000000000000000006000830152602082019050919050565b600061477f602c836150ca565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006147e56020836150ca565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614825601e836150ca565b91507f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c69737400006000830152602082019050919050565b6000614865601a836150ca565b91507f43616e27742061646420746865206e756c6c20616464726573730000000000006000830152602082019050919050565b60006148a56029836150ca565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061490b601e836150ca565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420746f206769667400006000830152602082019050919050565b600061494b601f836150ca565b91507f507572636861736520776f756c642065786365656420424e5f5055424c4943006000830152602082019050919050565b600061498b6021836150ca565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149f16031836150ca565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000614a57602c836150ca565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614abd601c836150ca565b91507f50757263686173652065786365656473206d617820616c6c6f776564000000006000830152602082019050919050565b6000614afd601b836150ca565b91507f416c6c20746f6b656e732068617665206265656e206d696e74656400000000006000830152602082019050919050565b6000614b3d6020836150ca565b91507f43616e6e6f742070757263686173652074686973206d616e7920746f6b656e736000830152602082019050919050565b614b7981615265565b82525050565b6000614b8b8285614191565b9150614b978284614191565b91508190509392505050565b6000602082019050614bb86000830184614101565b92915050565b6000608082019050614bd36000830187614101565b614be06020830186614101565b614bed6040830185614b70565b8181036060830152614bff818461411f565b905095945050505050565b6000602082019050614c1f6000830184614110565b92915050565b60006020820190508181036000830152614c3f8184614158565b905092915050565b60006020820190508181036000830152614c60816141c2565b9050919050565b60006020820190508181036000830152614c8081614202565b9050919050565b60006020820190508181036000830152614ca081614242565b9050919050565b60006020820190508181036000830152614cc0816142a8565b9050919050565b60006020820190508181036000830152614ce0816142e8565b9050919050565b60006020820190508181036000830152614d008161434e565b9050919050565b60006020820190508181036000830152614d20816143b4565b9050919050565b60006020820190508181036000830152614d40816143f4565b9050919050565b60006020820190508181036000830152614d6081614434565b9050919050565b60006020820190508181036000830152614d808161449a565b9050919050565b60006020820190508181036000830152614da0816144da565b9050919050565b60006020820190508181036000830152614dc08161451a565b9050919050565b60006020820190508181036000830152614de08161455a565b9050919050565b60006020820190508181036000830152614e00816145c0565b9050919050565b60006020820190508181036000830152614e2081614626565b9050919050565b60006020820190508181036000830152614e408161468c565b9050919050565b60006020820190508181036000830152614e60816146f2565b9050919050565b60006020820190508181036000830152614e8081614732565b9050919050565b60006020820190508181036000830152614ea081614772565b9050919050565b60006020820190508181036000830152614ec0816147d8565b9050919050565b60006020820190508181036000830152614ee081614818565b9050919050565b60006020820190508181036000830152614f0081614858565b9050919050565b60006020820190508181036000830152614f2081614898565b9050919050565b60006020820190508181036000830152614f40816148fe565b9050919050565b60006020820190508181036000830152614f608161493e565b9050919050565b60006020820190508181036000830152614f808161497e565b9050919050565b60006020820190508181036000830152614fa0816149e4565b9050919050565b60006020820190508181036000830152614fc081614a4a565b9050919050565b60006020820190508181036000830152614fe081614ab0565b9050919050565b6000602082019050818103600083015261500081614af0565b9050919050565b6000602082019050818103600083015261502081614b30565b9050919050565b600060208201905061503c6000830184614b70565b92915050565b6000604051905081810181811067ffffffffffffffff82111715615069576150686153ea565b5b8060405250919050565b600067ffffffffffffffff82111561508e5761508d6153ea565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006150f182615265565b91506150fc83615265565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151315761513061535d565b5b828201905092915050565b600061514782615265565b915061515283615265565b9250826151625761516161538c565b5b828204905092915050565b600061517882615265565b915061518383615265565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156151bc576151bb61535d565b5b828202905092915050565b60006151d282615265565b91506151dd83615265565b9250828210156151f0576151ef61535d565b5b828203905092915050565b600061520682615245565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561529c578082015181840152602081019050615281565b838111156152ab576000848401525b50505050565b600060028204905060018216806152c957607f821691505b602082108114156152dd576152dc6153bb565b5b50919050565b60006152ee82615265565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156153215761532061535d565b5b600182019050919050565b600061533782615265565b915061534283615265565b9250826153525761535161538c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b615433816151fb565b811461543e57600080fd5b50565b61544a8161520d565b811461545557600080fd5b50565b61546181615219565b811461546c57600080fd5b50565b61547881615265565b811461548357600080fd5b5056fea2646970667358221220084cdabc52f6b478528cb14c34abf052e9086a513208c5e7c9592e5823f00cd664736f6c63430008000033
Deployed Bytecode Sourcemap
43973:6380:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46005:198;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37792:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20395:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21954:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21477:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49187:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48360:458;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38432:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44324:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22844:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44170:52;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48824:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44357:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38100:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45390:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49300:146;;;;;;;;;;;;;:::i;:::-;;23254:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38622:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49562:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20089:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49669:141;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19819:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36314:94;;;;;;;;;;;;;:::i;:::-;;48928:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44905:479;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49068:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44425:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44275:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35663:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49452:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20564;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22247:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45505:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23510:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49922:428;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44542:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44227:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44577:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49816:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44084:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22613:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46209:1059;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47272:1082;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36563:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44125:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44399:19;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46005:198;46080:7;46120:1;46103:19;;:5;:19;;;;46095:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46173:17;:24;46191:5;46173:24;;;;;;;;;;;;;;;;46166:31;;46005:198;;;:::o;37792:224::-;37894:4;37933:35;37918:50;;;:11;:50;;;;:90;;;;37972:36;37996:11;37972:23;:36::i;:::-;37918:90;37911:97;;37792:224;;;:::o;20395:100::-;20449:13;20482:5;20475:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20395:100;:::o;21954:221::-;22030:7;22058:16;22066:7;22058;:16::i;:::-;22050:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22143:15;:24;22159:7;22143:24;;;;;;;;;;;;;;;;;;;;;22136:31;;21954:221;;;:::o;21477:411::-;21558:13;21574:23;21589:7;21574:14;:23::i;:::-;21558:39;;21622:5;21616:11;;:2;:11;;;;21608:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21716:5;21700:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21725:37;21742:5;21749:12;:10;:12::i;:::-;21725:16;:37::i;:::-;21700:62;21678:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;21859:21;21868:2;21872:7;21859:8;:21::i;:::-;21477:411;;;:::o;49187:107::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49277:11:::1;;49269:5;:19;;;;;;;:::i;:::-;;49187:107:::0;;:::o;48360:458::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44161:4:::1;44118:2;44203:19;;;;:::i;:::-;48440:13;:11;:13::i;:::-;:22;48432:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44118:2;48527;;:9;;48509:15;;:27;;;;:::i;:::-;:38;;48501:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48595:9;48591:222;48614:2;;:9;;48610:1;:13;48591:222;;;48703:15;48739:1;48721:15;;:19;;;;:::i;:::-;48703:37;;48770:1;48751:15;;:20;;;;;;;:::i;:::-;;;;;;;;48780:25;48790:2;;48793:1;48790:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48797:7;48780:9;:25::i;:::-;48591:222;48625:3;;;;;:::i;:::-;;;;48591:222;;;;48360:458:::0;;:::o;38432:113::-;38493:7;38520:10;:17;;;;38513:24;;38432:113;:::o;44324:28::-;;;;;;;;;;;;;:::o;22844:339::-;23039:41;23058:12;:10;:12::i;:::-;23072:7;23039:18;:41::i;:::-;23031:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23147:28;23157:4;23163:2;23167:7;23147:9;:28::i;:::-;22844:339;;;:::o;44170:52::-;44161:4;44118:2;44203:19;;;;:::i;:::-;44170:52;:::o;48824:98::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48907:9:::1;48896:8;;:20;;;;;;;;;;;;;;;;;;48824:98:::0;:::o;44357:37::-;;;;;;;;;;;;;:::o;38100:256::-;38197:7;38233:23;38250:5;38233:16;:23::i;:::-;38225:5;:31;38217:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38322:12;:19;38335:5;38322:19;;;;;;;;;;;;;;;:26;38342:5;38322:26;;;;;;;;;;;;38315:33;;38100:256;;;;:::o;45390:109::-;45457:4;45477:10;:16;45488:4;45477:16;;;;;;;;;;;;;;;;;;;;;;;;;45470:23;;45390:109;;;:::o;49300:146::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49355:15:::1;49373:21;49355:39;;49411:10;49403:28;;:37;49432:7;49403:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;35954:1;49300:146::o:0;23254:185::-;23392:39;23409:4;23415:2;23419:7;23392:39;;;;;;;;;;;;:16;:39::i;:::-;23254:185;;;:::o;38622:233::-;38697:7;38733:30;:28;:30::i;:::-;38725:5;:38;38717:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38830:10;38841:5;38830:17;;;;;;;;;;;;;;;;;;;;;;;;38823:24;;38622:233;;;:::o;49562:101::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49654:3:::1;;49638:13;:19;;;;;;;:::i;:::-;;49562:101:::0;;:::o;20089:239::-;20161:7;20181:13;20197:7;:16;20205:7;20197:16;;;;;;;;;;;;;;;;;;;;;20181:32;;20249:1;20232:19;;:5;:19;;;;20224:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20315:5;20308:12;;;20089:239;;;:::o;49669:141::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49789:15:::1;;49765:21;:39;;;;;;;:::i;:::-;;49669:141:::0;;:::o;19819:208::-;19891:7;19936:1;19919:19;;:5;:19;;;;19911:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20003:9;:16;20013:5;20003:16;;;;;;;;;;;;;;;;19996:23;;19819:208;;;:::o;36314:94::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36379:21:::1;36397:1;36379:9;:21::i;:::-;36314:94::o:0;48928:134::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49038:18:::1;49018:17;;:38;;;;;;;;;;;;;;;;;;48928:134:::0;:::o;44905:479::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44999:9:::1;44994:385;45018:9;;:16;;45014:1;:20;44994:385;;;45082:1;45058:26;;:9;;45068:1;45058:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;;;45050:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45153:4;45126:10;:24;45137:9;;45147:1;45137:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45126:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;45332:1;45298:17;:31;45316:9;;45326:1;45316:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45298:31;;;;;;;;;;;;;;;;:35;:73;;45370:1;45298:73;;;45336:17;:31;45354:9;;45364:1;45354:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45336:31;;;;;;;;;;;;;;;;45298:73;;45036:3;;;;;:::i;:::-;;;;44994:385;;;;44905:479:::0;;:::o;49068:113::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49168:7:::1;49149:16;:26;;;;49068:113:::0;:::o;44425:35::-;;;;:::o;44275:42::-;44307:10;44275:42;:::o;35663:87::-;35709:7;35736:6;;;;;;;;;;;35729:13;;35663:87;:::o;49452:104::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49547:3:::1;;49532:12;:18;;;;;;;:::i;:::-;;49452:104:::0;;:::o;20564:::-;20620:13;20653:7;20646:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20564:104;:::o;22247:295::-;22362:12;:10;:12::i;:::-;22350:24;;:8;:24;;;;22342:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22462:8;22417:18;:32;22436:12;:10;:12::i;:::-;22417:32;;;;;;;;;;;;;;;:42;22450:8;22417:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22515:8;22486:48;;22501:12;:10;:12::i;:::-;22486:48;;;22525:8;22486:48;;;;;;:::i;:::-;;;;;;;;22247:295;;:::o;45505:346::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45604:9:::1;45599:247;45623:9;;:16;;45619:1;:20;45599:247;;;45687:1;45663:26;;:9;;45673:1;45663:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;;;;45655:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;45833:5;45806:10;:24;45817:9;;45827:1;45817:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45806:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;45641:3;;;;;:::i;:::-;;;;45599:247;;;;45505:346:::0;;:::o;23510:328::-;23685:41;23704:12;:10;:12::i;:::-;23718:7;23685:18;:41::i;:::-;23677:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23791:39;23805:4;23811:2;23815:7;23824:5;23791:13;:39::i;:::-;23510:328;;;;:::o;49922:428::-;49995:13;50025:16;50033:7;50025;:16::i;:::-;50017:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;50150:29;50182:21;50150:53;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50249:1;50223:15;50217:29;:33;:127;;50331:13;50217:127;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50284:15;50301:18;:7;:16;:18::i;:::-;50267:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50217:127;50210:134;;;49922:428;;;:::o;44542:30::-;;;;:::o;44227:43::-;44268:2;44227:43;:::o;44577:32::-;;;;:::o;49816:100::-;49869:13;49898:12;49891:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49816:100;:::o;44084:36::-;44118:2;44084:36;:::o;22613:164::-;22710:4;22734:18;:25;22753:5;22734:25;;;;;;;;;;;;;;;:35;22760:8;22734:35;;;;;;;;;;;;;;;;;;;;;;;;;22727:42;;22613:164;;;;:::o;46209:1059::-;46292:8;;;;;;;;;;;46284:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;46343:17;;;;;;;;;;;46342:18;46334:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;44161:4;44118:2;44203:19;;;;:::i;:::-;46409:13;:11;:13::i;:::-;:22;46401:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44268:2;46478:14;:32;;46470:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;44161:4;46557:17;;:29;46549:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46663:9;46645:14;44307:10;46637:22;;;;:::i;:::-;:35;;46629:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;46719:9;46714:549;46738:14;46734:1;:18;46714:549;;;44161:4;46924:17;;:29;46920:336;;;47121:15;47169:1;47149:17;;44118:2;47139:27;;;;:::i;:::-;:31;;;;:::i;:::-;47121:49;;47204:1;47183:17;;:22;;;;;;;:::i;:::-;;;;;;;;47216:30;47226:10;47238:7;47216:9;:30::i;:::-;46920:336;;46754:3;;;;;:::i;:::-;;;;46714:549;;;;46209:1059;:::o;47272:1082::-;47364:8;;;;;;;;;;;47356:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;47414:17;;;;;;;;;;;47406:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;47475:10;:22;47486:10;47475:22;;;;;;;;;;;;;;;;;;;;;;;;;47467:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;44161:4;44118:2;44203:19;;;;:::i;:::-;47546:13;:11;:13::i;:::-;:22;47538:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;47633:16;;47615:14;:34;;47607:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;44161:4;47721:14;47701:17;;:34;;;;:::i;:::-;:47;;47693:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;47849:16;;47831:14;47799:17;:29;47817:10;47799:29;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:66;;47791:107;;;;;;;;;;;;:::i;:::-;;;;;;;;;47939:9;47921:14;44307:10;47913:22;;;;:::i;:::-;:35;;47905:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47995:9;47990:359;48014:14;48010:1;:18;47990:359;;;48177:15;48225:1;48205:17;;44118:2;48195:27;;;;:::i;:::-;:31;;;;:::i;:::-;48177:49;;48258:1;48237:17;;:22;;;;;;;:::i;:::-;;;;;;;;48301:1;48268:17;:29;48286:10;48268:29;;;;;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;48311:30;48321:10;48333:7;48311:9;:30::i;:::-;47990:359;48030:3;;;;;:::i;:::-;;;;47990:359;;;;47272:1082;:::o;36563:192::-;35894:12;:10;:12::i;:::-;35883:23;;:7;:5;:7::i;:::-;:23;;;35875:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36672:1:::1;36652:22;;:8;:22;;;;36644:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36728:19;36738:8;36728:9;:19::i;:::-;36563:192:::0;:::o;44125:40::-;44161:4;44125:40;:::o;44399:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19450:305::-;19552:4;19604:25;19589:40;;;:11;:40;;;;:105;;;;19661:33;19646:48;;;:11;:48;;;;19589:105;:158;;;;19711:36;19735:11;19711:23;:36::i;:::-;19589:158;19569:178;;19450:305;;;:::o;25348:127::-;25413:4;25465:1;25437:30;;:7;:16;25445:7;25437:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25430:37;;25348:127;;;:::o;2951:98::-;3004:7;3031:10;3024:17;;2951:98;:::o;29330:174::-;29432:2;29405:15;:24;29421:7;29405:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29488:7;29484:2;29450:46;;29459:23;29474:7;29459:14;:23::i;:::-;29450:46;;;;;;;;;;;;29330:174;;:::o;26332:110::-;26408:26;26418:2;26422:7;26408:26;;;;;;;;;;;;:9;:26::i;:::-;26332:110;;:::o;25642:348::-;25735:4;25760:16;25768:7;25760;:16::i;:::-;25752:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25836:13;25852:23;25867:7;25852:14;:23::i;:::-;25836:39;;25905:5;25894:16;;:7;:16;;;:51;;;;25938:7;25914:31;;:20;25926:7;25914:11;:20::i;:::-;:31;;;25894:51;:87;;;;25949:32;25966:5;25973:7;25949:16;:32::i;:::-;25894:87;25886:96;;;25642:348;;;;:::o;28634:578::-;28793:4;28766:31;;:23;28781:7;28766:14;:23::i;:::-;:31;;;28758:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;28876:1;28862:16;;:2;:16;;;;28854:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;28932:39;28953:4;28959:2;28963:7;28932:20;:39::i;:::-;29036:29;29053:1;29057:7;29036:8;:29::i;:::-;29097:1;29078:9;:15;29088:4;29078:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29126:1;29109:9;:13;29119:2;29109:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29157:2;29138:7;:16;29146:7;29138:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29196:7;29192:2;29177:27;;29186:4;29177:27;;;;;;;;;;;;28634:578;;;:::o;36763:173::-;36819:16;36838:6;;;;;;;;;;;36819:25;;36864:8;36855:6;;:17;;;;;;;;;;;;;;;;;;36919:8;36888:40;;36909:8;36888:40;;;;;;;;;;;;36763:173;;:::o;24720:315::-;24877:28;24887:4;24893:2;24897:7;24877:9;:28::i;:::-;24924:48;24947:4;24953:2;24957:7;24966:5;24924:22;:48::i;:::-;24916:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24720:315;;;;:::o;32959:723::-;33015:13;33245:1;33236:5;:10;33232:53;;;33263:10;;;;;;;;;;;;;;;;;;;;;33232:53;33295:12;33310:5;33295:20;;33326:14;33351:78;33366:1;33358:4;:9;33351:78;;33384:8;;;;;:::i;:::-;;;;33415:2;33407:10;;;;;:::i;:::-;;;33351:78;;;33439:19;33471:6;33461:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33439:39;;33489:154;33505:1;33496:5;:10;33489:154;;33533:1;33523:11;;;;;:::i;:::-;;;33600:2;33592:5;:10;;;;:::i;:::-;33579:2;:24;;;;:::i;:::-;33566:39;;33549:6;33556;33549:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;33629:2;33620:11;;;;;:::i;:::-;;;33489:154;;;33667:6;33653:21;;;;;32959:723;;;;:::o;2217:157::-;2302:4;2341:25;2326:40;;;:11;:40;;;;2319:47;;2217:157;;;:::o;26669:321::-;26799:18;26805:2;26809:7;26799:5;:18::i;:::-;26850:54;26881:1;26885:2;26889:7;26898:5;26850:22;:54::i;:::-;26828:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26669:321;;;:::o;39468:589::-;39612:45;39639:4;39645:2;39649:7;39612:26;:45::i;:::-;39690:1;39674:18;;:4;:18;;;39670:187;;;39709:40;39741:7;39709:31;:40::i;:::-;39670:187;;;39779:2;39771:10;;:4;:10;;;39767:90;;39798:47;39831:4;39837:7;39798:32;:47::i;:::-;39767:90;39670:187;39885:1;39871:16;;:2;:16;;;39867:183;;;39904:45;39941:7;39904:36;:45::i;:::-;39867:183;;;39977:4;39971:10;;:2;:10;;;39967:83;;39998:40;40026:2;40030:7;39998:27;:40::i;:::-;39967:83;39867:183;39468:589;;;:::o;30069:803::-;30224:4;30245:15;:2;:13;;;:15::i;:::-;30241:624;;;30297:2;30281:36;;;30318:12;:10;:12::i;:::-;30332:4;30338:7;30347:5;30281:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30277:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30544:1;30527:6;:13;:18;30523:272;;;30570:60;;;;;;;;;;:::i;:::-;;;;;;;;30523:272;30745:6;30739:13;30730:6;30726:2;30722:15;30715:38;30277:533;30414:45;;;30404:55;;;:6;:55;;;;30397:62;;;;;30241:624;30849:4;30842:11;;30069:803;;;;;;;:::o;27326:382::-;27420:1;27406:16;;:2;:16;;;;27398:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27479:16;27487:7;27479;:16::i;:::-;27478:17;27470:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27541:45;27570:1;27574:2;27578:7;27541:20;:45::i;:::-;27616:1;27599:9;:13;27609:2;27599:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27647:2;27628:7;:16;27636:7;27628:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27692:7;27688:2;27667:33;;27684:1;27667:33;;;;;;;;;;;;27326:382;;:::o;31444:126::-;;;;:::o;40780:164::-;40884:10;:17;;;;40857:15;:24;40873:7;40857:24;;;;;;;;;;;:44;;;;40912:10;40928:7;40912:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40780:164;:::o;41571:988::-;41837:22;41887:1;41862:22;41879:4;41862:16;:22::i;:::-;:26;;;;:::i;:::-;41837:51;;41899:18;41920:17;:26;41938:7;41920:26;;;;;;;;;;;;41899:47;;42067:14;42053:10;:28;42049:328;;42098:19;42120:12;:18;42133:4;42120:18;;;;;;;;;;;;;;;:34;42139:14;42120:34;;;;;;;;;;;;42098:56;;42204:11;42171:12;:18;42184:4;42171:18;;;;;;;;;;;;;;;:30;42190:10;42171:30;;;;;;;;;;;:44;;;;42321:10;42288:17;:30;42306:11;42288:30;;;;;;;;;;;:43;;;;42049:328;;42473:17;:26;42491:7;42473:26;;;;;;;;;;;42466:33;;;42517:12;:18;42530:4;42517:18;;;;;;;;;;;;;;;:34;42536:14;42517:34;;;;;;;;;;;42510:41;;;41571:988;;;;:::o;42854:1079::-;43107:22;43152:1;43132:10;:17;;;;:21;;;;:::i;:::-;43107:46;;43164:18;43185:15;:24;43201:7;43185:24;;;;;;;;;;;;43164:45;;43536:19;43558:10;43569:14;43558:26;;;;;;;;;;;;;;;;;;;;;;;;43536:48;;43622:11;43597:10;43608;43597:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;43733:10;43702:15;:28;43718:11;43702:28;;;;;;;;;;;:41;;;;43874:15;:24;43890:7;43874:24;;;;;;;;;;;43867:31;;;43909:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42854:1079;;;;:::o;40358:221::-;40443:14;40460:20;40477:2;40460:16;:20::i;:::-;40443:37;;40518:7;40491:12;:16;40504:2;40491:16;;;;;;;;;;;;;;;:24;40508:6;40491:24;;;;;;;;;;;:34;;;;40565:6;40536:17;:26;40554:7;40536:26;;;;;;;;;;;:35;;;;40358:221;;;:::o;3877:387::-;3937:4;4145:12;4212:7;4200:20;4192:28;;4255:1;4248:4;:8;4241:15;;;3877:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:139::-;;439:6;426:20;417:29;;455:33;482:5;455:33;:::i;:::-;407:87;;;;:::o;517:367::-;;;650:3;643:4;635:6;631:17;627:27;617:2;;668:1;665;658:12;617:2;704:6;691:20;681:30;;734:18;726:6;723:30;720:2;;;766:1;763;756:12;720:2;803:4;795:6;791:17;779:29;;857:3;849:4;841:6;837:17;827:8;823:32;820:41;817:2;;;874:1;871;864:12;817:2;607:277;;;;;:::o;890:133::-;;971:6;958:20;949:29;;987:30;1011:5;987:30;:::i;:::-;939:84;;;;:::o;1029:137::-;;1112:6;1099:20;1090:29;;1128:32;1154:5;1128:32;:::i;:::-;1080:86;;;;:::o;1172:141::-;;1259:6;1253:13;1244:22;;1275:32;1301:5;1275:32;:::i;:::-;1234:79;;;;:::o;1332:271::-;;1436:3;1429:4;1421:6;1417:17;1413:27;1403:2;;1454:1;1451;1444:12;1403:2;1494:6;1481:20;1519:78;1593:3;1585:6;1578:4;1570:6;1566:17;1519:78;:::i;:::-;1510:87;;1393:210;;;;;:::o;1623:352::-;;;1741:3;1734:4;1726:6;1722:17;1718:27;1708:2;;1759:1;1756;1749:12;1708:2;1795:6;1782:20;1772:30;;1825:18;1817:6;1814:30;1811:2;;;1857:1;1854;1847:12;1811:2;1894:4;1886:6;1882:17;1870:29;;1948:3;1940:4;1932:6;1928:17;1918:8;1914:32;1911:41;1908:2;;;1965:1;1962;1955:12;1908:2;1698:277;;;;;:::o;1981:139::-;;2065:6;2052:20;2043:29;;2081:33;2108:5;2081:33;:::i;:::-;2033:87;;;;:::o;2126:262::-;;2234:2;2222:9;2213:7;2209:23;2205:32;2202:2;;;2250:1;2247;2240:12;2202:2;2293:1;2318:53;2363:7;2354:6;2343:9;2339:22;2318:53;:::i;:::-;2308:63;;2264:117;2192:196;;;;:::o;2394:407::-;;;2519:2;2507:9;2498:7;2494:23;2490:32;2487:2;;;2535:1;2532;2525:12;2487:2;2578:1;2603:53;2648:7;2639:6;2628:9;2624:22;2603:53;:::i;:::-;2593:63;;2549:117;2705:2;2731:53;2776:7;2767:6;2756:9;2752:22;2731:53;:::i;:::-;2721:63;;2676:118;2477:324;;;;;:::o;2807:552::-;;;;2949:2;2937:9;2928:7;2924:23;2920:32;2917:2;;;2965:1;2962;2955:12;2917:2;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;3263:2;3289:53;3334:7;3325:6;3314:9;3310:22;3289:53;:::i;:::-;3279:63;;3234:118;2907:452;;;;;:::o;3365:809::-;;;;;3533:3;3521:9;3512:7;3508:23;3504:33;3501:2;;;3550:1;3547;3540:12;3501:2;3593:1;3618:53;3663:7;3654:6;3643:9;3639:22;3618:53;:::i;:::-;3608:63;;3564:117;3720:2;3746:53;3791:7;3782:6;3771:9;3767:22;3746:53;:::i;:::-;3736:63;;3691:118;3848:2;3874:53;3919:7;3910:6;3899:9;3895:22;3874:53;:::i;:::-;3864:63;;3819:118;4004:2;3993:9;3989:18;3976:32;4035:18;4027:6;4024:30;4021:2;;;4067:1;4064;4057:12;4021:2;4095:62;4149:7;4140:6;4129:9;4125:22;4095:62;:::i;:::-;4085:72;;3947:220;3491:683;;;;;;;:::o;4180:401::-;;;4302:2;4290:9;4281:7;4277:23;4273:32;4270:2;;;4318:1;4315;4308:12;4270:2;4361:1;4386:53;4431:7;4422:6;4411:9;4407:22;4386:53;:::i;:::-;4376:63;;4332:117;4488:2;4514:50;4556:7;4547:6;4536:9;4532:22;4514:50;:::i;:::-;4504:60;;4459:115;4260:321;;;;;:::o;4587:407::-;;;4712:2;4700:9;4691:7;4687:23;4683:32;4680:2;;;4728:1;4725;4718:12;4680:2;4771:1;4796:53;4841:7;4832:6;4821:9;4817:22;4796:53;:::i;:::-;4786:63;;4742:117;4898:2;4924:53;4969:7;4960:6;4949:9;4945:22;4924:53;:::i;:::-;4914:63;;4869:118;4670:324;;;;;:::o;5000:425::-;;;5143:2;5131:9;5122:7;5118:23;5114:32;5111:2;;;5159:1;5156;5149:12;5111:2;5230:1;5219:9;5215:17;5202:31;5260:18;5252:6;5249:30;5246:2;;;5292:1;5289;5282:12;5246:2;5328:80;5400:7;5391:6;5380:9;5376:22;5328:80;:::i;:::-;5310:98;;;;5173:245;5101:324;;;;;:::o;5431:256::-;;5536:2;5524:9;5515:7;5511:23;5507:32;5504:2;;;5552:1;5549;5542:12;5504:2;5595:1;5620:50;5662:7;5653:6;5642:9;5638:22;5620:50;:::i;:::-;5610:60;;5566:114;5494:193;;;;:::o;5693:260::-;;5800:2;5788:9;5779:7;5775:23;5771:32;5768:2;;;5816:1;5813;5806:12;5768:2;5859:1;5884:52;5928:7;5919:6;5908:9;5904:22;5884:52;:::i;:::-;5874:62;;5830:116;5758:195;;;;:::o;5959:282::-;;6077:2;6065:9;6056:7;6052:23;6048:32;6045:2;;;6093:1;6090;6083:12;6045:2;6136:1;6161:63;6216:7;6207:6;6196:9;6192:22;6161:63;:::i;:::-;6151:73;;6107:127;6035:206;;;;:::o;6247:395::-;;;6375:2;6363:9;6354:7;6350:23;6346:32;6343:2;;;6391:1;6388;6381:12;6343:2;6462:1;6451:9;6447:17;6434:31;6492:18;6484:6;6481:30;6478:2;;;6524:1;6521;6514:12;6478:2;6560:65;6617:7;6608:6;6597:9;6593:22;6560:65;:::i;:::-;6542:83;;;;6405:230;6333:309;;;;;:::o;6648:262::-;;6756:2;6744:9;6735:7;6731:23;6727:32;6724:2;;;6772:1;6769;6762:12;6724:2;6815:1;6840:53;6885:7;6876:6;6865:9;6861:22;6840:53;:::i;:::-;6830:63;;6786:117;6714:196;;;;:::o;6916:118::-;7003:24;7021:5;7003:24;:::i;:::-;6998:3;6991:37;6981:53;;:::o;7040:109::-;7121:21;7136:5;7121:21;:::i;:::-;7116:3;7109:34;7099:50;;:::o;7155:360::-;;7269:38;7301:5;7269:38;:::i;:::-;7323:70;7386:6;7381:3;7323:70;:::i;:::-;7316:77;;7402:52;7447:6;7442:3;7435:4;7428:5;7424:16;7402:52;:::i;:::-;7479:29;7501:6;7479:29;:::i;:::-;7474:3;7470:39;7463:46;;7245:270;;;;;:::o;7521:364::-;;7637:39;7670:5;7637:39;:::i;:::-;7692:71;7756:6;7751:3;7692:71;:::i;:::-;7685:78;;7772:52;7817:6;7812:3;7805:4;7798:5;7794:16;7772:52;:::i;:::-;7849:29;7871:6;7849:29;:::i;:::-;7844:3;7840:39;7833:46;;7613:272;;;;;:::o;7891:377::-;;8025:39;8058:5;8025:39;:::i;:::-;8080:89;8162:6;8157:3;8080:89;:::i;:::-;8073:96;;8178:52;8223:6;8218:3;8211:4;8204:5;8200:16;8178:52;:::i;:::-;8255:6;8250:3;8246:16;8239:23;;8001:267;;;;;:::o;8274:322::-;;8437:67;8501:2;8496:3;8437:67;:::i;:::-;8430:74;;8534:26;8530:1;8525:3;8521:11;8514:47;8587:2;8582:3;8578:12;8571:19;;8420:176;;;:::o;8602:327::-;;8765:67;8829:2;8824:3;8765:67;:::i;:::-;8758:74;;8862:31;8858:1;8853:3;8849:11;8842:52;8920:2;8915:3;8911:12;8904:19;;8748:181;;;:::o;8935:375::-;;9098:67;9162:2;9157:3;9098:67;:::i;:::-;9091:74;;9195:34;9191:1;9186:3;9182:11;9175:55;9261:13;9256:2;9251:3;9247:12;9240:35;9301:2;9296:3;9292:12;9285:19;;9081:229;;;:::o;9316:327::-;;9479:67;9543:2;9538:3;9479:67;:::i;:::-;9472:74;;9576:31;9572:1;9567:3;9563:11;9556:52;9634:2;9629:3;9625:12;9618:19;;9462:181;;;:::o;9649:382::-;;9812:67;9876:2;9871:3;9812:67;:::i;:::-;9805:74;;9909:34;9905:1;9900:3;9896:11;9889:55;9975:20;9970:2;9965:3;9961:12;9954:42;10022:2;10017:3;10013:12;10006:19;;9795:236;;;:::o;10037:370::-;;10200:67;10264:2;10259:3;10200:67;:::i;:::-;10193:74;;10297:34;10293:1;10288:3;10284:11;10277:55;10363:8;10358:2;10353:3;10349:12;10342:30;10398:2;10393:3;10389:12;10382:19;;10183:224;;;:::o;10413:326::-;;10576:67;10640:2;10635:3;10576:67;:::i;:::-;10569:74;;10673:30;10669:1;10664:3;10660:11;10653:51;10730:2;10725:3;10721:12;10714:19;;10559:180;;;:::o;10745:325::-;;10908:67;10972:2;10967:3;10908:67;:::i;:::-;10901:74;;11005:29;11001:1;10996:3;10992:11;10985:50;11061:2;11056:3;11052:12;11045:19;;10891:179;;;:::o;11076:368::-;;11239:67;11303:2;11298:3;11239:67;:::i;:::-;11232:74;;11336:34;11332:1;11327:3;11323:11;11316:55;11402:6;11397:2;11392:3;11388:12;11381:28;11435:2;11430:3;11426:12;11419:19;;11222:222;;;:::o;11450:323::-;;11613:67;11677:2;11672:3;11613:67;:::i;:::-;11606:74;;11710:27;11706:1;11701:3;11697:11;11690:48;11764:2;11759:3;11755:12;11748:19;;11596:177;;;:::o;11779:318::-;;11942:67;12006:2;12001:3;11942:67;:::i;:::-;11935:74;;12039:22;12035:1;12030:3;12026:11;12019:43;12088:2;12083:3;12079:12;12072:19;;11925:172;;;:::o;12103:326::-;;12266:67;12330:2;12325:3;12266:67;:::i;:::-;12259:74;;12363:30;12359:1;12354:3;12350:11;12343:51;12420:2;12415:3;12411:12;12404:19;;12249:180;;;:::o;12435:376::-;;12598:67;12662:2;12657:3;12598:67;:::i;:::-;12591:74;;12695:34;12691:1;12686:3;12682:11;12675:55;12761:14;12756:2;12751:3;12747:12;12740:36;12802:2;12797:3;12793:12;12786:19;;12581:230;;;:::o;12817:388::-;;12980:67;13044:2;13039:3;12980:67;:::i;:::-;12973:74;;13077:34;13073:1;13068:3;13064:11;13057:55;13143:26;13138:2;13133:3;13129:12;13122:48;13196:2;13191:3;13187:12;13180:19;;12963:242;;;:::o;13211:374::-;;13374:67;13438:2;13433:3;13374:67;:::i;:::-;13367:74;;13471:34;13467:1;13462:3;13458:11;13451:55;13537:12;13532:2;13527:3;13523:12;13516:34;13576:2;13571:3;13567:12;13560:19;;13357:228;;;:::o;13591:373::-;;13754:67;13818:2;13813:3;13754:67;:::i;:::-;13747:74;;13851:34;13847:1;13842:3;13838:11;13831:55;13917:11;13912:2;13907:3;13903:12;13896:33;13955:2;13950:3;13946:12;13939:19;;13737:227;;;:::o;13970:330::-;;14133:67;14197:2;14192:3;14133:67;:::i;:::-;14126:74;;14230:34;14226:1;14221:3;14217:11;14210:55;14291:2;14286:3;14282:12;14275:19;;14116:184;;;:::o;14306:320::-;;14469:67;14533:2;14528:3;14469:67;:::i;:::-;14462:74;;14566:24;14562:1;14557:3;14553:11;14546:45;14617:2;14612:3;14608:12;14601:19;;14452:174;;;:::o;14632:376::-;;14795:67;14859:2;14854:3;14795:67;:::i;:::-;14788:74;;14892:34;14888:1;14883:3;14879:11;14872:55;14958:14;14953:2;14948:3;14944:12;14937:36;14999:2;14994:3;14990:12;14983:19;;14778:230;;;:::o;15014:330::-;;15177:67;15241:2;15236:3;15177:67;:::i;:::-;15170:74;;15274:34;15270:1;15265:3;15261:11;15254:55;15335:2;15330:3;15326:12;15319:19;;15160:184;;;:::o;15350:328::-;;15513:67;15577:2;15572:3;15513:67;:::i;:::-;15506:74;;15610:32;15606:1;15601:3;15597:11;15590:53;15669:2;15664:3;15660:12;15653:19;;15496:182;;;:::o;15684:324::-;;15847:67;15911:2;15906:3;15847:67;:::i;:::-;15840:74;;15944:28;15940:1;15935:3;15931:11;15924:49;15999:2;15994:3;15990:12;15983:19;;15830:178;;;:::o;16014:373::-;;16177:67;16241:2;16236:3;16177:67;:::i;:::-;16170:74;;16274:34;16270:1;16265:3;16261:11;16254:55;16340:11;16335:2;16330:3;16326:12;16319:33;16378:2;16373:3;16369:12;16362:19;;16160:227;;;:::o;16393:328::-;;16556:67;16620:2;16615:3;16556:67;:::i;:::-;16549:74;;16653:32;16649:1;16644:3;16640:11;16633:53;16712:2;16707:3;16703:12;16696:19;;16539:182;;;:::o;16727:329::-;;16890:67;16954:2;16949:3;16890:67;:::i;:::-;16883:74;;16987:33;16983:1;16978:3;16974:11;16967:54;17047:2;17042:3;17038:12;17031:19;;16873:183;;;:::o;17062:365::-;;17225:67;17289:2;17284:3;17225:67;:::i;:::-;17218:74;;17322:34;17318:1;17313:3;17309:11;17302:55;17388:3;17383:2;17378:3;17374:12;17367:25;17418:2;17413:3;17409:12;17402:19;;17208:219;;;:::o;17433:381::-;;17596:67;17660:2;17655:3;17596:67;:::i;:::-;17589:74;;17693:34;17689:1;17684:3;17680:11;17673:55;17759:19;17754:2;17749:3;17745:12;17738:41;17805:2;17800:3;17796:12;17789:19;;17579:235;;;:::o;17820:376::-;;17983:67;18047:2;18042:3;17983:67;:::i;:::-;17976:74;;18080:34;18076:1;18071:3;18067:11;18060:55;18146:14;18141:2;18136:3;18132:12;18125:36;18187:2;18182:3;18178:12;18171:19;;17966:230;;;:::o;18202:326::-;;18365:67;18429:2;18424:3;18365:67;:::i;:::-;18358:74;;18462:30;18458:1;18453:3;18449:11;18442:51;18519:2;18514:3;18510:12;18503:19;;18348:180;;;:::o;18534:325::-;;18697:67;18761:2;18756:3;18697:67;:::i;:::-;18690:74;;18794:29;18790:1;18785:3;18781:11;18774:50;18850:2;18845:3;18841:12;18834:19;;18680:179;;;:::o;18865:330::-;;19028:67;19092:2;19087:3;19028:67;:::i;:::-;19021:74;;19125:34;19121:1;19116:3;19112:11;19105:55;19186:2;19181:3;19177:12;19170:19;;19011:184;;;:::o;19201:118::-;19288:24;19306:5;19288:24;:::i;:::-;19283:3;19276:37;19266:53;;:::o;19325:435::-;;19527:95;19618:3;19609:6;19527:95;:::i;:::-;19520:102;;19639:95;19730:3;19721:6;19639:95;:::i;:::-;19632:102;;19751:3;19744:10;;19509:251;;;;;:::o;19766:222::-;;19897:2;19886:9;19882:18;19874:26;;19910:71;19978:1;19967:9;19963:17;19954:6;19910:71;:::i;:::-;19864:124;;;;:::o;19994:640::-;;20227:3;20216:9;20212:19;20204:27;;20241:71;20309:1;20298:9;20294:17;20285:6;20241:71;:::i;:::-;20322:72;20390:2;20379:9;20375:18;20366:6;20322:72;:::i;:::-;20404;20472:2;20461:9;20457:18;20448:6;20404:72;:::i;:::-;20523:9;20517:4;20513:20;20508:2;20497:9;20493:18;20486:48;20551:76;20622:4;20613:6;20551:76;:::i;:::-;20543:84;;20194:440;;;;;;;:::o;20640:210::-;;20765:2;20754:9;20750:18;20742:26;;20778:65;20840:1;20829:9;20825:17;20816:6;20778:65;:::i;:::-;20732:118;;;;:::o;20856:313::-;;21007:2;20996:9;20992:18;20984:26;;21056:9;21050:4;21046:20;21042:1;21031:9;21027:17;21020:47;21084:78;21157:4;21148:6;21084:78;:::i;:::-;21076:86;;20974:195;;;;:::o;21175:419::-;;21379:2;21368:9;21364:18;21356:26;;21428:9;21422:4;21418:20;21414:1;21403:9;21399:17;21392:47;21456:131;21582:4;21456:131;:::i;:::-;21448:139;;21346:248;;;:::o;21600:419::-;;21804:2;21793:9;21789:18;21781:26;;21853:9;21847:4;21843:20;21839:1;21828:9;21824:17;21817:47;21881:131;22007:4;21881:131;:::i;:::-;21873:139;;21771:248;;;:::o;22025:419::-;;22229:2;22218:9;22214:18;22206:26;;22278:9;22272:4;22268:20;22264:1;22253:9;22249:17;22242:47;22306:131;22432:4;22306:131;:::i;:::-;22298:139;;22196:248;;;:::o;22450:419::-;;22654:2;22643:9;22639:18;22631:26;;22703:9;22697:4;22693:20;22689:1;22678:9;22674:17;22667:47;22731:131;22857:4;22731:131;:::i;:::-;22723:139;;22621:248;;;:::o;22875:419::-;;23079:2;23068:9;23064:18;23056:26;;23128:9;23122:4;23118:20;23114:1;23103:9;23099:17;23092:47;23156:131;23282:4;23156:131;:::i;:::-;23148:139;;23046:248;;;:::o;23300:419::-;;23504:2;23493:9;23489:18;23481:26;;23553:9;23547:4;23543:20;23539:1;23528:9;23524:17;23517:47;23581:131;23707:4;23581:131;:::i;:::-;23573:139;;23471:248;;;:::o;23725:419::-;;23929:2;23918:9;23914:18;23906:26;;23978:9;23972:4;23968:20;23964:1;23953:9;23949:17;23942:47;24006:131;24132:4;24006:131;:::i;:::-;23998:139;;23896:248;;;:::o;24150:419::-;;24354:2;24343:9;24339:18;24331:26;;24403:9;24397:4;24393:20;24389:1;24378:9;24374:17;24367:47;24431:131;24557:4;24431:131;:::i;:::-;24423:139;;24321:248;;;:::o;24575:419::-;;24779:2;24768:9;24764:18;24756:26;;24828:9;24822:4;24818:20;24814:1;24803:9;24799:17;24792:47;24856:131;24982:4;24856:131;:::i;:::-;24848:139;;24746:248;;;:::o;25000:419::-;;25204:2;25193:9;25189:18;25181:26;;25253:9;25247:4;25243:20;25239:1;25228:9;25224:17;25217:47;25281:131;25407:4;25281:131;:::i;:::-;25273:139;;25171:248;;;:::o;25425:419::-;;25629:2;25618:9;25614:18;25606:26;;25678:9;25672:4;25668:20;25664:1;25653:9;25649:17;25642:47;25706:131;25832:4;25706:131;:::i;:::-;25698:139;;25596:248;;;:::o;25850:419::-;;26054:2;26043:9;26039:18;26031:26;;26103:9;26097:4;26093:20;26089:1;26078:9;26074:17;26067:47;26131:131;26257:4;26131:131;:::i;:::-;26123:139;;26021:248;;;:::o;26275:419::-;;26479:2;26468:9;26464:18;26456:26;;26528:9;26522:4;26518:20;26514:1;26503:9;26499:17;26492:47;26556:131;26682:4;26556:131;:::i;:::-;26548:139;;26446:248;;;:::o;26700:419::-;;26904:2;26893:9;26889:18;26881:26;;26953:9;26947:4;26943:20;26939:1;26928:9;26924:17;26917:47;26981:131;27107:4;26981:131;:::i;:::-;26973:139;;26871:248;;;:::o;27125:419::-;;27329:2;27318:9;27314:18;27306:26;;27378:9;27372:4;27368:20;27364:1;27353:9;27349:17;27342:47;27406:131;27532:4;27406:131;:::i;:::-;27398:139;;27296:248;;;:::o;27550:419::-;;27754:2;27743:9;27739:18;27731:26;;27803:9;27797:4;27793:20;27789:1;27778:9;27774:17;27767:47;27831:131;27957:4;27831:131;:::i;:::-;27823:139;;27721:248;;;:::o;27975:419::-;;28179:2;28168:9;28164:18;28156:26;;28228:9;28222:4;28218:20;28214:1;28203:9;28199:17;28192:47;28256:131;28382:4;28256:131;:::i;:::-;28248:139;;28146:248;;;:::o;28400:419::-;;28604:2;28593:9;28589:18;28581:26;;28653:9;28647:4;28643:20;28639:1;28628:9;28624:17;28617:47;28681:131;28807:4;28681:131;:::i;:::-;28673:139;;28571:248;;;:::o;28825:419::-;;29029:2;29018:9;29014:18;29006:26;;29078:9;29072:4;29068:20;29064:1;29053:9;29049:17;29042:47;29106:131;29232:4;29106:131;:::i;:::-;29098:139;;28996:248;;;:::o;29250:419::-;;29454:2;29443:9;29439:18;29431:26;;29503:9;29497:4;29493:20;29489:1;29478:9;29474:17;29467:47;29531:131;29657:4;29531:131;:::i;:::-;29523:139;;29421:248;;;:::o;29675:419::-;;29879:2;29868:9;29864:18;29856:26;;29928:9;29922:4;29918:20;29914:1;29903:9;29899:17;29892:47;29956:131;30082:4;29956:131;:::i;:::-;29948:139;;29846:248;;;:::o;30100:419::-;;30304:2;30293:9;30289:18;30281:26;;30353:9;30347:4;30343:20;30339:1;30328:9;30324:17;30317:47;30381:131;30507:4;30381:131;:::i;:::-;30373:139;;30271:248;;;:::o;30525:419::-;;30729:2;30718:9;30714:18;30706:26;;30778:9;30772:4;30768:20;30764:1;30753:9;30749:17;30742:47;30806:131;30932:4;30806:131;:::i;:::-;30798:139;;30696:248;;;:::o;30950:419::-;;31154:2;31143:9;31139:18;31131:26;;31203:9;31197:4;31193:20;31189:1;31178:9;31174:17;31167:47;31231:131;31357:4;31231:131;:::i;:::-;31223:139;;31121:248;;;:::o;31375:419::-;;31579:2;31568:9;31564:18;31556:26;;31628:9;31622:4;31618:20;31614:1;31603:9;31599:17;31592:47;31656:131;31782:4;31656:131;:::i;:::-;31648:139;;31546:248;;;:::o;31800:419::-;;32004:2;31993:9;31989:18;31981:26;;32053:9;32047:4;32043:20;32039:1;32028:9;32024:17;32017:47;32081:131;32207:4;32081:131;:::i;:::-;32073:139;;31971:248;;;:::o;32225:419::-;;32429:2;32418:9;32414:18;32406:26;;32478:9;32472:4;32468:20;32464:1;32453:9;32449:17;32442:47;32506:131;32632:4;32506:131;:::i;:::-;32498:139;;32396:248;;;:::o;32650:419::-;;32854:2;32843:9;32839:18;32831:26;;32903:9;32897:4;32893:20;32889:1;32878:9;32874:17;32867:47;32931:131;33057:4;32931:131;:::i;:::-;32923:139;;32821:248;;;:::o;33075:419::-;;33279:2;33268:9;33264:18;33256:26;;33328:9;33322:4;33318:20;33314:1;33303:9;33299:17;33292:47;33356:131;33482:4;33356:131;:::i;:::-;33348:139;;33246:248;;;:::o;33500:419::-;;33704:2;33693:9;33689:18;33681:26;;33753:9;33747:4;33743:20;33739:1;33728:9;33724:17;33717:47;33781:131;33907:4;33781:131;:::i;:::-;33773:139;;33671:248;;;:::o;33925:419::-;;34129:2;34118:9;34114:18;34106:26;;34178:9;34172:4;34168:20;34164:1;34153:9;34149:17;34142:47;34206:131;34332:4;34206:131;:::i;:::-;34198:139;;34096:248;;;:::o;34350:222::-;;34481:2;34470:9;34466:18;34458:26;;34494:71;34562:1;34551:9;34547:17;34538:6;34494:71;:::i;:::-;34448:124;;;;:::o;34578:283::-;;34644:2;34638:9;34628:19;;34686:4;34678:6;34674:17;34793:6;34781:10;34778:22;34757:18;34745:10;34742:34;34739:62;34736:2;;;34804:18;;:::i;:::-;34736:2;34844:10;34840:2;34833:22;34618:243;;;;:::o;34867:331::-;;35018:18;35010:6;35007:30;35004:2;;;35040:18;;:::i;:::-;35004:2;35125:4;35121:9;35114:4;35106:6;35102:17;35098:33;35090:41;;35186:4;35180;35176:15;35168:23;;34933:265;;;:::o;35204:98::-;;35289:5;35283:12;35273:22;;35262:40;;;:::o;35308:99::-;;35394:5;35388:12;35378:22;;35367:40;;;:::o;35413:168::-;;35530:6;35525:3;35518:19;35570:4;35565:3;35561:14;35546:29;;35508:73;;;;:::o;35587:169::-;;35705:6;35700:3;35693:19;35745:4;35740:3;35736:14;35721:29;;35683:73;;;;:::o;35762:148::-;;35901:3;35886:18;;35876:34;;;;:::o;35916:305::-;;35975:20;35993:1;35975:20;:::i;:::-;35970:25;;36009:20;36027:1;36009:20;:::i;:::-;36004:25;;36163:1;36095:66;36091:74;36088:1;36085:81;36082:2;;;36169:18;;:::i;:::-;36082:2;36213:1;36210;36206:9;36199:16;;35960:261;;;;:::o;36227:185::-;;36284:20;36302:1;36284:20;:::i;:::-;36279:25;;36318:20;36336:1;36318:20;:::i;:::-;36313:25;;36357:1;36347:2;;36362:18;;:::i;:::-;36347:2;36404:1;36401;36397:9;36392:14;;36269:143;;;;:::o;36418:348::-;;36481:20;36499:1;36481:20;:::i;:::-;36476:25;;36515:20;36533:1;36515:20;:::i;:::-;36510:25;;36703:1;36635:66;36631:74;36628:1;36625:81;36620:1;36613:9;36606:17;36602:105;36599:2;;;36710:18;;:::i;:::-;36599:2;36758:1;36755;36751:9;36740:20;;36466:300;;;;:::o;36772:191::-;;36832:20;36850:1;36832:20;:::i;:::-;36827:25;;36866:20;36884:1;36866:20;:::i;:::-;36861:25;;36905:1;36902;36899:8;36896:2;;;36910:18;;:::i;:::-;36896:2;36955:1;36952;36948:9;36940:17;;36817:146;;;;:::o;36969:96::-;;37035:24;37053:5;37035:24;:::i;:::-;37024:35;;37014:51;;;:::o;37071:90::-;;37148:5;37141:13;37134:21;37123:32;;37113:48;;;:::o;37167:149::-;;37243:66;37236:5;37232:78;37221:89;;37211:105;;;:::o;37322:126::-;;37399:42;37392:5;37388:54;37377:65;;37367:81;;;:::o;37454:77::-;;37520:5;37509:16;;37499:32;;;:::o;37537:154::-;37621:6;37616:3;37611;37598:30;37683:1;37674:6;37669:3;37665:16;37658:27;37588:103;;;:::o;37697:307::-;37765:1;37775:113;37789:6;37786:1;37783:13;37775:113;;;37874:1;37869:3;37865:11;37859:18;37855:1;37850:3;37846:11;37839:39;37811:2;37808:1;37804:10;37799:15;;37775:113;;;37906:6;37903:1;37900:13;37897:2;;;37986:1;37977:6;37972:3;37968:16;37961:27;37897:2;37746:258;;;;:::o;38010:320::-;;38091:1;38085:4;38081:12;38071:22;;38138:1;38132:4;38128:12;38159:18;38149:2;;38215:4;38207:6;38203:17;38193:27;;38149:2;38277;38269:6;38266:14;38246:18;38243:38;38240:2;;;38296:18;;:::i;:::-;38240:2;38061:269;;;;:::o;38336:233::-;;38398:24;38416:5;38398:24;:::i;:::-;38389:33;;38444:66;38437:5;38434:77;38431:2;;;38514:18;;:::i;:::-;38431:2;38561:1;38554:5;38550:13;38543:20;;38379:190;;;:::o;38575:176::-;;38624:20;38642:1;38624:20;:::i;:::-;38619:25;;38658:20;38676:1;38658:20;:::i;:::-;38653:25;;38697:1;38687:2;;38702:18;;:::i;:::-;38687:2;38743:1;38740;38736:9;38731:14;;38609:142;;;;:::o;38757:180::-;38805:77;38802:1;38795:88;38902:4;38899:1;38892:15;38926:4;38923:1;38916:15;38943:180;38991:77;38988:1;38981:88;39088:4;39085:1;39078:15;39112:4;39109:1;39102:15;39129:180;39177:77;39174:1;39167:88;39274:4;39271:1;39264:15;39298:4;39295:1;39288:15;39315:180;39363:77;39360:1;39353:88;39460:4;39457:1;39450:15;39484:4;39481:1;39474:15;39501:102;;39593:2;39589:7;39584:2;39577:5;39573:14;39569:28;39559:38;;39549:54;;;:::o;39609:122::-;39682:24;39700:5;39682:24;:::i;:::-;39675:5;39672:35;39662:2;;39721:1;39718;39711:12;39662:2;39652:79;:::o;39737:116::-;39807:21;39822:5;39807:21;:::i;:::-;39800:5;39797:32;39787:2;;39843:1;39840;39833:12;39787:2;39777:76;:::o;39859:120::-;39931:23;39948:5;39931:23;:::i;:::-;39924:5;39921:34;39911:2;;39969:1;39966;39959:12;39911:2;39901:78;:::o;39985:122::-;40058:24;40076:5;40058:24;:::i;:::-;40051:5;40048:35;40038:2;;40097:1;40094;40087:12;40038:2;40028:79;:::o
Swarm Source
ipfs://084cdabc52f6b478528cb14c34abf052e9086a513208c5e7c9592e5823f00cd6
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.