Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
95 TRACD
Holders
56
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 TRACDLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TracDiplomas
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: GPL-3.0 //A Solidity Contract by Crypto N That import "./ERC721Enumerable.sol"; import "./Ownable.sol"; pragma solidity >=0.7.0 <0.9.0; contract deployedContract { function ownerOf(uint256) public returns (address) {} function balanceOf(address) public returns (uint256) {} } contract TracDiplomas is ERC721Enumerable, Ownable { using Strings for uint256; string baseURI; address public checkerContract; string public baseExtension = ".json"; uint256 public cost = 0 ether; uint256 public maxSupply = 8888; bool public paused = false; bool public revealed = false; string public notRevealedUri; mapping(address => uint256) public nftsMintedByAddress; mapping(address => uint256) public nftsAllowedToMint; constructor( string memory _name, string memory _symbol, string memory _initBaseURI, string memory _initNotRevealedUri ) ERC721(_name, _symbol) { setBaseURI(_initBaseURI); setNotRevealedURI(_initNotRevealedUri); } //INTERNAL function checkOwned(address _senderAddress, address _contractAddress) internal returns (uint256) { return deployedContract(_contractAddress).balanceOf(_senderAddress); } //refreshAllowedMint function refreshNftsAllowedToMint(address _address) public returns (uint256) { uint256 senderBalance = checkOwned(_address, checkerContract); if (senderBalance > 0) { if (senderBalance < 10) { nftsAllowedToMint[_address] = 1; return 1; } else { uint256 mintBalance; if (senderBalance % 10 == 0) { mintBalance = (senderBalance / 10); } else { mintBalance = (senderBalance / 10) + 1; } nftsAllowedToMint[_address] = mintBalance; return mintBalance; } } else { return 0; } } // internal function _baseURI() internal view virtual override returns (string memory) { return baseURI; } // public function mintDiploma(uint256 _mintAmount) public payable { refreshNftsAllowedToMint(msg.sender); require(nftsAllowedToMint[msg.sender] > 0); uint256 supply = totalSupply(); uint256 nftsAllowed = nftsAllowedToMint[msg.sender] - nftsMintedByAddress[msg.sender]; require(!paused); require(_mintAmount > 0); require(_mintAmount <= nftsAllowed); require(supply + _mintAmount <= maxSupply); if (msg.sender != owner()) { require(msg.value >= cost * _mintAmount); } for (uint256 i = 1; i <= _mintAmount; i++) { uint256 currentMinted = nftsMintedByAddress[msg.sender]; _safeMint(msg.sender, supply + i); nftsMintedByAddress[msg.sender] = currentMinted + 1; } } function walletOfOwner(address _owner) public view returns (uint256[] memory) { uint256 ownerTokenCount = balanceOf(_owner); uint256[] memory tokenIds = new uint256[](ownerTokenCount); for (uint256 i; i < ownerTokenCount; i++) { tokenIds[i] = tokenOfOwnerByIndex(_owner, i); } return tokenIds; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); if(revealed == false) { return notRevealedUri; } string memory currentBaseURI = _baseURI(); return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension)) : ""; } //only owner function setCheckerContract(address _contractAddress) public onlyOwner { checkerContract = _contractAddress; } function reveal() public onlyOwner { revealed = true; } function setCost(uint256 _newCost) public onlyOwner { cost = _newCost; } function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner { notRevealedUri = _notRevealedURI; } function setBaseURI(string memory _newBaseURI) public onlyOwner { baseURI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { baseExtension = _newBaseExtension; } function pause(bool _state) public onlyOwner { paused = _state; } function withdraw() public payable onlyOwner { (bool os, ) = payable(owner()).call{value: address(this).balance}(""); require(os); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner 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: caller is not token 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) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "./ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "./Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"string","name":"_initNotRevealedUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkerContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintDiploma","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nftsAllowedToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nftsMintedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"refreshNftsAllowedToMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setCheckerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000329565b506000600e556122b8600f556000601060006101000a81548160ff0219169083151502179055506000601060016101000a81548160ff021916908315150217905550348015620000a057600080fd5b5060405162004ac638038062004ac68339818101604052810190620000c6919062000457565b83838160009080519060200190620000e092919062000329565b508060019080519060200190620000f992919062000329565b5050506200011c620001106200014860201b60201c565b6200015060201b60201c565b6200012d826200021660201b60201c565b6200013e816200024260201b60201c565b505050506200074c565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002266200026e60201b60201c565b80600b90805190602001906200023e92919062000329565b5050565b620002526200026e60201b60201c565b80601190805190602001906200026a92919062000329565b5050565b6200027e6200014860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002a4620002ff60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f4906200056c565b60405180910390fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003379062000634565b90600052602060002090601f0160209004810192826200035b5760008555620003a7565b82601f106200037657805160ff1916838001178555620003a7565b82800160010185558215620003a7579182015b82811115620003a657825182559160200191906001019062000389565b5b509050620003b69190620003ba565b5090565b5b80821115620003d5576000816000905550600101620003bb565b5090565b6000620003f0620003ea84620005b7565b6200058e565b9050828152602081018484840111156200040f576200040e62000703565b5b6200041c848285620005fe565b509392505050565b600082601f8301126200043c576200043b620006fe565b5b81516200044e848260208601620003d9565b91505092915050565b600080600080608085870312156200047457620004736200070d565b5b600085015167ffffffffffffffff81111562000495576200049462000708565b5b620004a38782880162000424565b945050602085015167ffffffffffffffff811115620004c757620004c662000708565b5b620004d58782880162000424565b935050604085015167ffffffffffffffff811115620004f957620004f862000708565b5b620005078782880162000424565b925050606085015167ffffffffffffffff8111156200052b576200052a62000708565b5b620005398782880162000424565b91505092959194509250565b600062000554602083620005ed565b9150620005618262000723565b602082019050919050565b60006020820190508181036000830152620005878162000545565b9050919050565b60006200059a620005ad565b9050620005a882826200066a565b919050565b6000604051905090565b600067ffffffffffffffff821115620005d557620005d4620006cf565b5b620005e08262000712565b9050602081019050919050565b600082825260208201905092915050565b60005b838110156200061e57808201518184015260208101905062000601565b838111156200062e576000848401525b50505050565b600060028204905060018216806200064d57607f821691505b60208210811415620006645762000663620006a0565b5b50919050565b620006758262000712565b810181811067ffffffffffffffff82111715620006975762000696620006cf565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b61436a806200075c6000396000f3fe6080604052600436106102305760003560e01c80635d79ded91161012e578063a475b5dd116100ab578063d5abeb011161006f578063d5abeb0114610847578063da3ef23f14610872578063e985e9c51461089b578063f2c4ce1e146108d8578063f2fde38b1461090157610230565b8063a475b5dd14610776578063b88d4fde1461078d578063c6682862146107b6578063c87b56dd146107e1578063c87d1f041461081e57610230565b8063824f0cf7116100f2578063824f0cf71461069e5780638da5cb5b146106db57806395d89b4114610706578063995bd5fb14610731578063a22cb4651461074d57610230565b80635d79ded9146105a55780636352211e146105d057806370a082311461060d578063715018a61461064a57806374cec6d11461066157610230565b806323b872dd116101bc57806344a0d68a1161018057806344a0d68a146104c05780634f6ccce7146104e9578063518302271461052657806355f804b3146105515780635c975abb1461057a57610230565b806323b872dd146103ea5780632f745c59146104135780633ccfd60b1461045057806342842e0e1461045a578063438b63001461048357610230565b8063081c8c4411610203578063081c8c4414610303578063095ea7b31461032e5780630d4926501461035757806313faede61461039457806318160ddd146103bf57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061314e565b61092a565b6040516102699190613741565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613121565b6109a4565b005b3480156102a757600080fd5b506102b06109c9565b6040516102bd919061375c565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906131f1565b610a5b565b6040516102fa91906136b8565b60405180910390f35b34801561030f57600080fd5b50610318610aa1565b604051610325919061375c565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906130e1565b610b2f565b005b34801561036357600080fd5b5061037e60048036038101906103799190612f5e565b610c47565b60405161038b919061397e565b60405180910390f35b3480156103a057600080fd5b506103a9610d78565b6040516103b6919061397e565b60405180910390f35b3480156103cb57600080fd5b506103d4610d7e565b6040516103e1919061397e565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c9190612fcb565b610d8b565b005b34801561041f57600080fd5b5061043a600480360381019061043591906130e1565b610deb565b604051610447919061397e565b60405180910390f35b610458610e90565b005b34801561046657600080fd5b50610481600480360381019061047c9190612fcb565b610f18565b005b34801561048f57600080fd5b506104aa60048036038101906104a59190612f5e565b610f38565b6040516104b7919061371f565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e291906131f1565b610fe6565b005b3480156104f557600080fd5b50610510600480360381019061050b91906131f1565b610ff8565b60405161051d919061397e565b60405180910390f35b34801561053257600080fd5b5061053b611069565b6040516105489190613741565b60405180910390f35b34801561055d57600080fd5b50610578600480360381019061057391906131a8565b61107c565b005b34801561058657600080fd5b5061058f61109e565b60405161059c9190613741565b60405180910390f35b3480156105b157600080fd5b506105ba6110b1565b6040516105c791906136b8565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906131f1565b6110d7565b60405161060491906136b8565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612f5e565b611189565b604051610641919061397e565b60405180910390f35b34801561065657600080fd5b5061065f611241565b005b34801561066d57600080fd5b5061068860048036038101906106839190612f5e565b611255565b604051610695919061397e565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190612f5e565b61126d565b6040516106d2919061397e565b60405180910390f35b3480156106e757600080fd5b506106f0611285565b6040516106fd91906136b8565b60405180910390f35b34801561071257600080fd5b5061071b6112af565b604051610728919061375c565b60405180910390f35b61074b600480360381019061074691906131f1565b611341565b005b34801561075957600080fd5b50610774600480360381019061076f91906130a1565b6115a5565b005b34801561078257600080fd5b5061078b6115bb565b005b34801561079957600080fd5b506107b460048036038101906107af919061301e565b6115e0565b005b3480156107c257600080fd5b506107cb611642565b6040516107d8919061375c565b60405180910390f35b3480156107ed57600080fd5b50610808600480360381019061080391906131f1565b6116d0565b604051610815919061375c565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190612f5e565b611829565b005b34801561085357600080fd5b5061085c611875565b604051610869919061397e565b60405180910390f35b34801561087e57600080fd5b50610899600480360381019061089491906131a8565b61187b565b005b3480156108a757600080fd5b506108c260048036038101906108bd9190612f8b565b61189d565b6040516108cf9190613741565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa91906131a8565b611931565b005b34801561090d57600080fd5b5061092860048036038101906109239190612f5e565b611953565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099d575061099c826119d7565b5b9050919050565b6109ac611ab9565b80601060006101000a81548160ff02191690831515021790555050565b6060600080546109d890613c87565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0490613c87565b8015610a515780601f10610a2657610100808354040283529160200191610a51565b820191906000526020600020905b815481529060010190602001808311610a3457829003601f168201915b5050505050905090565b6000610a6682611b37565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610aae90613c87565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada90613c87565b8015610b275780601f10610afc57610100808354040283529160200191610b27565b820191906000526020600020905b815481529060010190602001808311610b0a57829003601f168201915b505050505081565b6000610b3a826110d7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba29061391e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bca611b82565b73ffffffffffffffffffffffffffffffffffffffff161480610bf95750610bf881610bf3611b82565b61189d565b5b610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f9061387e565b60405180910390fd5b610c428383611b8a565b505050565b600080610c7683600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611c43565b90506000811115610d6d57600a811015610cd9576001601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001915050610d73565b600080600a83610ce99190613d33565b1415610d0357600a82610cfc9190613b12565b9050610d1f565b6001600a83610d129190613b12565b610d1c9190613abc565b90505b80601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508092505050610d73565b60009150505b919050565b600e5481565b6000600880549050905090565b610d9c610d96611b82565b82611cd8565b610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd29061395e565b60405180910390fd5b610de6838383611d6d565b505050565b6000610df683611189565b8210610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e9061377e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e98611ab9565b6000610ea2611285565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ec5906136a3565b60006040518083038185875af1925050503d8060008114610f02576040519150601f19603f3d011682016040523d82523d6000602084013e610f07565b606091505b5050905080610f1557600080fd5b50565b610f33838383604051806020016040528060008152506115e0565b505050565b60606000610f4583611189565b905060008167ffffffffffffffff811115610f6357610f62613e4f565b5b604051908082528060200260200182016040528015610f915781602001602082028036833780820191505090505b50905060005b82811015610fdb57610fa98582610deb565b828281518110610fbc57610fbb613e20565b5b6020026020010181815250508080610fd390613cea565b915050610f97565b508092505050919050565b610fee611ab9565b80600e8190555050565b6000611002610d7e565b8210611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a9061393e565b60405180910390fd5b6008828154811061105757611056613e20565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b611084611ab9565b80600b908051906020019061109a929190612d5d565b5050565b601060009054906101000a900460ff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611177906138fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f19061385e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611249611ab9565b6112536000611fd4565b565b60126020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112be90613c87565b80601f01602080910402602001604051908101604052809291908181526020018280546112ea90613c87565b80156113375780601f1061130c57610100808354040283529160200191611337565b820191906000526020600020905b81548152906001019060200180831161131a57829003601f168201915b5050505050905090565b61134a33610c47565b506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161139757600080fd5b60006113a1610d7e565b90506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461142f9190613b9d565b9050601060009054906101000a900460ff161561144b57600080fd5b6000831161145857600080fd5b8083111561146557600080fd5b600f5483836114749190613abc565b111561147f57600080fd5b611487611285565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d45782600e546114c79190613b43565b3410156114d357600080fd5b5b6000600190505b83811161159f576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061153b3383866115369190613abc565b61209a565b6001816115489190613abc565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050808061159790613cea565b9150506114db565b50505050565b6115b76115b0611b82565b83836120b8565b5050565b6115c3611ab9565b6001601060016101000a81548160ff021916908315150217905550565b6115f16115eb611b82565b83611cd8565b611630576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116279061395e565b60405180910390fd5b61163c84848484612225565b50505050565b600d805461164f90613c87565b80601f016020809104026020016040519081016040528092919081815260200182805461167b90613c87565b80156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b505050505081565b60606116db82612281565b61171a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611711906138de565b60405180910390fd5b60001515601060019054906101000a900460ff16151514156117c8576011805461174390613c87565b80601f016020809104026020016040519081016040528092919081815260200182805461176f90613c87565b80156117bc5780601f10611791576101008083540402835291602001916117bc565b820191906000526020600020905b81548152906001019060200180831161179f57829003601f168201915b50505050509050611824565b60006117d26122ed565b905060008151116117f25760405180602001604052806000815250611820565b806117fc8461237f565b600d60405160200161181093929190613672565b6040516020818303038152906040525b9150505b919050565b611831611ab9565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b611883611ab9565b80600d9080519060200190611899929190612d5d565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611939611ab9565b806011908051906020019061194f929190612d5d565b5050565b61195b611ab9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c2906137be565b60405180910390fd5b6119d481611fd4565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aa257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ab25750611ab1826124e0565b5b9050919050565b611ac1611b82565b73ffffffffffffffffffffffffffffffffffffffff16611adf611285565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c906138be565b60405180910390fd5b565b611b4081612281565b611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906138fe565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bfd836110d7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611c7e91906136b8565b602060405180830381600087803b158015611c9857600080fd5b505af1158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd0919061321e565b905092915050565b600080611ce4836110d7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d265750611d25818561189d565b5b80611d6457508373ffffffffffffffffffffffffffffffffffffffff16611d4c84610a5b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8d826110d7565b73ffffffffffffffffffffffffffffffffffffffff1614611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906137de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a9061381e565b60405180910390fd5b611e5e83838361254a565b611e69600082611b8a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb99190613b9d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f109190613abc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fcf83838361265e565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120b4828260405180602001604052806000815250612663565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e9061383e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122189190613741565b60405180910390a3505050565b612230848484611d6d565b61223c848484846126be565b61227b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122729061379e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b80546122fc90613c87565b80601f016020809104026020016040519081016040528092919081815260200182805461232890613c87565b80156123755780601f1061234a57610100808354040283529160200191612375565b820191906000526020600020905b81548152906001019060200180831161235857829003601f168201915b5050505050905090565b606060008214156123c7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124db565b600082905060005b600082146123f95780806123e290613cea565b915050600a826123f29190613b12565b91506123cf565b60008167ffffffffffffffff81111561241557612414613e4f565b5b6040519080825280601f01601f1916602001820160405280156124475781602001600182028036833780820191505090505b5090505b600085146124d4576001826124609190613b9d565b9150600a8561246f9190613d33565b603061247b9190613abc565b60f81b81838151811061249157612490613e20565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124cd9190613b12565b945061244b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612555838383612855565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612598576125938161285a565b6125d7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125d6576125d583826128a3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261a5761261581612a10565b612659565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612658576126578282612ae1565b5b5b505050565b505050565b61266d8383612b60565b61267a60008484846126be565b6126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b09061379e565b60405180910390fd5b505050565b60006126df8473ffffffffffffffffffffffffffffffffffffffff16612d3a565b15612848578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612708611b82565b8786866040518563ffffffff1660e01b815260040161272a94939291906136d3565b602060405180830381600087803b15801561274457600080fd5b505af192505050801561277557506040513d601f19601f82011682018060405250810190612772919061317b565b60015b6127f8573d80600081146127a5576040519150601f19603f3d011682016040523d82523d6000602084013e6127aa565b606091505b506000815114156127f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e79061379e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061284d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128b084611189565b6128ba9190613b9d565b905060006007600084815260200190815260200160002054905081811461299f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a249190613b9d565b9050600060096000848152602001908152602001600020549050600060088381548110612a5457612a53613e20565b5b906000526020600020015490508060088381548110612a7657612a75613e20565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ac557612ac4613df1565b5b6001900381819060005260206000200160009055905550505050565b6000612aec83611189565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc79061389e565b60405180910390fd5b612bd981612281565b15612c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c10906137fe565b60405180910390fd5b612c256000838361254a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c759190613abc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d366000838361265e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612d6990613c87565b90600052602060002090601f016020900481019282612d8b5760008555612dd2565b82601f10612da457805160ff1916838001178555612dd2565b82800160010185558215612dd2579182015b82811115612dd1578251825591602001919060010190612db6565b5b509050612ddf9190612de3565b5090565b5b80821115612dfc576000816000905550600101612de4565b5090565b6000612e13612e0e846139be565b613999565b905082815260208101848484011115612e2f57612e2e613e83565b5b612e3a848285613c45565b509392505050565b6000612e55612e50846139ef565b613999565b905082815260208101848484011115612e7157612e70613e83565b5b612e7c848285613c45565b509392505050565b600081359050612e93816142d8565b92915050565b600081359050612ea8816142ef565b92915050565b600081359050612ebd81614306565b92915050565b600081519050612ed281614306565b92915050565b600082601f830112612eed57612eec613e7e565b5b8135612efd848260208601612e00565b91505092915050565b600082601f830112612f1b57612f1a613e7e565b5b8135612f2b848260208601612e42565b91505092915050565b600081359050612f438161431d565b92915050565b600081519050612f588161431d565b92915050565b600060208284031215612f7457612f73613e8d565b5b6000612f8284828501612e84565b91505092915050565b60008060408385031215612fa257612fa1613e8d565b5b6000612fb085828601612e84565b9250506020612fc185828601612e84565b9150509250929050565b600080600060608486031215612fe457612fe3613e8d565b5b6000612ff286828701612e84565b935050602061300386828701612e84565b925050604061301486828701612f34565b9150509250925092565b6000806000806080858703121561303857613037613e8d565b5b600061304687828801612e84565b945050602061305787828801612e84565b935050604061306887828801612f34565b925050606085013567ffffffffffffffff81111561308957613088613e88565b5b61309587828801612ed8565b91505092959194509250565b600080604083850312156130b8576130b7613e8d565b5b60006130c685828601612e84565b92505060206130d785828601612e99565b9150509250929050565b600080604083850312156130f8576130f7613e8d565b5b600061310685828601612e84565b925050602061311785828601612f34565b9150509250929050565b60006020828403121561313757613136613e8d565b5b600061314584828501612e99565b91505092915050565b60006020828403121561316457613163613e8d565b5b600061317284828501612eae565b91505092915050565b60006020828403121561319157613190613e8d565b5b600061319f84828501612ec3565b91505092915050565b6000602082840312156131be576131bd613e8d565b5b600082013567ffffffffffffffff8111156131dc576131db613e88565b5b6131e884828501612f06565b91505092915050565b60006020828403121561320757613206613e8d565b5b600061321584828501612f34565b91505092915050565b60006020828403121561323457613233613e8d565b5b600061324284828501612f49565b91505092915050565b60006132578383613654565b60208301905092915050565b61326c81613bd1565b82525050565b600061327d82613a45565b6132878185613a73565b935061329283613a20565b8060005b838110156132c35781516132aa888261324b565b97506132b583613a66565b925050600181019050613296565b5085935050505092915050565b6132d981613be3565b82525050565b60006132ea82613a50565b6132f48185613a84565b9350613304818560208601613c54565b61330d81613e92565b840191505092915050565b600061332382613a5b565b61332d8185613aa0565b935061333d818560208601613c54565b61334681613e92565b840191505092915050565b600061335c82613a5b565b6133668185613ab1565b9350613376818560208601613c54565b80840191505092915050565b6000815461338f81613c87565b6133998186613ab1565b945060018216600081146133b457600181146133c5576133f8565b60ff198316865281860193506133f8565b6133ce85613a30565b60005b838110156133f0578154818901526001820191506020810190506133d1565b838801955050505b50505092915050565b600061340e602b83613aa0565b915061341982613ea3565b604082019050919050565b6000613431603283613aa0565b915061343c82613ef2565b604082019050919050565b6000613454602683613aa0565b915061345f82613f41565b604082019050919050565b6000613477602583613aa0565b915061348282613f90565b604082019050919050565b600061349a601c83613aa0565b91506134a582613fdf565b602082019050919050565b60006134bd602483613aa0565b91506134c882614008565b604082019050919050565b60006134e0601983613aa0565b91506134eb82614057565b602082019050919050565b6000613503602983613aa0565b915061350e82614080565b604082019050919050565b6000613526603e83613aa0565b9150613531826140cf565b604082019050919050565b6000613549602083613aa0565b91506135548261411e565b602082019050919050565b600061356c602083613aa0565b915061357782614147565b602082019050919050565b600061358f602f83613aa0565b915061359a82614170565b604082019050919050565b60006135b2601883613aa0565b91506135bd826141bf565b602082019050919050565b60006135d5602183613aa0565b91506135e0826141e8565b604082019050919050565b60006135f8600083613a95565b915061360382614237565b600082019050919050565b600061361b602c83613aa0565b91506136268261423a565b604082019050919050565b600061363e602e83613aa0565b915061364982614289565b604082019050919050565b61365d81613c3b565b82525050565b61366c81613c3b565b82525050565b600061367e8286613351565b915061368a8285613351565b91506136968284613382565b9150819050949350505050565b60006136ae826135eb565b9150819050919050565b60006020820190506136cd6000830184613263565b92915050565b60006080820190506136e86000830187613263565b6136f56020830186613263565b6137026040830185613663565b818103606083015261371481846132df565b905095945050505050565b600060208201905081810360008301526137398184613272565b905092915050565b600060208201905061375660008301846132d0565b92915050565b600060208201905081810360008301526137768184613318565b905092915050565b6000602082019050818103600083015261379781613401565b9050919050565b600060208201905081810360008301526137b781613424565b9050919050565b600060208201905081810360008301526137d781613447565b9050919050565b600060208201905081810360008301526137f78161346a565b9050919050565b600060208201905081810360008301526138178161348d565b9050919050565b60006020820190508181036000830152613837816134b0565b9050919050565b60006020820190508181036000830152613857816134d3565b9050919050565b60006020820190508181036000830152613877816134f6565b9050919050565b6000602082019050818103600083015261389781613519565b9050919050565b600060208201905081810360008301526138b78161353c565b9050919050565b600060208201905081810360008301526138d78161355f565b9050919050565b600060208201905081810360008301526138f781613582565b9050919050565b60006020820190508181036000830152613917816135a5565b9050919050565b60006020820190508181036000830152613937816135c8565b9050919050565b600060208201905081810360008301526139578161360e565b9050919050565b6000602082019050818103600083015261397781613631565b9050919050565b60006020820190506139936000830184613663565b92915050565b60006139a36139b4565b90506139af8282613cb9565b919050565b6000604051905090565b600067ffffffffffffffff8211156139d9576139d8613e4f565b5b6139e282613e92565b9050602081019050919050565b600067ffffffffffffffff821115613a0a57613a09613e4f565b5b613a1382613e92565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ac782613c3b565b9150613ad283613c3b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b0757613b06613d64565b5b828201905092915050565b6000613b1d82613c3b565b9150613b2883613c3b565b925082613b3857613b37613d93565b5b828204905092915050565b6000613b4e82613c3b565b9150613b5983613c3b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b9257613b91613d64565b5b828202905092915050565b6000613ba882613c3b565b9150613bb383613c3b565b925082821015613bc657613bc5613d64565b5b828203905092915050565b6000613bdc82613c1b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c72578082015181840152602081019050613c57565b83811115613c81576000848401525b50505050565b60006002820490506001821680613c9f57607f821691505b60208210811415613cb357613cb2613dc2565b5b50919050565b613cc282613e92565b810181811067ffffffffffffffff82111715613ce157613ce0613e4f565b5b80604052505050565b6000613cf582613c3b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d2857613d27613d64565b5b600182019050919050565b6000613d3e82613c3b565b9150613d4983613c3b565b925082613d5957613d58613d93565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6142e181613bd1565b81146142ec57600080fd5b50565b6142f881613be3565b811461430357600080fd5b50565b61430f81613bef565b811461431a57600080fd5b50565b61432681613c3b565b811461433157600080fd5b5056fea2646970667358221220332a01fe0a679083a1d16f76428564eb7901436b7fa04383f4df1cb00422d55564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000d54524143204469706c6f6d6173000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005545241434400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046c696e6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046c696e6b00000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x6080604052600436106102305760003560e01c80635d79ded91161012e578063a475b5dd116100ab578063d5abeb011161006f578063d5abeb0114610847578063da3ef23f14610872578063e985e9c51461089b578063f2c4ce1e146108d8578063f2fde38b1461090157610230565b8063a475b5dd14610776578063b88d4fde1461078d578063c6682862146107b6578063c87b56dd146107e1578063c87d1f041461081e57610230565b8063824f0cf7116100f2578063824f0cf71461069e5780638da5cb5b146106db57806395d89b4114610706578063995bd5fb14610731578063a22cb4651461074d57610230565b80635d79ded9146105a55780636352211e146105d057806370a082311461060d578063715018a61461064a57806374cec6d11461066157610230565b806323b872dd116101bc57806344a0d68a1161018057806344a0d68a146104c05780634f6ccce7146104e9578063518302271461052657806355f804b3146105515780635c975abb1461057a57610230565b806323b872dd146103ea5780632f745c59146104135780633ccfd60b1461045057806342842e0e1461045a578063438b63001461048357610230565b8063081c8c4411610203578063081c8c4414610303578063095ea7b31461032e5780630d4926501461035757806313faede61461039457806318160ddd146103bf57610230565b806301ffc9a71461023557806302329a291461027257806306fdde031461029b578063081812fc146102c6575b600080fd5b34801561024157600080fd5b5061025c6004803603810190610257919061314e565b61092a565b6040516102699190613741565b60405180910390f35b34801561027e57600080fd5b5061029960048036038101906102949190613121565b6109a4565b005b3480156102a757600080fd5b506102b06109c9565b6040516102bd919061375c565b60405180910390f35b3480156102d257600080fd5b506102ed60048036038101906102e891906131f1565b610a5b565b6040516102fa91906136b8565b60405180910390f35b34801561030f57600080fd5b50610318610aa1565b604051610325919061375c565b60405180910390f35b34801561033a57600080fd5b50610355600480360381019061035091906130e1565b610b2f565b005b34801561036357600080fd5b5061037e60048036038101906103799190612f5e565b610c47565b60405161038b919061397e565b60405180910390f35b3480156103a057600080fd5b506103a9610d78565b6040516103b6919061397e565b60405180910390f35b3480156103cb57600080fd5b506103d4610d7e565b6040516103e1919061397e565b60405180910390f35b3480156103f657600080fd5b50610411600480360381019061040c9190612fcb565b610d8b565b005b34801561041f57600080fd5b5061043a600480360381019061043591906130e1565b610deb565b604051610447919061397e565b60405180910390f35b610458610e90565b005b34801561046657600080fd5b50610481600480360381019061047c9190612fcb565b610f18565b005b34801561048f57600080fd5b506104aa60048036038101906104a59190612f5e565b610f38565b6040516104b7919061371f565b60405180910390f35b3480156104cc57600080fd5b506104e760048036038101906104e291906131f1565b610fe6565b005b3480156104f557600080fd5b50610510600480360381019061050b91906131f1565b610ff8565b60405161051d919061397e565b60405180910390f35b34801561053257600080fd5b5061053b611069565b6040516105489190613741565b60405180910390f35b34801561055d57600080fd5b50610578600480360381019061057391906131a8565b61107c565b005b34801561058657600080fd5b5061058f61109e565b60405161059c9190613741565b60405180910390f35b3480156105b157600080fd5b506105ba6110b1565b6040516105c791906136b8565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906131f1565b6110d7565b60405161060491906136b8565b60405180910390f35b34801561061957600080fd5b50610634600480360381019061062f9190612f5e565b611189565b604051610641919061397e565b60405180910390f35b34801561065657600080fd5b5061065f611241565b005b34801561066d57600080fd5b5061068860048036038101906106839190612f5e565b611255565b604051610695919061397e565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c09190612f5e565b61126d565b6040516106d2919061397e565b60405180910390f35b3480156106e757600080fd5b506106f0611285565b6040516106fd91906136b8565b60405180910390f35b34801561071257600080fd5b5061071b6112af565b604051610728919061375c565b60405180910390f35b61074b600480360381019061074691906131f1565b611341565b005b34801561075957600080fd5b50610774600480360381019061076f91906130a1565b6115a5565b005b34801561078257600080fd5b5061078b6115bb565b005b34801561079957600080fd5b506107b460048036038101906107af919061301e565b6115e0565b005b3480156107c257600080fd5b506107cb611642565b6040516107d8919061375c565b60405180910390f35b3480156107ed57600080fd5b50610808600480360381019061080391906131f1565b6116d0565b604051610815919061375c565b60405180910390f35b34801561082a57600080fd5b5061084560048036038101906108409190612f5e565b611829565b005b34801561085357600080fd5b5061085c611875565b604051610869919061397e565b60405180910390f35b34801561087e57600080fd5b50610899600480360381019061089491906131a8565b61187b565b005b3480156108a757600080fd5b506108c260048036038101906108bd9190612f8b565b61189d565b6040516108cf9190613741565b60405180910390f35b3480156108e457600080fd5b506108ff60048036038101906108fa91906131a8565b611931565b005b34801561090d57600080fd5b5061092860048036038101906109239190612f5e565b611953565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061099d575061099c826119d7565b5b9050919050565b6109ac611ab9565b80601060006101000a81548160ff02191690831515021790555050565b6060600080546109d890613c87565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0490613c87565b8015610a515780601f10610a2657610100808354040283529160200191610a51565b820191906000526020600020905b815481529060010190602001808311610a3457829003601f168201915b5050505050905090565b6000610a6682611b37565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60118054610aae90613c87565b80601f0160208091040260200160405190810160405280929190818152602001828054610ada90613c87565b8015610b275780601f10610afc57610100808354040283529160200191610b27565b820191906000526020600020905b815481529060010190602001808311610b0a57829003601f168201915b505050505081565b6000610b3a826110d7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba29061391e565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bca611b82565b73ffffffffffffffffffffffffffffffffffffffff161480610bf95750610bf881610bf3611b82565b61189d565b5b610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f9061387e565b60405180910390fd5b610c428383611b8a565b505050565b600080610c7683600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611c43565b90506000811115610d6d57600a811015610cd9576001601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506001915050610d73565b600080600a83610ce99190613d33565b1415610d0357600a82610cfc9190613b12565b9050610d1f565b6001600a83610d129190613b12565b610d1c9190613abc565b90505b80601360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508092505050610d73565b60009150505b919050565b600e5481565b6000600880549050905090565b610d9c610d96611b82565b82611cd8565b610ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd29061395e565b60405180910390fd5b610de6838383611d6d565b505050565b6000610df683611189565b8210610e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2e9061377e565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610e98611ab9565b6000610ea2611285565b73ffffffffffffffffffffffffffffffffffffffff1647604051610ec5906136a3565b60006040518083038185875af1925050503d8060008114610f02576040519150601f19603f3d011682016040523d82523d6000602084013e610f07565b606091505b5050905080610f1557600080fd5b50565b610f33838383604051806020016040528060008152506115e0565b505050565b60606000610f4583611189565b905060008167ffffffffffffffff811115610f6357610f62613e4f565b5b604051908082528060200260200182016040528015610f915781602001602082028036833780820191505090505b50905060005b82811015610fdb57610fa98582610deb565b828281518110610fbc57610fbb613e20565b5b6020026020010181815250508080610fd390613cea565b915050610f97565b508092505050919050565b610fee611ab9565b80600e8190555050565b6000611002610d7e565b8210611043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103a9061393e565b60405180910390fd5b6008828154811061105757611056613e20565b5b90600052602060002001549050919050565b601060019054906101000a900460ff1681565b611084611ab9565b80600b908051906020019061109a929190612d5d565b5050565b601060009054906101000a900460ff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611180576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611177906138fe565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f19061385e565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611249611ab9565b6112536000611fd4565b565b60126020528060005260406000206000915090505481565b60136020528060005260406000206000915090505481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112be90613c87565b80601f01602080910402602001604051908101604052809291908181526020018280546112ea90613c87565b80156113375780601f1061130c57610100808354040283529160200191611337565b820191906000526020600020905b81548152906001019060200180831161131a57829003601f168201915b5050505050905090565b61134a33610c47565b506000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541161139757600080fd5b60006113a1610d7e565b90506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461142f9190613b9d565b9050601060009054906101000a900460ff161561144b57600080fd5b6000831161145857600080fd5b8083111561146557600080fd5b600f5483836114749190613abc565b111561147f57600080fd5b611487611285565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114d45782600e546114c79190613b43565b3410156114d357600080fd5b5b6000600190505b83811161159f576000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905061153b3383866115369190613abc565b61209a565b6001816115489190613abc565b601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555050808061159790613cea565b9150506114db565b50505050565b6115b76115b0611b82565b83836120b8565b5050565b6115c3611ab9565b6001601060016101000a81548160ff021916908315150217905550565b6115f16115eb611b82565b83611cd8565b611630576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116279061395e565b60405180910390fd5b61163c84848484612225565b50505050565b600d805461164f90613c87565b80601f016020809104026020016040519081016040528092919081815260200182805461167b90613c87565b80156116c85780601f1061169d576101008083540402835291602001916116c8565b820191906000526020600020905b8154815290600101906020018083116116ab57829003601f168201915b505050505081565b60606116db82612281565b61171a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611711906138de565b60405180910390fd5b60001515601060019054906101000a900460ff16151514156117c8576011805461174390613c87565b80601f016020809104026020016040519081016040528092919081815260200182805461176f90613c87565b80156117bc5780601f10611791576101008083540402835291602001916117bc565b820191906000526020600020905b81548152906001019060200180831161179f57829003601f168201915b50505050509050611824565b60006117d26122ed565b905060008151116117f25760405180602001604052806000815250611820565b806117fc8461237f565b600d60405160200161181093929190613672565b6040516020818303038152906040525b9150505b919050565b611831611ab9565b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5481565b611883611ab9565b80600d9080519060200190611899929190612d5d565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611939611ab9565b806011908051906020019061194f929190612d5d565b5050565b61195b611ab9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c2906137be565b60405180910390fd5b6119d481611fd4565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611aa257507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ab25750611ab1826124e0565b5b9050919050565b611ac1611b82565b73ffffffffffffffffffffffffffffffffffffffff16611adf611285565b73ffffffffffffffffffffffffffffffffffffffff1614611b35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2c906138be565b60405180910390fd5b565b611b4081612281565b611b7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b76906138fe565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611bfd836110d7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b8152600401611c7e91906136b8565b602060405180830381600087803b158015611c9857600080fd5b505af1158015611cac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd0919061321e565b905092915050565b600080611ce4836110d7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d265750611d25818561189d565b5b80611d6457508373ffffffffffffffffffffffffffffffffffffffff16611d4c84610a5b565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d8d826110d7565b73ffffffffffffffffffffffffffffffffffffffff1614611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda906137de565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a9061381e565b60405180910390fd5b611e5e83838361254a565b611e69600082611b8a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611eb99190613b9d565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f109190613abc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611fcf83838361265e565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6120b4828260405180602001604052806000815250612663565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612127576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211e9061383e565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516122189190613741565b60405180910390a3505050565b612230848484611d6d565b61223c848484846126be565b61227b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122729061379e565b60405180910390fd5b50505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6060600b80546122fc90613c87565b80601f016020809104026020016040519081016040528092919081815260200182805461232890613c87565b80156123755780601f1061234a57610100808354040283529160200191612375565b820191906000526020600020905b81548152906001019060200180831161235857829003601f168201915b5050505050905090565b606060008214156123c7576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506124db565b600082905060005b600082146123f95780806123e290613cea565b915050600a826123f29190613b12565b91506123cf565b60008167ffffffffffffffff81111561241557612414613e4f565b5b6040519080825280601f01601f1916602001820160405280156124475781602001600182028036833780820191505090505b5090505b600085146124d4576001826124609190613b9d565b9150600a8561246f9190613d33565b603061247b9190613abc565b60f81b81838151811061249157612490613e20565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856124cd9190613b12565b945061244b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612555838383612855565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612598576125938161285a565b6125d7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125d6576125d583826128a3565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561261a5761261581612a10565b612659565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612658576126578282612ae1565b5b5b505050565b505050565b61266d8383612b60565b61267a60008484846126be565b6126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b09061379e565b60405180910390fd5b505050565b60006126df8473ffffffffffffffffffffffffffffffffffffffff16612d3a565b15612848578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612708611b82565b8786866040518563ffffffff1660e01b815260040161272a94939291906136d3565b602060405180830381600087803b15801561274457600080fd5b505af192505050801561277557506040513d601f19601f82011682018060405250810190612772919061317b565b60015b6127f8573d80600081146127a5576040519150601f19603f3d011682016040523d82523d6000602084013e6127aa565b606091505b506000815114156127f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127e79061379e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061284d565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128b084611189565b6128ba9190613b9d565b905060006007600084815260200190815260200160002054905081811461299f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a249190613b9d565b9050600060096000848152602001908152602001600020549050600060088381548110612a5457612a53613e20565b5b906000526020600020015490508060088381548110612a7657612a75613e20565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612ac557612ac4613df1565b5b6001900381819060005260206000200160009055905550505050565b6000612aec83611189565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612bd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bc79061389e565b60405180910390fd5b612bd981612281565b15612c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c10906137fe565b60405180910390fd5b612c256000838361254a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612c759190613abc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d366000838361265e565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b828054612d6990613c87565b90600052602060002090601f016020900481019282612d8b5760008555612dd2565b82601f10612da457805160ff1916838001178555612dd2565b82800160010185558215612dd2579182015b82811115612dd1578251825591602001919060010190612db6565b5b509050612ddf9190612de3565b5090565b5b80821115612dfc576000816000905550600101612de4565b5090565b6000612e13612e0e846139be565b613999565b905082815260208101848484011115612e2f57612e2e613e83565b5b612e3a848285613c45565b509392505050565b6000612e55612e50846139ef565b613999565b905082815260208101848484011115612e7157612e70613e83565b5b612e7c848285613c45565b509392505050565b600081359050612e93816142d8565b92915050565b600081359050612ea8816142ef565b92915050565b600081359050612ebd81614306565b92915050565b600081519050612ed281614306565b92915050565b600082601f830112612eed57612eec613e7e565b5b8135612efd848260208601612e00565b91505092915050565b600082601f830112612f1b57612f1a613e7e565b5b8135612f2b848260208601612e42565b91505092915050565b600081359050612f438161431d565b92915050565b600081519050612f588161431d565b92915050565b600060208284031215612f7457612f73613e8d565b5b6000612f8284828501612e84565b91505092915050565b60008060408385031215612fa257612fa1613e8d565b5b6000612fb085828601612e84565b9250506020612fc185828601612e84565b9150509250929050565b600080600060608486031215612fe457612fe3613e8d565b5b6000612ff286828701612e84565b935050602061300386828701612e84565b925050604061301486828701612f34565b9150509250925092565b6000806000806080858703121561303857613037613e8d565b5b600061304687828801612e84565b945050602061305787828801612e84565b935050604061306887828801612f34565b925050606085013567ffffffffffffffff81111561308957613088613e88565b5b61309587828801612ed8565b91505092959194509250565b600080604083850312156130b8576130b7613e8d565b5b60006130c685828601612e84565b92505060206130d785828601612e99565b9150509250929050565b600080604083850312156130f8576130f7613e8d565b5b600061310685828601612e84565b925050602061311785828601612f34565b9150509250929050565b60006020828403121561313757613136613e8d565b5b600061314584828501612e99565b91505092915050565b60006020828403121561316457613163613e8d565b5b600061317284828501612eae565b91505092915050565b60006020828403121561319157613190613e8d565b5b600061319f84828501612ec3565b91505092915050565b6000602082840312156131be576131bd613e8d565b5b600082013567ffffffffffffffff8111156131dc576131db613e88565b5b6131e884828501612f06565b91505092915050565b60006020828403121561320757613206613e8d565b5b600061321584828501612f34565b91505092915050565b60006020828403121561323457613233613e8d565b5b600061324284828501612f49565b91505092915050565b60006132578383613654565b60208301905092915050565b61326c81613bd1565b82525050565b600061327d82613a45565b6132878185613a73565b935061329283613a20565b8060005b838110156132c35781516132aa888261324b565b97506132b583613a66565b925050600181019050613296565b5085935050505092915050565b6132d981613be3565b82525050565b60006132ea82613a50565b6132f48185613a84565b9350613304818560208601613c54565b61330d81613e92565b840191505092915050565b600061332382613a5b565b61332d8185613aa0565b935061333d818560208601613c54565b61334681613e92565b840191505092915050565b600061335c82613a5b565b6133668185613ab1565b9350613376818560208601613c54565b80840191505092915050565b6000815461338f81613c87565b6133998186613ab1565b945060018216600081146133b457600181146133c5576133f8565b60ff198316865281860193506133f8565b6133ce85613a30565b60005b838110156133f0578154818901526001820191506020810190506133d1565b838801955050505b50505092915050565b600061340e602b83613aa0565b915061341982613ea3565b604082019050919050565b6000613431603283613aa0565b915061343c82613ef2565b604082019050919050565b6000613454602683613aa0565b915061345f82613f41565b604082019050919050565b6000613477602583613aa0565b915061348282613f90565b604082019050919050565b600061349a601c83613aa0565b91506134a582613fdf565b602082019050919050565b60006134bd602483613aa0565b91506134c882614008565b604082019050919050565b60006134e0601983613aa0565b91506134eb82614057565b602082019050919050565b6000613503602983613aa0565b915061350e82614080565b604082019050919050565b6000613526603e83613aa0565b9150613531826140cf565b604082019050919050565b6000613549602083613aa0565b91506135548261411e565b602082019050919050565b600061356c602083613aa0565b915061357782614147565b602082019050919050565b600061358f602f83613aa0565b915061359a82614170565b604082019050919050565b60006135b2601883613aa0565b91506135bd826141bf565b602082019050919050565b60006135d5602183613aa0565b91506135e0826141e8565b604082019050919050565b60006135f8600083613a95565b915061360382614237565b600082019050919050565b600061361b602c83613aa0565b91506136268261423a565b604082019050919050565b600061363e602e83613aa0565b915061364982614289565b604082019050919050565b61365d81613c3b565b82525050565b61366c81613c3b565b82525050565b600061367e8286613351565b915061368a8285613351565b91506136968284613382565b9150819050949350505050565b60006136ae826135eb565b9150819050919050565b60006020820190506136cd6000830184613263565b92915050565b60006080820190506136e86000830187613263565b6136f56020830186613263565b6137026040830185613663565b818103606083015261371481846132df565b905095945050505050565b600060208201905081810360008301526137398184613272565b905092915050565b600060208201905061375660008301846132d0565b92915050565b600060208201905081810360008301526137768184613318565b905092915050565b6000602082019050818103600083015261379781613401565b9050919050565b600060208201905081810360008301526137b781613424565b9050919050565b600060208201905081810360008301526137d781613447565b9050919050565b600060208201905081810360008301526137f78161346a565b9050919050565b600060208201905081810360008301526138178161348d565b9050919050565b60006020820190508181036000830152613837816134b0565b9050919050565b60006020820190508181036000830152613857816134d3565b9050919050565b60006020820190508181036000830152613877816134f6565b9050919050565b6000602082019050818103600083015261389781613519565b9050919050565b600060208201905081810360008301526138b78161353c565b9050919050565b600060208201905081810360008301526138d78161355f565b9050919050565b600060208201905081810360008301526138f781613582565b9050919050565b60006020820190508181036000830152613917816135a5565b9050919050565b60006020820190508181036000830152613937816135c8565b9050919050565b600060208201905081810360008301526139578161360e565b9050919050565b6000602082019050818103600083015261397781613631565b9050919050565b60006020820190506139936000830184613663565b92915050565b60006139a36139b4565b90506139af8282613cb9565b919050565b6000604051905090565b600067ffffffffffffffff8211156139d9576139d8613e4f565b5b6139e282613e92565b9050602081019050919050565b600067ffffffffffffffff821115613a0a57613a09613e4f565b5b613a1382613e92565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ac782613c3b565b9150613ad283613c3b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b0757613b06613d64565b5b828201905092915050565b6000613b1d82613c3b565b9150613b2883613c3b565b925082613b3857613b37613d93565b5b828204905092915050565b6000613b4e82613c3b565b9150613b5983613c3b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613b9257613b91613d64565b5b828202905092915050565b6000613ba882613c3b565b9150613bb383613c3b565b925082821015613bc657613bc5613d64565b5b828203905092915050565b6000613bdc82613c1b565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613c72578082015181840152602081019050613c57565b83811115613c81576000848401525b50505050565b60006002820490506001821680613c9f57607f821691505b60208210811415613cb357613cb2613dc2565b5b50919050565b613cc282613e92565b810181811067ffffffffffffffff82111715613ce157613ce0613e4f565b5b80604052505050565b6000613cf582613c3b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d2857613d27613d64565b5b600182019050919050565b6000613d3e82613c3b565b9150613d4983613c3b565b925082613d5957613d58613d93565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b6142e181613bd1565b81146142ec57600080fd5b50565b6142f881613be3565b811461430357600080fd5b50565b61430f81613bef565b811461431a57600080fd5b50565b61432681613c3b565b811461433157600080fd5b5056fea2646970667358221220332a01fe0a679083a1d16f76428564eb7901436b7fa04383f4df1cb00422d55564736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000000d54524143204469706c6f6d6173000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005545241434400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046c696e6b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000046c696e6b00000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): TRAC Diplomas
Arg [1] : _symbol (string): TRACD
Arg [2] : _initBaseURI (string): link
Arg [3] : _initNotRevealedUri (string): link
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [4] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [5] : 54524143204469706c6f6d617300000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [7] : 5452414344000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 6c696e6b00000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [11] : 6c696e6b00000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
316:4119:12:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;989:222:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4215:71:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2405:98:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3870:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;624:28:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3402:407:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1234:660:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;494:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1614:111:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4547:327:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4291:142:12;;;:::i;:::-;;4940:179:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2759:337:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3785:78;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1797:230:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;592:28:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3991:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;562:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;419:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2125:218:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1864:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1824:101:10;;;;;;;;;;;;;:::i;:::-;;656:54:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;714:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1194:85:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2567:102:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2028:727:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4104:153:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3716:63:12;;;;;;;;;;;;;:::i;:::-;;5185:315:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;453:37:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3100:477;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3596:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;527:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4091:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4323:162:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3869:118:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2074:198:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;989:222:4;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;4215:71:12:-;1087:13:10;:11;:13::i;:::-;4275:6:12::1;4266;;:15;;;;;;;;;;;;;;;;;;4215:71:::0;:::o;2405:98:3:-;2459:13;2491:5;2484:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2405:98;:::o;3870:167::-;3946:7;3965:23;3980:7;3965:14;:23::i;:::-;4006:15;:24;4022:7;4006:24;;;;;;;;;;;;;;;;;;;;;3999:31;;3870:167;;;:::o;624:28:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3402:407:3:-;3482:13;3498:23;3513:7;3498:14;:23::i;:::-;3482:39;;3545:5;3539:11;;:2;:11;;;;3531:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3636:5;3620:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3645:37;3662:5;3669:12;:10;:12::i;:::-;3645:16;:37::i;:::-;3620:62;3599:171;;;;;;;;;;;;:::i;:::-;;;;;;;;;3781:21;3790:2;3794:7;3781:8;:21::i;:::-;3472:337;3402:407;;:::o;1234:660:12:-;1302:7;1320:21;1344:37;1355:8;1365:15;;;;;;;;;;;1344:10;:37::i;:::-;1320:61;;1409:1;1393:13;:17;1389:501;;;1442:2;1426:13;:18;1422:425;;;1490:1;1460:17;:27;1478:8;1460:27;;;;;;;;;;;;;;;:31;;;;1512:1;1505:8;;;;;1422:425;1544:19;1603:1;1597:2;1581:13;:18;;;;:::i;:::-;:23;1577:173;;;1655:2;1639:13;:18;;;;:::i;:::-;1624:34;;1577:173;;;1734:1;1728:2;1712:13;:18;;;;:::i;:::-;1711:24;;;;:::i;:::-;1697:38;;1577:173;1793:11;1763:17;:27;1781:8;1763:27;;;;;;;;;;;;;;;:41;;;;1825:11;1818:18;;;;;;1389:501;1880:1;1873:8;;;1234:660;;;;:::o;494:29::-;;;;:::o;1614:111:4:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;4547:327:3:-;4736:41;4755:12;:10;:12::i;:::-;4769:7;4736:18;:41::i;:::-;4728:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;4839:28;4849:4;4855:2;4859:7;4839:9;:28::i;:::-;4547:327;;;:::o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;4291:142:12:-;1087:13:10;:11;:13::i;:::-;4343:7:12::1;4364;:5;:7::i;:::-;4356:21;;4385;4356:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4342:69;;;4425:2;4417:11;;;::::0;::::1;;4336:97;4291:142::o:0;4940:179:3:-;5073:39;5090:4;5096:2;5100:7;5073:39;;;;;;;;;;;;:16;:39::i;:::-;4940:179;;;:::o;2759:337:12:-;2831:16;2857:23;2883:17;2893:6;2883:9;:17::i;:::-;2857:43;;2906:25;2948:15;2934:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2906:58;;2975:9;2970:101;2990:15;2986:1;:19;2970:101;;;3034:30;3054:6;3062:1;3034:19;:30::i;:::-;3020:8;3029:1;3020:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;3007:3;;;;;:::i;:::-;;;;2970:101;;;;3083:8;3076:15;;;;2759:337;;;:::o;3785:78::-;1087:13:10;:11;:13::i;:::-;3850:8:12::1;3843:4;:15;;;;3785:78:::0;:::o;1797:230:4:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;;1996:24;;1797:230;;;:::o;592:28:12:-;;;;;;;;;;;;;:::o;3991:96::-;1087:13:10;:11;:13::i;:::-;4071:11:12::1;4061:7;:21;;;;;;;;;;;;:::i;:::-;;3991:96:::0;:::o;562:26::-;;;;;;;;;;;;;:::o;419:30::-;;;;;;;;;;;;;:::o;2125:218:3:-;2197:7;2216:13;2232:7;:16;2240:7;2232:16;;;;;;;;;;;;;;;;;;;;;2216:32;;2283:1;2266:19;;:5;:19;;;;2258:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2331:5;2324:12;;;2125:218;;;:::o;1864:204::-;1936:7;1980:1;1963:19;;:5;:19;;;;1955:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2045:9;:16;2055:5;2045:16;;;;;;;;;;;;;;;;2038:23;;1864:204;;;:::o;1824:101:10:-;1087:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;656:54:12:-;;;;;;;;;;;;;;;;;:::o;714:52::-;;;;;;;;;;;;;;;;;:::o;1194:85:10:-;1240:7;1266:6;;;;;;;;;;;1259:13;;1194:85;:::o;2567:102:3:-;2623:13;2655:7;2648:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2567:102;:::o;2028:727:12:-;2091:36;2116:10;2091:24;:36::i;:::-;;2173:1;2141:17;:29;2159:10;2141:29;;;;;;;;;;;;;;;;:33;2133:42;;;;;;2181:14;2198:13;:11;:13::i;:::-;2181:30;;2217:19;2271;:31;2291:10;2271:31;;;;;;;;;;;;;;;;2239:17;:29;2257:10;2239:29;;;;;;;;;;;;;;;;:63;;;;:::i;:::-;2217:85;;2317:6;;;;;;;;;;;2316:7;2308:16;;;;;;2352:1;2338:11;:15;2330:24;;;;;;2383:11;2368;:26;;2360:35;;;;;;2433:9;;2418:11;2409:6;:20;;;;:::i;:::-;:33;;2401:42;;;;;;2468:7;:5;:7::i;:::-;2454:21;;:10;:21;;;2450:82;;2513:11;2506:4;;:18;;;;:::i;:::-;2493:9;:31;;2485:40;;;;;;2450:82;2543:9;2555:1;2543:13;;2538:213;2563:11;2558:1;:16;2538:213;;2589:21;2613:19;:31;2633:10;2613:31;;;;;;;;;;;;;;;;2589:55;;2652:33;2662:10;2683:1;2674:6;:10;;;;:::i;:::-;2652:9;:33::i;:::-;2743:1;2727:13;:17;;;;:::i;:::-;2693:19;:31;2713:10;2693:31;;;;;;;;;;;;;;;:51;;;;2581:170;2576:3;;;;;:::i;:::-;;;;2538:213;;;;2085:670;;2028:727;:::o;4104:153:3:-;4198:52;4217:12;:10;:12::i;:::-;4231:8;4241;4198:18;:52::i;:::-;4104:153;;:::o;3716:63:12:-;1087:13:10;:11;:13::i;:::-;3770:4:12::1;3759:8;;:15;;;;;;;;;;;;;;;;;;3716:63::o:0;5185:315:3:-;5353:41;5372:12;:10;:12::i;:::-;5386:7;5353:18;:41::i;:::-;5345:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;5455:38;5469:4;5475:2;5479:7;5488:4;5455:13;:38::i;:::-;5185:315;;;;:::o;453:37:12:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3100:477::-;3193:13;3231:16;3239:7;3231;:16::i;:::-;3216:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;3336:5;3324:17;;:8;;;;;;;;;;;:17;;;3321:60;;;3360:14;3353:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3321:60;3387:28;3418:10;:8;:10::i;:::-;3387:41;;3472:1;3447:14;3441:28;:32;:131;;;;;;;;;;;;;;;;;3508:14;3524:18;:7;:16;:18::i;:::-;3544:13;3491:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3441:131;3434:138;;;3100:477;;;;:::o;3596:116::-;1087:13:10;:11;:13::i;:::-;3691:16:12::1;3673:15;;:34;;;;;;;;;;;;;;;;;;3596:116:::0;:::o;527:31::-;;;;:::o;4091:120::-;1087:13:10;:11;:13::i;:::-;4189:17:12::1;4173:13;:33;;;;;;;;;;;;:::i;:::-;;4091:120:::0;:::o;4323:162:3:-;4420:4;4443:18;:25;4462:5;4443:25;;;;;;;;;;;;;;;:35;4469:8;4443:35;;;;;;;;;;;;;;;;;;;;;;;;;4436:42;;4323:162;;;;:::o;3869:118:12:-;1087:13:10;:11;:13::i;:::-;3967:15:12::1;3950:14;:32;;;;;;;;;;;;:::i;:::-;;3869:118:::0;:::o;2074:198:10:-;1087:13;:11;:13::i;:::-;2182:1:::1;2162:22;;:8;:22;;;;2154:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;1505:300:3:-;1607:4;1657:25;1642:40;;;:11;:40;;;;:104;;;;1713:33;1698:48;;;:11;:48;;;;1642:104;:156;;;;1762:36;1786:11;1762:23;:36::i;:::-;1642:156;1623:175;;1505:300;;;:::o;1352:130:10:-;1426:12;:10;:12::i;:::-;1415:23;;:7;:5;:7::i;:::-;:23;;;1407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:130::o;11592:133:3:-;11673:16;11681:7;11673;:16::i;:::-;11665:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;11592:133;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10894:171:3:-;10995:2;10968:15;:24;10984:7;10968:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11050:7;11046:2;11012:46;;11021:23;11036:7;11021:14;:23::i;:::-;11012:46;;;;;;;;;;;;10894:171;;:::o;1029:178:12:-;1118:7;1159:16;1142:44;;;1187:14;1142:60;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1135:67;;1029:178;;;;:::o;7252:261:3:-;7345:4;7361:13;7377:23;7392:7;7377:14;:23::i;:::-;7361:39;;7429:5;7418:16;;:7;:16;;;:52;;;;7438:32;7455:5;7462:7;7438:16;:32::i;:::-;7418:52;:87;;;;7498:7;7474:31;;:20;7486:7;7474:11;:20::i;:::-;:31;;;7418:87;7410:96;;;7252:261;;;;:::o;10177:605::-;10331:4;10304:31;;:23;10319:7;10304:14;:23::i;:::-;:31;;;10296:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10409:1;10395:16;;:2;:16;;;;10387:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10463:39;10484:4;10490:2;10494:7;10463:20;:39::i;:::-;10564:29;10581:1;10585:7;10564:8;:29::i;:::-;10623:1;10604:9;:15;10614:4;10604:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10651:1;10634:9;:13;10644:2;10634:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10681:2;10662:7;:16;10670:7;10662:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10718:7;10714:2;10699:27;;10708:4;10699:27;;;;;;;;;;;;10737:38;10757:4;10763:2;10767:7;10737:19;:38::i;:::-;10177:605;;;:::o;2426:187:10:-;2499:16;2518:6;;;;;;;;;;;2499:25;;2543:8;2534:6;;:17;;;;;;;;;;;;;;;;;;2597:8;2566:40;;2587:8;2566:40;;;;;;;;;;;;2489:124;2426:187;:::o;7843:108:3:-;7918:26;7928:2;7932:7;7918:26;;;;;;;;;;;;:9;:26::i;:::-;7843:108;;:::o;11201:307::-;11351:8;11342:17;;:5;:17;;;;11334:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11437:8;11399:18;:25;11418:5;11399:25;;;;;;;;;;;;;;;:35;11425:8;11399:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11482:8;11460:41;;11475:5;11460:41;;;11492:8;11460:41;;;;;;:::i;:::-;;;;;;;;11201:307;;;:::o;6361:305::-;6511:28;6521:4;6527:2;6531:7;6511:9;:28::i;:::-;6557:47;6580:4;6586:2;6590:7;6599:4;6557:22;:47::i;:::-;6549:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6361:305;;;;:::o;6969:125::-;7034:4;7085:1;7057:30;;:7;:16;7065:7;7057:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7050:37;;6969:125;;;:::o;1912:100:12:-;1972:13;2000:7;1993:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1912:100;:::o;392:703:11:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;829:155:2:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2623:572:4:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;14158:121:3:-;;;;:::o;8172:309::-;8296:18;8302:2;8306:7;8296:5;:18::i;:::-;8345:53;8376:1;8380:2;8384:7;8393:4;8345:22;:53::i;:::-;8324:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;8172:309;;;:::o;12277:831::-;12426:4;12446:15;:2;:13;;;:15::i;:::-;12442:660;;;12497:2;12481:36;;;12518:12;:10;:12::i;:::-;12532:4;12538:7;12547:4;12481:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12477:573;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12736:1;12719:6;:13;:18;12715:321;;;12761:60;;;;;;;;;;:::i;:::-;;;;;;;;12715:321;12988:6;12982:13;12973:6;12969:2;12965:15;12958:38;12477:573;12612:41;;;12602:51;;;:6;:51;;;;12595:58;;;;;12442:660;13087:4;13080:11;;12277:831;;;;;;;:::o;13664:122::-;;;;:::o;3901:161:4:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5183:289;5149:323;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4760:889;;4679:970;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;:::i;:::-;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3563:143;3489:217;;:::o;8803:427:3:-;8896:1;8882:16;;:2;:16;;;;8874:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;8954:16;8962:7;8954;:16::i;:::-;8953:17;8945:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9014:45;9043:1;9047:2;9051:7;9014:20;:45::i;:::-;9087:1;9070:9;:13;9080:2;9070:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9117:2;9098:7;:16;9106:7;9098:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9160:7;9156:2;9135:33;;9152:1;9135:33;;;;;;;;;;;;9179:44;9207:1;9211:2;9215:7;9179:19;:44::i;:::-;8803:427;;:::o;1175:320:0:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:13:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:143::-;2334:5;2365:6;2359:13;2350:22;;2381:33;2408:5;2381:33;:::i;:::-;2277:143;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:119;;;2540:79;;:::i;:::-;2502:119;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2426:329;;;;:::o;2761:474::-;2829:6;2837;2886:2;2874:9;2865:7;2861:23;2857:32;2854:119;;;2892:79;;:::i;:::-;2854:119;3012:1;3037:53;3082:7;3073:6;3062:9;3058:22;3037:53;:::i;:::-;3027:63;;2983:117;3139:2;3165:53;3210:7;3201:6;3190:9;3186:22;3165:53;:::i;:::-;3155:63;;3110:118;2761:474;;;;;:::o;3241:619::-;3318:6;3326;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3764:2;3790:53;3835:7;3826:6;3815:9;3811:22;3790:53;:::i;:::-;3780:63;;3735:118;3241:619;;;;;:::o;3866:943::-;3961:6;3969;3977;3985;4034:3;4022:9;4013:7;4009:23;4005:33;4002:120;;;4041:79;;:::i;:::-;4002:120;4161:1;4186:53;4231:7;4222:6;4211:9;4207:22;4186:53;:::i;:::-;4176:63;;4132:117;4288:2;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4259:118;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4572:2;4561:9;4557:18;4544:32;4603:18;4595:6;4592:30;4589:117;;;4625:79;;:::i;:::-;4589:117;4730:62;4784:7;4775:6;4764:9;4760:22;4730:62;:::i;:::-;4720:72;;4515:287;3866:943;;;;;;;:::o;4815:468::-;4880:6;4888;4937:2;4925:9;4916:7;4912:23;4908:32;4905:119;;;4943:79;;:::i;:::-;4905:119;5063:1;5088:53;5133:7;5124:6;5113:9;5109:22;5088:53;:::i;:::-;5078:63;;5034:117;5190:2;5216:50;5258:7;5249:6;5238:9;5234:22;5216:50;:::i;:::-;5206:60;;5161:115;4815:468;;;;;:::o;5289:474::-;5357:6;5365;5414:2;5402:9;5393:7;5389:23;5385:32;5382:119;;;5420:79;;:::i;:::-;5382:119;5540:1;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5511:117;5667:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5638:118;5289:474;;;;;:::o;5769:323::-;5825:6;5874:2;5862:9;5853:7;5849:23;5845:32;5842:119;;;5880:79;;:::i;:::-;5842:119;6000:1;6025:50;6067:7;6058:6;6047:9;6043:22;6025:50;:::i;:::-;6015:60;;5971:114;5769:323;;;;:::o;6098:327::-;6156:6;6205:2;6193:9;6184:7;6180:23;6176:32;6173:119;;;6211:79;;:::i;:::-;6173:119;6331:1;6356:52;6400:7;6391:6;6380:9;6376:22;6356:52;:::i;:::-;6346:62;;6302:116;6098:327;;;;:::o;6431:349::-;6500:6;6549:2;6537:9;6528:7;6524:23;6520:32;6517:119;;;6555:79;;:::i;:::-;6517:119;6675:1;6700:63;6755:7;6746:6;6735:9;6731:22;6700:63;:::i;:::-;6690:73;;6646:127;6431:349;;;;:::o;6786:509::-;6855:6;6904:2;6892:9;6883:7;6879:23;6875:32;6872:119;;;6910:79;;:::i;:::-;6872:119;7058:1;7047:9;7043:17;7030:31;7088:18;7080:6;7077:30;7074:117;;;7110:79;;:::i;:::-;7074:117;7215:63;7270:7;7261:6;7250:9;7246:22;7215:63;:::i;:::-;7205:73;;7001:287;6786:509;;;;:::o;7301:329::-;7360:6;7409:2;7397:9;7388:7;7384:23;7380:32;7377:119;;;7415:79;;:::i;:::-;7377:119;7535:1;7560:53;7605:7;7596:6;7585:9;7581:22;7560:53;:::i;:::-;7550:63;;7506:117;7301:329;;;;:::o;7636:351::-;7706:6;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7881:1;7906:64;7962:7;7953:6;7942:9;7938:22;7906:64;:::i;:::-;7896:74;;7852:128;7636:351;;;;:::o;7993:179::-;8062:10;8083:46;8125:3;8117:6;8083:46;:::i;:::-;8161:4;8156:3;8152:14;8138:28;;7993:179;;;;:::o;8178:118::-;8265:24;8283:5;8265:24;:::i;:::-;8260:3;8253:37;8178:118;;:::o;8332:732::-;8451:3;8480:54;8528:5;8480:54;:::i;:::-;8550:86;8629:6;8624:3;8550:86;:::i;:::-;8543:93;;8660:56;8710:5;8660:56;:::i;:::-;8739:7;8770:1;8755:284;8780:6;8777:1;8774:13;8755:284;;;8856:6;8850:13;8883:63;8942:3;8927:13;8883:63;:::i;:::-;8876:70;;8969:60;9022:6;8969:60;:::i;:::-;8959:70;;8815:224;8802:1;8799;8795:9;8790:14;;8755:284;;;8759:14;9055:3;9048:10;;8456:608;;;8332:732;;;;:::o;9070:109::-;9151:21;9166:5;9151:21;:::i;:::-;9146:3;9139:34;9070:109;;:::o;9185:360::-;9271:3;9299:38;9331:5;9299:38;:::i;:::-;9353:70;9416:6;9411:3;9353:70;:::i;:::-;9346:77;;9432:52;9477:6;9472:3;9465:4;9458:5;9454:16;9432:52;:::i;:::-;9509:29;9531:6;9509:29;:::i;:::-;9504:3;9500:39;9493:46;;9275:270;9185:360;;;;:::o;9551:364::-;9639:3;9667:39;9700:5;9667:39;:::i;:::-;9722:71;9786:6;9781:3;9722:71;:::i;:::-;9715:78;;9802:52;9847:6;9842:3;9835:4;9828:5;9824:16;9802:52;:::i;:::-;9879:29;9901:6;9879:29;:::i;:::-;9874:3;9870:39;9863:46;;9643:272;9551:364;;;;:::o;9921:377::-;10027:3;10055:39;10088:5;10055:39;:::i;:::-;10110:89;10192:6;10187:3;10110:89;:::i;:::-;10103:96;;10208:52;10253:6;10248:3;10241:4;10234:5;10230:16;10208:52;:::i;:::-;10285:6;10280:3;10276:16;10269:23;;10031:267;9921:377;;;;:::o;10328:845::-;10431:3;10468:5;10462:12;10497:36;10523:9;10497:36;:::i;:::-;10549:89;10631:6;10626:3;10549:89;:::i;:::-;10542:96;;10669:1;10658:9;10654:17;10685:1;10680:137;;;;10831:1;10826:341;;;;10647:520;;10680:137;10764:4;10760:9;10749;10745:25;10740:3;10733:38;10800:6;10795:3;10791:16;10784:23;;10680:137;;10826:341;10893:38;10925:5;10893:38;:::i;:::-;10953:1;10967:154;10981:6;10978:1;10975:13;10967:154;;;11055:7;11049:14;11045:1;11040:3;11036:11;11029:35;11105:1;11096:7;11092:15;11081:26;;11003:4;11000:1;10996:12;10991:17;;10967:154;;;11150:6;11145:3;11141:16;11134:23;;10833:334;;10647:520;;10435:738;;10328:845;;;;:::o;11179:366::-;11321:3;11342:67;11406:2;11401:3;11342:67;:::i;:::-;11335:74;;11418:93;11507:3;11418:93;:::i;:::-;11536:2;11531:3;11527:12;11520:19;;11179:366;;;:::o;11551:::-;11693:3;11714:67;11778:2;11773:3;11714:67;:::i;:::-;11707:74;;11790:93;11879:3;11790:93;:::i;:::-;11908:2;11903:3;11899:12;11892:19;;11551:366;;;:::o;11923:::-;12065:3;12086:67;12150:2;12145:3;12086:67;:::i;:::-;12079:74;;12162:93;12251:3;12162:93;:::i;:::-;12280:2;12275:3;12271:12;12264:19;;11923:366;;;:::o;12295:::-;12437:3;12458:67;12522:2;12517:3;12458:67;:::i;:::-;12451:74;;12534:93;12623:3;12534:93;:::i;:::-;12652:2;12647:3;12643:12;12636:19;;12295:366;;;:::o;12667:::-;12809:3;12830:67;12894:2;12889:3;12830:67;:::i;:::-;12823:74;;12906:93;12995:3;12906:93;:::i;:::-;13024:2;13019:3;13015:12;13008:19;;12667:366;;;:::o;13039:::-;13181:3;13202:67;13266:2;13261:3;13202:67;:::i;:::-;13195:74;;13278:93;13367:3;13278:93;:::i;:::-;13396:2;13391:3;13387:12;13380:19;;13039:366;;;:::o;13411:::-;13553:3;13574:67;13638:2;13633:3;13574:67;:::i;:::-;13567:74;;13650:93;13739:3;13650:93;:::i;:::-;13768:2;13763:3;13759:12;13752:19;;13411:366;;;:::o;13783:::-;13925:3;13946:67;14010:2;14005:3;13946:67;:::i;:::-;13939:74;;14022:93;14111:3;14022:93;:::i;:::-;14140:2;14135:3;14131:12;14124:19;;13783:366;;;:::o;14155:::-;14297:3;14318:67;14382:2;14377:3;14318:67;:::i;:::-;14311:74;;14394:93;14483:3;14394:93;:::i;:::-;14512:2;14507:3;14503:12;14496:19;;14155:366;;;:::o;14527:::-;14669:3;14690:67;14754:2;14749:3;14690:67;:::i;:::-;14683:74;;14766:93;14855:3;14766:93;:::i;:::-;14884:2;14879:3;14875:12;14868:19;;14527:366;;;:::o;14899:::-;15041:3;15062:67;15126:2;15121:3;15062:67;:::i;:::-;15055:74;;15138:93;15227:3;15138:93;:::i;:::-;15256:2;15251:3;15247:12;15240:19;;14899:366;;;:::o;15271:::-;15413:3;15434:67;15498:2;15493:3;15434:67;:::i;:::-;15427:74;;15510:93;15599:3;15510:93;:::i;:::-;15628:2;15623:3;15619:12;15612:19;;15271:366;;;:::o;15643:::-;15785:3;15806:67;15870:2;15865:3;15806:67;:::i;:::-;15799:74;;15882:93;15971:3;15882:93;:::i;:::-;16000:2;15995:3;15991:12;15984:19;;15643:366;;;:::o;16015:::-;16157:3;16178:67;16242:2;16237:3;16178:67;:::i;:::-;16171:74;;16254:93;16343:3;16254:93;:::i;:::-;16372:2;16367:3;16363:12;16356:19;;16015:366;;;:::o;16387:398::-;16546:3;16567:83;16648:1;16643:3;16567:83;:::i;:::-;16560:90;;16659:93;16748:3;16659:93;:::i;:::-;16777:1;16772:3;16768:11;16761:18;;16387:398;;;:::o;16791:366::-;16933:3;16954:67;17018:2;17013:3;16954:67;:::i;:::-;16947:74;;17030:93;17119:3;17030:93;:::i;:::-;17148:2;17143:3;17139:12;17132:19;;16791:366;;;:::o;17163:::-;17305:3;17326:67;17390:2;17385:3;17326:67;:::i;:::-;17319:74;;17402:93;17491:3;17402:93;:::i;:::-;17520:2;17515:3;17511:12;17504:19;;17163:366;;;:::o;17535:108::-;17612:24;17630:5;17612:24;:::i;:::-;17607:3;17600:37;17535:108;;:::o;17649:118::-;17736:24;17754:5;17736:24;:::i;:::-;17731:3;17724:37;17649:118;;:::o;17773:589::-;17998:3;18020:95;18111:3;18102:6;18020:95;:::i;:::-;18013:102;;18132:95;18223:3;18214:6;18132:95;:::i;:::-;18125:102;;18244:92;18332:3;18323:6;18244:92;:::i;:::-;18237:99;;18353:3;18346:10;;17773:589;;;;;;:::o;18368:379::-;18552:3;18574:147;18717:3;18574:147;:::i;:::-;18567:154;;18738:3;18731:10;;18368:379;;;:::o;18753:222::-;18846:4;18884:2;18873:9;18869:18;18861:26;;18897:71;18965:1;18954:9;18950:17;18941:6;18897:71;:::i;:::-;18753:222;;;;:::o;18981:640::-;19176:4;19214:3;19203:9;19199:19;19191:27;;19228:71;19296:1;19285:9;19281:17;19272:6;19228:71;:::i;:::-;19309:72;19377:2;19366:9;19362:18;19353:6;19309:72;:::i;:::-;19391;19459:2;19448:9;19444:18;19435:6;19391:72;:::i;:::-;19510:9;19504:4;19500:20;19495:2;19484:9;19480:18;19473:48;19538:76;19609:4;19600:6;19538:76;:::i;:::-;19530:84;;18981:640;;;;;;;:::o;19627:373::-;19770:4;19808:2;19797:9;19793:18;19785:26;;19857:9;19851:4;19847:20;19843:1;19832:9;19828:17;19821:47;19885:108;19988:4;19979:6;19885:108;:::i;:::-;19877:116;;19627:373;;;;:::o;20006:210::-;20093:4;20131:2;20120:9;20116:18;20108:26;;20144:65;20206:1;20195:9;20191:17;20182:6;20144:65;:::i;:::-;20006:210;;;;:::o;20222:313::-;20335:4;20373:2;20362:9;20358:18;20350:26;;20422:9;20416:4;20412:20;20408:1;20397:9;20393:17;20386:47;20450:78;20523:4;20514:6;20450:78;:::i;:::-;20442:86;;20222:313;;;;:::o;20541:419::-;20707:4;20745:2;20734:9;20730:18;20722:26;;20794:9;20788:4;20784:20;20780:1;20769:9;20765:17;20758:47;20822:131;20948:4;20822:131;:::i;:::-;20814:139;;20541:419;;;:::o;20966:::-;21132:4;21170:2;21159:9;21155:18;21147:26;;21219:9;21213:4;21209:20;21205:1;21194:9;21190:17;21183:47;21247:131;21373:4;21247:131;:::i;:::-;21239:139;;20966:419;;;:::o;21391:::-;21557:4;21595:2;21584:9;21580:18;21572:26;;21644:9;21638:4;21634:20;21630:1;21619:9;21615:17;21608:47;21672:131;21798:4;21672:131;:::i;:::-;21664:139;;21391:419;;;:::o;21816:::-;21982:4;22020:2;22009:9;22005:18;21997:26;;22069:9;22063:4;22059:20;22055:1;22044:9;22040:17;22033:47;22097:131;22223:4;22097:131;:::i;:::-;22089:139;;21816:419;;;:::o;22241:::-;22407:4;22445:2;22434:9;22430:18;22422:26;;22494:9;22488:4;22484:20;22480:1;22469:9;22465:17;22458:47;22522:131;22648:4;22522:131;:::i;:::-;22514:139;;22241:419;;;:::o;22666:::-;22832:4;22870:2;22859:9;22855:18;22847:26;;22919:9;22913:4;22909:20;22905:1;22894:9;22890:17;22883:47;22947:131;23073:4;22947:131;:::i;:::-;22939:139;;22666:419;;;:::o;23091:::-;23257:4;23295:2;23284:9;23280:18;23272:26;;23344:9;23338:4;23334:20;23330:1;23319:9;23315:17;23308:47;23372:131;23498:4;23372:131;:::i;:::-;23364:139;;23091:419;;;:::o;23516:::-;23682:4;23720:2;23709:9;23705:18;23697:26;;23769:9;23763:4;23759:20;23755:1;23744:9;23740:17;23733:47;23797:131;23923:4;23797:131;:::i;:::-;23789:139;;23516:419;;;:::o;23941:::-;24107:4;24145:2;24134:9;24130:18;24122:26;;24194:9;24188:4;24184:20;24180:1;24169:9;24165:17;24158:47;24222:131;24348:4;24222:131;:::i;:::-;24214:139;;23941:419;;;:::o;24366:::-;24532:4;24570:2;24559:9;24555:18;24547:26;;24619:9;24613:4;24609:20;24605:1;24594:9;24590:17;24583:47;24647:131;24773:4;24647:131;:::i;:::-;24639:139;;24366:419;;;:::o;24791:::-;24957:4;24995:2;24984:9;24980:18;24972:26;;25044:9;25038:4;25034:20;25030:1;25019:9;25015:17;25008:47;25072:131;25198:4;25072:131;:::i;:::-;25064:139;;24791:419;;;:::o;25216:::-;25382:4;25420:2;25409:9;25405:18;25397:26;;25469:9;25463:4;25459:20;25455:1;25444:9;25440:17;25433:47;25497:131;25623:4;25497:131;:::i;:::-;25489:139;;25216:419;;;:::o;25641:::-;25807:4;25845:2;25834:9;25830:18;25822:26;;25894:9;25888:4;25884:20;25880:1;25869:9;25865:17;25858:47;25922:131;26048:4;25922:131;:::i;:::-;25914:139;;25641:419;;;:::o;26066:::-;26232:4;26270:2;26259:9;26255:18;26247:26;;26319:9;26313:4;26309:20;26305:1;26294:9;26290:17;26283:47;26347:131;26473:4;26347:131;:::i;:::-;26339:139;;26066:419;;;:::o;26491:::-;26657:4;26695:2;26684:9;26680:18;26672:26;;26744:9;26738:4;26734:20;26730:1;26719:9;26715:17;26708:47;26772:131;26898:4;26772:131;:::i;:::-;26764:139;;26491:419;;;:::o;26916:::-;27082:4;27120:2;27109:9;27105:18;27097:26;;27169:9;27163:4;27159:20;27155:1;27144:9;27140:17;27133:47;27197:131;27323:4;27197:131;:::i;:::-;27189:139;;26916:419;;;:::o;27341:222::-;27434:4;27472:2;27461:9;27457:18;27449:26;;27485:71;27553:1;27542:9;27538:17;27529:6;27485:71;:::i;:::-;27341:222;;;;:::o;27569:129::-;27603:6;27630:20;;:::i;:::-;27620:30;;27659:33;27687:4;27679:6;27659:33;:::i;:::-;27569:129;;;:::o;27704:75::-;27737:6;27770:2;27764:9;27754:19;;27704:75;:::o;27785:307::-;27846:4;27936:18;27928:6;27925:30;27922:56;;;27958:18;;:::i;:::-;27922:56;27996:29;28018:6;27996:29;:::i;:::-;27988:37;;28080:4;28074;28070:15;28062:23;;27785:307;;;:::o;28098:308::-;28160:4;28250:18;28242:6;28239:30;28236:56;;;28272:18;;:::i;:::-;28236:56;28310:29;28332:6;28310:29;:::i;:::-;28302:37;;28394:4;28388;28384:15;28376:23;;28098:308;;;:::o;28412:132::-;28479:4;28502:3;28494:11;;28532:4;28527:3;28523:14;28515:22;;28412:132;;;:::o;28550:141::-;28599:4;28622:3;28614:11;;28645:3;28642:1;28635:14;28679:4;28676:1;28666:18;28658:26;;28550:141;;;:::o;28697:114::-;28764:6;28798:5;28792:12;28782:22;;28697:114;;;:::o;28817:98::-;28868:6;28902:5;28896:12;28886:22;;28817:98;;;:::o;28921:99::-;28973:6;29007:5;29001:12;28991:22;;28921:99;;;:::o;29026:113::-;29096:4;29128;29123:3;29119:14;29111:22;;29026:113;;;:::o;29145:184::-;29244:11;29278:6;29273:3;29266:19;29318:4;29313:3;29309:14;29294:29;;29145:184;;;;:::o;29335:168::-;29418:11;29452:6;29447:3;29440:19;29492:4;29487:3;29483:14;29468:29;;29335:168;;;;:::o;29509:147::-;29610:11;29647:3;29632:18;;29509:147;;;;:::o;29662:169::-;29746:11;29780:6;29775:3;29768:19;29820:4;29815:3;29811:14;29796:29;;29662:169;;;;:::o;29837:148::-;29939:11;29976:3;29961:18;;29837:148;;;;:::o;29991:305::-;30031:3;30050:20;30068:1;30050:20;:::i;:::-;30045:25;;30084:20;30102:1;30084:20;:::i;:::-;30079:25;;30238:1;30170:66;30166:74;30163:1;30160:81;30157:107;;;30244:18;;:::i;:::-;30157:107;30288:1;30285;30281:9;30274:16;;29991:305;;;;:::o;30302:185::-;30342:1;30359:20;30377:1;30359:20;:::i;:::-;30354:25;;30393:20;30411:1;30393:20;:::i;:::-;30388:25;;30432:1;30422:35;;30437:18;;:::i;:::-;30422:35;30479:1;30476;30472:9;30467:14;;30302:185;;;;:::o;30493:348::-;30533:7;30556:20;30574:1;30556:20;:::i;:::-;30551:25;;30590:20;30608:1;30590:20;:::i;:::-;30585:25;;30778:1;30710:66;30706:74;30703:1;30700:81;30695:1;30688:9;30681:17;30677:105;30674:131;;;30785:18;;:::i;:::-;30674:131;30833:1;30830;30826:9;30815:20;;30493:348;;;;:::o;30847:191::-;30887:4;30907:20;30925:1;30907:20;:::i;:::-;30902:25;;30941:20;30959:1;30941:20;:::i;:::-;30936:25;;30980:1;30977;30974:8;30971:34;;;30985:18;;:::i;:::-;30971:34;31030:1;31027;31023:9;31015:17;;30847:191;;;;:::o;31044:96::-;31081:7;31110:24;31128:5;31110:24;:::i;:::-;31099:35;;31044:96;;;:::o;31146:90::-;31180:7;31223:5;31216:13;31209:21;31198:32;;31146:90;;;:::o;31242:149::-;31278:7;31318:66;31311:5;31307:78;31296:89;;31242:149;;;:::o;31397:126::-;31434:7;31474:42;31467:5;31463:54;31452:65;;31397:126;;;:::o;31529:77::-;31566:7;31595:5;31584:16;;31529:77;;;:::o;31612:154::-;31696:6;31691:3;31686;31673:30;31758:1;31749:6;31744:3;31740:16;31733:27;31612:154;;;:::o;31772:307::-;31840:1;31850:113;31864:6;31861:1;31858:13;31850:113;;;31949:1;31944:3;31940:11;31934:18;31930:1;31925:3;31921:11;31914:39;31886:2;31883:1;31879:10;31874:15;;31850:113;;;31981:6;31978:1;31975:13;31972:101;;;32061:1;32052:6;32047:3;32043:16;32036:27;31972:101;31821:258;31772:307;;;:::o;32085:320::-;32129:6;32166:1;32160:4;32156:12;32146:22;;32213:1;32207:4;32203:12;32234:18;32224:81;;32290:4;32282:6;32278:17;32268:27;;32224:81;32352:2;32344:6;32341:14;32321:18;32318:38;32315:84;;;32371:18;;:::i;:::-;32315:84;32136:269;32085:320;;;:::o;32411:281::-;32494:27;32516:4;32494:27;:::i;:::-;32486:6;32482:40;32624:6;32612:10;32609:22;32588:18;32576:10;32573:34;32570:62;32567:88;;;32635:18;;:::i;:::-;32567:88;32675:10;32671:2;32664:22;32454:238;32411:281;;:::o;32698:233::-;32737:3;32760:24;32778:5;32760:24;:::i;:::-;32751:33;;32806:66;32799:5;32796:77;32793:103;;;32876:18;;:::i;:::-;32793:103;32923:1;32916:5;32912:13;32905:20;;32698:233;;;:::o;32937:176::-;32969:1;32986:20;33004:1;32986:20;:::i;:::-;32981:25;;33020:20;33038:1;33020:20;:::i;:::-;33015:25;;33059:1;33049:35;;33064:18;;:::i;:::-;33049:35;33105:1;33102;33098:9;33093:14;;32937:176;;;;:::o;33119:180::-;33167:77;33164:1;33157:88;33264:4;33261:1;33254:15;33288:4;33285:1;33278:15;33305:180;33353:77;33350:1;33343:88;33450:4;33447:1;33440:15;33474:4;33471:1;33464:15;33491:180;33539:77;33536:1;33529:88;33636:4;33633:1;33626:15;33660:4;33657:1;33650:15;33677:180;33725:77;33722:1;33715:88;33822:4;33819:1;33812:15;33846:4;33843:1;33836:15;33863:180;33911:77;33908:1;33901:88;34008:4;34005:1;33998:15;34032:4;34029:1;34022:15;34049:180;34097:77;34094:1;34087:88;34194:4;34191:1;34184:15;34218:4;34215:1;34208:15;34235:117;34344:1;34341;34334:12;34358:117;34467:1;34464;34457:12;34481:117;34590:1;34587;34580:12;34604:117;34713:1;34710;34703:12;34727:102;34768:6;34819:2;34815:7;34810:2;34803:5;34799:14;34795:28;34785:38;;34727:102;;;:::o;34835:230::-;34975:34;34971:1;34963:6;34959:14;34952:58;35044:13;35039:2;35031:6;35027:15;35020:38;34835:230;:::o;35071:237::-;35211:34;35207:1;35199:6;35195:14;35188:58;35280:20;35275:2;35267:6;35263:15;35256:45;35071:237;:::o;35314:225::-;35454:34;35450:1;35442:6;35438:14;35431:58;35523:8;35518:2;35510:6;35506:15;35499:33;35314:225;:::o;35545:224::-;35685:34;35681:1;35673:6;35669:14;35662:58;35754:7;35749:2;35741:6;35737:15;35730:32;35545:224;:::o;35775:178::-;35915:30;35911:1;35903:6;35899:14;35892:54;35775:178;:::o;35959:223::-;36099:34;36095:1;36087:6;36083:14;36076:58;36168:6;36163:2;36155:6;36151:15;36144:31;35959:223;:::o;36188:175::-;36328:27;36324:1;36316:6;36312:14;36305:51;36188:175;:::o;36369:228::-;36509:34;36505:1;36497:6;36493:14;36486:58;36578:11;36573:2;36565:6;36561:15;36554:36;36369:228;:::o;36603:249::-;36743:34;36739:1;36731:6;36727:14;36720:58;36812:32;36807:2;36799:6;36795:15;36788:57;36603:249;:::o;36858:182::-;36998:34;36994:1;36986:6;36982:14;36975:58;36858:182;:::o;37046:::-;37186:34;37182:1;37174:6;37170:14;37163:58;37046:182;:::o;37234:234::-;37374:34;37370:1;37362:6;37358:14;37351:58;37443:17;37438:2;37430:6;37426:15;37419:42;37234:234;:::o;37474:174::-;37614:26;37610:1;37602:6;37598:14;37591:50;37474:174;:::o;37654:220::-;37794:34;37790:1;37782:6;37778:14;37771:58;37863:3;37858:2;37850:6;37846:15;37839:28;37654:220;:::o;37880:114::-;;:::o;38000:231::-;38140:34;38136:1;38128:6;38124:14;38117:58;38209:14;38204:2;38196:6;38192:15;38185:39;38000:231;:::o;38237:233::-;38377:34;38373:1;38365:6;38361:14;38354:58;38446:16;38441:2;38433:6;38429:15;38422:41;38237:233;:::o;38476:122::-;38549:24;38567:5;38549:24;:::i;:::-;38542:5;38539:35;38529:63;;38588:1;38585;38578:12;38529:63;38476:122;:::o;38604:116::-;38674:21;38689:5;38674:21;:::i;:::-;38667:5;38664:32;38654:60;;38710:1;38707;38700:12;38654:60;38604:116;:::o;38726:120::-;38798:23;38815:5;38798:23;:::i;:::-;38791:5;38788:34;38778:62;;38836:1;38833;38826:12;38778:62;38726:120;:::o;38852:122::-;38925:24;38943:5;38925:24;:::i;:::-;38918:5;38915:35;38905:63;;38964:1;38961;38954:12;38905:63;38852:122;:::o
Swarm Source
ipfs://332a01fe0a679083a1d16f76428564eb7901436b7fa04383f4df1cb00422d555
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.