Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 88 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Whitelisted ... | 19374897 | 195 days ago | IN | 0 ETH | 0.0019443 | ||||
Validate Submitt... | 17876243 | 405 days ago | IN | 0 ETH | 0.00403387 | ||||
Echo | 17742416 | 424 days ago | IN | 0 ETH | 0.01128519 | ||||
Set Whitelisted ... | 17661669 | 435 days ago | IN | 0 ETH | 0.0003838 | ||||
Validate Submitt... | 17636823 | 439 days ago | IN | 0 ETH | 0.00878318 | ||||
Echo | 15376293 | 759 days ago | IN | 0 ETH | 0.00176844 | ||||
Set Whitelisted ... | 15357182 | 762 days ago | IN | 0 ETH | 0.00021224 | ||||
Validate Submitt... | 14886379 | 839 days ago | IN | 0 ETH | 0.0198802 | ||||
Echo | 14886368 | 839 days ago | IN | 0 ETH | 0.02087896 | ||||
Set Whitelisted ... | 14885372 | 839 days ago | IN | 0 ETH | 0.00227705 | ||||
Validate Submitt... | 14748578 | 861 days ago | IN | 0 ETH | 0.00954341 | ||||
Echo | 14748570 | 861 days ago | IN | 0 ETH | 0.0107616 | ||||
Set Whitelisted ... | 14748529 | 861 days ago | IN | 0 ETH | 0.00140642 | ||||
Validate Submitt... | 14659541 | 875 days ago | IN | 0 ETH | 0.00644134 | ||||
Echo | 14659532 | 875 days ago | IN | 0 ETH | 0.00688449 | ||||
Set Whitelisted ... | 14659478 | 875 days ago | IN | 0 ETH | 0.00084766 | ||||
Validate Submitt... | 14641648 | 878 days ago | IN | 0 ETH | 0.01432659 | ||||
Echo | 14641621 | 878 days ago | IN | 0 ETH | 0.01692333 | ||||
Set Whitelisted ... | 14641315 | 878 days ago | IN | 0 ETH | 0.00109209 | ||||
Validate Submitt... | 14583807 | 887 days ago | IN | 0 ETH | 0.02446017 | ||||
Echo | 14583801 | 887 days ago | IN | 0 ETH | 0.0198997 | ||||
Set Whitelisted ... | 14583781 | 887 days ago | IN | 0 ETH | 0.00241823 | ||||
Set Whitelisted ... | 13895856 | 994 days ago | IN | 0 ETH | 0.00327595 | ||||
Validate Submitt... | 13895162 | 994 days ago | IN | 0 ETH | 0.04071022 | ||||
Echo | 13882058 | 996 days ago | IN | 0 ETH | 0.01405886 |
Loading...
Loading
Contract Name:
Echoes
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier:Unlicensed pragma solidity ^0.8.2; //echoes echo echoes /* .::. .---- :====: .==== .----. .==== .:::::. .:::::. .==== .:::. ..::::. .::::.. .:::::.. -=========: :=========- .====-=======- :=========-. .-========-. :=========-. .-==-. .-==-. .-==-. .====:...:===- -===-...:==== .====-...:====: -===-...:====: :===-:...-===: :===- .====. :====: :====: :====: -===: -===: :===- ::::. .==== -===- :===- ====. .====. .==== :===-:.. .::. .::. .::. ==============: -===: .==== :===- -===: -===: :============== .-=======-: ====:.......... :===- .==== :===- :===- ====. .====.......... ..::-====. .... :====: .:: ====: .====. .==== :===- .====: .-===- -===-. .-. ==== -===: :====: .-==========- .-==========. .==== :===- .-==========: :===========. .====---====- .-==-. .:-----:: .:-----:. ---- :---: .:-----:. .:-----:. .:-----:: */ import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "./base64.sol"; contract Echoes is ERC721 { //all those arrays are basically used to store the echoes data address private _owner; address private _whitelistedAddress; string[] private echoes; string[] private contributors; string[] private signers; string[] private dates; string[] private colors; string[] private submission; string[12] monthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sept","Oct","Nov","Dec"]; string[2] color=["#F27F7F","#000000"]; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor() ERC721("Echoes by Nahiko", "ECHOES") { //init the whitelisted addy as sender _whitelistedAddress = _msgSender(); _owner = _msgSender(); emit OwnershipTransferred(address(0), _msgSender()); } //_________________________________________________________________________________ //functions that are utils for the ERC721 function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { uint i; bytes memory json; //concat data and return the json as a string bytes memory loopedValues; for(i= tokenId*6+0; (i < tokenId*6+(echoes.length - tokenId*6)) && (i < tokenId*6 +6) ; i++){ loopedValues = abi.encodePacked(loopedValues," <rect class='tab' y='",uint2str(296+(700*(i%6))),"px'/> <text class='name' y='",uint2str(610+(700*(i%6))),"px' x='450px'>",contributors[i]," \u00B7<tspan class='signature' dx='30px' dy='-10px'>",echoes[i],"</tspan> <tspan class='date' text-anchor='end' x='93%' dy='-200px'>",dates[i],"</tspan> <tspan class='signed' text-anchor='end' x='93%' dy='-170px'>signed by 0x",signers[i],"</tspan> <tspan class='dot' style='fill:",colors[i],";' x='92.5%' dy='400px'>\u00B7</tspan> </text>"); } json = abi.encodePacked("<svg width='5000px' height='5000px' xmlns='http://www.w3.org/2000/svg'> <style type='text/css'> .tab{ width: 4452px; height: 496px; fill:#FFFFFF; x:274px; border-radius: 70px; rx:70px; dy:160px; margin-left:274px; filter: drop-shadow( 0px 23px 42px rgba(137, 151, 188, 0.23)); } .name{font-weight:bold;} .signature{font-weight:lighter !important;font-size:120px;} .text{fill:#1a1a1a;font-size:160px;font-family:sans-serif;} .date{fill:#A6AEBB;font-size:50px;} .signed{fill:#A6AEBB;font-size:50px;font-weight:lighter !important;} .dot{font-size:700px;fill:#000000;} </style> <rect width='100%' height='100%' fill='#F3F5F9'/> <g class='text' y='296px'>", loopedValues, "<text style='fill:red;font-weight: bold;font-size: 122px;fill:#F27F7F' x='50%' y='98%' text-anchor='middle'>\u2E2D echoes</text> </g> </svg>"); return string(abi.encodePacked('data:application/json;utf8,{"description":"Echoes is a 100% on chain blank slate. The owner can whitelist people to sign a message.","background_color": "F3F5F9","name": "Echoes ',uint2str(tokenId),'","image": "data:image/svg+xml;base64,',Base64.encode(json),'"}')); } function contractURI() public pure returns (string memory) { return 'data:application/json;utf8,{"description":"The Echoes Smart Contract enables its owner to allow whitelisted addresses to sign the Echoes token. Each token is 100% generated on chain. There is NO image, only code.","name": "Echoes Smart Contract","image": "ipfs://QmXw3Ug5ub53xckjT9T6xE3EU45bqUMsGnswzMYGertENa","seller_fee_basis_points": 500,"fee_recipient": "0x9E57A685F5843090A79A01ce6947a82eAdA9EDf1"}'; } function owner() public view virtual returns (address) { return _owner; } function transferOwnership(address newOwner) public virtual { require(_msgSender() == _owner,"only the owner transfer ownership"); require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function getWhitelistedAddress() public view returns(address){ return _whitelistedAddress; } function setWhitelistedAddress(address newWhitelistedAddress) external { require(_msgSender() == _owner,"you are not the owner of the contract"); _whitelistedAddress = newWhitelistedAddress; } function echo(string memory newEcho,string memory signedBy) public{ require(_msgSender() == _whitelistedAddress,"you are not whitelisted"); require(isValid(newEcho) && isValid(signedBy),"please make sure to keep it simple"); require(abi.encodePacked(newEcho,signedBy).length < 100,"max total length is 100 bytes"); //push everything to the submission array submission.push(newEcho); submission.push(signedBy); submission.push(string(abi.encodePacked("0x",toAsciiString(_msgSender())))); submission.push(getCurrentDate(block.timestamp)); submission.push(color[random()]); _whitelistedAddress = _owner; } function validateSubmittedEcho(bool ok) public{ require(_msgSender() == _owner,"only the owner can refuse an echo"); if(ok == true){ if(echoes.length%6 == 0){ //making sure to mint a token every 6th echo as needed _mint(msg.sender,echoes.length/6); } echoes.push(submission[0]); //update the new echo data contributors.push(submission[1]); signers.push(submission[2]); dates.push(submission[3]); colors.push(submission[4]); } delete submission; //refresh the submission array } function getEchoes() public view returns(string[] memory,string[] memory,string[] memory,string[] memory,string[] memory){ return (echoes,contributors,signers,dates,colors); } function getSubmission() public view returns(string[] memory){ return submission; } ////////////utils//////////// //this part is code picked from bokkypoobah's github. Thank you for leaving this as MIT license <3 // https://github.com/bokkypoobah/BokkyPooBahsDateTimeLibrary int constant OFFSET19700101 = 2440588; uint constant SECONDS_PER_DAY = 24 * 60 * 60; function _daysToDate(uint _days) internal pure returns (uint year, uint month, uint day) { int __days = int(_days); int L = __days + 68569 + OFFSET19700101; int N = 4 * L / 146097; L = L - (146097 * N + 3) / 4; int _year = 4000 * (L + 1) / 1461001; L = L - 1461 * _year / 4 + 31; int _month = 80 * L / 2447; int _day = L - 2447 * _month / 80; L = _month / 11; _month = _month + 2 - 12 * L; _year = 100 * (N - 49) + _year + L; year = uint(_year); month = uint(_month); day = uint(_day); } function getCurrentDate(uint timestamp) internal view returns (string memory date) { uint yearint; uint monthint; uint dayint; (yearint,monthint,dayint) = _daysToDate(timestamp / SECONDS_PER_DAY); date=string(abi.encodePacked(monthNames[monthint-1]," ",uint2str(dayint)," ",uint2str(yearint))); return date; } function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function random() private view returns (uint) { return uint(keccak256(abi.encodePacked(block.difficulty, block.timestamp)))%2; } function toAsciiString(address x) internal pure returns (string memory) { bytes memory s = new bytes(40); for (uint i = 0; i < 20; i++) { bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i))))); bytes1 hi = bytes1(uint8(b) / 16); bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi)); s[2*i] = char(hi); s[2*i+1] = char(lo); } return string(s); } function char(bytes1 b) internal pure returns (bytes1 c) { if (uint8(b) < 10) return bytes1(uint8(b) + 0x30); else return bytes1(uint8(b) + 0x57); } //function coming from Seedlings project. ty @dievardump function isValid(string memory str) public pure returns (bool) { bytes memory strBytes = bytes(str); if (strBytes.length < 1) return false; if (strBytes.length > 100) return false; // Cannot be longer than 100 bytes if (strBytes[0] == 0x20) return false; // Leading space if (strBytes[strBytes.length - 1] == 0x20) return false; // Trailing space bytes1 lastChar; bytes1 char2; uint8 charCode; for (uint256 i; i < strBytes.length; i++) { char2 = strBytes[i]; if (char2 == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces charCode = uint8(char2); if ( !(charCode >= 97 && charCode <= 122) && // a - z !(charCode >= 65 && charCode <= 90) && // A - Z !(charCode >= 48 && charCode <= 57) && // 0 - 9 !(charCode == 32) && // space !(charCode == 44) && // , !(charCode == 39) && // ' !(charCode == 63) && // ? !(charCode == 33) && // ! !(charCode == 64) && // @ !(charCode == 59) && // ; !(charCode == 45) // - ) { return false; } lastChar = char2; } return true; } }
pragma solidity ^0.8.0; // SPDX-License-Identifier: MIT /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides a function for encoding some bytes in base64 library Base64 { string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for { } lt(dataPtr, endPtr) { } { dataPtr := add(dataPtr, 3) // read 3 bytes let input := mload(dataPtr) // write 4 characters mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))) ) resultPtr := add(resultPtr, 1) mstore( resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))) ) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/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: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"string","name":"newEcho","type":"string"},{"internalType":"string","name":"signedBy","type":"string"}],"name":"echo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEchoes","outputs":[{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"string[]","name":"","type":"string[]"},{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSubmission","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"address","name":"newWhitelistedAddress","type":"address"}],"name":"setWhitelistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"bool","name":"ok","type":"bool"}],"name":"validateSubmittedEcho","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518061018001604052806040518060400160405280600381526020017f4a616e000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f466562000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4d6172000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f417072000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4d6179000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4a756e000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4a756c000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f417567000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f536570740000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4f6374000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4e6f76000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600381526020017f4465630000000000000000000000000000000000000000000000000000000000815250815250600e90600c620002e49291906200053d565b5060405180604001604052806040518060400160405280600781526020017f234632374637460000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f2330303030303000000000000000000000000000000000000000000000000000815250815250601a9060026200037692919062000597565b503480156200038457600080fd5b506040518060400160405280601081526020017f4563686f6573206279204e6168696b6f000000000000000000000000000000008152506040518060400160405280600681526020017f4543484f45530000000000000000000000000000000000000000000000000000815250816000908051906020019062000409929190620005f1565b50806001908051906020019062000422929190620005f1565b505050620004356200053560201b60201c565b600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004856200053560201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004d56200053560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a362000774565b600033905090565b82600c810192821562000584579160200282015b828111156200058357825182908051906020019062000572929190620005f1565b509160200191906001019062000551565b5b50905062000593919062000682565b5090565b8260028101928215620005de579160200282015b82811115620005dd578251829080519060200190620005cc929190620005f1565b5091602001919060010190620005ab565b5b509050620005ed919062000682565b5090565b828054620005ff906200070f565b90600052602060002090601f0160209004810192826200062357600085556200066f565b82601f106200063e57805160ff19168380011785556200066f565b828001600101855582156200066f579182015b828111156200066e57825182559160200191906001019062000651565b5b5090506200067e9190620006aa565b5090565b5b80821115620006a657600081816200069c9190620006c9565b5060010162000683565b5090565b5b80821115620006c5576000816000905550600101620006ab565b5090565b508054620006d7906200070f565b6000825580601f10620006eb57506200070c565b601f0160209004906000526020600020908101906200070b9190620006aa565b5b50565b600060028204905060018216806200072857607f821691505b602082108114156200073f576200073e62000745565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b615c8580620007846000396000f3fe608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063d6f449c01161007c578063d6f449c01461039c578063e8a3d485146103be578063e985e9c5146103dc578063f096b0ff1461040c578063f1dfaefb14610428578063f2fde38b146104585761014d565b80638da5cb5b146102da57806395d89b41146102f8578063a22cb46514610316578063a888dda014610332578063b88d4fde14610350578063c87b56dd1461036c5761014d565b80632d160693116101155780632d1606931461020857806337c8d21f1461022657806342842e0e146102425780634db64feb1461025e5780636352211e1461027a57806370a08231146102aa5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806323b872dd146101ec575b600080fd5b61016c6004803603810190610167919061347c565b610474565b6040516101799190613fdc565b60405180910390f35b61018a610556565b6040516101979190613ff7565b60405180910390f35b6101ba60048036038101906101b59190613597565b6105e8565b6040516101c79190613edd565b60405180910390f35b6101ea60048036038101906101e5919061340f565b61066d565b005b610206600480360381019061020191906132f9565b610785565b005b6102106107e5565b60405161021d9190613f44565b60405180910390f35b610240600480360381019061023b919061351f565b6108be565b005b61025c600480360381019061025791906132f9565b610bfb565b005b6102786004803603810190610273919061344f565b610c1b565b005b610294600480360381019061028f9190613597565b610edd565b6040516102a19190613edd565b60405180910390f35b6102c460048036038101906102bf919061328c565b610f8f565b6040516102d19190614299565b60405180910390f35b6102e2611047565b6040516102ef9190613edd565b60405180910390f35b610300611071565b60405161030d9190613ff7565b60405180910390f35b610330600480360381019061032b91906133cf565b611103565b005b61033a611284565b6040516103479190613edd565b60405180910390f35b61036a6004803603810190610365919061334c565b6112ae565b005b61038660048036038101906103819190613597565b611310565b6040516103939190613ff7565b60405180910390f35b6103a461151e565b6040516103b5959493929190613f66565b60405180910390f35b6103c6611960565b6040516103d39190613ff7565b60405180910390f35b6103f660048036038101906103f191906132b9565b611983565b6040516104039190613fdc565b60405180910390f35b6104266004803603810190610421919061328c565b611a17565b005b610442600480360381019061043d91906134d6565b611af2565b60405161044f9190613fdc565b60405180910390f35b610472600480360381019061046d919061328c565b611d8e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061053f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061054f575061054e82611ea1565b5b9050919050565b60606000805461056590614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461059190614abb565b80156105de5780601f106105b3576101008083540402835291602001916105de565b820191906000526020600020905b8154815290600101906020018083116105c157829003601f168201915b5050505050905090565b60006105f382611f0b565b610632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610629906141d9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067882610edd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e090614259565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610708611f77565b73ffffffffffffffffffffffffffffffffffffffff161480610737575061073681610731611f77565b611983565b5b610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90614139565b60405180910390fd5b6107808383611f7f565b505050565b610796610790611f77565b82612038565b6107d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cc90614279565b60405180910390fd5b6107e0838383612116565b505050565b6060600d805480602002602001604051908101604052809291908181526020016000905b828210156108b557838290600052602060002001805461082890614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461085490614abb565b80156108a15780601f10610876576101008083540402835291602001916108a1565b820191906000526020600020905b81548152906001019060200180831161088457829003601f168201915b505050505081526020019060010190610809565b50505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108ff611f77565b73ffffffffffffffffffffffffffffffffffffffff1614610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90614239565b60405180910390fd5b61095e82611af2565b801561096f575061096e81611af2565b5b6109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590614119565b60405180910390fd5b606482826040516020016109c3929190613db2565b6040516020818303038152906040525110610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90614079565b60405180910390fd5b600d82908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610a4e929190612f8e565b50600d81908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610a8a929190612f8e565b50600d610a9d610a98611f77565b612372565b604051602001610aad9190613e4a565b604051602081830303815290604052908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610af4929190612f8e565b50600d610b0042612535565b908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610b38929190612f8e565b50600d601a610b456125bd565b60028110610b5657610b55614c2f565b5b0190806001815401808255809150506001900390600052602060002001600090919091909150908054610b8890614abb565b610b93929190613014565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610c16838383604051806020016040528060008152506112ae565b505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610c5c611f77565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614199565b60405180910390fd5b600115158115151415610ecc5760006006600880549050610cd39190614b71565b1415610cf557610cf4336006600880549050610cef9190614573565b6125fc565b5b6008600d600081548110610d0c57610d0b614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610d4790614abb565b610d52929190613014565b506009600d600181548110610d6a57610d69614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610da590614abb565b610db0929190613014565b50600a600d600281548110610dc857610dc7614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e0390614abb565b610e0e929190613014565b50600b600d600381548110610e2657610e25614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e6190614abb565b610e6c929190613014565b50600c600d600481548110610e8457610e83614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610ebf90614abb565b610eca929190613014565b505b600d6000610eda91906130a1565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90614179565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790614159565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461108090614abb565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac90614abb565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b5050505050905090565b61110b611f77565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611170906140d9565b60405180910390fd5b8060056000611186611f77565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611233611f77565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112789190613fdc565b60405180910390a35050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112bf6112b9611f77565b83612038565b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590614279565b60405180910390fd5b61130a848484846127ca565b50505050565b606060006060806000600686611326919061485d565b611330919061447c565b92505b600685611340919061485d565b6008805490506113509190614986565b60068661135d919061485d565b611367919061447c565b8310801561138b57506006808661137e919061485d565b611388919061447c565b83105b156114c057806113c06006856113a19190614b71565b6102bc6113ae919061485d565b6101286113bb919061447c565b612826565b6113ef6006866113d09190614b71565b6102bc6113dd919061485d565b6102626113ea919061447c565b612826565b6009868154811061140357611402614c2f565b5b906000526020600020016008878154811061142157611420614c2f565b5b90600052602060002001600b888154811061143f5761143e614c2f565b5b90600052602060002001600a898154811061145d5761145c614c2f565b5b90600052602060002001600c8a8154811061147b5761147a614c2f565b5b9060005260206000200160405160200161149c989796959493929190613ce8565b604051602081830303815290604052905082806114b890614b1e565b935050611333565b806040516020016114d19190613e1d565b60405160208183030381529060405291506114eb85612826565b6114f4836129af565b604051602001611505929190613e6c565b6040516020818303038152906040529350505050919050565b606080606080606060086009600a600b600c84805480602002602001604051908101604052809291908181526020016000905b828210156115fd57838290600052602060002001805461157090614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461159c90614abb565b80156115e95780601f106115be576101008083540402835291602001916115e9565b820191906000526020600020905b8154815290600101906020018083116115cc57829003601f168201915b505050505081526020019060010190611551565b50505050945083805480602002602001604051908101604052809291908181526020016000905b828210156116d057838290600052602060002001805461164390614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461166f90614abb565b80156116bc5780601f10611691576101008083540402835291602001916116bc565b820191906000526020600020905b81548152906001019060200180831161169f57829003601f168201915b505050505081526020019060010190611624565b50505050935082805480602002602001604051908101604052809291908181526020016000905b828210156117a357838290600052602060002001805461171690614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461174290614abb565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b5050505050815260200190600101906116f7565b50505050925081805480602002602001604051908101604052809291908181526020016000905b828210156118765783829060005260206000200180546117e990614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461181590614abb565b80156118625780601f1061183757610100808354040283529160200191611862565b820191906000526020600020905b81548152906001019060200180831161184557829003601f168201915b5050505050815260200190600101906117ca565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156119495783829060005260206000200180546118bc90614abb565b80601f01602080910402602001604051908101604052809291908181526020018280546118e890614abb565b80156119355780601f1061190a57610100808354040283529160200191611935565b820191906000526020600020905b81548152906001019060200180831161191857829003601f168201915b50505050508152602001906001019061189d565b505050509050945094509450945094509091929394565b6060604051806101c001604052806101948152602001615abc6101949139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a58611f77565b73ffffffffffffffffffffffffffffffffffffffff1614611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa5906141f9565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080829050600181511015611b0c576000915050611d89565b606481511115611b20576000915050611d89565b602060f81b81600081518110611b3957611b38614c2f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611b76576000915050611d89565b602060f81b8160018351611b8a9190614986565b81518110611b9b57611b9a614c2f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611bd8576000915050611d89565b6000806000805b8451811015611d7f57848181518110611bfb57611bfa614c2f565b5b602001015160f81c60f81b9250602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148015611c625750602060f81b847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15611c7557600095505050505050611d89565b8260f81c915060618260ff1610158015611c935750607a8260ff1611155b158015611cb5575060418260ff1610158015611cb35750605a8260ff1611155b155b8015611cd6575060308260ff1610158015611cd4575060398260ff1611155b155b8015611ce6575060208260ff1614155b8015611cf65750602c8260ff1614155b8015611d06575060278260ff1614155b8015611d165750603f8260ff1614155b8015611d26575060218260ff1614155b8015611d36575060408260ff1614155b8015611d465750603b8260ff1614155b8015611d565750602d8260ff1614155b15611d6957600095505050505050611d89565b8293508080611d7790614b1e565b915050611bdf565b5060019450505050505b919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611dcf611f77565b73ffffffffffffffffffffffffffffffffffffffff1614611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614039565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614059565b60405180910390fd5b611e9e81612b34565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ff283610edd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061204382611f0b565b612082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612079906140f9565b60405180910390fd5b600061208d83610edd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120fc57508373ffffffffffffffffffffffffffffffffffffffff166120e4846105e8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061210d575061210c8185611983565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661213682610edd565b73ffffffffffffffffffffffffffffffffffffffff161461218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390614219565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f3906140b9565b60405180910390fd5b612207838383612bfa565b612212600082611f7f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122629190614986565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b9919061447c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000602867ffffffffffffffff81111561239157612390614c5e565b5b6040519080825280601f01601f1916602001820160405280156123c35781602001600182028036833780820191505090505b50905060005b601481101561252b5760008160136123e19190614986565b60086123ed919061485d565b60026123f99190614628565b8573ffffffffffffffffffffffffffffffffffffffff1661241a9190614573565b60f81b9050600060108260f81c61243191906145a4565b60f81b905060008160f81c601061244891906148b7565b8360f81c61245691906149ba565b60f81b905061246482612bff565b85856002612472919061485d565b8151811061248357612482614c2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506124bb81612bff565b8560018660026124cb919061485d565b6124d5919061447c565b815181106124e6576124e5614c2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350505050808061252390614b1e565b9150506123c9565b5080915050919050565b60606000806000612553620151808661254e9190614573565b612c45565b809350819450829550505050600e60018361256e9190614986565b600c811061257f5761257e614c2f565b5b0161258982612826565b61259285612826565b6040516020016125a493929190613dd6565b6040516020818303038152906040529350505050919050565b6000600244426040516020016125d4929190613eb1565b6040516020818303038152906040528051906020012060001c6125f79190614b71565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612663906141b9565b60405180910390fd5b61267581611f0b565b156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90614099565b60405180910390fd5b6126c160008383612bfa565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612711919061447c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6127d5848484612116565b6127e184848484612de4565b612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281790614019565b60405180910390fd5b50505050565b6060600082141561286e576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129aa565b600082905060005b600082146128a057808061288990614b1e565b915050600a826128999190614573565b9150612876565b60008167ffffffffffffffff8111156128bc576128bb614c5e565b5b6040519080825280601f01601f1916602001820160405280156128ee5781602001600182028036833780820191505090505b50905060008290505b600086146129a25760018161290c9190614986565b90506000600a808861291e9190614573565b612928919061485d565b876129339190614986565b603061293f91906144d2565b905060008160f81b90508084848151811061295d5761295c614c2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886129999190614573565b975050506128f7565b819450505050505b919050565b60606000825114156129d257604051806020016040528060008152509050612b2f565b6000604051806060016040528060408152602001615a7c6040913990506000600360028551612a01919061447c565b612a0b9190614573565b6004612a17919061485d565b90506000602082612a28919061447c565b67ffffffffffffffff811115612a4157612a40614c5e565b5b6040519080825280601f01601f191660200182016040528015612a735781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612aee576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612a87565b600389510660018114612b085760028114612b1857612b23565b613d3d60f01b6002830352612b23565b603d60f81b60018303525b50505050508093505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b6000600a8260f81c60ff161015612c2a5760308260f81c612c2091906144d2565b60f81b9050612c40565b60578260f81c612c3a91906144d2565b60f81b90505b919050565b600080600080849050600062253d8c62010bd983612c6391906143e8565b612c6d91906143e8565b9050600062023ab1826004612c829190614746565b612c8c9190614509565b9050600460038262023ab1612ca19190614746565b612cab91906143e8565b612cb59190614509565b82612cc091906148f2565b9150600062164b09600184612cd591906143e8565b610fa0612ce29190614746565b612cec9190614509565b9050601f6004826105b5612d009190614746565b612d0a9190614509565b84612d1591906148f2565b612d1f91906143e8565b9250600061098f846050612d339190614746565b612d3d9190614509565b9050600060508261098f612d519190614746565b612d5b9190614509565b85612d6691906148f2565b9050600b82612d759190614509565b945084600c612d849190614746565b600283612d9191906143e8565b612d9b91906148f2565b91508483603186612dac91906148f2565b6064612db89190614746565b612dc291906143e8565b612dcc91906143e8565b92508298508197508096505050505050509193909250565b6000612e058473ffffffffffffffffffffffffffffffffffffffff16612f7b565b15612f6e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e2e611f77565b8786866040518563ffffffff1660e01b8152600401612e509493929190613ef8565b602060405180830381600087803b158015612e6a57600080fd5b505af1925050508015612e9b57506040513d601f19601f82011682018060405250810190612e9891906134a9565b60015b612f1e573d8060008114612ecb576040519150601f19603f3d011682016040523d82523d6000602084013e612ed0565b606091505b50600081511415612f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0d90614019565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f73565b600190505b949350505050565b600080823b905060008111915050919050565b828054612f9a90614abb565b90600052602060002090601f016020900481019282612fbc5760008555613003565b82601f10612fd557805160ff1916838001178555613003565b82800160010185558215613003579182015b82811115613002578251825591602001919060010190612fe7565b5b50905061301091906130c2565b5090565b82805461302090614abb565b90600052602060002090601f0160209004810192826130425760008555613090565b82601f106130535780548555613090565b8280016001018555821561309057600052602060002091601f016020900482015b8281111561308f578254825591600101919060010190613074565b5b50905061309d91906130c2565b5090565b50805460008255906000526020600020908101906130bf91906130df565b50565b5b808211156130db5760008160009055506001016130c3565b5090565b5b808211156130ff57600081816130f69190613103565b506001016130e0565b5090565b50805461310f90614abb565b6000825580601f106131215750613140565b601f01602090049060005260206000209081019061313f91906130c2565b5b50565b6000613156613151846142d9565b6142b4565b90508281526020810184848401111561317257613171614c92565b5b61317d848285614a79565b509392505050565b60006131986131938461430a565b6142b4565b9050828152602081018484840111156131b4576131b3614c92565b5b6131bf848285614a79565b509392505050565b6000813590506131d681615a1f565b92915050565b6000813590506131eb81615a36565b92915050565b60008135905061320081615a4d565b92915050565b60008151905061321581615a4d565b92915050565b600082601f8301126132305761322f614c8d565b5b8135613240848260208601613143565b91505092915050565b600082601f83011261325e5761325d614c8d565b5b813561326e848260208601613185565b91505092915050565b60008135905061328681615a64565b92915050565b6000602082840312156132a2576132a1614c9c565b5b60006132b0848285016131c7565b91505092915050565b600080604083850312156132d0576132cf614c9c565b5b60006132de858286016131c7565b92505060206132ef858286016131c7565b9150509250929050565b60008060006060848603121561331257613311614c9c565b5b6000613320868287016131c7565b9350506020613331868287016131c7565b925050604061334286828701613277565b9150509250925092565b6000806000806080858703121561336657613365614c9c565b5b6000613374878288016131c7565b9450506020613385878288016131c7565b935050604061339687828801613277565b925050606085013567ffffffffffffffff8111156133b7576133b6614c97565b5b6133c38782880161321b565b91505092959194509250565b600080604083850312156133e6576133e5614c9c565b5b60006133f4858286016131c7565b9250506020613405858286016131dc565b9150509250929050565b6000806040838503121561342657613425614c9c565b5b6000613434858286016131c7565b925050602061344585828601613277565b9150509250929050565b60006020828403121561346557613464614c9c565b5b6000613473848285016131dc565b91505092915050565b60006020828403121561349257613491614c9c565b5b60006134a0848285016131f1565b91505092915050565b6000602082840312156134bf576134be614c9c565b5b60006134cd84828501613206565b91505092915050565b6000602082840312156134ec576134eb614c9c565b5b600082013567ffffffffffffffff81111561350a57613509614c97565b5b61351684828501613249565b91505092915050565b6000806040838503121561353657613535614c9c565b5b600083013567ffffffffffffffff81111561355457613553614c97565b5b61356085828601613249565b925050602083013567ffffffffffffffff81111561358157613580614c97565b5b61358d85828601613249565b9150509250929050565b6000602082840312156135ad576135ac614c9c565b5b60006135bb84828501613277565b91505092915050565b60006135d083836136d5565b905092915050565b6135e1816149ee565b82525050565b60006135f282614360565b6135fc818561438e565b93508360208202850161360e8561433b565b8060005b8581101561364a578484038952815161362b85826135c4565b945061363683614381565b925060208a01995050600181019050613612565b50829750879550505050505092915050565b61366581614a00565b82525050565b60006136768261436b565b613680818561439f565b9350613690818560208601614a88565b61369981614ca1565b840191505092915050565b60006136af8261436b565b6136b981856143b0565b93506136c9818560208601614a88565b80840191505092915050565b60006136e082614376565b6136ea81856143bb565b93506136fa818560208601614a88565b61370381614ca1565b840191505092915050565b600061371982614376565b61372381856143cc565b9350613733818560208601614a88565b61373c81614ca1565b840191505092915050565b600061375282614376565b61375c81856143dd565b935061376c818560208601614a88565b80840191505092915050565b6000815461378581614abb565b61378f81866143dd565b945060018216600081146137aa57600181146137bb576137ee565b60ff198316865281860193506137ee565b6137c48561434b565b60005b838110156137e6578154818901526001820191506020810190506137c7565b838801955050505b50505092915050565b600061380561028a836143dd565b915061381082614cbf565b61028a82019050919050565b60006138296051836143dd565b915061383482614fed565b605182019050919050565b600061384c6032836143cc565b915061385782615062565b604082019050919050565b600061386f6021836143cc565b915061387a826150b1565b604082019050919050565b60006138926026836143cc565b915061389d82615100565b604082019050919050565b60006138b5601d836143cc565b91506138c08261514f565b602082019050919050565b60006138d8601c836143cc565b91506138e382615178565b602082019050919050565b60006138fb6089836143dd565b9150613906826151a1565b608982019050919050565b600061391e6002836143dd565b915061392982615262565b600282019050919050565b60006139416028836143dd565b915061394c8261528b565b602882019050919050565b60006139646024836143cc565b915061396f826152da565b604082019050919050565b60006139876019836143cc565b915061399282615329565b602082019050919050565b60006139aa6026836143dd565b91506139b582615352565b602682019050919050565b60006139cd602c836143cc565b91506139d8826153a1565b604082019050919050565b60006139f06022836143cc565b91506139fb826153f0565b604082019050919050565b6000613a136001836143dd565b9150613a1e8261543f565b600182019050919050565b6000613a36602a836143dd565b9150613a4182615468565b602a82019050919050565b6000613a596038836143cc565b9150613a64826154b7565b604082019050919050565b6000613a7c602a836143cc565b9150613a8782615506565b604082019050919050565b6000613a9f6029836143cc565b9150613aaa82615555565b604082019050919050565b6000613ac260b2836143dd565b9150613acd826155a4565b60b282019050919050565b6000613ae5600e836143dd565b9150613af08261568b565b600e82019050919050565b6000613b086002836143dd565b9150613b13826156b4565b600282019050919050565b6000613b2b6021836143cc565b9150613b36826156dd565b604082019050919050565b6000613b4e6020836143cc565b9150613b598261572c565b602082019050919050565b6000613b71602c836143cc565b9150613b7c82615755565b604082019050919050565b6000613b946025836143cc565b9150613b9f826157a4565b604082019050919050565b6000613bb76029836143cc565b9150613bc2826157f3565b604082019050919050565b6000613bda6043836143dd565b9150613be582615842565b604382019050919050565b6000613bfd6017836143cc565b9150613c08826158b7565b602082019050919050565b6000613c206021836143cc565b9150613c2b826158e0565b604082019050919050565b6000613c436031836143cc565b9150613c4e8261592f565b604082019050919050565b6000613c666031836143dd565b9150613c718261597e565b603182019050919050565b6000613c896016836143dd565b9150613c94826159cd565b601682019050919050565b6000613cac601c836143dd565b9150613cb7826159f6565b601c82019050919050565b613ccb81614a62565b82525050565b613ce2613cdd82614a62565b614b67565b82525050565b6000613cf4828b6136a4565b9150613cff82613c7c565b9150613d0b828a613747565b9150613d1682613c9f565b9150613d228289613747565b9150613d2d82613ad8565b9150613d398288613778565b9150613d4482613c59565b9150613d508287613778565b9150613d5b82613bcd565b9150613d678286613778565b9150613d728261381c565b9150613d7e8285613778565b9150613d8982613934565b9150613d958284613778565b9150613da082613a29565b91508190509998505050505050505050565b6000613dbe8285613747565b9150613dca8284613747565b91508190509392505050565b6000613de28286613778565b9150613ded82613a06565b9150613df98285613747565b9150613e0482613a06565b9150613e108284613747565b9150819050949350505050565b6000613e28826137f7565b9150613e3482846136a4565b9150613e3f826138ee565b915081905092915050565b6000613e5582613911565b9150613e618284613747565b915081905092915050565b6000613e7782613ab5565b9150613e838285613747565b9150613e8e8261399d565b9150613e9a8284613747565b9150613ea582613afb565b91508190509392505050565b6000613ebd8285613cd1565b602082019150613ecd8284613cd1565b6020820191508190509392505050565b6000602082019050613ef260008301846135d8565b92915050565b6000608082019050613f0d60008301876135d8565b613f1a60208301866135d8565b613f276040830185613cc2565b8181036060830152613f39818461366b565b905095945050505050565b60006020820190508181036000830152613f5e81846135e7565b905092915050565b600060a0820190508181036000830152613f8081886135e7565b90508181036020830152613f9481876135e7565b90508181036040830152613fa881866135e7565b90508181036060830152613fbc81856135e7565b90508181036080830152613fd081846135e7565b90509695505050505050565b6000602082019050613ff1600083018461365c565b92915050565b60006020820190508181036000830152614011818461370e565b905092915050565b600060208201905081810360008301526140328161383f565b9050919050565b6000602082019050818103600083015261405281613862565b9050919050565b6000602082019050818103600083015261407281613885565b9050919050565b60006020820190508181036000830152614092816138a8565b9050919050565b600060208201905081810360008301526140b2816138cb565b9050919050565b600060208201905081810360008301526140d281613957565b9050919050565b600060208201905081810360008301526140f28161397a565b9050919050565b60006020820190508181036000830152614112816139c0565b9050919050565b60006020820190508181036000830152614132816139e3565b9050919050565b6000602082019050818103600083015261415281613a4c565b9050919050565b6000602082019050818103600083015261417281613a6f565b9050919050565b6000602082019050818103600083015261419281613a92565b9050919050565b600060208201905081810360008301526141b281613b1e565b9050919050565b600060208201905081810360008301526141d281613b41565b9050919050565b600060208201905081810360008301526141f281613b64565b9050919050565b6000602082019050818103600083015261421281613b87565b9050919050565b6000602082019050818103600083015261423281613baa565b9050919050565b6000602082019050818103600083015261425281613bf0565b9050919050565b6000602082019050818103600083015261427281613c13565b9050919050565b6000602082019050818103600083015261429281613c36565b9050919050565b60006020820190506142ae6000830184613cc2565b92915050565b60006142be6142cf565b90506142ca8282614aed565b919050565b6000604051905090565b600067ffffffffffffffff8211156142f4576142f3614c5e565b5b6142fd82614ca1565b9050602081019050919050565b600067ffffffffffffffff82111561432557614324614c5e565b5b61432e82614ca1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143f382614a38565b91506143fe83614a38565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561443957614438614ba2565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561447157614470614ba2565b5b828201905092915050565b600061448782614a62565b915061449283614a62565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144c7576144c6614ba2565b5b828201905092915050565b60006144dd82614a6c565b91506144e883614a6c565b92508260ff038211156144fe576144fd614ba2565b5b828201905092915050565b600061451482614a38565b915061451f83614a38565b92508261452f5761452e614bd1565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561456857614567614ba2565b5b828205905092915050565b600061457e82614a62565b915061458983614a62565b92508261459957614598614bd1565b5b828204905092915050565b60006145af82614a6c565b91506145ba83614a6c565b9250826145ca576145c9614bd1565b5b828204905092915050565b6000808291508390505b600185111561461f578086048111156145fb576145fa614ba2565b5b600185161561460a5780820291505b808102905061461885614cb2565b94506145df565b94509492505050565b600061463382614a62565b915061463e83614a62565b925061466b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614673565b905092915050565b600082614683576001905061473f565b81614691576000905061473f565b81600181146146a757600281146146b1576146e0565b600191505061473f565b60ff8411156146c3576146c2614ba2565b5b8360020a9150848211156146da576146d9614ba2565b5b5061473f565b5060208310610133831016604e8410600b84101617156147155782820a9050838111156147105761470f614ba2565b5b61473f565b61472284848460016145d5565b9250905081840481111561473957614738614ba2565b5b81810290505b9392505050565b600061475182614a38565b915061475c83614a38565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561479b5761479a614ba2565b5b817f800000000000000000000000000000000000000000000000000000000000000005831260008412600084131616156147d8576147d7614ba2565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561481557614814614ba2565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff058212600084126000841216161561485257614851614ba2565b5b828202905092915050565b600061486882614a62565b915061487383614a62565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148ac576148ab614ba2565b5b828202905092915050565b60006148c282614a6c565b91506148cd83614a6c565b92508160ff04831182151516156148e7576148e6614ba2565b5b828202905092915050565b60006148fd82614a38565b915061490883614a38565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561494357614942614ba2565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561497b5761497a614ba2565b5b828203905092915050565b600061499182614a62565b915061499c83614a62565b9250828210156149af576149ae614ba2565b5b828203905092915050565b60006149c582614a6c565b91506149d083614a6c565b9250828210156149e3576149e2614ba2565b5b828203905092915050565b60006149f982614a42565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614aa6578082015181840152602081019050614a8b565b83811115614ab5576000848401525b50505050565b60006002820490506001821680614ad357607f821691505b60208210811415614ae757614ae6614c00565b5b50919050565b614af682614ca1565b810181811067ffffffffffffffff82111715614b1557614b14614c5e565b5b80604052505050565b6000614b2982614a62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b5c57614b5b614ba2565b5b600182019050919050565b6000819050919050565b6000614b7c82614a62565b9150614b8783614a62565b925082614b9757614b96614bd1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f3c7376672077696474683d2735303030707827206865696768743d273530303060008201527f70782720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f32303060208201527f302f737667273e203c7374796c6520747970653d27746578742f637373273e2060408201527f2e7461627b2077696474683a203434353270783b206865696768743a2034393660608201527f70783b2066696c6c3a234646464646463b20783a32373470783b20626f72646560808201527f722d7261646975733a20373070783b2072783a373070783b2064793a3136307060a08201527f783b206d617267696e2d6c6566743a32373470783b2066696c7465723a20647260c08201527f6f702d736861646f77282030707820323370782034327078207267626128313360e08201527f372c203135312c203138382c20302e323329293b207d202e6e616d657b666f6e6101008201527f742d7765696768743a626f6c643b7d202e7369676e61747572657b666f6e742d6101208201527f7765696768743a6c6967687465722021696d706f7274616e743b666f6e742d736101408201527f697a653a31323070783b7d202e746578747b66696c6c3a233161316131613b666101608201527f6f6e742d73697a653a31363070783b666f6e742d66616d696c793a73616e732d6101808201527f73657269663b7d202e646174657b66696c6c3a234136414542423b666f6e742d6101a08201527f73697a653a353070783b7d202e7369676e65647b66696c6c3a234136414542426101c08201527f3b666f6e742d73697a653a353070783b666f6e742d7765696768743a6c6967686101e08201527f7465722021696d706f7274616e743b7d202e646f747b666f6e742d73697a653a6102008201527f37303070783b66696c6c3a233030303030303b7d203c2f7374796c653e203c726102208201527f6563742077696474683d273130302527206865696768743d27313030252720666102408201527f696c6c3d2723463346354639272f3e203c6720636c6173733d277465787427206102608201527f793d273239367078273e0000000000000000000000000000000000000000000061028082015250565b7f3c2f747370616e3e203c747370616e20636c6173733d277369676e656427207460008201527f6578742d616e63686f723d27656e642720783d27393325272064793d272d313760208201527f307078273e7369676e6564206279203078000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f6f6e6c7920746865206f776e6572207472616e73666572206f776e657273686960008201527f7000000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d617820746f74616c206c656e67746820697320313030206279746573000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3c74657874207374796c653d2766696c6c3a7265643b666f6e742d776569676860008201527f743a20626f6c643b666f6e742d73697a653a2031323270783b66696c6c3a234660208201527f32374637462720783d273530252720793d273938252720746578742d616e636860408201527f6f723d276d6964646c65273ee2b8ad206563686f65733c2f746578743e203c2f60608201527f673e203c2f7376673e0000000000000000000000000000000000000000000000608082015250565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c2f747370616e3e203c747370616e20636c6173733d27646f7427207374796c60008201527f653d2766696c6c3a000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f222c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260008201527f61736536342c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f706c65617365206d616b65207375726520746f206b6565702069742073696d7060008201527f6c65000000000000000000000000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f3b2720783d2739322e3525272064793d273430307078273ec2b73c2f7473706160008201527f6e3e203c2f746578743e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b2264657360008201527f6372697074696f6e223a224563686f657320697320612031303025206f6e206360208201527f6861696e20626c616e6b20736c6174652e20546865206f776e65722063616e2060408201527f77686974656c6973742070656f706c6520746f207369676e2061206d6573736160608201527f67652e222c226261636b67726f756e645f636f6c6f72223a202246334635463960808201527f222c226e616d65223a20224563686f657320000000000000000000000000000060a082015250565b7f70782720783d273435307078273e000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f6f6e6c7920746865206f776e65722063616e2072656675736520616e2065636860008201527f6f00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f796f7520617265206e6f7420746865206f776e6572206f662074686520636f6e60008201527f7472616374000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3c2f747370616e3e203c747370616e20636c6173733d2764617465272074657860008201527f742d616e63686f723d27656e642720783d27393325272064793d272d3230307060208201527f78273e0000000000000000000000000000000000000000000000000000000000604082015250565b7f796f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f20c2b73c747370616e20636c6173733d277369676e6174757265272064783d2760008201527f33307078272064793d272d31307078273e000000000000000000000000000000602082015250565b7f203c7265637420636c6173733d277461622720793d2700000000000000000000600082015250565b7f7078272f3e203c7465787420636c6173733d276e616d652720793d2700000000600082015250565b615a28816149ee565b8114615a3357600080fd5b50565b615a3f81614a00565b8114615a4a57600080fd5b50565b615a5681614a0c565b8114615a6157600080fd5b50565b615a6d81614a62565b8114615a7857600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226465736372697074696f6e223a22546865204563686f657320536d61727420436f6e747261637420656e61626c657320697473206f776e657220746f20616c6c6f772077686974656c69737465642061646472657373657320746f207369676e20746865204563686f657320746f6b656e2e204561636820746f6b656e20697320313030252067656e657261746564206f6e20636861696e2e205468657265206973204e4f20696d6167652c206f6e6c7920636f64652e222c226e616d65223a20224563686f657320536d61727420436f6e7472616374222c22696d616765223a2022697066733a2f2f516d5877335567357562353378636b6a54395436784533455534356271554d73476e73777a4d5947657274454e61222c2273656c6c65725f6665655f62617369735f706f696e7473223a203530302c226665655f726563697069656e74223a2022307839453537413638354635383433303930413739413031636536393437613832654164413945446631227da2646970667358221220c98b2a07d141bb52b7e84f2aeb7130bc08c3159290aad33b5e4e943b558b6df664736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061014d5760003560e01c80638da5cb5b116100c3578063d6f449c01161007c578063d6f449c01461039c578063e8a3d485146103be578063e985e9c5146103dc578063f096b0ff1461040c578063f1dfaefb14610428578063f2fde38b146104585761014d565b80638da5cb5b146102da57806395d89b41146102f8578063a22cb46514610316578063a888dda014610332578063b88d4fde14610350578063c87b56dd1461036c5761014d565b80632d160693116101155780632d1606931461020857806337c8d21f1461022657806342842e0e146102425780634db64feb1461025e5780636352211e1461027a57806370a08231146102aa5761014d565b806301ffc9a71461015257806306fdde0314610182578063081812fc146101a0578063095ea7b3146101d057806323b872dd146101ec575b600080fd5b61016c6004803603810190610167919061347c565b610474565b6040516101799190613fdc565b60405180910390f35b61018a610556565b6040516101979190613ff7565b60405180910390f35b6101ba60048036038101906101b59190613597565b6105e8565b6040516101c79190613edd565b60405180910390f35b6101ea60048036038101906101e5919061340f565b61066d565b005b610206600480360381019061020191906132f9565b610785565b005b6102106107e5565b60405161021d9190613f44565b60405180910390f35b610240600480360381019061023b919061351f565b6108be565b005b61025c600480360381019061025791906132f9565b610bfb565b005b6102786004803603810190610273919061344f565b610c1b565b005b610294600480360381019061028f9190613597565b610edd565b6040516102a19190613edd565b60405180910390f35b6102c460048036038101906102bf919061328c565b610f8f565b6040516102d19190614299565b60405180910390f35b6102e2611047565b6040516102ef9190613edd565b60405180910390f35b610300611071565b60405161030d9190613ff7565b60405180910390f35b610330600480360381019061032b91906133cf565b611103565b005b61033a611284565b6040516103479190613edd565b60405180910390f35b61036a6004803603810190610365919061334c565b6112ae565b005b61038660048036038101906103819190613597565b611310565b6040516103939190613ff7565b60405180910390f35b6103a461151e565b6040516103b5959493929190613f66565b60405180910390f35b6103c6611960565b6040516103d39190613ff7565b60405180910390f35b6103f660048036038101906103f191906132b9565b611983565b6040516104039190613fdc565b60405180910390f35b6104266004803603810190610421919061328c565b611a17565b005b610442600480360381019061043d91906134d6565b611af2565b60405161044f9190613fdc565b60405180910390f35b610472600480360381019061046d919061328c565b611d8e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061053f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061054f575061054e82611ea1565b5b9050919050565b60606000805461056590614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461059190614abb565b80156105de5780601f106105b3576101008083540402835291602001916105de565b820191906000526020600020905b8154815290600101906020018083116105c157829003601f168201915b5050505050905090565b60006105f382611f0b565b610632576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610629906141d9565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067882610edd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e090614259565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610708611f77565b73ffffffffffffffffffffffffffffffffffffffff161480610737575061073681610731611f77565b611983565b5b610776576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076d90614139565b60405180910390fd5b6107808383611f7f565b505050565b610796610790611f77565b82612038565b6107d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107cc90614279565b60405180910390fd5b6107e0838383612116565b505050565b6060600d805480602002602001604051908101604052809291908181526020016000905b828210156108b557838290600052602060002001805461082890614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461085490614abb565b80156108a15780601f10610876576101008083540402835291602001916108a1565b820191906000526020600020905b81548152906001019060200180831161088457829003601f168201915b505050505081526020019060010190610809565b50505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108ff611f77565b73ffffffffffffffffffffffffffffffffffffffff1614610955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094c90614239565b60405180910390fd5b61095e82611af2565b801561096f575061096e81611af2565b5b6109ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a590614119565b60405180910390fd5b606482826040516020016109c3929190613db2565b6040516020818303038152906040525110610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90614079565b60405180910390fd5b600d82908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610a4e929190612f8e565b50600d81908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610a8a929190612f8e565b50600d610a9d610a98611f77565b612372565b604051602001610aad9190613e4a565b604051602081830303815290604052908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610af4929190612f8e565b50600d610b0042612535565b908060018154018082558091505060019003906000526020600020016000909190919091509080519060200190610b38929190612f8e565b50600d601a610b456125bd565b60028110610b5657610b55614c2f565b5b0190806001815401808255809150506001900390600052602060002001600090919091909150908054610b8890614abb565b610b93929190613014565b50600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b610c16838383604051806020016040528060008152506112ae565b505050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16610c5c611f77565b73ffffffffffffffffffffffffffffffffffffffff1614610cb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca990614199565b60405180910390fd5b600115158115151415610ecc5760006006600880549050610cd39190614b71565b1415610cf557610cf4336006600880549050610cef9190614573565b6125fc565b5b6008600d600081548110610d0c57610d0b614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610d4790614abb565b610d52929190613014565b506009600d600181548110610d6a57610d69614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610da590614abb565b610db0929190613014565b50600a600d600281548110610dc857610dc7614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e0390614abb565b610e0e929190613014565b50600b600d600381548110610e2657610e25614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610e6190614abb565b610e6c929190613014565b50600c600d600481548110610e8457610e83614c2f565b5b9060005260206000200190806001815401808255809150506001900390600052602060002001600090919091909150908054610ebf90614abb565b610eca929190613014565b505b600d6000610eda91906130a1565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7d90614179565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611000576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff790614159565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461108090614abb565b80601f01602080910402602001604051908101604052809291908181526020018280546110ac90614abb565b80156110f95780601f106110ce576101008083540402835291602001916110f9565b820191906000526020600020905b8154815290600101906020018083116110dc57829003601f168201915b5050505050905090565b61110b611f77565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611179576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611170906140d9565b60405180910390fd5b8060056000611186611f77565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611233611f77565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112789190613fdc565b60405180910390a35050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6112bf6112b9611f77565b83612038565b6112fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f590614279565b60405180910390fd5b61130a848484846127ca565b50505050565b606060006060806000600686611326919061485d565b611330919061447c565b92505b600685611340919061485d565b6008805490506113509190614986565b60068661135d919061485d565b611367919061447c565b8310801561138b57506006808661137e919061485d565b611388919061447c565b83105b156114c057806113c06006856113a19190614b71565b6102bc6113ae919061485d565b6101286113bb919061447c565b612826565b6113ef6006866113d09190614b71565b6102bc6113dd919061485d565b6102626113ea919061447c565b612826565b6009868154811061140357611402614c2f565b5b906000526020600020016008878154811061142157611420614c2f565b5b90600052602060002001600b888154811061143f5761143e614c2f565b5b90600052602060002001600a898154811061145d5761145c614c2f565b5b90600052602060002001600c8a8154811061147b5761147a614c2f565b5b9060005260206000200160405160200161149c989796959493929190613ce8565b604051602081830303815290604052905082806114b890614b1e565b935050611333565b806040516020016114d19190613e1d565b60405160208183030381529060405291506114eb85612826565b6114f4836129af565b604051602001611505929190613e6c565b6040516020818303038152906040529350505050919050565b606080606080606060086009600a600b600c84805480602002602001604051908101604052809291908181526020016000905b828210156115fd57838290600052602060002001805461157090614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461159c90614abb565b80156115e95780601f106115be576101008083540402835291602001916115e9565b820191906000526020600020905b8154815290600101906020018083116115cc57829003601f168201915b505050505081526020019060010190611551565b50505050945083805480602002602001604051908101604052809291908181526020016000905b828210156116d057838290600052602060002001805461164390614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461166f90614abb565b80156116bc5780601f10611691576101008083540402835291602001916116bc565b820191906000526020600020905b81548152906001019060200180831161169f57829003601f168201915b505050505081526020019060010190611624565b50505050935082805480602002602001604051908101604052809291908181526020016000905b828210156117a357838290600052602060002001805461171690614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461174290614abb565b801561178f5780601f106117645761010080835404028352916020019161178f565b820191906000526020600020905b81548152906001019060200180831161177257829003601f168201915b5050505050815260200190600101906116f7565b50505050925081805480602002602001604051908101604052809291908181526020016000905b828210156118765783829060005260206000200180546117e990614abb565b80601f016020809104026020016040519081016040528092919081815260200182805461181590614abb565b80156118625780601f1061183757610100808354040283529160200191611862565b820191906000526020600020905b81548152906001019060200180831161184557829003601f168201915b5050505050815260200190600101906117ca565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156119495783829060005260206000200180546118bc90614abb565b80601f01602080910402602001604051908101604052809291908181526020018280546118e890614abb565b80156119355780601f1061190a57610100808354040283529160200191611935565b820191906000526020600020905b81548152906001019060200180831161191857829003601f168201915b50505050508152602001906001019061189d565b505050509050945094509450945094509091929394565b6060604051806101c001604052806101948152602001615abc6101949139905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a58611f77565b73ffffffffffffffffffffffffffffffffffffffff1614611aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa5906141f9565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080829050600181511015611b0c576000915050611d89565b606481511115611b20576000915050611d89565b602060f81b81600081518110611b3957611b38614c2f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611b76576000915050611d89565b602060f81b8160018351611b8a9190614986565b81518110611b9b57611b9a614c2f565b5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415611bd8576000915050611d89565b6000806000805b8451811015611d7f57848181518110611bfb57611bfa614c2f565b5b602001015160f81c60f81b9250602060f81b837effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148015611c625750602060f81b847effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15611c7557600095505050505050611d89565b8260f81c915060618260ff1610158015611c935750607a8260ff1611155b158015611cb5575060418260ff1610158015611cb35750605a8260ff1611155b155b8015611cd6575060308260ff1610158015611cd4575060398260ff1611155b155b8015611ce6575060208260ff1614155b8015611cf65750602c8260ff1614155b8015611d06575060278260ff1614155b8015611d165750603f8260ff1614155b8015611d26575060218260ff1614155b8015611d36575060408260ff1614155b8015611d465750603b8260ff1614155b8015611d565750602d8260ff1614155b15611d6957600095505050505050611d89565b8293508080611d7790614b1e565b915050611bdf565b5060019450505050505b919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611dcf611f77565b73ffffffffffffffffffffffffffffffffffffffff1614611e25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1c90614039565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8c90614059565b60405180910390fd5b611e9e81612b34565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ff283610edd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061204382611f0b565b612082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612079906140f9565b60405180910390fd5b600061208d83610edd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806120fc57508373ffffffffffffffffffffffffffffffffffffffff166120e4846105e8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061210d575061210c8185611983565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661213682610edd565b73ffffffffffffffffffffffffffffffffffffffff161461218c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218390614219565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f3906140b9565b60405180910390fd5b612207838383612bfa565b612212600082611f7f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122629190614986565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122b9919061447c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000602867ffffffffffffffff81111561239157612390614c5e565b5b6040519080825280601f01601f1916602001820160405280156123c35781602001600182028036833780820191505090505b50905060005b601481101561252b5760008160136123e19190614986565b60086123ed919061485d565b60026123f99190614628565b8573ffffffffffffffffffffffffffffffffffffffff1661241a9190614573565b60f81b9050600060108260f81c61243191906145a4565b60f81b905060008160f81c601061244891906148b7565b8360f81c61245691906149ba565b60f81b905061246482612bff565b85856002612472919061485d565b8151811061248357612482614c2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506124bb81612bff565b8560018660026124cb919061485d565b6124d5919061447c565b815181106124e6576124e5614c2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350505050808061252390614b1e565b9150506123c9565b5080915050919050565b60606000806000612553620151808661254e9190614573565b612c45565b809350819450829550505050600e60018361256e9190614986565b600c811061257f5761257e614c2f565b5b0161258982612826565b61259285612826565b6040516020016125a493929190613dd6565b6040516020818303038152906040529350505050919050565b6000600244426040516020016125d4929190613eb1565b6040516020818303038152906040528051906020012060001c6125f79190614b71565b905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561266c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612663906141b9565b60405180910390fd5b61267581611f0b565b156126b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ac90614099565b60405180910390fd5b6126c160008383612bfa565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612711919061447c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6127d5848484612116565b6127e184848484612de4565b612820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281790614019565b60405180910390fd5b50505050565b6060600082141561286e576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506129aa565b600082905060005b600082146128a057808061288990614b1e565b915050600a826128999190614573565b9150612876565b60008167ffffffffffffffff8111156128bc576128bb614c5e565b5b6040519080825280601f01601f1916602001820160405280156128ee5781602001600182028036833780820191505090505b50905060008290505b600086146129a25760018161290c9190614986565b90506000600a808861291e9190614573565b612928919061485d565b876129339190614986565b603061293f91906144d2565b905060008160f81b90508084848151811061295d5761295c614c2f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886129999190614573565b975050506128f7565b819450505050505b919050565b60606000825114156129d257604051806020016040528060008152509050612b2f565b6000604051806060016040528060408152602001615a7c6040913990506000600360028551612a01919061447c565b612a0b9190614573565b6004612a17919061485d565b90506000602082612a28919061447c565b67ffffffffffffffff811115612a4157612a40614c5e565b5b6040519080825280601f01601f191660200182016040528015612a735781602001600182028036833780820191505090505b509050818152600183018586518101602084015b81831015612aee576003830192508251603f8160121c1685015160f81b8252600182019150603f81600c1c1685015160f81b8252600182019150603f8160061c1685015160f81b8252600182019150603f811685015160f81b825260018201915050612a87565b600389510660018114612b085760028114612b1857612b23565b613d3d60f01b6002830352612b23565b603d60f81b60018303525b50505050508093505050505b919050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b6000600a8260f81c60ff161015612c2a5760308260f81c612c2091906144d2565b60f81b9050612c40565b60578260f81c612c3a91906144d2565b60f81b90505b919050565b600080600080849050600062253d8c62010bd983612c6391906143e8565b612c6d91906143e8565b9050600062023ab1826004612c829190614746565b612c8c9190614509565b9050600460038262023ab1612ca19190614746565b612cab91906143e8565b612cb59190614509565b82612cc091906148f2565b9150600062164b09600184612cd591906143e8565b610fa0612ce29190614746565b612cec9190614509565b9050601f6004826105b5612d009190614746565b612d0a9190614509565b84612d1591906148f2565b612d1f91906143e8565b9250600061098f846050612d339190614746565b612d3d9190614509565b9050600060508261098f612d519190614746565b612d5b9190614509565b85612d6691906148f2565b9050600b82612d759190614509565b945084600c612d849190614746565b600283612d9191906143e8565b612d9b91906148f2565b91508483603186612dac91906148f2565b6064612db89190614746565b612dc291906143e8565b612dcc91906143e8565b92508298508197508096505050505050509193909250565b6000612e058473ffffffffffffffffffffffffffffffffffffffff16612f7b565b15612f6e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e2e611f77565b8786866040518563ffffffff1660e01b8152600401612e509493929190613ef8565b602060405180830381600087803b158015612e6a57600080fd5b505af1925050508015612e9b57506040513d601f19601f82011682018060405250810190612e9891906134a9565b60015b612f1e573d8060008114612ecb576040519150601f19603f3d011682016040523d82523d6000602084013e612ed0565b606091505b50600081511415612f16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f0d90614019565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f73565b600190505b949350505050565b600080823b905060008111915050919050565b828054612f9a90614abb565b90600052602060002090601f016020900481019282612fbc5760008555613003565b82601f10612fd557805160ff1916838001178555613003565b82800160010185558215613003579182015b82811115613002578251825591602001919060010190612fe7565b5b50905061301091906130c2565b5090565b82805461302090614abb565b90600052602060002090601f0160209004810192826130425760008555613090565b82601f106130535780548555613090565b8280016001018555821561309057600052602060002091601f016020900482015b8281111561308f578254825591600101919060010190613074565b5b50905061309d91906130c2565b5090565b50805460008255906000526020600020908101906130bf91906130df565b50565b5b808211156130db5760008160009055506001016130c3565b5090565b5b808211156130ff57600081816130f69190613103565b506001016130e0565b5090565b50805461310f90614abb565b6000825580601f106131215750613140565b601f01602090049060005260206000209081019061313f91906130c2565b5b50565b6000613156613151846142d9565b6142b4565b90508281526020810184848401111561317257613171614c92565b5b61317d848285614a79565b509392505050565b60006131986131938461430a565b6142b4565b9050828152602081018484840111156131b4576131b3614c92565b5b6131bf848285614a79565b509392505050565b6000813590506131d681615a1f565b92915050565b6000813590506131eb81615a36565b92915050565b60008135905061320081615a4d565b92915050565b60008151905061321581615a4d565b92915050565b600082601f8301126132305761322f614c8d565b5b8135613240848260208601613143565b91505092915050565b600082601f83011261325e5761325d614c8d565b5b813561326e848260208601613185565b91505092915050565b60008135905061328681615a64565b92915050565b6000602082840312156132a2576132a1614c9c565b5b60006132b0848285016131c7565b91505092915050565b600080604083850312156132d0576132cf614c9c565b5b60006132de858286016131c7565b92505060206132ef858286016131c7565b9150509250929050565b60008060006060848603121561331257613311614c9c565b5b6000613320868287016131c7565b9350506020613331868287016131c7565b925050604061334286828701613277565b9150509250925092565b6000806000806080858703121561336657613365614c9c565b5b6000613374878288016131c7565b9450506020613385878288016131c7565b935050604061339687828801613277565b925050606085013567ffffffffffffffff8111156133b7576133b6614c97565b5b6133c38782880161321b565b91505092959194509250565b600080604083850312156133e6576133e5614c9c565b5b60006133f4858286016131c7565b9250506020613405858286016131dc565b9150509250929050565b6000806040838503121561342657613425614c9c565b5b6000613434858286016131c7565b925050602061344585828601613277565b9150509250929050565b60006020828403121561346557613464614c9c565b5b6000613473848285016131dc565b91505092915050565b60006020828403121561349257613491614c9c565b5b60006134a0848285016131f1565b91505092915050565b6000602082840312156134bf576134be614c9c565b5b60006134cd84828501613206565b91505092915050565b6000602082840312156134ec576134eb614c9c565b5b600082013567ffffffffffffffff81111561350a57613509614c97565b5b61351684828501613249565b91505092915050565b6000806040838503121561353657613535614c9c565b5b600083013567ffffffffffffffff81111561355457613553614c97565b5b61356085828601613249565b925050602083013567ffffffffffffffff81111561358157613580614c97565b5b61358d85828601613249565b9150509250929050565b6000602082840312156135ad576135ac614c9c565b5b60006135bb84828501613277565b91505092915050565b60006135d083836136d5565b905092915050565b6135e1816149ee565b82525050565b60006135f282614360565b6135fc818561438e565b93508360208202850161360e8561433b565b8060005b8581101561364a578484038952815161362b85826135c4565b945061363683614381565b925060208a01995050600181019050613612565b50829750879550505050505092915050565b61366581614a00565b82525050565b60006136768261436b565b613680818561439f565b9350613690818560208601614a88565b61369981614ca1565b840191505092915050565b60006136af8261436b565b6136b981856143b0565b93506136c9818560208601614a88565b80840191505092915050565b60006136e082614376565b6136ea81856143bb565b93506136fa818560208601614a88565b61370381614ca1565b840191505092915050565b600061371982614376565b61372381856143cc565b9350613733818560208601614a88565b61373c81614ca1565b840191505092915050565b600061375282614376565b61375c81856143dd565b935061376c818560208601614a88565b80840191505092915050565b6000815461378581614abb565b61378f81866143dd565b945060018216600081146137aa57600181146137bb576137ee565b60ff198316865281860193506137ee565b6137c48561434b565b60005b838110156137e6578154818901526001820191506020810190506137c7565b838801955050505b50505092915050565b600061380561028a836143dd565b915061381082614cbf565b61028a82019050919050565b60006138296051836143dd565b915061383482614fed565b605182019050919050565b600061384c6032836143cc565b915061385782615062565b604082019050919050565b600061386f6021836143cc565b915061387a826150b1565b604082019050919050565b60006138926026836143cc565b915061389d82615100565b604082019050919050565b60006138b5601d836143cc565b91506138c08261514f565b602082019050919050565b60006138d8601c836143cc565b91506138e382615178565b602082019050919050565b60006138fb6089836143dd565b9150613906826151a1565b608982019050919050565b600061391e6002836143dd565b915061392982615262565b600282019050919050565b60006139416028836143dd565b915061394c8261528b565b602882019050919050565b60006139646024836143cc565b915061396f826152da565b604082019050919050565b60006139876019836143cc565b915061399282615329565b602082019050919050565b60006139aa6026836143dd565b91506139b582615352565b602682019050919050565b60006139cd602c836143cc565b91506139d8826153a1565b604082019050919050565b60006139f06022836143cc565b91506139fb826153f0565b604082019050919050565b6000613a136001836143dd565b9150613a1e8261543f565b600182019050919050565b6000613a36602a836143dd565b9150613a4182615468565b602a82019050919050565b6000613a596038836143cc565b9150613a64826154b7565b604082019050919050565b6000613a7c602a836143cc565b9150613a8782615506565b604082019050919050565b6000613a9f6029836143cc565b9150613aaa82615555565b604082019050919050565b6000613ac260b2836143dd565b9150613acd826155a4565b60b282019050919050565b6000613ae5600e836143dd565b9150613af08261568b565b600e82019050919050565b6000613b086002836143dd565b9150613b13826156b4565b600282019050919050565b6000613b2b6021836143cc565b9150613b36826156dd565b604082019050919050565b6000613b4e6020836143cc565b9150613b598261572c565b602082019050919050565b6000613b71602c836143cc565b9150613b7c82615755565b604082019050919050565b6000613b946025836143cc565b9150613b9f826157a4565b604082019050919050565b6000613bb76029836143cc565b9150613bc2826157f3565b604082019050919050565b6000613bda6043836143dd565b9150613be582615842565b604382019050919050565b6000613bfd6017836143cc565b9150613c08826158b7565b602082019050919050565b6000613c206021836143cc565b9150613c2b826158e0565b604082019050919050565b6000613c436031836143cc565b9150613c4e8261592f565b604082019050919050565b6000613c666031836143dd565b9150613c718261597e565b603182019050919050565b6000613c896016836143dd565b9150613c94826159cd565b601682019050919050565b6000613cac601c836143dd565b9150613cb7826159f6565b601c82019050919050565b613ccb81614a62565b82525050565b613ce2613cdd82614a62565b614b67565b82525050565b6000613cf4828b6136a4565b9150613cff82613c7c565b9150613d0b828a613747565b9150613d1682613c9f565b9150613d228289613747565b9150613d2d82613ad8565b9150613d398288613778565b9150613d4482613c59565b9150613d508287613778565b9150613d5b82613bcd565b9150613d678286613778565b9150613d728261381c565b9150613d7e8285613778565b9150613d8982613934565b9150613d958284613778565b9150613da082613a29565b91508190509998505050505050505050565b6000613dbe8285613747565b9150613dca8284613747565b91508190509392505050565b6000613de28286613778565b9150613ded82613a06565b9150613df98285613747565b9150613e0482613a06565b9150613e108284613747565b9150819050949350505050565b6000613e28826137f7565b9150613e3482846136a4565b9150613e3f826138ee565b915081905092915050565b6000613e5582613911565b9150613e618284613747565b915081905092915050565b6000613e7782613ab5565b9150613e838285613747565b9150613e8e8261399d565b9150613e9a8284613747565b9150613ea582613afb565b91508190509392505050565b6000613ebd8285613cd1565b602082019150613ecd8284613cd1565b6020820191508190509392505050565b6000602082019050613ef260008301846135d8565b92915050565b6000608082019050613f0d60008301876135d8565b613f1a60208301866135d8565b613f276040830185613cc2565b8181036060830152613f39818461366b565b905095945050505050565b60006020820190508181036000830152613f5e81846135e7565b905092915050565b600060a0820190508181036000830152613f8081886135e7565b90508181036020830152613f9481876135e7565b90508181036040830152613fa881866135e7565b90508181036060830152613fbc81856135e7565b90508181036080830152613fd081846135e7565b90509695505050505050565b6000602082019050613ff1600083018461365c565b92915050565b60006020820190508181036000830152614011818461370e565b905092915050565b600060208201905081810360008301526140328161383f565b9050919050565b6000602082019050818103600083015261405281613862565b9050919050565b6000602082019050818103600083015261407281613885565b9050919050565b60006020820190508181036000830152614092816138a8565b9050919050565b600060208201905081810360008301526140b2816138cb565b9050919050565b600060208201905081810360008301526140d281613957565b9050919050565b600060208201905081810360008301526140f28161397a565b9050919050565b60006020820190508181036000830152614112816139c0565b9050919050565b60006020820190508181036000830152614132816139e3565b9050919050565b6000602082019050818103600083015261415281613a4c565b9050919050565b6000602082019050818103600083015261417281613a6f565b9050919050565b6000602082019050818103600083015261419281613a92565b9050919050565b600060208201905081810360008301526141b281613b1e565b9050919050565b600060208201905081810360008301526141d281613b41565b9050919050565b600060208201905081810360008301526141f281613b64565b9050919050565b6000602082019050818103600083015261421281613b87565b9050919050565b6000602082019050818103600083015261423281613baa565b9050919050565b6000602082019050818103600083015261425281613bf0565b9050919050565b6000602082019050818103600083015261427281613c13565b9050919050565b6000602082019050818103600083015261429281613c36565b9050919050565b60006020820190506142ae6000830184613cc2565b92915050565b60006142be6142cf565b90506142ca8282614aed565b919050565b6000604051905090565b600067ffffffffffffffff8211156142f4576142f3614c5e565b5b6142fd82614ca1565b9050602081019050919050565b600067ffffffffffffffff82111561432557614324614c5e565b5b61432e82614ca1565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006143f382614a38565b91506143fe83614a38565b9250817f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0383136000831215161561443957614438614ba2565b5b817f800000000000000000000000000000000000000000000000000000000000000003831260008312161561447157614470614ba2565b5b828201905092915050565b600061448782614a62565b915061449283614a62565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144c7576144c6614ba2565b5b828201905092915050565b60006144dd82614a6c565b91506144e883614a6c565b92508260ff038211156144fe576144fd614ba2565b5b828201905092915050565b600061451482614a38565b915061451f83614a38565b92508261452f5761452e614bd1565b5b600160000383147f80000000000000000000000000000000000000000000000000000000000000008314161561456857614567614ba2565b5b828205905092915050565b600061457e82614a62565b915061458983614a62565b92508261459957614598614bd1565b5b828204905092915050565b60006145af82614a6c565b91506145ba83614a6c565b9250826145ca576145c9614bd1565b5b828204905092915050565b6000808291508390505b600185111561461f578086048111156145fb576145fa614ba2565b5b600185161561460a5780820291505b808102905061461885614cb2565b94506145df565b94509492505050565b600061463382614a62565b915061463e83614a62565b925061466b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484614673565b905092915050565b600082614683576001905061473f565b81614691576000905061473f565b81600181146146a757600281146146b1576146e0565b600191505061473f565b60ff8411156146c3576146c2614ba2565b5b8360020a9150848211156146da576146d9614ba2565b5b5061473f565b5060208310610133831016604e8410600b84101617156147155782820a9050838111156147105761470f614ba2565b5b61473f565b61472284848460016145d5565b9250905081840481111561473957614738614ba2565b5b81810290505b9392505050565b600061475182614a38565b915061475c83614a38565b9250827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211600084136000841316161561479b5761479a614ba2565b5b817f800000000000000000000000000000000000000000000000000000000000000005831260008412600084131616156147d8576147d7614ba2565b5b827f8000000000000000000000000000000000000000000000000000000000000000058212600084136000841216161561481557614814614ba2565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff058212600084126000841216161561485257614851614ba2565b5b828202905092915050565b600061486882614a62565b915061487383614a62565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148ac576148ab614ba2565b5b828202905092915050565b60006148c282614a6c565b91506148cd83614a6c565b92508160ff04831182151516156148e7576148e6614ba2565b5b828202905092915050565b60006148fd82614a38565b915061490883614a38565b9250827f80000000000000000000000000000000000000000000000000000000000000000182126000841215161561494357614942614ba2565b5b827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01821360008412161561497b5761497a614ba2565b5b828203905092915050565b600061499182614a62565b915061499c83614a62565b9250828210156149af576149ae614ba2565b5b828203905092915050565b60006149c582614a6c565b91506149d083614a6c565b9250828210156149e3576149e2614ba2565b5b828203905092915050565b60006149f982614a42565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614aa6578082015181840152602081019050614a8b565b83811115614ab5576000848401525b50505050565b60006002820490506001821680614ad357607f821691505b60208210811415614ae757614ae6614c00565b5b50919050565b614af682614ca1565b810181811067ffffffffffffffff82111715614b1557614b14614c5e565b5b80604052505050565b6000614b2982614a62565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b5c57614b5b614ba2565b5b600182019050919050565b6000819050919050565b6000614b7c82614a62565b9150614b8783614a62565b925082614b9757614b96614bd1565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f3c7376672077696474683d2735303030707827206865696768743d273530303060008201527f70782720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f32303060208201527f302f737667273e203c7374796c6520747970653d27746578742f637373273e2060408201527f2e7461627b2077696474683a203434353270783b206865696768743a2034393660608201527f70783b2066696c6c3a234646464646463b20783a32373470783b20626f72646560808201527f722d7261646975733a20373070783b2072783a373070783b2064793a3136307060a08201527f783b206d617267696e2d6c6566743a32373470783b2066696c7465723a20647260c08201527f6f702d736861646f77282030707820323370782034327078207267626128313360e08201527f372c203135312c203138382c20302e323329293b207d202e6e616d657b666f6e6101008201527f742d7765696768743a626f6c643b7d202e7369676e61747572657b666f6e742d6101208201527f7765696768743a6c6967687465722021696d706f7274616e743b666f6e742d736101408201527f697a653a31323070783b7d202e746578747b66696c6c3a233161316131613b666101608201527f6f6e742d73697a653a31363070783b666f6e742d66616d696c793a73616e732d6101808201527f73657269663b7d202e646174657b66696c6c3a234136414542423b666f6e742d6101a08201527f73697a653a353070783b7d202e7369676e65647b66696c6c3a234136414542426101c08201527f3b666f6e742d73697a653a353070783b666f6e742d7765696768743a6c6967686101e08201527f7465722021696d706f7274616e743b7d202e646f747b666f6e742d73697a653a6102008201527f37303070783b66696c6c3a233030303030303b7d203c2f7374796c653e203c726102208201527f6563742077696474683d273130302527206865696768743d27313030252720666102408201527f696c6c3d2723463346354639272f3e203c6720636c6173733d277465787427206102608201527f793d273239367078273e0000000000000000000000000000000000000000000061028082015250565b7f3c2f747370616e3e203c747370616e20636c6173733d277369676e656427207460008201527f6578742d616e63686f723d27656e642720783d27393325272064793d272d313760208201527f307078273e7369676e6564206279203078000000000000000000000000000000604082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f6f6e6c7920746865206f776e6572207472616e73666572206f776e657273686960008201527f7000000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d617820746f74616c206c656e67746820697320313030206279746573000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3c74657874207374796c653d2766696c6c3a7265643b666f6e742d776569676860008201527f743a20626f6c643b666f6e742d73697a653a2031323270783b66696c6c3a234660208201527f32374637462720783d273530252720793d273938252720746578742d616e636860408201527f6f723d276d6964646c65273ee2b8ad206563686f65733c2f746578743e203c2f60608201527f673e203c2f7376673e0000000000000000000000000000000000000000000000608082015250565b7f3078000000000000000000000000000000000000000000000000000000000000600082015250565b7f3c2f747370616e3e203c747370616e20636c6173733d27646f7427207374796c60008201527f653d2766696c6c3a000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f222c22696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260008201527f61736536342c0000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f706c65617365206d616b65207375726520746f206b6565702069742073696d7060008201527f6c65000000000000000000000000000000000000000000000000000000000000602082015250565b7f2000000000000000000000000000000000000000000000000000000000000000600082015250565b7f3b2720783d2739322e3525272064793d273430307078273ec2b73c2f7473706160008201527f6e3e203c2f746578743e00000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b2264657360008201527f6372697074696f6e223a224563686f657320697320612031303025206f6e206360208201527f6861696e20626c616e6b20736c6174652e20546865206f776e65722063616e2060408201527f77686974656c6973742070656f706c6520746f207369676e2061206d6573736160608201527f67652e222c226261636b67726f756e645f636f6c6f72223a202246334635463960808201527f222c226e616d65223a20224563686f657320000000000000000000000000000060a082015250565b7f70782720783d273435307078273e000000000000000000000000000000000000600082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f6f6e6c7920746865206f776e65722063616e2072656675736520616e2065636860008201527f6f00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f796f7520617265206e6f7420746865206f776e6572206f662074686520636f6e60008201527f7472616374000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3c2f747370616e3e203c747370616e20636c6173733d2764617465272074657860008201527f742d616e63686f723d27656e642720783d27393325272064793d272d3230307060208201527f78273e0000000000000000000000000000000000000000000000000000000000604082015250565b7f796f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f20c2b73c747370616e20636c6173733d277369676e6174757265272064783d2760008201527f33307078272064793d272d31307078273e000000000000000000000000000000602082015250565b7f203c7265637420636c6173733d277461622720793d2700000000000000000000600082015250565b7f7078272f3e203c7465787420636c6173733d276e616d652720793d2700000000600082015250565b615a28816149ee565b8114615a3357600080fd5b50565b615a3f81614a00565b8114615a4a57600080fd5b50565b615a5681614a0c565b8114615a6157600080fd5b50565b615a6d81614a62565b8114615a7857600080fd5b5056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226465736372697074696f6e223a22546865204563686f657320536d61727420436f6e747261637420656e61626c657320697473206f776e657220746f20616c6c6f772077686974656c69737465642061646472657373657320746f207369676e20746865204563686f657320746f6b656e2e204561636820746f6b656e20697320313030252067656e657261746564206f6e20636861696e2e205468657265206973204e4f20696d6167652c206f6e6c7920636f64652e222c226e616d65223a20224563686f657320536d61727420436f6e7472616374222c22696d616765223a2022697066733a2f2f516d5877335567357562353378636b6a54395436784533455534356271554d73476e73777a4d5947657274454e61222c2273656c6c65725f6665655f62617369735f706f696e7473223a203530302c226665655f726563697069656e74223a2022307839453537413638354635383433303930413739413031636536393437613832654164413945446631227da2646970667358221220c98b2a07d141bb52b7e84f2aeb7130bc08c3159290aad33b5e4e943b558b6df664736f6c63430008070033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.