More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 1,277 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 21317861 | 21 days ago | IN | 0 ETH | 0.0014423 | ||||
Safe Transfer Fr... | 21055535 | 57 days ago | IN | 0 ETH | 0.00036444 | ||||
Safe Transfer Fr... | 21055471 | 57 days ago | IN | 0 ETH | 0.00027611 | ||||
Safe Transfer Fr... | 21055350 | 57 days ago | IN | 0 ETH | 0.00038722 | ||||
Set Approval For... | 20866556 | 84 days ago | IN | 0 ETH | 0.00042532 | ||||
Set Approval For... | 20752408 | 100 days ago | IN | 0 ETH | 0.00008626 | ||||
Set Approval For... | 20641795 | 115 days ago | IN | 0 ETH | 0.00012453 | ||||
Set Approval For... | 20602499 | 121 days ago | IN | 0 ETH | 0.00005216 | ||||
Set Approval For... | 20157827 | 183 days ago | IN | 0 ETH | 0.00013327 | ||||
Set Approval For... | 19799241 | 233 days ago | IN | 0 ETH | 0.00019413 | ||||
Set Approval For... | 19586883 | 263 days ago | IN | 0 ETH | 0.00061065 | ||||
Set Approval For... | 19365552 | 294 days ago | IN | 0 ETH | 0.00437543 | ||||
Set Approval For... | 18910975 | 357 days ago | IN | 0 ETH | 0.00042352 | ||||
Set Approval For... | 18851737 | 366 days ago | IN | 0 ETH | 0.00077687 | ||||
Set Approval For... | 18710716 | 386 days ago | IN | 0 ETH | 0.00177284 | ||||
Set Approval For... | 18677246 | 390 days ago | IN | 0 ETH | 0.00133586 | ||||
Set Approval For... | 18655092 | 393 days ago | IN | 0 ETH | 0.00099432 | ||||
Transfer From | 18448475 | 422 days ago | IN | 0 ETH | 0.00154669 | ||||
Transfer From | 18448468 | 422 days ago | IN | 0 ETH | 0.00175649 | ||||
Set Approval For... | 18410286 | 428 days ago | IN | 0 ETH | 0.00051518 | ||||
Set Approval For... | 18410099 | 428 days ago | IN | 0 ETH | 0.00042075 | ||||
Transfer From | 18410064 | 428 days ago | IN | 0 ETH | 0.00090525 | ||||
Safe Transfer Fr... | 18369978 | 433 days ago | IN | 0 ETH | 0.0006784 | ||||
Safe Transfer Fr... | 18369818 | 433 days ago | IN | 0 ETH | 0.00098291 | ||||
Set Approval For... | 17736361 | 522 days ago | IN | 0 ETH | 0.00171232 |
Loading...
Loading
Contract Name:
CryptoServalV2
Compiler Version
v0.5.0+commit.1d4f565a
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-05-24 */ // File: node_modules\openzeppelin-solidity\contracts\introspection\IERC165.sol pragma solidity ^0.5.0; /** * @title IERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface IERC165 { /** * @notice Query if a contract implements an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721.sol pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) public view returns (uint256 balance); function ownerOf(uint256 tokenId) public view returns (address owner); function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function transferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId) public; function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Receiver.sol pragma solidity ^0.5.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safeTransfer`. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } // File: node_modules\openzeppelin-solidity\contracts\math\SafeMath.sol pragma solidity ^0.5.0; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: node_modules\openzeppelin-solidity\contracts\utils\Address.sol pragma solidity ^0.5.0; /** * Utility library of inline functions on addresses */ library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // TODO Check this again before the Serenity release, because all addresses will be // contracts then. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } // File: node_modules\openzeppelin-solidity\contracts\introspection\ERC165.sol pragma solidity ^0.5.0; /** * @title ERC165 * @author Matt Condon (@shrugs) * @dev Implements ERC165 using a lookup table. */ contract ERC165 is IERC165 { bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * 0x01ffc9a7 === * bytes4(keccak256('supportsInterface(bytes4)')) */ /** * @dev a mapping of interface id to whether or not it's supported */ mapping(bytes4 => bool) private _supportedInterfaces; /** * @dev A contract implementing SupportsInterfaceWithLookup * implement ERC165 itself */ constructor () internal { _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev internal method for registering an interface */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff); _supportedInterfaces[interfaceId] = true; } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721.sol pragma solidity ^0.5.0; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721 is ERC165, IERC721 { using SafeMath for uint256; using Address for address; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => uint256) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * 0x80ac58cd === * bytes4(keccak256('balanceOf(address)')) ^ * bytes4(keccak256('ownerOf(uint256)')) ^ * bytes4(keccak256('approve(address,uint256)')) ^ * bytes4(keccak256('getApproved(uint256)')) ^ * bytes4(keccak256('setApprovalForAll(address,bool)')) ^ * bytes4(keccak256('isApprovedForAll(address,address)')) ^ * bytes4(keccak256('transferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) ^ * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) */ constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0)); return _ownedTokensCount[owner]; } /** * @dev Gets the owner of the specified token ID * @param tokenId uint256 ID of the token to query the owner of * @return owner address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0)); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner); require(msg.sender == owner || isApprovedForAll(owner, msg.sender)); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId)); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != msg.sender); _operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, to, approved); } /** * @dev Tells whether an operator is approved by a given owner * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address * Usage of this method is discouraged, use `safeTransferFrom` whenever possible * Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { require(_isApprovedOrOwner(msg.sender, tokenId)); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * * Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data)); } /** * @dev Returns whether the specified token exists * @param tokenId uint256 ID of the token to query the existence of * @return whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0)); require(!_exists(tokenId)); _tokenOwner[tokenId] = to; _ownedTokensCount[to] = _ownedTokensCount[to].add(1); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner); _clearApproval(tokenId); _ownedTokensCount[owner] = _ownedTokensCount[owner].sub(1); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from); require(to != address(0)); _clearApproval(tokenId); _ownedTokensCount[from] = _ownedTokensCount[from].sub(1); _ownedTokensCount[to] = _ownedTokensCount[to].add(1); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke `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 whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } /** * @dev Private function to clear current approval of a given token ID * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Enumerable.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Enumerable.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => uint256[]) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * 0x780e9d63 === * bytes4(keccak256('totalSupply()')) ^ * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) ^ * bytes4(keccak256('tokenByIndex(uint256)')) */ /** * @dev Constructor function */ constructor () public { // register the supported interface to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner)); return _ownedTokens[owner][index]; } /** * @dev Gets the total amount of tokens stored by the contract * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply()); return _allTokens[index]; } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * Deprecated, use _burn(uint256) instead * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); _removeTokenFromOwnerEnumeration(owner, tokenId); // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund _ownedTokensIndex[tokenId] = 0; _removeTokenFromAllTokensEnumeration(tokenId); } /** * @dev Gets the list of token IDs of the requested owner * @param owner address owning the tokens * @return uint256[] List of token IDs owned by the requested address */ function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the _ownedTokensIndex mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array _ownedTokens[from].length--; // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occcupied by // lasTokenId, or just over the end of the array if the token was the last one). } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length.sub(1); uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array _allTokens.length--; _allTokensIndex[tokenId] = 0; } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\IERC721Metadata.sol pragma solidity ^0.5.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Metadata.sol pragma solidity ^0.5.0; contract ERC721Metadata is ERC165, ERC721, IERC721Metadata { // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /** * 0x5b5e139f === * bytes4(keccak256('name()')) ^ * bytes4(keccak256('symbol()')) ^ * bytes4(keccak256('tokenURI(uint256)')) */ /** * @dev Constructor function */ constructor (string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_METADATA); } /** * @dev Gets the token name * @return string representing the token name */ function name() external view returns (string memory) { return _name; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external view returns (string memory) { return _symbol; } /** * @dev Returns an URI for a given token ID * Throws if the token ID does not exist. May return an empty string. * @param tokenId uint256 ID of the token to query */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId)); return _tokenURIs[tokenId]; } /** * @dev Internal function to set the token URI for a given token * Reverts if the token ID does not exist * @param tokenId uint256 ID of the token to set its URI * @param uri string URI to assign */ function _setTokenURI(uint256 tokenId, string memory uri) internal { require(_exists(tokenId)); _tokenURIs[tokenId] = uri; } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * Deprecated, use _burn(uint256) instead * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned by the msg.sender */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: node_modules\openzeppelin-solidity\contracts\token\ERC721\ERC721Full.sol pragma solidity ^0.5.0; /** * @title Full ERC721 Token * This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md */ contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata { constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) { // solhint-disable-previous-line no-empty-blocks } } // File: contracts\GameData.sol pragma solidity 0.5.0; contract GameData { struct Animal { uint256 wildAnimalId; uint256 xp; uint16 effectiveness; uint16[3] accessories; } } // File: node_modules\openzeppelin-solidity\contracts\ownership\Ownable.sol pragma solidity ^0.5.0; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts\Restricted.sol pragma solidity 0.5.0; contract Restricted is Ownable { mapping(address => bool) private addressIsAdmin; bool private isActive = true; modifier onlyAdmin() { require(addressIsAdmin[msg.sender] || msg.sender == owner(), "Sender is not admin"); _; } modifier contractIsActive() { require(isActive, "Contract is not active"); _; } function addAdmin(address adminAddress) public onlyOwner { addressIsAdmin[adminAddress] = true; } function removeAdmin(address adminAddress) public onlyOwner { addressIsAdmin[adminAddress] = false; } function pauseContract() public onlyOwner { isActive = false; } function activateContract() public onlyOwner { isActive = true; } } // File: contracts\IDnaRepository.sol pragma solidity 0.5.0; contract IDnaRepository { function getDna(uint256 _dnaId) public view returns( uint animalId, address owner, uint16 effectiveness, uint256 id ); } // File: contracts\IServal.sol pragma solidity 0.5.0; contract IServal is IDnaRepository { function getAnimal(uint256 _animalId) public view returns( uint256 countryId, bytes32 name, uint8 rarity, uint256 currentValue, uint256 targetValue, address owner, uint256 id ); } // File: contracts\IMarketplace.sol pragma solidity 0.5.0; contract IMarketplace { function createAuction( uint256 _tokenId, uint128 startPrice, uint128 endPrice, uint128 duration ) external; } // File: contracts\CryptoServalV2.sol pragma solidity 0.5.0; contract CryptoServalV2 is ERC721Full("CryptoServalGame", "CSG"), GameData, Restricted { address private servalChainAddress; IServal private cryptoServalContract; IDnaRepository private dnaRepositoryContract; IMarketplace private marketplaceContract; mapping(uint256 => bool) private usedNonces; mapping(address => uint256) private addressToGems; mapping(bytes32 => bool) private withdrawnHashedContractAnimals; mapping(bytes32 => bool) private withdrawnHashedRepositoryAnimals; Animal[] internal animals; uint256 private syncCost = 0.003 ether; uint256 private spawnCost = 0.01 ether; uint256 private spawnWindow = 1 hours; uint256[3] private rarityToSpawnGemCost = [30, 60, 90]; using SafeMath for uint256; event GemsAddedEvent( address to, uint256 gemAmount ); event XpAddedEvent( uint256 animalId, uint256 xpAmount ); event AccessoryAddedEvent( uint256 animalId, uint8 accessorySlot, uint16 accessoryId ); function setServalChainAddress(address newServalChainAddress) external onlyAdmin() { servalChainAddress = newServalChainAddress; } function setCryptoServalContract(address cryptoServalContractAddress) external onlyAdmin() { cryptoServalContract = IServal(cryptoServalContractAddress); } function setDnaRepositoryContract(address dnaRepositoryContractAddress) external onlyAdmin() { dnaRepositoryContract = IDnaRepository(dnaRepositoryContractAddress); } function setMarketplaceContract(address marketplaceContractAddress) external onlyAdmin() { marketplaceContract = IMarketplace(marketplaceContractAddress); } function setSyncCost(uint256 _syncCost) external onlyAdmin() { syncCost = _syncCost; } function setSpawnCost(uint256 _spawnCost) external onlyAdmin() { spawnCost = _spawnCost; } function setRarityToSpawnGemCost(uint8 index, uint256 targetValue) external onlyAdmin { rarityToSpawnGemCost[index] = targetValue; } function sequenceContractDna(uint256 wildAnimalId, uint256[] calldata dnaIds) external { require(!isWithdrawnFromContract(msg.sender, wildAnimalId), "Animal was already minted from contract"); withdrawnHashedContractAnimals[keccak256(abi.encodePacked(msg.sender, wildAnimalId))] = true; sequenceDna(wildAnimalId, dnaIds, cryptoServalContract); } function sequenceRepositoryDna(uint256 wildAnimalId, uint256[] calldata dnaIds) external { require(!isWithdrawnFromRepository(msg.sender, wildAnimalId), "Animal was already minted from repository"); withdrawnHashedRepositoryAnimals[keccak256(abi.encodePacked(msg.sender, wildAnimalId))] = true; sequenceDna(wildAnimalId, dnaIds, dnaRepositoryContract); } function spawnOffspring( uint256 wildAnimalId, uint16 effectiveness, uint256 timestamp, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external payable usesNonce(nonce) spawnPriced() { require(now < timestamp.add(spawnWindow), "Animal spawn expired"); require(effectiveness <= 100, "Invalid effectiveness"); require(isServalChainSigner( keccak256(abi.encodePacked(wildAnimalId, effectiveness, timestamp, nonce, msg.sender, this)), v, r, s ), "Invalid signature"); uint8 rarity; (, , rarity, , , ,) = cryptoServalContract.getAnimal(wildAnimalId); // SafeMath reverts if sender does not have enough gems addressToGems[msg.sender] = addressToGems[msg.sender].sub(rarityToSpawnGemCost[rarity]); mintAnimal(wildAnimalId, effectiveness, msg.sender); } function requestGems( uint256 amount, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external payable usesNonce(nonce) syncPriced() { require(isServalChainSigner( keccak256(abi.encodePacked(amount, nonce, msg.sender, this)), v, r, s), "Invalid signature" ); addGems(msg.sender, amount); } function addXp( uint256 animalId, uint256 xpToAdd, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external payable syncPriced() usesNonce(nonce) { require(isServalChainSigner( keccak256(abi.encodePacked(animalId, xpToAdd, nonce, msg.sender, this)), v, r, s), "Invalid signature" ); animals[animalId].xp = animals[animalId].xp.add(xpToAdd); emit XpAddedEvent(animalId, xpToAdd); } function addAccessories( uint256 animalId, uint8 accessorySlot, uint16 accessoryId, uint256 nonce, uint8 v, bytes32 r, bytes32 s ) external payable syncPriced() usesNonce(nonce) { require(isServalChainSigner( keccak256(abi.encodePacked(animalId, accessorySlot, accessoryId, nonce, msg.sender, this)), v, r, s ), "Invalid signature" ); require(msg.sender == ownerOf(animalId)); require(animals[animalId].accessories[accessorySlot] == 0); animals[animalId].accessories[accessorySlot] = accessoryId; emit AccessoryAddedEvent(animalId, accessorySlot, accessoryId); } function fuseAnimal(uint256 animalId) external payable syncPriced() { Animal memory animal = animals[animalId]; address wildAnimalOwner; uint8 rarity; (, , rarity, , , wildAnimalOwner,) = cryptoServalContract.getAnimal(animal.wildAnimalId); uint256 gemsToAdd = uint256(animal.effectiveness).div(4); uint256 rarityMultiplier = uint256(rarity).add(1); if (gemsToAdd > 2) { gemsToAdd = gemsToAdd.mul(rarityMultiplier); } _burn(msg.sender, animalId); delete animals[animalId]; addGems(msg.sender, gemsToAdd); addGems(wildAnimalOwner, rarityMultiplier.mul(5)); } function createAuction( uint256 _tokenId, uint128 startPrice, uint128 endPrice, uint128 duration ) external { // approve, not a transfer, let marketplace confirm the original owner and take ownership approve(address(marketplaceContract), _tokenId); marketplaceContract.createAuction(_tokenId, startPrice, endPrice, duration); } function getAnimal(uint256 animalId) external view returns( address owner, uint256 wildAnimalId, uint256 xp, uint16 effectiveness, uint16[3] memory accessories ) { Animal memory animal = animals[animalId]; return ( ownerOf(animalId), animal.wildAnimalId, animal.xp, animal.effectiveness, animal.accessories ); } function getPlayerAnimals(address playerAddress) external view returns(uint256[] memory) { return _tokensOfOwner(playerAddress); } function getPlayerGems(address addr) external view returns(uint256) { return addressToGems[addr]; } function getSyncCost() external view returns(uint256) { return syncCost; } function getSpawnCost() external view returns(uint256) { return spawnCost; } function getRarityToSpawnGemCost(uint8 index) public view returns(uint256) { return rarityToSpawnGemCost[index]; } function isWithdrawnFromContract(address owner, uint256 wildAnimalId) public view returns(bool) { return withdrawnHashedContractAnimals[keccak256(abi.encodePacked(owner, wildAnimalId))]; } function isWithdrawnFromRepository(address owner, uint256 wildAnimalId) public view returns(bool) { return withdrawnHashedRepositoryAnimals[keccak256(abi.encodePacked(owner, wildAnimalId))]; } function isServalChainSigner(bytes32 msgHash, uint8 v, bytes32 r, bytes32 s) public view returns (bool) { return servalChainAddress == ecrecover(msgHash, v, r, s); } function withdrawContract() public onlyOwner { msg.sender.transfer(address(this).balance); } function sequenceDna(uint256 animalToSpawn, uint256[] memory dnaIds, IDnaRepository dnaContract) private { uint256 highestEffectiveness = 0; uint256 sumOfEffectiveness = 0; require(!hasDuplicateMember(dnaIds), "DNA array contains the same cards"); for (uint256 i = 0; i < dnaIds.length; i++) { uint animalId; address owner; uint16 effectiveness; uint256 id; (animalId, owner, effectiveness, id) = dnaContract.getDna(dnaIds[i]); require(animalId == animalToSpawn, "Provided DNA has incorrect wild animal id"); require(msg.sender == owner, "Sender is not owner of DNA"); if (effectiveness > highestEffectiveness) { highestEffectiveness = effectiveness; } sumOfEffectiveness = sumOfEffectiveness.add(effectiveness); } uint256 effectivenessBonus = (sumOfEffectiveness.sub(highestEffectiveness)).div(10); uint256 finalEffectiveness = highestEffectiveness.add(effectivenessBonus); if (finalEffectiveness > 100) { addGems(msg.sender, finalEffectiveness.sub(100)); finalEffectiveness = 100; } mintAnimal(animalToSpawn, uint16(finalEffectiveness), msg.sender); } function hasDuplicateMember(uint256[] memory uintArray) private pure returns(bool) { uint256 uintArrayLength = uintArray.length; for (uint256 i = 0; i < uintArrayLength - 1; i++) { for (uint256 u = i + 1; u < uintArrayLength; u++) { if (uintArray[i] == uintArray[u]) { return true; } } } return false; } function mintAnimal(uint256 wildAnimalId, uint16 effectiveness, address mintTo) private { Animal memory animal = Animal( wildAnimalId, 0, effectiveness, [uint16(0), uint16(0), uint16(0)] ); uint256 id = animals.length; // id before push animals.push(animal); _mint(mintTo, id); } function addGems(address receiver, uint256 gemsCount) private { addressToGems[receiver] = addressToGems[receiver].add(gemsCount); emit GemsAddedEvent(receiver, gemsCount); } modifier usesNonce(uint256 nonce) { require(!usedNonces[nonce], "Nonce already used"); usedNonces[nonce] = true; _; } modifier syncPriced() { require(msg.value == syncCost, "Sync price not paid"); _; } modifier spawnPriced() { require(msg.value == spawnCost, "Mint price not paid"); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_tokenId","type":"uint256"},{"name":"startPrice","type":"uint128"},{"name":"endPrice","type":"uint128"},{"name":"duration","type":"uint128"}],"name":"createAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"animalId","type":"uint256"},{"name":"xpToAdd","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"addXp","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"marketplaceContractAddress","type":"address"}],"name":"setMarketplaceContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"removeAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"wildAnimalId","type":"uint256"}],"name":"isWithdrawnFromContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wildAnimalId","type":"uint256"},{"name":"effectiveness","type":"uint16"},{"name":"timestamp","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"spawnOffspring","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"msgHash","type":"bytes32"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"isServalChainSigner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"cryptoServalContractAddress","type":"address"}],"name":"setCryptoServalContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"requestGems","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint8"}],"name":"getRarityToSpawnGemCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_syncCost","type":"uint256"}],"name":"setSyncCost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"pauseContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"animalId","type":"uint256"}],"name":"getAnimal","outputs":[{"name":"owner","type":"address"},{"name":"wildAnimalId","type":"uint256"},{"name":"xp","type":"uint256"},{"name":"effectiveness","type":"uint16"},{"name":"accessories","type":"uint16[3]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"adminAddress","type":"address"}],"name":"addAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"wildAnimalId","type":"uint256"}],"name":"isWithdrawnFromRepository","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"wildAnimalId","type":"uint256"},{"name":"dnaIds","type":"uint256[]"}],"name":"sequenceContractDna","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activateContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"index","type":"uint8"},{"name":"targetValue","type":"uint256"}],"name":"setRarityToSpawnGemCost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"wildAnimalId","type":"uint256"},{"name":"dnaIds","type":"uint256[]"}],"name":"sequenceRepositoryDna","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spawnCost","type":"uint256"}],"name":"setSpawnCost","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getSyncCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getSpawnCost","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newServalChainAddress","type":"address"}],"name":"setServalChainAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"playerAddress","type":"address"}],"name":"getPlayerAnimals","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"animalId","type":"uint256"}],"name":"fuseAnimal","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"dnaRepositoryContractAddress","type":"address"}],"name":"setDnaRepositoryContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"getPlayerGems","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"animalId","type":"uint256"},{"name":"accessorySlot","type":"uint8"},{"name":"accessoryId","type":"uint16"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"addAccessories","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"to","type":"address"},{"indexed":false,"name":"gemAmount","type":"uint256"}],"name":"GemsAddedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"animalId","type":"uint256"},{"indexed":false,"name":"xpAmount","type":"uint256"}],"name":"XpAddedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"animalId","type":"uint256"},{"indexed":false,"name":"accessorySlot","type":"uint8"},{"indexed":false,"name":"accessoryId","type":"uint16"}],"name":"AccessoryAddedEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"approved","type":"address"},{"indexed":true,"name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]
Contract Creation Code
60806040526001600e60006101000a81548160ff021916908315150217905550660aa87bee538000601755662386f26fc10000601855610e10601955606060405190810160405280601e60ff168152602001603c60ff168152602001605a60ff16815250601a9060036200007592919062000390565b506040805190810160405280601081526020017f43727970746f53657276616c47616d65000000000000000000000000000000008152506040805190810160405280600381526020017f43534700000000000000000000000000000000000000000000000000000000008152508181620001216301ffc9a77c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b6200015e6380ac58cd7c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b6200019b63780e9d637c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b8160099080519060200190620001b3929190620003da565b5080600a9080519060200190620001cc929190620003da565b506200020a635b5e139f7c010000000000000000000000000000000000000000000000000000000002620002d2640100000000026401000000009004565b5050505033600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a362000489565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515156200032457600080fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b8260038101928215620003c7579160200282015b82811115620003c6578251829060ff16905591602001919060010190620003a4565b5b509050620003d6919062000461565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200041d57805160ff19168380011785556200044e565b828001600101855582156200044e579182015b828111156200044d57825182559160200191906001019062000430565b5b5090506200045d919062000461565b5090565b6200048691905b808211156200048257600081600090555060010162000468565b5090565b90565b615c1c80620004996000396000f3fe608060405260043610610251576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063011879db1461025657806301ffc9a7146102e557806306fdde0314610357578063081812fc146103e7578063095ea7b3146104625780630f1211f8146104bd5780631102610e146105205780631785f53c1461057157806318160ddd146105c257806322c02de5146105ed57806323b872dd1461066057806328bac61a146106db5780632d0270ce1461074c5780632f745c59146107c057806330114c311461082f57806330c9430c146108805780633cbaa632146108d95780633d7988b71461092b57806342842e0e14610966578063439766ce146109e157806345d3cc81146109f85780634f6ccce714610abf5780636352211e14610b0e5780637048027514610b8957806370a0823114610bda578063715018a614610c3f57806372586af514610c565780637ad0d4f014610cc95780638da5cb5b14610d595780638f32d59b14610db05780638fda356d14610ddf57806395d89b4114610df657806399c1c3d014610e865780639da9df3e14610ece578063a0f10e7414610ee5578063a22cb46514610f75578063a387669e14610fd2578063a5e687e31461100d578063b57eba2a14611038578063b7f0709614611063578063b88d4fde146110b4578063ba622ddc146111c6578063c87b56dd1461126c578063cfdd5da114611320578063e23e5e171461134e578063e985e9c51461139f578063f2fde38b14611428578063f61a73fc14611479578063fde9e2b6146114de575b600080fd5b34801561026257600080fd5b506102e36004803603608081101561027957600080fd5b810190808035906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff169060200190929190505050611552565b005b3480156102f157600080fd5b5061033d6004803603602081101561030857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506116b1565b604051808215151515815260200191505060405180910390f35b34801561036357600080fd5b5061036c611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ac578082015181840152602081019050610391565b50505050905090810190601f1680156103d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f357600080fd5b506104206004803603602081101561040a57600080fd5b81019080803590602001909291905050506117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561046e57600080fd5b506104bb6004803603604081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061180b565b005b61051e600480360360c08110156104d357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611950565b005b34801561052c57600080fd5b5061056f6004803603602081101561054357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c67565b005b34801561057d57600080fd5b506105c06004803603602081101561059457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da9565b005b3480156105ce57600080fd5b506105d7611e17565b6040518082815260200191505060405180910390f35b3480156105f957600080fd5b506106466004803603604081101561061057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e24565b604051808215151515815260200191505060405180910390f35b34801561066c57600080fd5b506106d96004803603606081101561068357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611eb8565b005b61074a600480360360e08110156106f157600080fd5b8101908080359060200190929190803561ffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611edd565b005b34801561075857600080fd5b506107a66004803603608081101561076f57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061246f565b604051808215151515815260200191505060405180910390f35b3480156107cc57600080fd5b50610819600480360360408110156107e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612532565b6040518082815260200191505060405180910390f35b34801561083b57600080fd5b5061087e6004803603602081101561085257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125a9565b005b6108d7600480360360a081101561089657600080fd5b810190808035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506126eb565b005b3480156108e557600080fd5b50610915600480360360208110156108fc57600080fd5b81019080803560ff16906020019092919050505061296d565b6040518082815260200191505060405180910390f35b34801561093757600080fd5b506109646004803603602081101561094e57600080fd5b810190808035906020019092919050505061298a565b005b34801561097257600080fd5b506109df6004803603606081101561098957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a92565b005b3480156109ed57600080fd5b506109f6612ab3565b005b348015610a0457600080fd5b50610a3160048036036020811015610a1b57600080fd5b8101908080359060200190929190505050612ae3565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018361ffff1661ffff16815260200182600360200280838360005b83811015610aa8578082015181840152602081019050610a8d565b505050509050019550505050505060405180910390f35b348015610acb57600080fd5b50610af860048036036020811015610ae257600080fd5b8101908080359060200190929190505050612bf9565b6040518082815260200191505060405180910390f35b348015610b1a57600080fd5b50610b4760048036036020811015610b3157600080fd5b8101908080359060200190929190505050612c31565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9557600080fd5b50610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612caf565b005b348015610be657600080fd5b50610c2960048036036020811015610bfd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1d565b6040518082815260200191505060405180910390f35b348015610c4b57600080fd5b50610c54612da1565b005b348015610c6257600080fd5b50610caf60048036036040811015610c7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e75565b604051808215151515815260200191505060405180910390f35b348015610cd557600080fd5b50610d5760048036036040811015610cec57600080fd5b810190808035906020019092919080359060200190640100000000811115610d1357600080fd5b820183602082011115610d2557600080fd5b80359060200191846020830284011164010000000083111715610d4757600080fd5b9091929391929390505050612f09565b005b348015610d6557600080fd5b50610d6e6130b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbc57600080fd5b50610dc56130e0565b604051808215151515815260200191505060405180910390f35b348015610deb57600080fd5b50610df4613138565b005b348015610e0257600080fd5b50610e0b613168565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e9257600080fd5b50610ecc60048036036040811015610ea957600080fd5b81019080803560ff1690602001909291908035906020019092919050505061320a565b005b348015610eda57600080fd5b50610ee3613324565b005b348015610ef157600080fd5b50610f7360048036036040811015610f0857600080fd5b810190808035906020019092919080359060200190640100000000811115610f2f57600080fd5b820183602082011115610f4157600080fd5b80359060200191846020830284011164010000000083111715610f6357600080fd5b9091929391929390505050613397565b005b348015610f8157600080fd5b50610fd060048036036040811015610f9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613544565b005b348015610fde57600080fd5b5061100b60048036036020811015610ff557600080fd5b8101908080359060200190929190505050613680565b005b34801561101957600080fd5b50611022613788565b6040518082815260200191505060405180910390f35b34801561104457600080fd5b5061104d613792565b6040518082815260200191505060405180910390f35b34801561106f57600080fd5b506110b26004803603602081101561108657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061379c565b005b3480156110c057600080fd5b506111c4600480360360808110156110d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561113e57600080fd5b82018360208201111561115057600080fd5b8035906020019184600183028401116401000000008311171561117257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138de565b005b3480156111d257600080fd5b50611215600480360360208110156111e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613906565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561125857808201518184015260208101905061123d565b505050509050019250505060405180910390f35b34801561127857600080fd5b506112a56004803603602081101561128f57600080fd5b8101908080359060200190929190505050613967565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156112e55780820151818401526020810190506112ca565b50505050905090810190601f1680156113125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61134c6004803603602081101561133657600080fd5b8101908080359060200190929190505050613a30565b005b34801561135a57600080fd5b5061139d6004803603602081101561137157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d8f565b005b3480156113ab57600080fd5b5061140e600480360360408110156113c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ed1565b604051808215151515815260200191505060405180910390f35b34801561143457600080fd5b506114776004803603602081101561144b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f65565b005b34801561148557600080fd5b506114c86004803603602081101561149c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f84565b6040518082815260200191505060405180910390f35b611550600480360360e08110156114f457600080fd5b8101908080359060200190929190803560ff169060200190929190803561ffff16906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050613fcd565b005b61157e601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561180b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663011879db858585856040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180858152602001846fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001945050505050600060405180830381600087803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b5050505050505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117b05780601f10611785576101008083540402835291602001916117b0565b820191906000526020600020905b81548152906001019060200180831161179357829003601f168201915b5050505050905090565b60006117c5826143f1565b15156117d057600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061181682612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561185357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061189357506118928133613ed1565b5b151561189e57600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601754341415156119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff16151515611a60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611b548787873330604051602001808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040516020818303038152906040528051906020012085858561246f565b1515611bc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b611bfb86601689815481101515611bdb57fe5b90600052602060002090600402016001015461446390919063ffffffff16565b601688815481101515611c0a57fe5b9060005260206000209060040201600101819055507f7bea0315f14559f9a02f1c2d9d8beb6bc45e21861fed12daf11d8b4c43efe2418787604051808381526020018281526020019250505060405180910390a150505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cf15750611cc26130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611db16130e0565b1515611dbc57600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600780549050905090565b6000601460008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b611ec23382614484565b1515611ecd57600080fd5b611ed8838383614519565b505050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515611f74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060185434141515612019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d696e74207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b61202e6019548761446390919063ffffffff16565b421015156120a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f416e696d616c20737061776e206578706972656400000000000000000000000081525060200191505060405180910390fd5b60648761ffff1611151515612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e76616c6964206566666563746976656e657373000000000000000000000081525060200191505060405180910390fd5b61221a888888883330604051602001808781526020018661ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561228e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc818a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b15801561231f57600080fd5b505afa158015612333573d6000803e3d6000fd5b505050506040513d60e081101561234957600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192939495509091929394509091925090915090505080915050612416601a8260ff166003811015156123c657fe5b0154601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061246489893361455f565b505050505050505050565b600060018585858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156124ce573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b600061253d83612d1d565b8210151561254a57600080fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561259657fe5b9060005260206000200154905092915050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061263357506126046130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156126a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515612782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060175434141515612827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b6128e786863330604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019450505050506040516020818303038152906040528051906020012085858561246f565b151561295b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6129653387614661565b505050505050565b6000601a8260ff1660038110151561298157fe5b01549050919050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a1457506129e56130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612a88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060178190555050565b612aae83838360206040519081016040528060008152506138de565b505050565b612abb6130e0565b1515612ac657600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600080600080612af1615a09565b612af9615a2c565b601687815481101515612b0857fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015612bba576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b815790505b5050505050815250509050612bce87612c31565b8160000151826020015183604001518460600151809050955095509550955095505091939590929450565b6000612c03611e17565b82101515612c1057600080fd5b600782815481101515612c1f57fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ca657600080fd5b80915050919050565b612cb76130e0565b1515612cc257600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d5a57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612da96130e0565b1515612db457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601560008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b612f133384611e24565b151515612fae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d206381526020017f6f6e74726163740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601460003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055506130b183838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6131406130e0565b151561314b57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132005780601f106131d557610100808354040283529160200191613200565b820191906000526020600020905b8154815290600101906020018083116131e357829003601f168201915b5050505050905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061329457506132656130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601a8360ff1660038110151561331b57fe5b01819055505050565b61332c6130e0565b151561333757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613394573d6000803e3d6000fd5b50565b6133a13384612e75565b15151561343c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d207281526020017f65706f7369746f7279000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601560003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555061353f83838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561357f57600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061370a57506136db6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561377e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060188190555050565b6000601754905090565b6000601854905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061382657506137f76130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6138e9848484611eb8565b6138f584848484614b14565b151561390057600080fd5b50505050565b606061391182614d37565b80548060200260200160405190810160405280929190818152602001828054801561395b57602002820191906000526020600020905b815481526020019060010190808311613947575b50505050509050919050565b6060613972826143f1565b151561397d57600080fd5b600b60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613a245780601f106139f957610100808354040283529160200191613a24565b820191906000526020600020905b815481529060010190602001808311613a0757829003601f168201915b50505050509050919050565b60175434141515613aa9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b613ab1615a2c565b601682815481101515613ac057fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015613b72576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411613b395790505b5050505050815250509050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc8184600001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b158015613c1357600080fd5b505afa158015613c27573d6000803e3d6000fd5b505050506040513d60e0811015613c3d57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505090919293949550909192939450909192509091505080935081925050506000613cc56004856040015161ffff16614d7f90919063ffffffff16565b90506000613ce060018460ff1661446390919063ffffffff16565b90506002821115613d0157613cfe8183614da990919063ffffffff16565b91505b613d0b3387614de7565b601686815481101515613d1a57fe5b906000526020600020906004020160008082016000905560018201600090556002820160006101000a81549061ffff0219169055600382016000613d5e9190615a5f565b5050613d6a3383614661565b613d8784613d82600584614da990919063ffffffff16565b614661565b505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613e195750613dea6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613e8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613f6d6130e0565b1515613f7857600080fd5b613f8181614e46565b50565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175434141515614046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff161515156140dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555061422a888888883330604051602001808781526020018660ff1660ff167f01000000000000000000000000000000000000000000000000000000000000000281526001018561ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561429e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6142a788612c31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156142e057600080fd5b60006016898154811015156142f157fe5b90600052602060002090600402016003018860ff1660038110151561431257fe5b601091828204019190066002029054906101000a900461ffff1661ffff1614151561433c57600080fd5b8560168981548110151561434c57fe5b90600052602060002090600402016003018860ff1660038110151561436d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055507f626443cd9ab4a50fbd6c420a0a3a0e6b95c7bf3db7ec295b6c67bc13bd0f6a9b888888604051808481526020018360ff1660ff1681526020018261ffff1661ffff168152602001935050505060405180910390a15050505050505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080828401905083811015151561447a57600080fd5b8091505092915050565b60008061449083612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806144ff57508373ffffffffffffffffffffffffffffffffffffffff166144e7846117ba565b73ffffffffffffffffffffffffffffffffffffffff16145b80614510575061450f8185613ed1565b5b91505092915050565b614524838383614f42565b61452e83826151a7565b614538828261534b565b505050565b600082821115151561454e57600080fd5b600082840390508091505092915050565b614567615a2c565b608060405190810160405280858152602001600081526020018461ffff168152602001606060405190810160405280600061ffff1661ffff168152602001600061ffff1661ffff168152602001600061ffff1661ffff1681525081525090506000601680549050905060168290806001815401808255809150509060018203906000526020600020906004020160009091929091909150600082015181600001556020820151816001015560408201518160020160006101000a81548161ffff021916908361ffff16021790555060608201518160030190600361464c929190615a66565b5050505061465a8382615412565b5050505050565b6146b381601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fa78cb306635f790294a937ca6e6f846b5782f8c6f7ec2b774d6f05cf9eece7498282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000809050600080905061477884615433565b151515614813576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f444e4120617272617920636f6e7461696e73207468652073616d65206361726481526020017f730000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008090505b8451811015614a93576000806000808773ffffffffffffffffffffffffffffffffffffffff1663422627c38a8781518110151561485257fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060806040518083038186803b1580156148ac57600080fd5b505afa1580156148c0573d6000803e3d6000fd5b505050506040513d60808110156148d657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050508094508195508296508397505050505089841415156149b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f50726f766964656420444e412068617320696e636f72726563742077696c642081526020017f616e696d616c206964000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74206f776e6572206f6620444e4100000000000081525060200191505060405180910390fd5b868261ffff161115614a69578161ffff1696505b614a808261ffff168761446390919063ffffffff16565b9550505050508080600101915050614819565b506000614abc600a614aae858561453d90919063ffffffff16565b614d7f90919063ffffffff16565b90506000614ad3828561446390919063ffffffff16565b90506064811115614b0057614afb33614af660648461453d90919063ffffffff16565b614661565b606490505b614b0b87823361455f565b50505050505050565b6000614b358473ffffffffffffffffffffffffffffffffffffffff166154c5565b1515614b445760019050614d2f565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c3b578082015181840152602081019050614c20565b50505050905090810190601f168015614c685780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c8a57600080fd5b505af1158015614c9e573d6000803e3d6000fd5b505050506040513d6020811015614cb457600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050919050565b60008082111515614d8f57600080fd5b60008284811515614d9c57fe5b0490508091505092915050565b600080831415614dbc5760009050614de1565b60008284029050828482811515614dcf57fe5b04141515614ddc57600080fd5b809150505b92915050565b614df182826154d8565b6000600b6000838152602001908152602001600020805460018160011615610100020316600290049050141515614e4257600b60008281526020019081526020016000206000614e419190615b03565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e8257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16614f6282612c31565b73ffffffffffffffffffffffffffffffffffffffff16141515614f8457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614fc057600080fd5b614fc981615512565b61501c6001600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150b26001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006151ff6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061453d90919063ffffffff16565b905060006006600084815260200190815260200160002054905081811415156152f2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561527057fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156152ca57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036153449190615b4b565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b61541c82826155d2565b615426828261534b565b61542f8161576b565b5050565b6000808251905060008090505b600182038110156154b95760006001820190505b828110156154ab57848181518110151561546a57fe5b90602001906020020151858381518110151561548257fe5b90602001906020020151141561549e57600193505050506154c0565b8080600101915050615454565b508080600101915050615440565b5060009150505b919050565b600080823b905060008111915050919050565b6154e282826157b7565b6154ec82826151a7565b6000600660008381526020019081526020016000208190555061550e8161594b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156155cf5760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561560e57600080fd5b615617816143f1565b15151561562357600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506156c86001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b8173ffffffffffffffffffffffffffffffffffffffff166157d782612c31565b73ffffffffffffffffffffffffffffffffffffffff161415156157f957600080fd5b61580281615512565b6158556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000615966600160078054905061453d90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110151561599157fe5b90600052602060002001549050806007838154811015156159ae57fe5b906000526020600020018190555081600860008381526020019081526020016000208190555060078054809190600190036159e99190615b4b565b506000600860008681526020019081526020016000208190555050505050565b606060405190810160405280600390602082028038833980820191505090505090565b60c0604051908101604052806000815260200160008152602001600061ffff168152602001615a59615b77565b81525090565b5060009055565b826003600f01601090048101928215615af25791602002820160005b83821115615ac257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302615a82565b8015615af05782816101000a81549061ffff0219169055600201602081600101049283019260010302615ac2565b505b509050615aff9190615b9a565b5090565b50805460018160011615610100020316600290046000825580601f10615b295750615b48565b601f016020900490600052602060002090810190615b479190615bcb565b5b50565b815481835581811115615b7257818360005260206000209182019101615b719190615bcb565b5b505050565b606060405190810160405280600390602082028038833980820191505090505090565b615bc891905b80821115615bc457600081816101000a81549061ffff021916905550600101615ba0565b5090565b90565b615bed91905b80821115615be9576000816000905550600101615bd1565b5090565b9056fea165627a7a723058205f842fb11b13a6f59b2b2515cf1f9cb7fa7ad903c461ecaf8b58464dc43478560029
Deployed Bytecode
0x608060405260043610610251576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063011879db1461025657806301ffc9a7146102e557806306fdde0314610357578063081812fc146103e7578063095ea7b3146104625780630f1211f8146104bd5780631102610e146105205780631785f53c1461057157806318160ddd146105c257806322c02de5146105ed57806323b872dd1461066057806328bac61a146106db5780632d0270ce1461074c5780632f745c59146107c057806330114c311461082f57806330c9430c146108805780633cbaa632146108d95780633d7988b71461092b57806342842e0e14610966578063439766ce146109e157806345d3cc81146109f85780634f6ccce714610abf5780636352211e14610b0e5780637048027514610b8957806370a0823114610bda578063715018a614610c3f57806372586af514610c565780637ad0d4f014610cc95780638da5cb5b14610d595780638f32d59b14610db05780638fda356d14610ddf57806395d89b4114610df657806399c1c3d014610e865780639da9df3e14610ece578063a0f10e7414610ee5578063a22cb46514610f75578063a387669e14610fd2578063a5e687e31461100d578063b57eba2a14611038578063b7f0709614611063578063b88d4fde146110b4578063ba622ddc146111c6578063c87b56dd1461126c578063cfdd5da114611320578063e23e5e171461134e578063e985e9c51461139f578063f2fde38b14611428578063f61a73fc14611479578063fde9e2b6146114de575b600080fd5b34801561026257600080fd5b506102e36004803603608081101561027957600080fd5b810190808035906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff16906020019092919080356fffffffffffffffffffffffffffffffff169060200190929190505050611552565b005b3480156102f157600080fd5b5061033d6004803603602081101561030857600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690602001909291905050506116b1565b604051808215151515815260200191505060405180910390f35b34801561036357600080fd5b5061036c611718565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103ac578082015181840152602081019050610391565b50505050905090810190601f1680156103d95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103f357600080fd5b506104206004803603602081101561040a57600080fd5b81019080803590602001909291905050506117ba565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561046e57600080fd5b506104bb6004803603604081101561048557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061180b565b005b61051e600480360360c08110156104d357600080fd5b81019080803590602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611950565b005b34801561052c57600080fd5b5061056f6004803603602081101561054357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c67565b005b34801561057d57600080fd5b506105c06004803603602081101561059457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611da9565b005b3480156105ce57600080fd5b506105d7611e17565b6040518082815260200191505060405180910390f35b3480156105f957600080fd5b506106466004803603604081101561061057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611e24565b604051808215151515815260200191505060405180910390f35b34801561066c57600080fd5b506106d96004803603606081101561068357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611eb8565b005b61074a600480360360e08110156106f157600080fd5b8101908080359060200190929190803561ffff1690602001909291908035906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050611edd565b005b34801561075857600080fd5b506107a66004803603608081101561076f57600080fd5b8101908080359060200190929190803560ff169060200190929190803590602001909291908035906020019092919050505061246f565b604051808215151515815260200191505060405180910390f35b3480156107cc57600080fd5b50610819600480360360408110156107e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612532565b6040518082815260200191505060405180910390f35b34801561083b57600080fd5b5061087e6004803603602081101561085257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125a9565b005b6108d7600480360360a081101561089657600080fd5b810190808035906020019092919080359060200190929190803560ff16906020019092919080359060200190929190803590602001909291905050506126eb565b005b3480156108e557600080fd5b50610915600480360360208110156108fc57600080fd5b81019080803560ff16906020019092919050505061296d565b6040518082815260200191505060405180910390f35b34801561093757600080fd5b506109646004803603602081101561094e57600080fd5b810190808035906020019092919050505061298a565b005b34801561097257600080fd5b506109df6004803603606081101561098957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612a92565b005b3480156109ed57600080fd5b506109f6612ab3565b005b348015610a0457600080fd5b50610a3160048036036020811015610a1b57600080fd5b8101908080359060200190929190505050612ae3565b604051808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018481526020018361ffff1661ffff16815260200182600360200280838360005b83811015610aa8578082015181840152602081019050610a8d565b505050509050019550505050505060405180910390f35b348015610acb57600080fd5b50610af860048036036020811015610ae257600080fd5b8101908080359060200190929190505050612bf9565b6040518082815260200191505060405180910390f35b348015610b1a57600080fd5b50610b4760048036036020811015610b3157600080fd5b8101908080359060200190929190505050612c31565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610b9557600080fd5b50610bd860048036036020811015610bac57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612caf565b005b348015610be657600080fd5b50610c2960048036036020811015610bfd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612d1d565b6040518082815260200191505060405180910390f35b348015610c4b57600080fd5b50610c54612da1565b005b348015610c6257600080fd5b50610caf60048036036040811015610c7957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e75565b604051808215151515815260200191505060405180910390f35b348015610cd557600080fd5b50610d5760048036036040811015610cec57600080fd5b810190808035906020019092919080359060200190640100000000811115610d1357600080fd5b820183602082011115610d2557600080fd5b80359060200191846020830284011164010000000083111715610d4757600080fd5b9091929391929390505050612f09565b005b348015610d6557600080fd5b50610d6e6130b6565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610dbc57600080fd5b50610dc56130e0565b604051808215151515815260200191505060405180910390f35b348015610deb57600080fd5b50610df4613138565b005b348015610e0257600080fd5b50610e0b613168565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610e4b578082015181840152602081019050610e30565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b348015610e9257600080fd5b50610ecc60048036036040811015610ea957600080fd5b81019080803560ff1690602001909291908035906020019092919050505061320a565b005b348015610eda57600080fd5b50610ee3613324565b005b348015610ef157600080fd5b50610f7360048036036040811015610f0857600080fd5b810190808035906020019092919080359060200190640100000000811115610f2f57600080fd5b820183602082011115610f4157600080fd5b80359060200191846020830284011164010000000083111715610f6357600080fd5b9091929391929390505050613397565b005b348015610f8157600080fd5b50610fd060048036036040811015610f9857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803515159060200190929190505050613544565b005b348015610fde57600080fd5b5061100b60048036036020811015610ff557600080fd5b8101908080359060200190929190505050613680565b005b34801561101957600080fd5b50611022613788565b6040518082815260200191505060405180910390f35b34801561104457600080fd5b5061104d613792565b6040518082815260200191505060405180910390f35b34801561106f57600080fd5b506110b26004803603602081101561108657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061379c565b005b3480156110c057600080fd5b506111c4600480360360808110156110d757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561113e57600080fd5b82018360208201111561115057600080fd5b8035906020019184600183028401116401000000008311171561117257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138de565b005b3480156111d257600080fd5b50611215600480360360208110156111e957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613906565b6040518080602001828103825283818151815260200191508051906020019060200280838360005b8381101561125857808201518184015260208101905061123d565b505050509050019250505060405180910390f35b34801561127857600080fd5b506112a56004803603602081101561128f57600080fd5b8101908080359060200190929190505050613967565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156112e55780820151818401526020810190506112ca565b50505050905090810190601f1680156113125780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61134c6004803603602081101561133657600080fd5b8101908080359060200190929190505050613a30565b005b34801561135a57600080fd5b5061139d6004803603602081101561137157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613d8f565b005b3480156113ab57600080fd5b5061140e600480360360408110156113c257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613ed1565b604051808215151515815260200191505060405180910390f35b34801561143457600080fd5b506114776004803603602081101561144b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f65565b005b34801561148557600080fd5b506114c86004803603602081101561149c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613f84565b6040518082815260200191505060405180910390f35b611550600480360360e08110156114f457600080fd5b8101908080359060200190929190803560ff169060200190929190803561ffff16906020019092919080359060200190929190803560ff1690602001909291908035906020019092919080359060200190929190505050613fcd565b005b61157e601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168561180b565b601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663011879db858585856040518563ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180858152602001846fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001836fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001826fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152602001945050505050600060405180830381600087803b15801561169357600080fd5b505af11580156116a7573d6000803e3d6000fd5b5050505050505050565b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156117b05780601f10611785576101008083540402835291602001916117b0565b820191906000526020600020905b81548152906001019060200180831161179357829003601f168201915b5050505050905090565b60006117c5826143f1565b15156117d057600080fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061181682612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561185357600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061189357506118928133613ed1565b5b151561189e57600080fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b601754341415156119c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff16151515611a60576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff021916908315150217905550611b548787873330604051602001808681526020018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c01000000000000000000000000028152601401955050505050506040516020818303038152906040528051906020012085858561246f565b1515611bc8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b611bfb86601689815481101515611bdb57fe5b90600052602060002090600402016001015461446390919063ffffffff16565b601688815481101515611c0a57fe5b9060005260206000209060040201600101819055507f7bea0315f14559f9a02f1c2d9d8beb6bc45e21861fed12daf11d8b4c43efe2418787604051808381526020018281526020019250505060405180910390a150505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680611cf15750611cc26130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515611d65576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611db16130e0565b1515611dbc57600080fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600780549050905090565b6000601460008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b611ec23382614484565b1515611ecd57600080fd5b611ed8838383614519565b505050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515611f74576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060185434141515612019576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f4d696e74207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b61202e6019548761446390919063ffffffff16565b421015156120a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f416e696d616c20737061776e206578706972656400000000000000000000000081525060200191505060405180910390fd5b60648761ffff1611151515612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f496e76616c6964206566666563746976656e657373000000000000000000000081525060200191505060405180910390fd5b61221a888888883330604051602001808781526020018661ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561228e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc818a6040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b15801561231f57600080fd5b505afa158015612333573d6000803e3d6000fd5b505050506040513d60e081101561234957600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050909192939495509091929394509091925090915090505080915050612416601a8260ff166003811015156123c657fe5b0154601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061246489893361455f565b505050505050505050565b600060018585858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156124ce573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b600061253d83612d1d565b8210151561254a57600080fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110151561259657fe5b9060005260206000200154905092915050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061263357506126046130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156126a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b836012600082815260200190815260200160002060009054906101000a900460ff16151515612782576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555060175434141515612827576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b6128e786863330604051602001808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014019450505050506040516020818303038152906040528051906020012085858561246f565b151561295b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6129653387614661565b505050505050565b6000601a8260ff1660038110151561298157fe5b01549050919050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612a1457506129e56130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515612a88576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060178190555050565b612aae83838360206040519081016040528060008152506138de565b505050565b612abb6130e0565b1515612ac657600080fd5b6000600e60006101000a81548160ff021916908315150217905550565b600080600080612af1615a09565b612af9615a2c565b601687815481101515612b0857fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015612bba576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411612b815790505b5050505050815250509050612bce87612c31565b8160000151826020015183604001518460600151809050955095509550955095505091939590929450565b6000612c03611e17565b82101515612c1057600080fd5b600782815481101515612c1f57fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612ca657600080fd5b80915050919050565b612cb76130e0565b1515612cc257600080fd5b6001600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515612d5a57600080fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b612da96130e0565b1515612db457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000601560008484604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060009054906101000a900460ff16905092915050565b612f133384611e24565b151515612fae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d206381526020017f6f6e74726163740000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601460003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff0219169083151502179055506130b183838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6131406130e0565b151561314b57600080fd5b6001600e60006101000a81548160ff021916908315150217905550565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156132005780601f106131d557610100808354040283529160200191613200565b820191906000526020600020905b8154815290600101906020018083116131e357829003601f168201915b5050505050905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061329457506132656130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613308576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601a8360ff1660038110151561331b57fe5b01819055505050565b61332c6130e0565b151561333757600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc3073ffffffffffffffffffffffffffffffffffffffff16319081150290604051600060405180830381858888f19350505050158015613394573d6000803e3d6000fd5b50565b6133a13384612e75565b15151561343c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f416e696d616c2077617320616c7265616479206d696e7465642066726f6d207281526020017f65706f7369746f7279000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001601560003386604051602001808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018281526020019250505060405160208183030381529060405280519060200120815260200190815260200160002060006101000a81548160ff02191690831515021790555061353f83838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16614765565b505050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561357f57600080fd5b80600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061370a57506136db6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561377e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b8060188190555050565b6000601754905090565b6000601854905090565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff168061382657506137f76130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b151561389a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6138e9848484611eb8565b6138f584848484614b14565b151561390057600080fd5b50505050565b606061391182614d37565b80548060200260200160405190810160405280929190818152602001828054801561395b57602002820191906000526020600020905b815481526020019060010190808311613947575b50505050509050919050565b6060613972826143f1565b151561397d57600080fd5b600b60008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015613a245780601f106139f957610100808354040283529160200191613a24565b820191906000526020600020905b815481529060010190602001808311613a0757829003601f168201915b50505050509050919050565b60175434141515613aa9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b613ab1615a2c565b601682815481101515613ac057fe5b90600052602060002090600402016080604051908101604052908160008201548152602001600182015481526020016002820160009054906101000a900461ffff1661ffff1661ffff16815260200160038201600380602002604051908101604052809291908260038015613b72576020028201916000905b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411613b395790505b5050505050815250509050600080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166345d3cc8184600001516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060e06040518083038186803b158015613c1357600080fd5b505afa158015613c27573d6000803e3d6000fd5b505050506040513d60e0811015613c3d57600080fd5b810190808051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505090919293949550909192939450909192509091505080935081925050506000613cc56004856040015161ffff16614d7f90919063ffffffff16565b90506000613ce060018460ff1661446390919063ffffffff16565b90506002821115613d0157613cfe8183614da990919063ffffffff16565b91505b613d0b3387614de7565b601686815481101515613d1a57fe5b906000526020600020906004020160008082016000905560018201600090556002820160006101000a81549061ffff0219169055600382016000613d5e9190615a5f565b5050613d6a3383614661565b613d8784613d82600584614da990919063ffffffff16565b614661565b505050505050565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680613e195750613dea6130b6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515613e8d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53656e646572206973206e6f742061646d696e0000000000000000000000000081525060200191505060405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b613f6d6130e0565b1515613f7857600080fd5b613f8181614e46565b50565b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60175434141515614046576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f53796e63207072696365206e6f7420706169640000000000000000000000000081525060200191505060405180910390fd5b836012600082815260200190815260200160002060009054906101000a900460ff161515156140dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4e6f6e636520616c72656164792075736564000000000000000000000000000081525060200191505060405180910390fd5b60016012600083815260200190815260200160002060006101000a81548160ff02191690831515021790555061422a888888883330604051602001808781526020018660ff1660ff167f01000000000000000000000000000000000000000000000000000000000000000281526001018561ffff1661ffff167e010000000000000000000000000000000000000000000000000000000000000281526002018481526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c010000000000000000000000000281526014018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166c0100000000000000000000000002815260140196505050505050506040516020818303038152906040528051906020012085858561246f565b151561429e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f496e76616c6964207369676e617475726500000000000000000000000000000081525060200191505060405180910390fd5b6142a788612c31565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156142e057600080fd5b60006016898154811015156142f157fe5b90600052602060002090600402016003018860ff1660038110151561431257fe5b601091828204019190066002029054906101000a900461ffff1661ffff1614151561433c57600080fd5b8560168981548110151561434c57fe5b90600052602060002090600402016003018860ff1660038110151561436d57fe5b601091828204019190066002026101000a81548161ffff021916908361ffff1602179055507f626443cd9ab4a50fbd6c420a0a3a0e6b95c7bf3db7ec295b6c67bc13bd0f6a9b888888604051808481526020018360ff1660ff1681526020018261ffff1661ffff168152602001935050505060405180910390a15050505050505050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600080828401905083811015151561447a57600080fd5b8091505092915050565b60008061449083612c31565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806144ff57508373ffffffffffffffffffffffffffffffffffffffff166144e7846117ba565b73ffffffffffffffffffffffffffffffffffffffff16145b80614510575061450f8185613ed1565b5b91505092915050565b614524838383614f42565b61452e83826151a7565b614538828261534b565b505050565b600082821115151561454e57600080fd5b600082840390508091505092915050565b614567615a2c565b608060405190810160405280858152602001600081526020018461ffff168152602001606060405190810160405280600061ffff1661ffff168152602001600061ffff1661ffff168152602001600061ffff1661ffff1681525081525090506000601680549050905060168290806001815401808255809150509060018203906000526020600020906004020160009091929091909150600082015181600001556020820151816001015560408201518160020160006101000a81548161ffff021916908361ffff16021790555060608201518160030190600361464c929190615a66565b5050505061465a8382615412565b5050505050565b6146b381601360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507fa78cb306635f790294a937ca6e6f846b5782f8c6f7ec2b774d6f05cf9eece7498282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000809050600080905061477884615433565b151515614813576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001807f444e4120617272617920636f6e7461696e73207468652073616d65206361726481526020017f730000000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60008090505b8451811015614a93576000806000808773ffffffffffffffffffffffffffffffffffffffff1663422627c38a8781518110151561485257fe5b906020019060200201516040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060806040518083038186803b1580156148ac57600080fd5b505afa1580156148c0573d6000803e3d6000fd5b505050506040513d60808110156148d657600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050508094508195508296508397505050505089841415156149b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f50726f766964656420444e412068617320696e636f72726563742077696c642081526020017f616e696d616c206964000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515614a55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f53656e646572206973206e6f74206f776e6572206f6620444e4100000000000081525060200191505060405180910390fd5b868261ffff161115614a69578161ffff1696505b614a808261ffff168761446390919063ffffffff16565b9550505050508080600101915050614819565b506000614abc600a614aae858561453d90919063ffffffff16565b614d7f90919063ffffffff16565b90506000614ad3828561446390919063ffffffff16565b90506064811115614b0057614afb33614af660648461453d90919063ffffffff16565b614661565b606490505b614b0b87823361455f565b50505050505050565b6000614b358473ffffffffffffffffffffffffffffffffffffffff166154c5565b1515614b445760019050614d2f565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015614c3b578082015181840152602081019050614c20565b50505050905090810190601f168015614c685780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015614c8a57600080fd5b505af1158015614c9e573d6000803e3d6000fd5b505050506040513d6020811015614cb457600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050919050565b60008082111515614d8f57600080fd5b60008284811515614d9c57fe5b0490508091505092915050565b600080831415614dbc5760009050614de1565b60008284029050828482811515614dcf57fe5b04141515614ddc57600080fd5b809150505b92915050565b614df182826154d8565b6000600b6000838152602001908152602001600020805460018160011615610100020316600290049050141515614e4257600b60008281526020019081526020016000206000614e419190615b03565b5b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515614e8257600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b8273ffffffffffffffffffffffffffffffffffffffff16614f6282612c31565b73ffffffffffffffffffffffffffffffffffffffff16141515614f8457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515614fc057600080fd5b614fc981615512565b61501c6001600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506150b26001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006151ff6001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061453d90919063ffffffff16565b905060006006600084815260200190815260200160002054905081811415156152f2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208381548110151561527057fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811015156152ca57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036153449190615b4b565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b61541c82826155d2565b615426828261534b565b61542f8161576b565b5050565b6000808251905060008090505b600182038110156154b95760006001820190505b828110156154ab57848181518110151561546a57fe5b90602001906020020151858381518110151561548257fe5b90602001906020020151141561549e57600193505050506154c0565b8080600101915050615454565b508080600101915050615440565b5060009150505b919050565b600080823b905060008111915050919050565b6154e282826157b7565b6154ec82826151a7565b6000600660008381526020019081526020016000208190555061550e8161594b565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156155cf5760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561560e57600080fd5b615617816143f1565b15151561562357600080fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506156c86001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461446390919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b8173ffffffffffffffffffffffffffffffffffffffff166157d782612c31565b73ffffffffffffffffffffffffffffffffffffffff161415156157f957600080fd5b61580281615512565b6158556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461453d90919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000615966600160078054905061453d90919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110151561599157fe5b90600052602060002001549050806007838154811015156159ae57fe5b906000526020600020018190555081600860008381526020019081526020016000208190555060078054809190600190036159e99190615b4b565b506000600860008681526020019081526020016000208190555050505050565b606060405190810160405280600390602082028038833980820191505090505090565b60c0604051908101604052806000815260200160008152602001600061ffff168152602001615a59615b77565b81525090565b5060009055565b826003600f01601090048101928215615af25791602002820160005b83821115615ac257835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302615a82565b8015615af05782816101000a81549061ffff0219169055600201602081600101049283019260010302615ac2565b505b509050615aff9190615b9a565b5090565b50805460018160011615610100020316600290046000825580601f10615b295750615b48565b601f016020900490600052602060002090810190615b479190615bcb565b5b50565b815481835581811115615b7257818360005260206000209182019101615b719190615bcb565b5b505050565b606060405190810160405280600390602082028038833980820191505090505090565b615bc891905b80821115615bc457600081816101000a81549061ffff021916905550600101615ba0565b5090565b90565b615bed91905b80821115615be9576000816000905550600101615bd1565b5090565b9056fea165627a7a723058205f842fb11b13a6f59b2b2515cf1f9cb7fa7ad903c461ecaf8b58464dc43478560029
Deployed Bytecode Sourcemap
36798:11726:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43439:414;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43439:414:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;43439:414:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7232:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7232:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;7232:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30136:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30136:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30136:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11338:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11338:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11338:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10746:299;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10746:299:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10746:299:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41271:556;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;41271:556:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38413:170;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38413:170:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38413:170:0;;;;;;;;;;;;;;;;;;;;;;35430:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35430:115:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35430:115:0;;;;;;;;;;;;;;;;;;;;;;21871:96;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21871:96:0;;;;;;;;;;;;;;;;;;;;;;;44983:202;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44983:202:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44983:202:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12928:184;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12928:184:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12928:184:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39752:1026;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;39752:1026:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45408:179;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45408:179:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45408:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21528:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21528:185:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;21528:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38048:169;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38048:169:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38048:169:0;;;;;;;;;;;;;;;;;;;;;;40794:469;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;40794:469:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44847:128;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44847:128:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44847:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38591:100;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38591:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38591:100:0;;;;;;;;;;;;;;;;;;;;13765:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13765:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13765:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35553:77;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35553:77:0;;;;;;43862:478;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43862:478:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;43862:478:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;43862:478:0;;;;;;;;;;;;;;;;;;;;22312:151;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22312:151:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22312:151:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10134:181;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10134:181:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;10134:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35311:111;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35311:111:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;35311:111:0;;;;;;;;;;;;;;;;;;;;;;9750:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9750:153:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9750:153:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34092:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34092:140:0;;;;;;45193:207;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45193:207:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;45193:207:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38965:381;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38965:381:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38965:381:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;38965:381:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;38965:381:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;38965:381:0;;;;;;;;;;;;;;;33379:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33379:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;33714:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33714:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;35638:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35638:79:0;;;;;;30335:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30335:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30335:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38811:146;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38811:146:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38811:146:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45595:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45595:106:0;;;;;;39354:390;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39354:390:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;39354:390:0;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;39354:390:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;39354:390:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;39354:390:0;;;;;;;;;;;;;;;11792:217;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11792:217:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11792:217:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38699:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38699:104:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38699:104:0;;;;;;;;;;;;;;;;;;;;44653:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44653:88:0;;;;;;;;;;;;;;;;;;;;;;;44749:90;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44749:90:0;;;;;;;;;;;;;;;;;;;;;;;37896:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37896:144:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37896:144:0;;;;;;;;;;;;;;;;;;;;;;14618:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14618:214:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;14618:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;14618:214:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;14618:214:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;14618:214:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;14618:214:0;;;;;;;;;;;;;;;;;;44348:176;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44348:176:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44348:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;44348:176:0;;;;;;;;;;;;;;;;;30630:154;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30630:154:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30630:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;30630:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42710:721;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;42710:721:0;;;;;;;;;;;;;;;;;;;;38225:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38225:180:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;38225:180:0;;;;;;;;;;;;;;;;;;;;;;12338:147;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12338:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12338:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34409:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34409:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34409:109:0;;;;;;;;;;;;;;;;;;;;;;44532:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44532:113:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44532:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41841:861;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;41841:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43439:414;43712:47;43728:19;;;;;;;;;;;43750:8;43712:7;:47::i;:::-;43770:19;;;;;;;;;;;:33;;;43804:8;43814:10;43826:8;43836;43770:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43770:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43770:75:0;;;;43439:414;;;;:::o;7232:135::-;7302:4;7326:20;:33;7347:11;7326:33;;;;;;;;;;;;;;;;;;;;;;;;;;;7319:40;;7232:135;;;:::o;30136:85::-;30175:13;30208:5;30201:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30136:85;:::o;11338:154::-;11397:7;11425:16;11433:7;11425;:16::i;:::-;11417:25;;;;;;;;11460:15;:24;11476:7;11460:24;;;;;;;;;;;;;;;;;;;;;11453:31;;11338:154;;;:::o;10746:299::-;10810:13;10826:16;10834:7;10826;:16::i;:::-;10810:32;;10867:5;10861:11;;:2;:11;;;;10853:20;;;;;;;;10906:5;10892:19;;:10;:19;;;:58;;;;10915:35;10932:5;10939:10;10915:16;:35::i;:::-;10892:58;10884:67;;;;;;;;10991:2;10964:15;:24;10980:7;10964:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11029:7;11025:2;11009:28;;11018:5;11009:28;;;;;;;;;;;;10746:299;;;:::o;41271:556::-;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41508:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;41539:115;41600:8;41610:7;41619:5;41626:10;41638:4;41583:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41583:60:0;;;41573:71;;;;;;41646:1;41649;41652;41539:19;:115::i;:::-;41531:172;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41737:33;41762:7;41737;41745:8;41737:17;;;;;;;;;;;;;;;;;;;;:20;;;:24;;:33;;;;:::i;:::-;41714:7;41722:8;41714:17;;;;;;;;;;;;;;;;;;;;:20;;:56;;;;41788:31;41801:8;41811:7;41788:31;;;;;;;;;;;;;;;;;;;;;;;;48396:1;41271:556;;;;;;:::o;38413:170::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38548:26;38513:19;;:62;;;;;;;;;;;;;;;;;;38413:170;:::o;35430:115::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35532:5;35501:14;:28;35516:12;35501:28;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;35430:115;:::o;21871:96::-;21915:7;21942:10;:17;;;;21935:24;;21871:96;:::o;44983:202::-;45073:4;45097:30;:80;45155:5;45162:12;45138:37;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45138:37:0;;;45128:48;;;;;;45097:80;;;;;;;;;;;;;;;;;;;;;45090:87;;44983:202;;;;:::o;12928:184::-;13019:39;13038:10;13050:7;13019:18;:39::i;:::-;13011:48;;;;;;;;13072:32;13086:4;13092:2;13096:7;13072:13;:32::i;:::-;12928:184;;;:::o;39752:1026::-;40013:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;48468:9;;48455;:22;48447:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40081:26;40095:11;;40081:9;:13;;:26;;;;:::i;:::-;40075:3;:32;40067:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40168:3;40151:13;:20;;;;40143:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40216:205;40281:12;40295:13;40310:9;40321:5;40328:10;40340:4;40264:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;40264:81:0;;;40254:92;;;;;;40365:1;40385;40405;40216:19;:205::i;:::-;40208:235;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40456:12;40501:20;;;;;;;;;;;:30;;;40532:12;40501:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40501:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40501:44:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;40501:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40479:66;;;;;;;;;;;;;;;;;;;;;;;;;;;40649:59;40679:20;40700:6;40679:28;;;;;;;;;;;;;40649:13;:25;40663:10;40649:25;;;;;;;;;;;;;;;;:29;;:59;;;;:::i;:::-;40621:13;:25;40635:10;40621:25;;;;;;;;;;;;;;;:87;;;;40719:51;40730:12;40744:13;40759:10;40719;:51::i;:::-;48512:1;39752:1026;;;;;;;;:::o;45408:179::-;45506:4;45552:27;45562:7;45571:1;45574;45577;45552:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45552:27:0;;;;;;;;45530:49;;:18;;;;;;;;;;;:49;;;45523:56;;45408:179;;;;;;:::o;21528:185::-;21608:7;21644:16;21654:5;21644:9;:16::i;:::-;21636:5;:24;21628:33;;;;;;;;21679:12;:19;21692:5;21679:19;;;;;;;;;;;;;;;21699:5;21679:26;;;;;;;;;;;;;;;;;;21672:33;;21528:185;;;;:::o;38048:169::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38181:27;38150:20;;:59;;;;;;;;;;;;;;;;;;38048:169;:::o;40794:469::-;40995:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41048:104;41109:6;41117:5;41124:10;41136:4;41092:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;41092::0;;;41082:60;;;;;;41144:1;41147;41150;41048:19;:104::i;:::-;41040:161;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41220:27;41228:10;41240:6;41220:7;:27::i;:::-;40794:469;;;;;;:::o;44847:128::-;44913:7;44940:20;44961:5;44940:27;;;;;;;;;;;;;44933:34;;44847:128;;;:::o;38591:100::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38674:9;38663:8;:20;;;;38591:100;:::o;13765:134::-;13852:39;13869:4;13875:2;13879:7;13852:39;;;;;;;;;;;;;:16;:39::i;:::-;13765:134;;;:::o;35553:77::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35617:5;35606:8;;:16;;;;;;;;;;;;;;;;;;35553:77::o;43862:478::-;43946:13;43970:20;44001:10;44022:20;44053:28;;:::i;:::-;44105:20;;:::i;:::-;44128:7;44136:8;44128:17;;;;;;;;;;;;;;;;;;;;44105:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44178:17;44186:8;44178:7;:17::i;:::-;44210:6;:19;;;44244:6;:9;;;44268:6;:20;;;44303:6;:18;;;44156:176;;;;;;;;;;;;;;43862:478;;;;;;;:::o;22312:151::-;22370:7;22406:13;:11;:13::i;:::-;22398:5;:21;22390:30;;;;;;;;22438:10;22449:5;22438:17;;;;;;;;;;;;;;;;;;22431:24;;22312:151;;;:::o;10134:181::-;10189:7;10209:13;10225:11;:20;10237:7;10225:20;;;;;;;;;;;;;;;;;;;;;10209:36;;10281:1;10264:19;;:5;:19;;;;10256:28;;;;;;;;10302:5;10295:12;;;10134:181;;;:::o;35311:111::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35410:4;35379:14;:28;35394:12;35379:28;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;35311:111;:::o;9750:153::-;9805:7;9850:1;9833:19;;:5;:19;;;;9825:28;;;;;;;;9871:17;:24;9889:5;9871:24;;;;;;;;;;;;;;;;9864:31;;9750:153;;;:::o;34092:140::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;34191:1;34154:40;;34175:6;;;;;;;;;;;34154:40;;;;;;;;;;;;34222:1;34205:6;;:19;;;;;;;;;;;;;;;;;;34092:140::o;45193:207::-;45285:4;45309:32;:82;45369:5;45376:12;45352:37;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45352:37:0;;;45342:48;;;;;;45309:82;;;;;;;;;;;;;;;;;;;;;45302:89;;45193:207;;;;:::o;38965:381::-;39072:49;39096:10;39108:12;39072:23;:49::i;:::-;39071:50;39063:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39266:4;39178:30;:85;39236:10;39248:12;39219:42;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39219:42:0;;;39209:53;;;;;;39178:85;;;;;;;;;;;;:92;;;;;;;;;;;;;;;;;;39281:55;39293:12;39307:6;;39281:55;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39281:55:0;;;;;;39315:20;;;;;;;;;;;39281:11;:55::i;:::-;38965:381;;;:::o;33379:79::-;33417:7;33444:6;;;;;;;;;;;33437:13;;33379:79;:::o;33714:92::-;33754:4;33792:6;;;;;;;;;;;33778:20;;:10;:20;;;33771:27;;33714:92;:::o;35638:79::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;35705:4;35694:8;;:15;;;;;;;;;;;;;;;;;;35638:79::o;30335:89::-;30376:13;30409:7;30402:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30335:89;:::o;38811:146::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38938:11;38908:20;38929:5;38908:27;;;;;;;;;;;;:41;;;;38811:146;;:::o;45595:106::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;45651:10;:19;;:42;45679:4;45671:21;;;45651:42;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45651:42:0;45595:106::o;39354:390::-;39463:51;39489:10;39501:12;39463:25;:51::i;:::-;39462:52;39454:106;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39663:4;39573:32;:87;39633:10;39645:12;39616:42;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39616:42:0;;;39606:53;;;;;;39573:87;;;;;;;;;;;;:94;;;;;;;;;;;;;;;;;;39678:56;39690:12;39704:6;;39678:56;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39678:56:0;;;;;;39712:21;;;;;;;;;;;39678:11;:56::i;:::-;39354:390;;;:::o;11792:217::-;11878:10;11872:16;;:2;:16;;;;11864:25;;;;;;;;11937:8;11900:18;:30;11919:10;11900:30;;;;;;;;;;;;;;;:34;11931:2;11900:34;;;;;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;11988:2;11961:40;;11976:10;11961:40;;;11992:8;11961:40;;;;;;;;;;;;;;;;;;;;;;11792:217;;:::o;38699:104::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38785:10;38773:9;:22;;;;38699:104;:::o;44653:88::-;44698:7;44725:8;;44718:15;;44653:88;:::o;44749:90::-;44795:7;44822:9;;44815:16;;44749:90;:::o;37896:144::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38011:21;37990:18;;:42;;;;;;;;;;;;;;;;;;37896:144;:::o;14618:214::-;14725:31;14738:4;14744:2;14748:7;14725:12;:31::i;:::-;14775:48;14798:4;14804:2;14808:7;14817:5;14775:22;:48::i;:::-;14767:57;;;;;;;;14618:214;;;;:::o;44348:176::-;44446:16;44487:29;44502:13;44487:14;:29::i;:::-;44480:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44348:176;;;:::o;30630:154::-;30688:13;30722:16;30730:7;30722;:16::i;:::-;30714:25;;;;;;;;30757:10;:19;30768:7;30757:19;;;;;;;;;;;30750:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30630:154;;;:::o;42710:721::-;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42797:20;;:::i;:::-;42820:7;42828:8;42820:17;;;;;;;;;;;;;;;;;;;;42797:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42850:23;42884:12;42944:20;;;;;;;;;;;:30;;;42975:6;:19;;;42944:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42944:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42944:51:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;42944:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42907:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43016:17;43036:36;43070:1;43044:6;:20;;;43036:29;;:33;;:36;;;;:::i;:::-;43016:56;;43083:24;43110:22;43130:1;43118:6;43110:15;;:19;;:22;;;;:::i;:::-;43083:49;;43161:1;43149:9;:13;43145:101;;;43203:31;43217:16;43203:9;:13;;:31;;;;:::i;:::-;43191:43;;43145:101;43258:27;43264:10;43276:8;43258:5;:27::i;:::-;43303:7;43311:8;43303:17;;;;;;;;;;;;;;;;;;;;;43296:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;43333:30;43341:10;43353:9;43333:7;:30::i;:::-;43374:49;43382:15;43399:23;43420:1;43399:16;:20;;:23;;;;:::i;:::-;43374:7;:49::i;:::-;48396:1;;;;;42710:721;:::o;38225:180::-;35098:14;:26;35113:10;35098:26;;;;;;;;;;;;;;;;;;;;;;;;;:51;;;;35142:7;:5;:7::i;:::-;35128:21;;:10;:21;;;35098:51;35090:83;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38368:28;38329:21;;:68;;;;;;;;;;;;;;;;;;38225:180;:::o;12338:147::-;12418:4;12442:18;:25;12461:5;12442:25;;;;;;;;;;;;;;;:35;12468:8;12442:35;;;;;;;;;;;;;;;;;;;;;;;;;12435:42;;12338:147;;;;:::o;34409:109::-;33591:9;:7;:9::i;:::-;33583:18;;;;;;;;34482:28;34501:8;34482:18;:28::i;:::-;34409:109;:::o;44532:113::-;44591:7;44618:13;:19;44632:4;44618:19;;;;;;;;;;;;;;;;44611:26;;44532:113;;;:::o;41841:861::-;48353:8;;48340:9;:21;48332:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42126:5;48196:10;:17;48207:5;48196:17;;;;;;;;;;;;;;;;;;;;;48195:18;48187:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48267:4;48247:10;:17;48258:5;48247:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;42157:203;42222:8;42232:13;42247:11;42260:5;42267:10;42279:4;42205:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;42205:79:0;;;42195:90;;;;;;42304:1;42324;42344;42157:19;:203::i;:::-;42149:260;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42450:17;42458:8;42450:7;:17::i;:::-;42436:31;;:10;:31;;;42428:40;;;;;;;;42535:1;42487:7;42495:8;42487:17;;;;;;;;;;;;;;;;;;;;:29;;42517:13;42487:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:49;;;42479:58;;;;;;;;42610:11;42563:7;42571:8;42563:17;;;;;;;;;;;;;;;;;;;;:29;;42593:13;42563:44;;;;;;;;;;;;;;;;;;;;;;:58;;;;;;;;;;;;;;;;;;42637:57;42657:8;42667:13;42682:11;42637:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48396:1;41841:861;;;;;;;:::o;15028:155::-;15085:4;15102:13;15118:11;:20;15130:7;15118:20;;;;;;;;;;;;;;;;;;;;;15102:36;;15173:1;15156:19;;:5;:19;;;;15149:26;;;15028:155;;;:::o;4741:150::-;4799:7;4819:9;4835:1;4831;:5;4819:17;;4860:1;4855;:6;;4847:15;;;;;;;;4882:1;4875:8;;;4741:150;;;;:::o;15555:249::-;15640:4;15657:13;15673:16;15681:7;15673;:16::i;:::-;15657:32;;15719:5;15708:16;;:7;:16;;;:51;;;;15752:7;15728:31;;:20;15740:7;15728:11;:20::i;:::-;:31;;;15708:51;:87;;;;15763:32;15780:5;15787:7;15763:16;:32::i;:::-;15708:87;15700:96;;;15555:249;;;;:::o;22846:245::-;22932:38;22952:4;22958:2;22962:7;22932:19;:38::i;:::-;22983:47;23016:4;23022:7;22983:32;:47::i;:::-;23043:40;23071:2;23075:7;23043:27;:40::i;:::-;22846:245;;;:::o;4505:150::-;4563:7;4596:1;4591;:6;;4583:15;;;;;;;;4609:9;4625:1;4621;:5;4609:17;;4646:1;4639:8;;;4505:150;;;;:::o;47541:387::-;47645:20;;:::i;:::-;47668:136;;;;;;;;;47689:12;47668:136;;;;47716:1;47668:136;;;;47732:13;47668:136;;;;;;;;;;;;;;;47768:1;47668:136;;;;;;;;47779:1;47668:136;;;;;;;;47790:1;47668:136;;;;;;;;;;47645:159;;47816:10;47829:7;:14;;;;47816:27;;47872:7;47885:6;47872:20;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;47872:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;47903:17;47909:6;47917:2;47903:5;:17::i;:::-;47541:387;;;;;:::o;47936:198::-;48035:38;48063:9;48035:13;:23;48049:8;48035:23;;;;;;;;;;;;;;;;:27;;:38;;;;:::i;:::-;48009:13;:23;48023:8;48009:23;;;;;;;;;;;;;;;:64;;;;48091:35;48106:8;48116:9;48091:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;47936:198;;:::o;45709:1389::-;45825:28;45856:1;45825:32;;45868:26;45897:1;45868:30;;45920:26;45939:6;45920:18;:26::i;:::-;45919:27;45911:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46010:9;46022:1;46010:13;;46005:631;46029:6;:13;46025:1;:17;46005:631;;;46064:13;46092;46120:20;46155:10;46221:11;:18;;;46240:6;46247:1;46240:9;;;;;;;;;;;;;;;;;;46221:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46221:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46221:29:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46221:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46182:68;;;;;;;;;;;;;;;;46287:13;46275:8;:25;46267:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46383:5;46369:19;;:10;:19;;;46361:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46456:20;46440:13;:36;;;46436:114;;;46521:13;46498:36;;;;46436:114;46587:37;46610:13;46587:37;;:18;:22;;:37;;;;:::i;:::-;46566:58;;46005:631;;;;46044:3;;;;;;;46005:631;;;;46656:26;46685:54;46736:2;46686:44;46709:20;46686:18;:22;;:44;;;;:::i;:::-;46685:50;;:54;;;;:::i;:::-;46656:83;;46751:26;46780:44;46805:18;46780:20;:24;;:44;;;;:::i;:::-;46751:73;;46860:3;46839:18;:24;46835:170;;;46880:48;46888:10;46900:27;46923:3;46900:18;:22;;:27;;;;:::i;:::-;46880:7;:48::i;:::-;46978:3;46957:24;;46835:170;47025:65;47036:13;47058:18;47079:10;47025;:65::i;:::-;45709:1389;;;;;;;:::o;18546:356::-;18668:4;18695:15;:2;:13;;;:15::i;:::-;18694:16;18690:60;;;18734:4;18727:11;;;;18690:60;18762:13;18794:2;18778:36;;;18815:10;18827:4;18833:7;18842:5;18778:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;18778:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18778:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18778:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18778:70:0;;;;;;;;;;;;;;;;18762:86;;8214:10;18877:16;;18867:26;;;:6;:26;;;;18859:35;;;18546:356;;;;;;;:::o;24420:126::-;24482:17;24519:12;:19;24532:5;24519:19;;;;;;;;;;;;;;;24512:26;;24420:126;;;:::o;4066:303::-;4124:7;4223:1;4219;:5;4211:14;;;;;;;;4236:9;4252:1;4248;:5;;;;;;;;4236:17;;4360:1;4353:8;;;4066:303;;;;:::o;3500:433::-;3558:7;3807:1;3802;:6;3798:47;;;3832:1;3825:8;;;;3798:47;3857:9;3873:1;3869;:5;3857:17;;3902:1;3897;3893;:5;;;;;;;;:10;3885:19;;;;;;;;3924:1;3917:8;;;3500:433;;;;;:::o;31475:247::-;31542:27;31554:5;31561:7;31542:11;:27::i;:::-;31659:1;31628:10;:19;31639:7;31628:19;;;;;;;;;;;31622:33;;;;;;;;;;;;;;;;:38;;31618:97;;;31684:10;:19;31695:7;31684:19;;;;;;;;;;;;31677:26;;;;:::i;:::-;31618:97;31475:247;;:::o;34668:187::-;34762:1;34742:22;;:8;:22;;;;34734:31;;;;;;;;34810:8;34781:38;;34802:6;;;;;;;;;;;34781:38;;;;;;;;;;;;34839:8;34830:6;;:17;;;;;;;;;;;;;;;;;;34668:187;:::o;17598:414::-;17712:4;17692:24;;:16;17700:7;17692;:16::i;:::-;:24;;;17684:33;;;;;;;;17750:1;17736:16;;:2;:16;;;;17728:25;;;;;;;;17766:23;17781:7;17766:14;:23::i;:::-;17828:30;17856:1;17828:17;:23;17846:4;17828:23;;;;;;;;;;;;;;;;:27;;:30;;;;:::i;:::-;17802:17;:23;17820:4;17802:23;;;;;;;;;;;;;;;:56;;;;17893:28;17919:1;17893:17;:21;17911:2;17893:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;17869:17;:21;17887:2;17869:21;;;;;;;;;;;;;;;:52;;;;17957:2;17934:11;:20;17946:7;17934:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;17996:7;17992:2;17977:27;;17986:4;17977:27;;;;;;;;;;;;17598:414;;;:::o;26023:1148::-;26289:22;26314:32;26344:1;26314:12;:18;26327:4;26314:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;26289:57;;26357:18;26378:17;:26;26396:7;26378:26;;;;;;;;;;;;26357:47;;26525:14;26511:10;:28;;26507:328;;;26556:19;26578:12;:18;26591:4;26578:18;;;;;;;;;;;;;;;26597:14;26578:34;;;;;;;;;;;;;;;;;;26556:56;;26662:11;26629:12;:18;26642:4;26629:18;;;;;;;;;;;;;;;26648:10;26629:30;;;;;;;;;;;;;;;;;:44;;;;26779:10;26746:17;:30;26764:11;26746:30;;;;;;;;;;;:43;;;;26507:328;;26924:12;:18;26937:4;26924:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;26023:1148;;;;:::o;24847:186::-;24961:12;:16;24974:2;24961:16;;;;;;;;;;;;;;;:23;;;;24932:17;:26;24950:7;24932:26;;;;;;;;;;;:52;;;;24995:12;:16;25008:2;24995:16;;;;;;;;;;;;;;;25017:7;24995:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;24995:30:0;;;;;;;;;;;;;;;;;;;;;;24847:186;;:::o;23354:202::-;23418:24;23430:2;23434:7;23418:11;:24::i;:::-;23455:40;23483:2;23487:7;23455:27;:40::i;:::-;23508;23540:7;23508:31;:40::i;:::-;23354:202;;:::o;47106:427::-;47183:4;47200:23;47226:9;:16;47200:42;;47258:9;47270:1;47258:13;;47253:248;47295:1;47277:15;:19;47273:1;:23;47253:248;;;47323:9;47339:1;47335;:5;47323:17;;47318:172;47346:15;47342:1;:19;47318:172;;;47407:9;47417:1;47407:12;;;;;;;;;;;;;;;;;;47391:9;47401:1;47391:12;;;;;;;;;;;;;;;;;;:28;47387:88;;;47451:4;47444:11;;;;;;;47387:88;47363:3;;;;;;;47318:172;;;;47298:3;;;;;;;47253:248;;;;47520:5;47513:12;;;47106:427;;;;:::o;5731:627::-;5791:4;5808:12;6315:7;6303:20;6295:28;;6349:1;6342:4;:8;6335:15;;;5731:627;;;:::o;23837:372::-;23904:27;23916:5;23923:7;23904:11;:27::i;:::-;23944:48;23977:5;23984:7;23944:32;:48::i;:::-;24142:1;24113:17;:26;24131:7;24113:26;;;;;;;;;;;:30;;;;24156:45;24193:7;24156:36;:45::i;:::-;23837:372;;:::o;19069:175::-;19169:1;19133:38;;:15;:24;19149:7;19133:24;;;;;;;;;;;;;;;;;;;;;:38;;;;19129:108;;;19223:1;19188:15;:24;19204:7;19188:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;19129:108;19069:175;:::o;16055:286::-;16141:1;16127:16;;:2;:16;;;;16119:25;;;;;;;;16164:16;16172:7;16164;:16::i;:::-;16163:17;16155:26;;;;;;;;16217:2;16194:11;:20;16206:7;16194:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;16254:28;16280:1;16254:17;:21;16272:2;16254:21;;;;;;;;;;;;;;;;:25;;:28;;;;:::i;:::-;16230:17;:21;16248:2;16230:21;;;;;;;;;;;;;;;:52;;;;16325:7;16321:2;16300:33;;16317:1;16300:33;;;;;;;;;;;;16055:286;;:::o;25234:164::-;25338:10;:17;;;;25311:15;:24;25327:7;25311:24;;;;;;;;;;;:44;;;;25366:10;25382:7;25366:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;25366:24:0;;;;;;;;;;;;;;;;;;;;;;25234:164;:::o;16623:314::-;16718:5;16698:25;;:16;16706:7;16698;:16::i;:::-;:25;;;16690:34;;;;;;;;16737:23;16752:7;16737:14;:23::i;:::-;16800:31;16829:1;16800:17;:24;16818:5;16800:24;;;;;;;;;;;;;;;;:28;;:31;;;;:::i;:::-;16773:17;:24;16791:5;16773:24;;;;;;;;;;;;;;;:58;;;;16873:1;16842:11;:20;16854:7;16842:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;16921:7;16917:1;16893:36;;16902:5;16893:36;;;;;;;;;;;;16623:314;;:::o;27466:1082::-;27719:22;27744:24;27766:1;27744:10;:17;;;;:21;;:24;;;;:::i;:::-;27719:49;;27779:18;27800:15;:24;27816:7;27800:24;;;;;;;;;;;;27779:45;;28151:19;28173:10;28184:14;28173:26;;;;;;;;;;;;;;;;;;28151:48;;28237:11;28212:10;28223;28212:22;;;;;;;;;;;;;;;;;:36;;;;28348:10;28317:15;:28;28333:11;28317:28;;;;;;;;;;;:41;;;;28482:10;:19;;;;;;;;;;;;:::i;:::-;;28539:1;28512:15;:24;28528:7;28512:24;;;;;;;;;;;:28;;;;27466:1082;;;;:::o;36798:11726::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36798:11726:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;36798:11726:0;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://5f842fb11b13a6f59b2b2515cf1f9cb7fa7ad903c461ecaf8b58464dc4347856
Loading...
Loading
Loading...
Loading
OVERVIEW
CryptoServal is a game based on smart contracts running on the Ethereum blockchain, centered around breedable, collectible, and fighting creatures.Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | Ether (ETH) | 100.00% | $3,410.32 | 0.012 | $40.92 |
Loading...
Loading
[ Download: CSV Export ]
[ 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.