More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 294 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 20929043 | 5 days ago | IN | 0 ETH | 0.00186555 | ||||
Safe Transfer Fr... | 20878828 | 12 days ago | IN | 0 ETH | 0.00174251 | ||||
Set Approval For... | 20487088 | 67 days ago | IN | 0 ETH | 0.00051035 | ||||
Safe Transfer Fr... | 20438982 | 73 days ago | IN | 0 ETH | 0.00029461 | ||||
Safe Transfer Fr... | 20438981 | 73 days ago | IN | 0 ETH | 0.00033783 | ||||
Safe Transfer Fr... | 20426039 | 75 days ago | IN | 0 ETH | 0.00077304 | ||||
Set Approval For... | 20282685 | 95 days ago | IN | 0 ETH | 0.00022357 | ||||
Set Approval For... | 20202139 | 106 days ago | IN | 0 ETH | 0.00013743 | ||||
Set Approval For... | 19920214 | 146 days ago | IN | 0 ETH | 0.00062919 | ||||
Safe Transfer Fr... | 19804675 | 162 days ago | IN | 0 ETH | 0.00083726 | ||||
Set Approval For... | 19721266 | 174 days ago | IN | 0 ETH | 0.00048353 | ||||
Set Approval For... | 19337442 | 227 days ago | IN | 0 ETH | 0.00118155 | ||||
Set Approval For... | 19274606 | 236 days ago | IN | 0 ETH | 0.00069907 | ||||
Set Approval For... | 19200441 | 247 days ago | IN | 0 ETH | 0.00186084 | ||||
Safe Transfer Fr... | 19200419 | 247 days ago | IN | 0 ETH | 0.0042503 | ||||
Set Approval For... | 19177506 | 250 days ago | IN | 0 ETH | 0.00267956 | ||||
Set Approval For... | 19120106 | 258 days ago | IN | 0 ETH | 0.00216873 | ||||
Set Approval For... | 19093783 | 262 days ago | IN | 0 ETH | 0.00030619 | ||||
Set Approval For... | 19093780 | 262 days ago | IN | 0 ETH | 0.00059544 | ||||
Set Approval For... | 19041961 | 269 days ago | IN | 0 ETH | 0.00215589 | ||||
Set Approval For... | 19041899 | 269 days ago | IN | 0 ETH | 0.0023554 | ||||
Set Approval For... | 19041897 | 269 days ago | IN | 0 ETH | 0.00223511 | ||||
Set Approval For... | 19041495 | 269 days ago | IN | 0 ETH | 0.00105327 | ||||
Set Approval For... | 19041290 | 269 days ago | IN | 0 ETH | 0.00084764 | ||||
Set Approval For... | 19041287 | 269 days ago | IN | 0 ETH | 0.0014497 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
WrappedIKB
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity 0.5.17; pragma experimental ABIEncoderV2; import "./ERC721Full.sol"; import "./IKlein.sol"; import "./ProxyRegistry.sol"; contract WrappedIKB is ERC721Full, Ownable { // `baseURI` is an IPFS folder with a trailing slash string private _baseURI = "https://ipfs.io/ipfs/QmQ5yApMr1thk5gkFakFeJpSvKBPKbTAfkVG9FHpo2zuSY/"; string private constant _contractURI = "https://ipfs.io/ipfs/Qmf2pwtBCsnWaFrtKq1RG3fod4iH66vfeoQdJifmmLm9TN"; IKlein public Klein; address public proxyRegistryAddress; constructor(address _IKBAddress, address _proxyRegistryAddress) ERC721Full("IKB Cachet de Garantie", "wIKB") Ownable() public { Klein = IKlein(_IKBAddress); proxyRegistryAddress = _proxyRegistryAddress; } /************************************************************************** * Opensea-specific methods *************************************************************************/ function contractURI() external pure returns (string memory) { return _contractURI; } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll(address owner, address operator) public view returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } /************************************************************************** * ERC721 methods *************************************************************************/ /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view returns (string memory) { return _baseURI; } /** * @dev `baseURI` is a folder with a trailing slash. * The JSON metadata for `tokenId` can be found at `baseURI` + `tokenId` + .json */ function tokenURI(uint256 tokenId) public view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); return string(abi.encodePacked(baseURI(), uint2str(tokenId), '.json')); } /************************************************************************** * WrappedIKB-specific methods *************************************************************************/ /** * @dev Uses `transferFrom` to transer all IKB Tokens from `msg.sender` to * this wrapper. Once the wrapper owns all editions, it mints new tokens with * the same `id` and sets `msg.sender` as the owner. * * Requirements: * * - All IKB tokens owned by `msg.sender` must be allowed to be transfered by WrappedIKB. * To do this, call `approve()` with the address of WrappedIKB and the current * balance of the owner */ function mint() public returns (bool){ uint256[] memory ownedRecords = Klein.getHolderEditions(_msgSender()); uint ownedRecordsLength = ownedRecords.length; require(Klein.allowance(_msgSender(),address(this)) >= ownedRecordsLength, "WrappedIKB: must approve all IKB tokens to be transfered"); require(Klein.transferFrom(_msgSender(),address(this), ownedRecordsLength), "WrappedIKB: IKB Token did not transferFrom"); for (uint i = 0; i < ownedRecordsLength; i++){ _safeMint(_msgSender(), ownedRecords[i]); } return true; } /** * @dev Uses `specificTransferFrom` to transer specific a IKB Token edition from * `msg.sender` to this wrapper. Once the wrapper owns the specified edition, * it mints new tokens with * the same `id` and sets `msg.sender` as the owner. * * Requirements: * * - None. There is no way to check if the IKB contract allows a specific transfer. * The transfer will fail on the IKB contract `specificApprove()` is not called * with the correct edition. */ function mint(uint edition) public { require(Klein.specificTransferFrom(_msgSender(), address(this), edition), "WrappedIKB: IKB Token did not specificTransferFrom"); _safeMint(_msgSender(), edition); } /** * @dev Transfers the specified IKB token editions back to `msg.sender` * and burns the corresponding WrappedIKB tokens * * Requirements: * * - `msg.sender` must be the owner of the WrappedIKB tokens */ function unwrapSpecific(uint tokenId) public{ require(ownerOf(tokenId) == _msgSender(), "WrappedIKB: Token not owned by sender"); require(Klein.specificTransfer(_msgSender(), tokenId), "WrappedIKB: Token transfer failed"); _burn(tokenId); } /** * @dev Convenience function transfers all IKB token editions back to * `msg.sender` and burns the corresponding WrappedIKB tokens. * See `unwrapSpecific()` for implementation. */ function unwrapAll() public{ uint256 balance = balanceOf(_msgSender()); uint[] memory tokenIds = new uint[](balance); for (uint256 i = 0; i < balance; i++){ tokenIds[i] = (tokenOfOwnerByIndex(_msgSender(), i)); } for (uint256 i = 0; i < balance; i++){ unwrapSpecific(tokenIds[i]); } } /************************************************************************** * Utility methods *************************************************************************/ // via https://github.com/ProjectOpenSea/opensea-creatures/blob/master/contracts/Strings.sol function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } }
// Sources flattened with hardhat v2.1.2 https://hardhat.org // File openzeppelin-solidity/contracts/GSN/[email protected] pragma solidity 0.5.17; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor () internal { } // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File openzeppelin-solidity/contracts/introspection/[email protected] pragma solidity 0.5.17; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; /** * @dev Required interface of an ERC721 compliant contract. */ 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); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either {approve} or {setApprovalForAll}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either {approve} or {setApprovalForAll}. */ function transferFrom(address from, address to, uint256 tokenId) public; 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 safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; /** * @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 {IERC721-safeTransferFrom}. 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 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } // File openzeppelin-solidity/contracts/math/[email protected] pragma solidity 0.5.17; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot 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-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File openzeppelin-solidity/contracts/utils/[email protected] pragma solidity ^0.5.5; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Converts an `address` into `address payable`. Note that this is * simply a type cast: the actual underlying value is not changed. * * _Available since v2.4.0._ */ function toPayable(address account) internal pure returns (address payable) { return address(uint160(account)); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. * * _Available since v2.4.0._ */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-call-value (bool success, ) = recipient.call.value(amount)(""); require(success, "Address: unable to send value, recipient may have reverted"); } } // File openzeppelin-solidity/contracts/drafts/[email protected] pragma solidity 0.5.17; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the {SafeMath} * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { // The {SafeMath} overflow check can be skipped here, see the comment at the top counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } // File openzeppelin-solidity/contracts/introspection/[email protected] pragma solidity 0.5.17; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // 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 => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; 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), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return 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), "ERC721: owner query for nonexistent token"); 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, "ERC721: approval to current owner"); require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _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), "ERC721: approved query for nonexistent token"); 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 != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][to] = approved; emit ApprovalForAll(_msgSender(), 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 { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _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 {IERC721Receiver-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 {IERC721Receiver-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 _msgSender() 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 { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransferFrom(from, to, tokenId, _data); } /** * @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) internal { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool 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) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * 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. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _safeMint(address to, uint256 tokenId) internal { _safeMint(to, tokenId, ""); } /** * @dev Internal function to safely mint a new token. * Reverts if the given token ID already exists. * 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. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted * @param _data bytes data to send along with a safe transfer check */ function _safeMint(address to, uint256 tokenId, bytes memory _data) internal { _mint(to, tokenId); require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @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), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use {_burn} 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, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _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, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * This is an internal detail of the `ERC721` contract and its use is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data )); if (!success) { if (returndata.length > 0) { // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert("ERC721: transfer to non ERC721Receiver implementer"); } } else { bytes4 retval = abi.decode(returndata, (bytes4)); 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 openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ 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 openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Enumerable is Context, 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(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Constructor function. */ constructor () public { // register the supported interface to conform to ERC721Enumerable 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), "ERC721Enumerable: owner index out of bounds"); 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(), "ERC721Enumerable: global index out of bounds"); 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 {ERC721-_burn} 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 occupied by // lastTokenId, 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 openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ 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 openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata { // Token name string private _name; // Token symbol string private _symbol; // Base URI string private _baseURI; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /** * @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 the URI for a given token ID. May return an empty string. * * If the token's URI is non-empty and a base URI was set (via * {_setBaseURI}), it will be added to the token ID's URI as a prefix. * * Reverts if the token ID does not exist. */ function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; // Even if there is a base URI, it is only appended to non-empty token-specific URIs if (bytes(_tokenURI).length == 0) { return ""; } else { // abi.encodePacked is being used to concatenate strings return string(abi.encodePacked(_baseURI, _tokenURI)); } } /** * @dev Internal function to set the token URI for a given token. * * Reverts if the token ID does not exist. * * TIP: if all token IDs share a prefix (e.g. if your URIs look like * `http://api.myproject.com/token/<id>`), use {_setBaseURI} to store * it and save gas. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}. * * _Available since v2.5.0._ */ function _setBaseURI(string memory baseURI) internal { _baseURI = baseURI; } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a preffix in {tokenURI} to each token's URI, when * they are non-empty. * * _Available since v2.5.0._ */ function baseURI() external view returns (string memory) { return _baseURI; } /** * @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 openzeppelin-solidity/contracts/token/ERC721/[email protected] pragma solidity 0.5.17; /** * @title Full ERC721 Token * @dev This implementation includes all the required and some optional functionality of the ERC721 standard * Moreover, it includes approve all functionality using operator terminology. * * See https://eips.ethereum.org/EIPS/eip-721 */ 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 openzeppelin-solidity/contracts/ownership/[email protected] pragma solidity 0.5.17; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return _msgSender() == _owner; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File contracts/Strings.sol pragma solidity 0.5.17; library Strings { // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory _bd = bytes(_d); bytes memory _be = bytes(_e); string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length); bytes memory babcde = bytes(abcde); uint k = 0; for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i]; for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i]; for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i]; return string(babcde); } function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) { return strConcat(_a, _b, _c, _d, ""); } function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) { return strConcat(_a, _b, _c, "", ""); } function strConcat(string memory _a, string memory _b) internal pure returns (string memory) { return strConcat(_a, _b, "", "", ""); } function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } }
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.5.17; interface IKlein { function getHolderEditions(address _holder) external view returns (uint256[] memory); function specificTransferFrom(address _from, address _to, uint _edition) external returns (bool success); function specificTransfer(address _to, uint _edition) external returns (bool success); /************************************************************************** * ERC20 Interface *************************************************************************/ function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity 0.5.17; /** * @dev Stripped out ProxyRegistry from Open Sea's ERC721Tradable * https://raw.githubusercontent.com/ProjectOpenSea/opensea-creatures/0ac530b8a05b605c3376c0e026399b575ade0499/contracts/ERC721Tradable.sol */ contract OwnableDelegateProxy {} contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_IKBAddress","type":"address"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"Klein","outputs":[{"internalType":"contract IKlein","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"edition","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unwrapAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unwrapSpecific","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526040518060800160405280604481526020016200485b60449139600e90805190602001906200003592919062000388565b503480156200004357600080fd5b506040516200489f3803806200489f83398181016040526200006991908101906200044e565b6040518060400160405280601681526020017f494b422043616368657420646520476172616e746965000000000000000000008152506040518060400160405280600481526020017f77494b42000000000000000000000000000000000000000000000000000000008152508181620000ef6301ffc9a760e01b620002a860201b60201c565b620001076380ac58cd60e01b620002a860201b60201c565b6200011f63780e9d6360e01b620002a860201b60201c565b81600990805190602001906200013792919062000388565b5080600a90805190602001906200015092919062000388565b5062000169635b5e139f60e01b620002a860201b60201c565b5050505060006200017f6200038060201b60201c565b905080600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35081600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505062000552565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141562000314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030b90620004d1565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003cb57805160ff1916838001178555620003fc565b82800160010185558215620003fc579182015b82811115620003fb578251825591602001919060010190620003de565b5b5090506200040b91906200040f565b5090565b6200043491905b808211156200043057600081600090555060010162000416565b5090565b90565b600081519050620004488162000538565b92915050565b600080604083850312156200046257600080fd5b6000620004728582860162000437565b9250506020620004858582860162000437565b9150509250929050565b60006200049e601c83620004f3565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b60006020820190508181036000830152620004ec816200048f565b9050919050565b600082825260208201905092915050565b6000620005118262000518565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b620005438162000504565b81146200054f57600080fd5b50565b6142f980620005626000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063daf4e65411610071578063daf4e654146104e3578063e8a3d485146104ff578063e985e9c51461051d578063f2fde38b1461054d576101c4565b8063b88d4fde14610479578063c87b56dd14610495578063cd7c0326146104c5576101c4565b806395d89b41116100d357806395d89b4114610405578063a0712d6814610423578063a22cb4651461043f578063b2cd67ef1461045b576101c4565b8063715018a6146103bf5780638da5cb5b146103c95780638f32d59b146103e7576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce7146103115780636352211e146103415780636c0360eb1461037157806370a082311461038f576101c4565b80632f745c59146102bb57806342842e0e146102eb5780634982e3b714610307576101c4565b8063095ea7b3116101a2578063095ea7b3146102475780631249c58b1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036036101de9190810190612ff5565b610569565b6040516101f09190613c79565b60405180910390f35b6102016105d0565b60405161020e9190613caf565b60405180910390f35b610231600480360361022c9190810190613070565b610672565b60405161023e9190613b6e565b60405180910390f35b610261600480360361025c9190810190612f4f565b6106f7565b005b61026b6108b2565b6040516102789190613c79565b60405180910390f35b610289610bab565b6040516102969190613fd1565b60405180910390f35b6102b960048036036102b49190810190612e49565b610bb8565b005b6102d560048036036102d09190810190612f4f565b610c18565b6040516102e29190613fd1565b60405180910390f35b61030560048036036103009190810190612e49565b610cc1565b005b61030f610ce1565b005b61032b60048036036103269190810190613070565b610daa565b6040516103389190613fd1565b60405180910390f35b61035b60048036036103569190810190613070565b610e14565b6040516103689190613b6e565b60405180910390f35b610379610ec6565b6040516103869190613caf565b60405180910390f35b6103a960048036036103a49190810190612de4565b610f68565b6040516103b69190613fd1565b60405180910390f35b6103c7611027565b005b6103d161112f565b6040516103de9190613b6e565b60405180910390f35b6103ef611159565b6040516103fc9190613c79565b60405180910390f35b61040d6111b8565b60405161041a9190613caf565b60405180910390f35b61043d60048036036104389190810190613070565b61125a565b005b61045960048036036104549190810190612f13565b611365565b005b6104636114e6565b6040516104709190613c94565b60405180910390f35b610493600480360361048e9190810190612e98565b61150c565b005b6104af60048036036104aa9190810190613070565b61156e565b6040516104bc9190613caf565b60405180910390f35b6104cd6115f0565b6040516104da9190613b6e565b60405180910390f35b6104fd60048036036104f89190810190613070565b611616565b005b610507611794565b6040516105149190613caf565b60405180910390f35b61053760048036036105329190810190612e0d565b6117b4565b6040516105449190613c79565b60405180910390f35b61056760048036036105629190810190612de4565b6118b6565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106685780601f1061063d57610100808354040283529160200191610668565b820191906000526020600020905b81548152906001019060200180831161064b57829003601f168201915b5050505050905090565b600061067d82611909565b6106bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b390613ed1565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070282610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076a90613f51565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079261197b565b73ffffffffffffffffffffffffffffffffffffffff1614806107c157506107c0816107bb61197b565b6117b4565b5b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613df1565b60405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006060600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636531a7086108fc61197b565b6040518263ffffffff1660e01b81526004016109189190613b89565b60006040518083038186803b15801561093057600080fd5b505afa158015610944573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061096d9190810190612f8b565b905060008151905080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6109bc61197b565b306040518363ffffffff1660e01b81526004016109da929190613ba4565b60206040518083038186803b1580156109f257600080fd5b505afa158015610a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a2a9190810190613099565b1015610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290613e51565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd610ab161197b565b30846040518463ffffffff1660e01b8152600401610ad193929190613bcd565b602060405180830381600087803b158015610aeb57600080fd5b505af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b239190810190612fcc565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613cd1565b60405180910390fd5b60008090505b81811015610ba157610b94610b7b61197b565b848381518110610b8757fe5b6020026020010151611983565b8080600101915050610b68565b5060019250505090565b6000600780549050905090565b610bc9610bc361197b565b826119a1565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613f71565b60405180910390fd5b610c13838383611a7f565b505050565b6000610c2383610f68565b8210610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90613cf1565b60405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610cae57fe5b9060005260206000200154905092915050565b610cdc8383836040518060200160405280600081525061150c565b505050565b6000610cf3610cee61197b565b610f68565b9050606081604051908082528060200260200182016040528015610d265781602001602082028038833980820191505090505b50905060008090505b82811015610d6d57610d48610d4261197b565b82610c18565b828281518110610d5457fe5b6020026020010181815250508080600101915050610d2f565b5060008090505b82811015610da557610d98828281518110610d8b57fe5b6020026020010151611616565b8080600101915050610d74565b505050565b6000610db4610bab565b8210610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613f91565b60405180910390fd5b60078281548110610e0257fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613e31565b60405180910390fd5b80915050919050565b6060600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090613e11565b60405180910390fd5b611020600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611aa3565b9050919050565b61102f611159565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613ef1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661119c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112505780601f1061122557610100808354040283529160200191611250565b820191906000526020600020905b81548152906001019060200180831161123357829003601f168201915b5050505050905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365ce52226112a061197b565b30846040518463ffffffff1660e01b81526004016112c093929190613bcd565b602060405180830381600087803b1580156112da57600080fd5b505af11580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113129190810190612fcc565b611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134890613db1565b60405180910390fd5b61136261135c61197b565b82611983565b50565b61136d61197b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613d91565b60405180910390fd5b80600460006113e861197b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149561197b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114da9190613c79565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61151d61151761197b565b836119a1565b61155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390613f71565b60405180910390fd5b61156884848484611ab1565b50505050565b606061157982611909565b6115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613f31565b60405180910390fd5b6115c0610ec6565b6115c983611b0d565b6040516020016115da929190613b3f565b6040516020818303038152906040529050919050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61161e61197b565b73ffffffffffffffffffffffffffffffffffffffff1661163d82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90613e71565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663350f42706116d961197b565b836040518363ffffffff1660e01b81526004016116f7929190613c50565b602060405180830381600087803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117499190810190612fcc565b611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613e91565b60405180910390fd5b61179181611c3a565b50565b606060405180608001604052806043815260200161427460439139905090565b600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161182c9190613b6e565b60206040518083038186803b15801561184457600080fd5b505afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061187c9190810190613047565b73ffffffffffffffffffffffffffffffffffffffff1614156118a25760019150506118b0565b6118ac8484611c4f565b9150505b92915050565b6118be611159565b6118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490613ef1565b60405180910390fd5b61190681611ce3565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b61199d828260405180602001604052806000815250611e13565b5050565b60006119ac82611909565b6119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613dd1565b60405180910390fd5b60006119f683610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a6557508373ffffffffffffffffffffffffffffffffffffffff16611a4d84610672565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a765750611a7581856117b4565b5b91505092915050565b611a8a838383611e6e565b611a94838261209d565b611a9e828261223b565b505050565b600081600001549050919050565b611abc848484611a7f565b611ac884848484612302565b611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90613d11565b60405180910390fd5b50505050565b60606000821415611b55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c35565b600082905060005b60008214611b7f578080600101915050600a8281611b7757fe5b049150611b5d565b6060816040519080825280601f01601f191660200182016040528015611bb45781602001600182028038833980820191505090505b50905060006001830390505b60008614611c2d57600a8681611bd257fe5b0660300160f81b82828060019003935081518110611bec57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681611c2557fe5b049550611bc0565b819450505050505b919050565b611c4c611c4682610e14565b826124fc565b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90613d31565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e1d8383612559565b611e2a6000848484612302565b611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613d11565b60405180910390fd5b505050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8e82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90613f11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90613d71565b60405180910390fd5b611f5d8161257a565b611fa4600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b611feb600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120f56001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061267190919063ffffffff16565b90506000600660008481526020019081526020016000205490508181146121e2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061216257fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106121ba57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036122349190612bcc565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b60006123238473ffffffffffffffffffffffffffffffffffffffff166126bb565b61233057600190506124f4565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b61237461197b565b89888860405160240161238a9493929190613c04565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123f49190613b28565b6000604051808303816000865af19150503d8060008114612431576040519150601f19603f3d011682016040523d82523d6000602084013e612436565b606091505b50915091508161248e576000815111156124535780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248590613d11565b60405180910390fd5b6000818060200190516124a4919081019061301e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b6125068282612706565b6000600c60008381526020019081526020016000208054600181600116156101000203166002900490501461255557600c600082815260200190815260200160002060006125549190612bf8565b5b5050565b6125638282612740565b61256d828261223b565b612576816128f2565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126355760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6126506001826000015461267190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006126b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061293e565b905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156126fd57506000801b8214155b92505050919050565b6127108282612999565b61271a828261209d565b6000600660008381526020019081526020016000208190555061273c81612b12565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790613eb1565b60405180910390fd5b6127b981611909565b156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090613d51565b60405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612892600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6000838311158290612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9190613caf565b60405180910390fd5b5060008385039050809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff166129b982610e14565b73ffffffffffffffffffffffffffffffffffffffff1614612a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0690613fb1565b60405180910390fd5b612a188161257a565b612a5f600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b2d600160078054905061267190919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110612b5657fe5b906000526020600020015490508060078381548110612b7157fe5b90600052602060002001819055508160086000838152602001908152602001600020819055506007805480919060019003612bac9190612bcc565b506000600860008681526020019081526020016000208190555050505050565b815481835581811115612bf357818360005260206000209182019101612bf29190612c40565b5b505050565b50805460018160011615610100020316600290046000825580601f10612c1e5750612c3d565b601f016020900490600052602060002090810190612c3c9190612c40565b5b50565b612c6291905b80821115612c5e576000816000905550600101612c46565b5090565b90565b600081359050612c7481614200565b92915050565b600082601f830112612c8b57600080fd5b8151612c9e612c9982614019565b613fec565b91508181835260208401935060208101905083856020840282011115612cc357600080fd5b60005b83811015612cf35781612cd98882612dcf565b845260208401935060208301925050600181019050612cc6565b5050505092915050565b600081359050612d0c81614217565b92915050565b600081519050612d2181614217565b92915050565b600081359050612d368161422e565b92915050565b600081519050612d4b8161422e565b92915050565b600082601f830112612d6257600080fd5b8135612d75612d7082614041565b613fec565b91508082526020830160208301858383011115612d9157600080fd5b612d9c8382846141ad565b50505092915050565b600081519050612db481614245565b92915050565b600081359050612dc98161425c565b92915050565b600081519050612dde8161425c565b92915050565b600060208284031215612df657600080fd5b6000612e0484828501612c65565b91505092915050565b60008060408385031215612e2057600080fd5b6000612e2e85828601612c65565b9250506020612e3f85828601612c65565b9150509250929050565b600080600060608486031215612e5e57600080fd5b6000612e6c86828701612c65565b9350506020612e7d86828701612c65565b9250506040612e8e86828701612dba565b9150509250925092565b60008060008060808587031215612eae57600080fd5b6000612ebc87828801612c65565b9450506020612ecd87828801612c65565b9350506040612ede87828801612dba565b925050606085013567ffffffffffffffff811115612efb57600080fd5b612f0787828801612d51565b91505092959194509250565b60008060408385031215612f2657600080fd5b6000612f3485828601612c65565b9250506020612f4585828601612cfd565b9150509250929050565b60008060408385031215612f6257600080fd5b6000612f7085828601612c65565b9250506020612f8185828601612dba565b9150509250929050565b600060208284031215612f9d57600080fd5b600082015167ffffffffffffffff811115612fb757600080fd5b612fc384828501612c7a565b91505092915050565b600060208284031215612fde57600080fd5b6000612fec84828501612d12565b91505092915050565b60006020828403121561300757600080fd5b600061301584828501612d27565b91505092915050565b60006020828403121561303057600080fd5b600061303e84828501612d3c565b91505092915050565b60006020828403121561305957600080fd5b600061306784828501612da5565b91505092915050565b60006020828403121561308257600080fd5b600061309084828501612dba565b91505092915050565b6000602082840312156130ab57600080fd5b60006130b984828501612dcf565b91505092915050565b6130cb81614153565b82525050565b6130da816140cd565b82525050565b6130e9816140bb565b82525050565b6130f8816140df565b82525050565b60006131098261406d565b6131138185614083565b93506131238185602086016141bc565b61312c816141ef565b840191505092915050565b60006131428261406d565b61314c8185614094565b935061315c8185602086016141bc565b80840191505092915050565b61317181614165565b82525050565b600061318282614078565b61318c818561409f565b935061319c8185602086016141bc565b6131a5816141ef565b840191505092915050565b60006131bb82614078565b6131c581856140b0565b93506131d58185602086016141bc565b80840191505092915050565b60006131ee602a8361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420747260008301527f616e7366657246726f6d000000000000000000000000000000000000000000006020830152604082019050919050565b6000613254602b8361409f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006132ba60328361409f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061332060268361409f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613386601c8361409f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006133c660248361409f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061342c60198361409f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061346c60328361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420737060008301527f6563696669635472616e7366657246726f6d00000000000000000000000000006020830152604082019050919050565b60006134d2602c8361409f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353860388361409f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061359e602a8361409f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061360460298361409f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366a60388361409f565b91507f57726170706564494b423a206d75737420617070726f766520616c6c20494b4260008301527f20746f6b656e7320746f206265207472616e73666572656400000000000000006020830152604082019050919050565b60006136d060258361409f565b91507f57726170706564494b423a20546f6b656e206e6f74206f776e6564206279207360008301527f656e6465720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061373660218361409f565b91507f57726170706564494b423a20546f6b656e207472616e73666572206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379c60208361409f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137dc602c8361409f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138426005836140b0565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061388260208361409f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006138c260298361409f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613928602f8361409f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061398e60218361409f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f460318361409f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a5a602c8361409f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613ac060258361409f565b91507f4552433732313a206275726e206f6620746f6b656e2074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b613b2281614149565b82525050565b6000613b348284613137565b915081905092915050565b6000613b4b82856131b0565b9150613b5782846131b0565b9150613b6282613835565b91508190509392505050565b6000602082019050613b8360008301846130e0565b92915050565b6000602082019050613b9e60008301846130c2565b92915050565b6000604082019050613bb960008301856130c2565b613bc660208301846130e0565b9392505050565b6000606082019050613be260008301866130c2565b613bef60208301856130e0565b613bfc6040830184613b19565b949350505050565b6000608082019050613c1960008301876130d1565b613c2660208301866130e0565b613c336040830185613b19565b8181036060830152613c4581846130fe565b905095945050505050565b6000604082019050613c6560008301856130c2565b613c726020830184613b19565b9392505050565b6000602082019050613c8e60008301846130ef565b92915050565b6000602082019050613ca96000830184613168565b92915050565b60006020820190508181036000830152613cc98184613177565b905092915050565b60006020820190508181036000830152613cea816131e1565b9050919050565b60006020820190508181036000830152613d0a81613247565b9050919050565b60006020820190508181036000830152613d2a816132ad565b9050919050565b60006020820190508181036000830152613d4a81613313565b9050919050565b60006020820190508181036000830152613d6a81613379565b9050919050565b60006020820190508181036000830152613d8a816133b9565b9050919050565b60006020820190508181036000830152613daa8161341f565b9050919050565b60006020820190508181036000830152613dca8161345f565b9050919050565b60006020820190508181036000830152613dea816134c5565b9050919050565b60006020820190508181036000830152613e0a8161352b565b9050919050565b60006020820190508181036000830152613e2a81613591565b9050919050565b60006020820190508181036000830152613e4a816135f7565b9050919050565b60006020820190508181036000830152613e6a8161365d565b9050919050565b60006020820190508181036000830152613e8a816136c3565b9050919050565b60006020820190508181036000830152613eaa81613729565b9050919050565b60006020820190508181036000830152613eca8161378f565b9050919050565b60006020820190508181036000830152613eea816137cf565b9050919050565b60006020820190508181036000830152613f0a81613875565b9050919050565b60006020820190508181036000830152613f2a816138b5565b9050919050565b60006020820190508181036000830152613f4a8161391b565b9050919050565b60006020820190508181036000830152613f6a81613981565b9050919050565b60006020820190508181036000830152613f8a816139e7565b9050919050565b60006020820190508181036000830152613faa81613a4d565b9050919050565b60006020820190508181036000830152613fca81613ab3565b9050919050565b6000602082019050613fe66000830184613b19565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561400f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561403057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561405857600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c682614129565b9050919050565b60006140d882614129565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614122826140bb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061415e82614189565b9050919050565b600061417082614177565b9050919050565b600061418282614129565b9050919050565b60006141948261419b565b9050919050565b60006141a682614129565b9050919050565b82818337600083830152505050565b60005b838110156141da5780820151818401526020810190506141bf565b838111156141e9576000848401525b50505050565b6000601f19601f8301169050919050565b614209816140bb565b811461421457600080fd5b50565b614220816140df565b811461422b57600080fd5b50565b614237816140eb565b811461424257600080fd5b50565b61424e81614117565b811461425957600080fd5b50565b61426581614149565b811461427057600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d66327077744243736e57614672744b7131524733666f6434694836367666656f51644a69666d6d4c6d39544ea365627a7a72315820fe9778c866f13098422aaa1bf3d7a6c3ca6d82e9b692291075df8331c0abfa506c6578706572696d656e74616cf564736f6c6343000511004068747470733a2f2f697066732e696f2f697066732f516d51357941704d723174686b35676b46616b46654a7053764b42504b625441666b5647394648706f327a7553592f00000000000000000000000088ae96845e157558ef59e9ff90e766e22e480390000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063daf4e65411610071578063daf4e654146104e3578063e8a3d485146104ff578063e985e9c51461051d578063f2fde38b1461054d576101c4565b8063b88d4fde14610479578063c87b56dd14610495578063cd7c0326146104c5576101c4565b806395d89b41116100d357806395d89b4114610405578063a0712d6814610423578063a22cb4651461043f578063b2cd67ef1461045b576101c4565b8063715018a6146103bf5780638da5cb5b146103c95780638f32d59b146103e7576101c4565b80632f745c59116101665780634f6ccce7116101405780634f6ccce7146103115780636352211e146103415780636c0360eb1461037157806370a082311461038f576101c4565b80632f745c59146102bb57806342842e0e146102eb5780634982e3b714610307576101c4565b8063095ea7b3116101a2578063095ea7b3146102475780631249c58b1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036036101de9190810190612ff5565b610569565b6040516101f09190613c79565b60405180910390f35b6102016105d0565b60405161020e9190613caf565b60405180910390f35b610231600480360361022c9190810190613070565b610672565b60405161023e9190613b6e565b60405180910390f35b610261600480360361025c9190810190612f4f565b6106f7565b005b61026b6108b2565b6040516102789190613c79565b60405180910390f35b610289610bab565b6040516102969190613fd1565b60405180910390f35b6102b960048036036102b49190810190612e49565b610bb8565b005b6102d560048036036102d09190810190612f4f565b610c18565b6040516102e29190613fd1565b60405180910390f35b61030560048036036103009190810190612e49565b610cc1565b005b61030f610ce1565b005b61032b60048036036103269190810190613070565b610daa565b6040516103389190613fd1565b60405180910390f35b61035b60048036036103569190810190613070565b610e14565b6040516103689190613b6e565b60405180910390f35b610379610ec6565b6040516103869190613caf565b60405180910390f35b6103a960048036036103a49190810190612de4565b610f68565b6040516103b69190613fd1565b60405180910390f35b6103c7611027565b005b6103d161112f565b6040516103de9190613b6e565b60405180910390f35b6103ef611159565b6040516103fc9190613c79565b60405180910390f35b61040d6111b8565b60405161041a9190613caf565b60405180910390f35b61043d60048036036104389190810190613070565b61125a565b005b61045960048036036104549190810190612f13565b611365565b005b6104636114e6565b6040516104709190613c94565b60405180910390f35b610493600480360361048e9190810190612e98565b61150c565b005b6104af60048036036104aa9190810190613070565b61156e565b6040516104bc9190613caf565b60405180910390f35b6104cd6115f0565b6040516104da9190613b6e565b60405180910390f35b6104fd60048036036104f89190810190613070565b611616565b005b610507611794565b6040516105149190613caf565b60405180910390f35b61053760048036036105329190810190612e0d565b6117b4565b6040516105449190613c79565b60405180910390f35b61056760048036036105629190810190612de4565b6118b6565b005b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156106685780601f1061063d57610100808354040283529160200191610668565b820191906000526020600020905b81548152906001019060200180831161064b57829003601f168201915b5050505050905090565b600061067d82611909565b6106bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106b390613ed1565b60405180910390fd5b6002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061070282610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076a90613f51565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079261197b565b73ffffffffffffffffffffffffffffffffffffffff1614806107c157506107c0816107bb61197b565b6117b4565b5b610800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107f790613df1565b60405180910390fd5b826002600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006060600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636531a7086108fc61197b565b6040518263ffffffff1660e01b81526004016109189190613b89565b60006040518083038186803b15801561093057600080fd5b505afa158015610944573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061096d9190810190612f8b565b905060008151905080600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e6109bc61197b565b306040518363ffffffff1660e01b81526004016109da929190613ba4565b60206040518083038186803b1580156109f257600080fd5b505afa158015610a06573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610a2a9190810190613099565b1015610a6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6290613e51565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd610ab161197b565b30846040518463ffffffff1660e01b8152600401610ad193929190613bcd565b602060405180830381600087803b158015610aeb57600080fd5b505af1158015610aff573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610b239190810190612fcc565b610b62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5990613cd1565b60405180910390fd5b60008090505b81811015610ba157610b94610b7b61197b565b848381518110610b8757fe5b6020026020010151611983565b8080600101915050610b68565b5060019250505090565b6000600780549050905090565b610bc9610bc361197b565b826119a1565b610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90613f71565b60405180910390fd5b610c13838383611a7f565b505050565b6000610c2383610f68565b8210610c64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5b90613cf1565b60405180910390fd5b600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110610cae57fe5b9060005260206000200154905092915050565b610cdc8383836040518060200160405280600081525061150c565b505050565b6000610cf3610cee61197b565b610f68565b9050606081604051908082528060200260200182016040528015610d265781602001602082028038833980820191505090505b50905060008090505b82811015610d6d57610d48610d4261197b565b82610c18565b828281518110610d5457fe5b6020026020010181815250508080600101915050610d2f565b5060008090505b82811015610da557610d98828281518110610d8b57fe5b6020026020010151611616565b8080600101915050610d74565b505050565b6000610db4610bab565b8210610df5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dec90613f91565b60405180910390fd5b60078281548110610e0257fe5b90600052602060002001549050919050565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ebd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb490613e31565b60405180910390fd5b80915050919050565b6060600e8054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f5e5780601f10610f3357610100808354040283529160200191610f5e565b820191906000526020600020905b815481529060010190602001808311610f4157829003601f168201915b5050505050905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd090613e11565b60405180910390fd5b611020600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020611aa3565b9050919050565b61102f611159565b61106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106590613ef1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661119c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156112505780601f1061122557610100808354040283529160200191611250565b820191906000526020600020905b81548152906001019060200180831161123357829003601f168201915b5050505050905090565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166365ce52226112a061197b565b30846040518463ffffffff1660e01b81526004016112c093929190613bcd565b602060405180830381600087803b1580156112da57600080fd5b505af11580156112ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506113129190810190612fcc565b611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134890613db1565b60405180910390fd5b61136261135c61197b565b82611983565b50565b61136d61197b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156113db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d290613d91565b60405180910390fd5b80600460006113e861197b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661149561197b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516114da9190613c79565b60405180910390a35050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61151d61151761197b565b836119a1565b61155c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155390613f71565b60405180910390fd5b61156884848484611ab1565b50505050565b606061157982611909565b6115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613f31565b60405180910390fd5b6115c0610ec6565b6115c983611b0d565b6040516020016115da929190613b3f565b6040516020818303038152906040529050919050565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61161e61197b565b73ffffffffffffffffffffffffffffffffffffffff1661163d82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611693576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168a90613e71565b60405180910390fd5b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663350f42706116d961197b565b836040518363ffffffff1660e01b81526004016116f7929190613c50565b602060405180830381600087803b15801561171157600080fd5b505af1158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117499190810190612fcc565b611788576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177f90613e91565b60405180910390fd5b61179181611c3a565b50565b606060405180608001604052806043815260200161427460439139905090565b600080601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663c4552791866040518263ffffffff1660e01b815260040161182c9190613b6e565b60206040518083038186803b15801561184457600080fd5b505afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061187c9190810190613047565b73ffffffffffffffffffffffffffffffffffffffff1614156118a25760019150506118b0565b6118ac8484611c4f565b9150505b92915050565b6118be611159565b6118fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f490613ef1565b60405180910390fd5b61190681611ce3565b50565b6000806001600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b600033905090565b61199d828260405180602001604052806000815250611e13565b5050565b60006119ac82611909565b6119eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e290613dd1565b60405180910390fd5b60006119f683610e14565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611a6557508373ffffffffffffffffffffffffffffffffffffffff16611a4d84610672565b73ffffffffffffffffffffffffffffffffffffffff16145b80611a765750611a7581856117b4565b5b91505092915050565b611a8a838383611e6e565b611a94838261209d565b611a9e828261223b565b505050565b600081600001549050919050565b611abc848484611a7f565b611ac884848484612302565b611b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afe90613d11565b60405180910390fd5b50505050565b60606000821415611b55576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c35565b600082905060005b60008214611b7f578080600101915050600a8281611b7757fe5b049150611b5d565b6060816040519080825280601f01601f191660200182016040528015611bb45781602001600182028038833980820191505090505b50905060006001830390505b60008614611c2d57600a8681611bd257fe5b0660300160f81b82828060019003935081518110611bec57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8681611c2557fe5b049550611bc0565b819450505050505b919050565b611c4c611c4682610e14565b826124fc565b50565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4a90613d31565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611e1d8383612559565b611e2a6000848484612302565b611e69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6090613d11565b60405180910390fd5b505050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8e82610e14565b73ffffffffffffffffffffffffffffffffffffffff1614611ee4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edb90613f11565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4b90613d71565b60405180910390fd5b611f5d8161257a565b611fa4600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b611feb600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006120f56001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061267190919063ffffffff16565b90506000600660008481526020019081526020016000205490508181146121e2576000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020838154811061216257fe5b9060005260206000200154905080600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002083815481106121ba57fe5b9060005260206000200181905550816006600083815260200190815260200160002081905550505b600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054809190600190036122349190612bcc565b5050505050565b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506006600083815260200190815260200160002081905550600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190806001815401808255809150509060018203906000526020600020016000909192909190915055505050565b60006123238473ffffffffffffffffffffffffffffffffffffffff166126bb565b61233057600190506124f4565b600060608573ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1663150b7a02905060e01b61237461197b565b89888860405160240161238a9493929190613c04565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123f49190613b28565b6000604051808303816000865af19150503d8060008114612431576040519150601f19603f3d011682016040523d82523d6000602084013e612436565b606091505b50915091508161248e576000815111156124535780518082602001fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248590613d11565b60405180910390fd5b6000818060200190516124a4919081019061301e565b905063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161493505050505b949350505050565b6125068282612706565b6000600c60008381526020019081526020016000208054600181600116156101000203166002900490501461255557600c600082815260200190815260200160002060006125549190612bf8565b5b5050565b6125638282612740565b61256d828261223b565b612576816128f2565b5050565b600073ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146126355760006002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b6126506001826000015461267190919063ffffffff16565b816000018190555050565b6001816000016000828254019250508190555050565b60006126b383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061293e565b905092915050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156126fd57506000801b8214155b92505050919050565b6127108282612999565b61271a828261209d565b6000600660008381526020019081526020016000208190555061273c81612b12565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127a790613eb1565b60405180910390fd5b6127b981611909565b156127f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f090613d51565b60405180910390fd5b816001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550612892600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061265b565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6007805490506008600083815260200190815260200160002081905550600781908060018154018082558091505090600182039060005260206000200160009091929091909150555050565b6000838311158290612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9190613caf565b60405180910390fd5b5060008385039050809150509392505050565b8173ffffffffffffffffffffffffffffffffffffffff166129b982610e14565b73ffffffffffffffffffffffffffffffffffffffff1614612a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0690613fb1565b60405180910390fd5b612a188161257a565b612a5f600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020612638565b60006001600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000612b2d600160078054905061267190919063ffffffff16565b9050600060086000848152602001908152602001600020549050600060078381548110612b5657fe5b906000526020600020015490508060078381548110612b7157fe5b90600052602060002001819055508160086000838152602001908152602001600020819055506007805480919060019003612bac9190612bcc565b506000600860008681526020019081526020016000208190555050505050565b815481835581811115612bf357818360005260206000209182019101612bf29190612c40565b5b505050565b50805460018160011615610100020316600290046000825580601f10612c1e5750612c3d565b601f016020900490600052602060002090810190612c3c9190612c40565b5b50565b612c6291905b80821115612c5e576000816000905550600101612c46565b5090565b90565b600081359050612c7481614200565b92915050565b600082601f830112612c8b57600080fd5b8151612c9e612c9982614019565b613fec565b91508181835260208401935060208101905083856020840282011115612cc357600080fd5b60005b83811015612cf35781612cd98882612dcf565b845260208401935060208301925050600181019050612cc6565b5050505092915050565b600081359050612d0c81614217565b92915050565b600081519050612d2181614217565b92915050565b600081359050612d368161422e565b92915050565b600081519050612d4b8161422e565b92915050565b600082601f830112612d6257600080fd5b8135612d75612d7082614041565b613fec565b91508082526020830160208301858383011115612d9157600080fd5b612d9c8382846141ad565b50505092915050565b600081519050612db481614245565b92915050565b600081359050612dc98161425c565b92915050565b600081519050612dde8161425c565b92915050565b600060208284031215612df657600080fd5b6000612e0484828501612c65565b91505092915050565b60008060408385031215612e2057600080fd5b6000612e2e85828601612c65565b9250506020612e3f85828601612c65565b9150509250929050565b600080600060608486031215612e5e57600080fd5b6000612e6c86828701612c65565b9350506020612e7d86828701612c65565b9250506040612e8e86828701612dba565b9150509250925092565b60008060008060808587031215612eae57600080fd5b6000612ebc87828801612c65565b9450506020612ecd87828801612c65565b9350506040612ede87828801612dba565b925050606085013567ffffffffffffffff811115612efb57600080fd5b612f0787828801612d51565b91505092959194509250565b60008060408385031215612f2657600080fd5b6000612f3485828601612c65565b9250506020612f4585828601612cfd565b9150509250929050565b60008060408385031215612f6257600080fd5b6000612f7085828601612c65565b9250506020612f8185828601612dba565b9150509250929050565b600060208284031215612f9d57600080fd5b600082015167ffffffffffffffff811115612fb757600080fd5b612fc384828501612c7a565b91505092915050565b600060208284031215612fde57600080fd5b6000612fec84828501612d12565b91505092915050565b60006020828403121561300757600080fd5b600061301584828501612d27565b91505092915050565b60006020828403121561303057600080fd5b600061303e84828501612d3c565b91505092915050565b60006020828403121561305957600080fd5b600061306784828501612da5565b91505092915050565b60006020828403121561308257600080fd5b600061309084828501612dba565b91505092915050565b6000602082840312156130ab57600080fd5b60006130b984828501612dcf565b91505092915050565b6130cb81614153565b82525050565b6130da816140cd565b82525050565b6130e9816140bb565b82525050565b6130f8816140df565b82525050565b60006131098261406d565b6131138185614083565b93506131238185602086016141bc565b61312c816141ef565b840191505092915050565b60006131428261406d565b61314c8185614094565b935061315c8185602086016141bc565b80840191505092915050565b61317181614165565b82525050565b600061318282614078565b61318c818561409f565b935061319c8185602086016141bc565b6131a5816141ef565b840191505092915050565b60006131bb82614078565b6131c581856140b0565b93506131d58185602086016141bc565b80840191505092915050565b60006131ee602a8361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420747260008301527f616e7366657246726f6d000000000000000000000000000000000000000000006020830152604082019050919050565b6000613254602b8361409f565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006132ba60328361409f565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061332060268361409f565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613386601c8361409f565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006133c660248361409f565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061342c60198361409f565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061346c60328361409f565b91507f57726170706564494b423a20494b4220546f6b656e20646964206e6f7420737060008301527f6563696669635472616e7366657246726f6d00000000000000000000000000006020830152604082019050919050565b60006134d2602c8361409f565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061353860388361409f565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b600061359e602a8361409f565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b600061360460298361409f565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061366a60388361409f565b91507f57726170706564494b423a206d75737420617070726f766520616c6c20494b4260008301527f20746f6b656e7320746f206265207472616e73666572656400000000000000006020830152604082019050919050565b60006136d060258361409f565b91507f57726170706564494b423a20546f6b656e206e6f74206f776e6564206279207360008301527f656e6465720000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061373660218361409f565b91507f57726170706564494b423a20546f6b656e207472616e73666572206661696c6560008301527f64000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061379c60208361409f565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006137dc602c8361409f565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006138426005836140b0565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061388260208361409f565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006138c260298361409f565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000613928602f8361409f565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b600061398e60218361409f565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006139f460318361409f565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b6000613a5a602c8361409f565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000613ac060258361409f565b91507f4552433732313a206275726e206f6620746f6b656e2074686174206973206e6f60008301527f74206f776e0000000000000000000000000000000000000000000000000000006020830152604082019050919050565b613b2281614149565b82525050565b6000613b348284613137565b915081905092915050565b6000613b4b82856131b0565b9150613b5782846131b0565b9150613b6282613835565b91508190509392505050565b6000602082019050613b8360008301846130e0565b92915050565b6000602082019050613b9e60008301846130c2565b92915050565b6000604082019050613bb960008301856130c2565b613bc660208301846130e0565b9392505050565b6000606082019050613be260008301866130c2565b613bef60208301856130e0565b613bfc6040830184613b19565b949350505050565b6000608082019050613c1960008301876130d1565b613c2660208301866130e0565b613c336040830185613b19565b8181036060830152613c4581846130fe565b905095945050505050565b6000604082019050613c6560008301856130c2565b613c726020830184613b19565b9392505050565b6000602082019050613c8e60008301846130ef565b92915050565b6000602082019050613ca96000830184613168565b92915050565b60006020820190508181036000830152613cc98184613177565b905092915050565b60006020820190508181036000830152613cea816131e1565b9050919050565b60006020820190508181036000830152613d0a81613247565b9050919050565b60006020820190508181036000830152613d2a816132ad565b9050919050565b60006020820190508181036000830152613d4a81613313565b9050919050565b60006020820190508181036000830152613d6a81613379565b9050919050565b60006020820190508181036000830152613d8a816133b9565b9050919050565b60006020820190508181036000830152613daa8161341f565b9050919050565b60006020820190508181036000830152613dca8161345f565b9050919050565b60006020820190508181036000830152613dea816134c5565b9050919050565b60006020820190508181036000830152613e0a8161352b565b9050919050565b60006020820190508181036000830152613e2a81613591565b9050919050565b60006020820190508181036000830152613e4a816135f7565b9050919050565b60006020820190508181036000830152613e6a8161365d565b9050919050565b60006020820190508181036000830152613e8a816136c3565b9050919050565b60006020820190508181036000830152613eaa81613729565b9050919050565b60006020820190508181036000830152613eca8161378f565b9050919050565b60006020820190508181036000830152613eea816137cf565b9050919050565b60006020820190508181036000830152613f0a81613875565b9050919050565b60006020820190508181036000830152613f2a816138b5565b9050919050565b60006020820190508181036000830152613f4a8161391b565b9050919050565b60006020820190508181036000830152613f6a81613981565b9050919050565b60006020820190508181036000830152613f8a816139e7565b9050919050565b60006020820190508181036000830152613faa81613a4d565b9050919050565b60006020820190508181036000830152613fca81613ab3565b9050919050565b6000602082019050613fe66000830184613b19565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561400f57600080fd5b8060405250919050565b600067ffffffffffffffff82111561403057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561405857600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006140c682614129565b9050919050565b60006140d882614129565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614122826140bb565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061415e82614189565b9050919050565b600061417082614177565b9050919050565b600061418282614129565b9050919050565b60006141948261419b565b9050919050565b60006141a682614129565b9050919050565b82818337600083830152505050565b60005b838110156141da5780820151818401526020810190506141bf565b838111156141e9576000848401525b50505050565b6000601f19601f8301169050919050565b614209816140bb565b811461421457600080fd5b50565b614220816140df565b811461422b57600080fd5b50565b614237816140eb565b811461424257600080fd5b50565b61424e81614117565b811461425957600080fd5b50565b61426581614149565b811461427057600080fd5b5056fe68747470733a2f2f697066732e696f2f697066732f516d66327077744243736e57614672744b7131524733666f6434694836367666656f51644a69666d6d4c6d39544ea365627a7a72315820fe9778c866f13098422aaa1bf3d7a6c3ca6d82e9b692291075df8331c0abfa506c6578706572696d656e74616cf564736f6c63430005110040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000088ae96845e157558ef59e9ff90e766e22e480390000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
-----Decoded View---------------
Arg [0] : _IKBAddress (address): 0x88AE96845e157558ef59e9Ff90E766E22E480390
Arg [1] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000088ae96845e157558ef59e9ff90e766e22e480390
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Deployed Bytecode Sourcemap
173:5902:3:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;173:5902:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16222:133:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;43422:83;;;:::i;:::-;;;;;;;;;;;;;;;;21071:200;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;20371:415;;;;;;;;;;;;;;;;:::i;:::-;;3086:561:3;;;:::i;:::-;;;;;;;;;;;;;;;;35191:94:0;;;:::i;:::-;;;;;;;;;;;;;;;;22717:287;;;;;;;;;;;;;;;;:::i;:::-;;34809:229;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23653:132;;;;;;;;;;;;;;;;:::i;:::-;;5040:324:3;;;:::i;:::-;;35623:196:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;19727:223;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;1962:83:3;;;:::i;:::-;;;;;;;;;;;;;;;;19301:207:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48568:137;;;:::i;:::-;;47783:77;;;:::i;:::-;;;;;;;;;;;;;;;;48134:92;;;:::i;:::-;;;;;;;;;;;;;;;;43614:87;;;:::i;:::-;;;;;;;;;;;;;;;;4143:211:3;;;;;;;;;;;;;;;;:::i;:::-;;21564:249:0;;;;;;;;;;;;;;;;:::i;:::-;;492:19:3;;;:::i;:::-;;;;;;;;;;;;;;;;24508:269:0;;;;;;;;;;;;;;;;:::i;:::-;;2201:235:3;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;516:35;;;:::i;:::-;;;;;;;;;;;;;;;;4586:254;;;;;;;;;;;;;;;;:::i;:::-;;976:93;;;:::i;:::-;;;;;;;;;;;;;;;;1188:375;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48854:107:0;;;;;;;;;;;;;;;;:::i;:::-;;16222:133;16292:4;16315:20;:33;16336:11;16315:33;;;;;;;;;;;;;;;;;;;;;;;;;;;16308:40;;16222:133;;;:::o;43422:83::-;43461:13;43493:5;43486:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43422:83;:::o;21071:200::-;21130:7;21157:16;21165:7;21157;:16::i;:::-;21149:73;;;;;;;;;;;;;;;;;;;;;;21240:15;:24;21256:7;21240:24;;;;;;;;;;;;;;;;;;;;;21233:31;;21071:200;;;:::o;20371:415::-;20434:13;20450:16;20458:7;20450;:16::i;:::-;20434:32;;20490:5;20484:11;;:2;:11;;;;20476:57;;;;;;;;;;;;;;;;;;;;;;20568:5;20552:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20577:37;20594:5;20601:12;:10;:12::i;:::-;20577:16;:37::i;:::-;20552:62;20544:152;;;;;;;;;;;;;;;;;;;;;;20734:2;20707:15;:24;20723:7;20707:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20771:7;20767:2;20751:28;;20760:5;20751:28;;;;;;;;;;;;20371:415;;;:::o;3086:561:3:-;3118:4;3129:29;3161:5;;;;;;;;;;;:23;;;3185:12;:10;:12::i;:::-;3161:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3161:37:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3161:37:3;;;;;;39:16:-1;36:1;17:17;2:54;3161:37:3;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3161:37:3;;;;;;;;;3129:69;;3204:23;3230:12;:19;3204:45;;3311:18;3264:5;;;;;;;;;;;:15;;;3280:12;:10;:12::i;:::-;3301:4;3264:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3264:43:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3264:43:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3264:43:3;;;;;;;;;:65;;3256:134;;;;;;;;;;;;;;;;;;;;;;3405:5;;;;;;;;;;;:18;;;3424:12;:10;:12::i;:::-;3445:4;3452:18;3405:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3405:66:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3405:66:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;3405:66:3;;;;;;;;;3397:121;;;;;;;;;;;;;;;;;;;;;;3530:6;3539:1;3530:10;;3525:100;3546:18;3542:1;:22;3525:100;;;3578:40;3588:12;:10;:12::i;:::-;3602;3615:1;3602:15;;;;;;;;;;;;;;3578:9;:40::i;:::-;3566:3;;;;;;;3525:100;;;;3638:4;3631:11;;;;3086:561;:::o;35191:94:0:-;35235:7;35261:10;:17;;;;35254:24;;35191:94;:::o;22717:287::-;22859:41;22878:12;:10;:12::i;:::-;22892:7;22859:18;:41::i;:::-;22851:103;;;;;;;;;;;;;;;;;;;;;;22965:32;22979:4;22985:2;22989:7;22965:13;:32::i;:::-;22717:287;;;:::o;34809:229::-;34889:7;34924:16;34934:5;34924:9;:16::i;:::-;34916:5;:24;34908:80;;;;;;;;;;;;;;;;;;;;;;35005:12;:19;35018:5;35005:19;;;;;;;;;;;;;;;35025:5;35005:26;;;;;;;;;;;;;;;;34998:33;;34809:229;;;;:::o;23653:132::-;23739:39;23756:4;23762:2;23766:7;23739:39;;;;;;;;;;;;:16;:39::i;:::-;23653:132;;;:::o;5040:324:3:-;5073:15;5091:23;5101:12;:10;:12::i;:::-;5091:9;:23::i;:::-;5073:41;;5121:22;5157:7;5146:19;;;;;;;;;;;;;;;;;;;;;;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;5146:19:3;;;;5121:44;;5177:9;5189:1;5177:13;;5172:104;5196:7;5192:1;:11;5172:104;;;5232:36;5252:12;:10;:12::i;:::-;5266:1;5232:19;:36::i;:::-;5217:8;5226:1;5217:11;;;;;;;;;;;;;:52;;;;;5205:3;;;;;;;5172:104;;;;5286:9;5298:1;5286:13;;5281:79;5305:7;5301:1;:11;5281:79;;;5326:27;5341:8;5350:1;5341:11;;;;;;;;;;;;;;5326:14;:27::i;:::-;5314:3;;;;;;;5281:79;;;;5040:324;;:::o;35623:196:0:-;35681:7;35716:13;:11;:13::i;:::-;35708:5;:21;35700:78;;;;;;;;;;;;;;;;;;;;;;35795:10;35806:5;35795:17;;;;;;;;;;;;;;;;35788:24;;35623:196;;;:::o;19727:223::-;19782:7;19801:13;19817:11;:20;19829:7;19817:20;;;;;;;;;;;;;;;;;;;;;19801:36;;19872:1;19855:19;;:5;:19;;;;19847:73;;;;;;;;;;;;;;;;;;;;;;19938:5;19931:12;;;19727:223;;;:::o;1962:83:3:-;2002:13;2032:8;2025:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1962:83;:::o;19301:207:0:-;19356:7;19400:1;19383:19;;:5;:19;;;;19375:74;;;;;;;;;;;;;;;;;;;;;;19467:34;:17;:24;19485:5;19467:24;;;;;;;;;;;;;;;:32;:34::i;:::-;19460:41;;19301:207;;;:::o;48568:137::-;47987:9;:7;:9::i;:::-;47979:54;;;;;;;;;;;;;;;;;;;;;;48666:1;48629:40;;48650:6;;;;;;;;;;;48629:40;;;;;;;;;;;;48696:1;48679:6;;:19;;;;;;;;;;;;;;;;;;48568:137::o;47783:77::-;47821:7;47847:6;;;;;;;;;;;47840:13;;47783:77;:::o;48134:92::-;48174:4;48213:6;;;;;;;;;;;48197:22;;:12;:10;:12::i;:::-;:22;;;48190:29;;48134:92;:::o;43614:87::-;43655:13;43687:7;43680:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43614:87;:::o;4143:211:3:-;4192:5;;;;;;;;;;;:26;;;4219:12;:10;:12::i;:::-;4241:4;4248:7;4192:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4192:64:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4192:64:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4192:64:3;;;;;;;;;4184:127;;;;;;;;;;;;;;;;;;;;;;4317:32;4327:12;:10;:12::i;:::-;4341:7;4317:9;:32::i;:::-;4143:211;:::o;21564:249:0:-;21649:12;:10;:12::i;:::-;21643:18;;:2;:18;;;;21635:56;;;;;;;;;;;;;;;;;;;;;;21741:8;21702:18;:32;21721:12;:10;:12::i;:::-;21702:32;;;;;;;;;;;;;;;:36;21735:2;21702:36;;;;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;21793:2;21764:42;;21779:12;:10;:12::i;:::-;21764:42;;;21797:8;21764:42;;;;;;;;;;;;;;;21564:249;;:::o;492:19:3:-;;;;;;;;;;;;;:::o;24508:269:0:-;24622:41;24641:12;:10;:12::i;:::-;24655:7;24622:18;:41::i;:::-;24614:103;;;;;;;;;;;;;;;;;;;;;;24727:43;24745:4;24751:2;24755:7;24764:5;24727:17;:43::i;:::-;24508:269;;;;:::o;2201:235:3:-;2257:13;2286:16;2294:7;2286;:16::i;:::-;2278:76;;;;;;;;;;;;;;;;;;;;;;2392:9;:7;:9::i;:::-;2403:17;2412:7;2403:8;:17::i;:::-;2375:55;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2375:55:3;;;2361:70;;2201:235;;;:::o;516:35::-;;;;;;;;;;;;;:::o;4586:254::-;4664:12;:10;:12::i;:::-;4644:32;;:16;4652:7;4644;:16::i;:::-;:32;;;4636:82;;;;;;;;;;;;;;;;;;;;;;4732:5;;;;;;;;;;;:22;;;4755:12;:10;:12::i;:::-;4769:7;4732:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4732:45:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4732:45:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;4732:45:3;;;;;;;;;4724:91;;;;;;;;;;;;;;;;;;;;;;4821:14;4827:7;4821:5;:14::i;:::-;4586:254;:::o;976:93::-;1022:13;1052:12;;;;;;;;;;;;;;;;;1045:19;;976:93;:::o;1188:375::-;1280:4;1352:27;1396:20;;;;;;;;;;;1352:65;;1468:8;1427:49;;1435:13;:21;;;1457:5;1435:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1435:28:3;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1435:28:3;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;1435:28:3;;;;;;;;;1427:49;;;1423:83;;;1495:4;1488:11;;;;;1423:83;1519:39;1542:5;1549:8;1519:22;:39::i;:::-;1512:46;;;1188:375;;;;;:::o;48854:107:0:-;47987:9;:7;:9::i;:::-;47979:54;;;;;;;;;;;;;;;;;;;;;;48926:28;48945:8;48926:18;:28::i;:::-;48854:107;:::o;25946:152::-;26003:4;26019:13;26035:11;:20;26047:7;26035:20;;;;;;;;;;;;;;;;;;;;;26019:36;;26089:1;26072:19;;:5;:19;;;;26065:26;;;25946:152;;;:::o;914:96::-;959:15;993:10;986:17;;914:96;:::o;27317:100::-;27384:26;27394:2;27398:7;27384:26;;;;;;;;;;;;:9;:26::i;:::-;27317:100;;:::o;26459:329::-;26544:4;26568:16;26576:7;26568;:16::i;:::-;26560:73;;;;;;;;;;;;;;;;;;;;;;26643:13;26659:16;26667:7;26659;:16::i;:::-;26643:32;;26704:5;26693:16;;:7;:16;;;:51;;;;26737:7;26713:31;;:20;26725:7;26713:11;:20::i;:::-;:31;;;26693:51;:87;;;;26748:32;26765:5;26772:7;26748:16;:32::i;:::-;26693:87;26685:96;;;26459:329;;;;:::o;36194:239::-;36279:38;36299:4;36305:2;36309:7;36279:19;:38::i;:::-;36328:47;36361:4;36367:7;36328:32;:47::i;:::-;36386:40;36414:2;36418:7;36386:27;:40::i;:::-;36194:239;;;:::o;14844:112::-;14909:7;14935;:14;;;14928:21;;14844:112;;;:::o;25482:269::-;25591:32;25605:4;25611:2;25615:7;25591:13;:32::i;:::-;25641:48;25664:4;25670:2;25674:7;25683:5;25641:22;:48::i;:::-;25633:111;;;;;;;;;;;;;;;;;;;;;;25482:269;;;;:::o;5641:431:3:-;5691:27;5738:1;5732:2;:7;5728:44;;;5753:10;;;;;;;;;;;;;;;;;;;;;5728:44;5779:6;5788:2;5779:11;;5798:8;5814:60;5826:1;5821;:6;5814:60;;5841:5;;;;;;;5863:2;5858:7;;;;;;;;;5814:60;;;5881:17;5911:3;5901:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;5901:14:3;;;;5881:34;;5923:6;5938:1;5932:3;:7;5923:16;;5947:94;5960:1;5954:2;:7;5947:94;;6008:2;6003;:7;;;;;;5998:2;:12;5987:25;;5975:4;5980:3;;;;;;;5975:9;;;;;;;;;;;:37;;;;;;;;;;;6030:2;6024:8;;;;;;;;;5947:94;;;6062:4;6048:19;;;;;;5641:431;;;;:::o;29602:90:0:-;29653:32;29659:16;29667:7;29659;:16::i;:::-;29677:7;29653:5;:32::i;:::-;29602:90;:::o;22135:145::-;22215:4;22238:18;:25;22257:5;22238:25;;;;;;;;;;;;;;;:35;22264:8;22238:35;;;;;;;;;;;;;;;;;;;;;;;;;22231:42;;22135:145;;;;:::o;49062:225::-;49155:1;49135:22;;:8;:22;;;;49127:73;;;;;;;;;;;;;;;;;;;;;;49244:8;49215:38;;49236:6;;;;;;;;;;;49215:38;;;;;;;;;;;;49272:8;49263:6;;:17;;;;;;;;;;;;;;;;;;49062:225;:::o;28018:239::-;28105:18;28111:2;28115:7;28105:5;:18::i;:::-;28141:54;28172:1;28176:2;28180:7;28189:5;28141:22;:54::i;:::-;28133:117;;;;;;;;;;;;;;;;;;;;;;28018:239;;;:::o;30069:447::-;30182:4;30162:24;;:16;30170:7;30162;:16::i;:::-;:24;;;30154:78;;;;;;;;;;;;;;;;;;;;;;30264:1;30250:16;;:2;:16;;;;30242:65;;;;;;;;;;;;;;;;;;;;;;30318:23;30333:7;30318:14;:23::i;:::-;30352:35;:17;:23;30370:4;30352:23;;;;;;;;;;;;;;;:33;:35::i;:::-;30397:33;:17;:21;30415:2;30397:21;;;;;;;;;;;;;;;:31;:33::i;:::-;30464:2;30441:11;:20;30453:7;30441:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;30501:7;30497:2;30482:27;;30491:4;30482:27;;;;;;;;;;;;30069:447;;;:::o;39304:1128::-;39566:22;39591:32;39621:1;39591:12;:18;39604:4;39591:18;;;;;;;;;;;;;;;:25;;;;:29;;:32;;;;:::i;:::-;39566:57;;39633:18;39654:17;:26;39672:7;39654:26;;;;;;;;;;;;39633:47;;39798:14;39784:10;:28;39780:323;;39828:19;39850:12;:18;39863:4;39850:18;;;;;;;;;;;;;;;39869:14;39850:34;;;;;;;;;;;;;;;;39828:56;;39932:11;39899:12;:18;39912:4;39899:18;;;;;;;;;;;;;;;39918:10;39899:30;;;;;;;;;;;;;;;:44;;;;40048:10;40015:17;:30;40033:11;40015:30;;;;;;;;;;;:43;;;;39780:323;;40189:12;:18;40202:4;40189:18;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:::i;:::-;;39304:1128;;;;:::o;38148:183::-;38261:12;:16;38274:2;38261:16;;;;;;;;;;;;;;;:23;;;;38232:17;:26;38250:7;38232:26;;;;;;;;;;;:52;;;;38294:12;:16;38307:2;38294:16;;;;;;;;;;;;;;;38316:7;38294:30;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38294:30:0;;;;;;;;;;;;;;;;;;;;;;38148:183;;:::o;31155:1051::-;31276:4;31301:15;:2;:13;;;:15::i;:::-;31296:58;;31339:4;31332:11;;;;31296:58;31423:12;31437:23;31464:2;:7;;31524:2;31508:36;;;:45;;;;31567:12;:10;:12::i;:::-;31593:4;31611:7;31632:5;31472:175;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;31472:175:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;31472:175:0;31464:184;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;31422:226:0;;;;31663:7;31658:542;;31710:1;31690:10;:17;:21;31686:376;;;31855:10;31849:17;31915:15;31902:10;31898:2;31894:19;31887:44;31804:145;31987:60;;;;;;;;;;;;;;;;;;;31658:542;32092:13;32119:10;32108:32;;;;;;;;;;;;;;32092:48;;17542:10;32172:16;;32162:26;;;:6;:26;;;;32154:35;;;;;31155:1051;;;;;;;:::o;45992:240::-;46058:27;46070:5;46077:7;46058:11;:27::i;:::-;46172:1;46141:10;:19;46152:7;46141:19;;;;;;;;;;;46135:33;;;;;;;;;;;;;;;;:38;46131:95;;46196:10;:19;46207:7;46196:19;;;;;;;;;;;;46189:26;;;;:::i;:::-;46131:95;45992:240;;:::o;36690:196::-;36753:24;36765:2;36769:7;36753:11;:24::i;:::-;36788:40;36816:2;36820:7;36788:27;:40::i;:::-;36839;36871:7;36839:31;:40::i;:::-;36690:196;;:::o;32368:171::-;32467:1;32431:38;;:15;:24;32447:7;32431:24;;;;;;;;;;;;;;;;;;;;;:38;;;32427:106;;32520:1;32485:15;:24;32501:7;32485:24;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;32427:106;32368:171;:::o;15146:108::-;15226:21;15245:1;15226:7;:14;;;:18;;:21;;;;:::i;:::-;15209:7;:14;;:38;;;;15146:108;:::o;14962:178::-;15132:1;15114:7;:14;;;:19;;;;;;;;;;;14962:178;:::o;6695:134::-;6753:7;6779:43;6783:1;6786;6779:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;6772:50;;6695:134;;;;:::o;11472:610::-;11532:4;11790:16;11816:19;11838:66;11816:88;;;;12005:7;11993:20;11981:32;;12044:11;12032:8;:23;;:42;;;;;12071:3;12059:15;;:8;:15;;12032:42;12024:51;;;;11472:610;;;:::o;37161:364::-;37227:27;37239:5;37246:7;37227:11;:27::i;:::-;37265:48;37298:5;37305:7;37265:32;:48::i;:::-;37461:1;37432:17;:26;37450:7;37432:26;;;;;;;;;;;:30;;;;37473:45;37510:7;37473:36;:45::i;:::-;37161:364;;:::o;28502:327::-;28587:1;28573:16;;:2;:16;;;;28565:61;;;;;;;;;;;;;;;;;;;;;;28645:16;28653:7;28645;:16::i;:::-;28644:17;28636:58;;;;;;;;;;;;;;;;;;;;;;28728:2;28705:11;:20;28717:7;28705:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28740:33;:17;:21;28758:2;28740:21;;;;;;;;;;;;;;;:31;:33::i;:::-;28814:7;28810:2;28789:33;;28806:1;28789:33;;;;;;;;;;;;28502:327;;:::o;38526:161::-;38629:10;:17;;;;38602:15;:24;38618:7;38602:24;;;;;;;;;;;:44;;;;38656:10;38672:7;38656:24;;39:1:-1;33:3;27:10;23:18;57:10;52:3;45:23;79:10;72:17;;0:93;38656:24:0;;;;;;;;;;;;;;;;;;;;;;38526:161;:::o;7153:187::-;7239:7;7271:1;7266;:6;;7274:12;7258:29;;;;;;;;;;;;;;;;;;;;;;;;;7297:9;7313:1;7309;:5;7297:17;;7332:1;7325:8;;;7153:187;;;;;:::o;29097:324::-;29191:5;29171:25;;:16;29179:7;29171;:16::i;:::-;:25;;;29163:75;;;;;;;;;;;;;;;;;;;;;;29249:23;29264:7;29249:14;:23::i;:::-;29283:36;:17;:24;29301:5;29283:24;;;;;;;;;;;;;;;:34;:36::i;:::-;29360:1;29329:11;:20;29341:7;29329:20;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;29406:7;29402:1;29378:36;;29387:5;29378:36;;;;;;;;;;;;29097:324;;:::o;40720:1064::-;40969:22;40994:24;41016:1;40994:10;:17;;;;:21;;:24;;;;:::i;:::-;40969:49;;41028:18;41049:15;:24;41065:7;41049:24;;;;;;;;;;;;41028:45;;41395:19;41417:10;41428:14;41417:26;;;;;;;;;;;;;;;;41395:48;;41479:11;41454:10;41465;41454:22;;;;;;;;;;;;;;;:36;;;;41589:10;41558:15;:28;41574:11;41558:28;;;;;;;;;;;:41;;;;41720:10;:19;;;;;;;;;;;;:::i;:::-;;41776:1;41749:15;:24;41765:7;41749:24;;;;;;;;;;;:28;;;;40720:1064;;;;:::o;173:5902:3:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;160:722;;288:3;281:4;273:6;269:17;265:27;255:2;;306:1;303;296:12;255:2;336:6;330:13;358:80;373:64;430:6;373:64;;;358:80;;;349:89;;455:5;480:6;473:5;466:21;510:4;502:6;498:17;488:27;;532:4;527:3;523:14;516:21;;585:6;632:3;624:4;616:6;612:17;607:3;603:27;600:36;597:2;;;649:1;646;639:12;597:2;674:1;659:217;684:6;681:1;678:13;659:217;;;742:3;764:48;808:3;796:10;764:48;;;759:3;752:61;836:4;831:3;827:14;820:21;;864:4;859:3;855:14;848:21;;716:160;706:1;703;699:9;694:14;;659:217;;;663:14;248:634;;;;;;;;890:124;;967:6;954:20;945:29;;979:30;1003:5;979:30;;;939:75;;;;;1021:128;;1102:6;1096:13;1087:22;;1114:30;1138:5;1114:30;;;1081:68;;;;;1156:128;;1235:6;1222:20;1213:29;;1247:32;1273:5;1247:32;;;1207:77;;;;;1291:132;;1374:6;1368:13;1359:22;;1386:32;1412:5;1386:32;;;1353:70;;;;;1431:440;;1532:3;1525:4;1517:6;1513:17;1509:27;1499:2;;1550:1;1547;1540:12;1499:2;1587:6;1574:20;1609:64;1624:48;1665:6;1624:48;;;1609:64;;;1600:73;;1693:6;1686:5;1679:21;1729:4;1721:6;1717:17;1762:4;1755:5;1751:16;1797:3;1788:6;1783:3;1779:16;1776:25;1773:2;;;1814:1;1811;1804:12;1773:2;1824:41;1858:6;1853:3;1848;1824:41;;;1492:379;;;;;;;;1879:192;;1992:6;1986:13;1977:22;;2004:62;2060:5;2004:62;;;1971:100;;;;;2078:130;;2158:6;2145:20;2136:29;;2170:33;2197:5;2170:33;;;2130:78;;;;;2215:134;;2299:6;2293:13;2284:22;;2311:33;2338:5;2311:33;;;2278:71;;;;;2356:241;;2460:2;2448:9;2439:7;2435:23;2431:32;2428:2;;;2476:1;2473;2466:12;2428:2;2511:1;2528:53;2573:7;2564:6;2553:9;2549:22;2528:53;;;2518:63;;2490:97;2422:175;;;;;2604:366;;;2725:2;2713:9;2704:7;2700:23;2696:32;2693:2;;;2741:1;2738;2731:12;2693:2;2776:1;2793:53;2838:7;2829:6;2818:9;2814:22;2793:53;;;2783:63;;2755:97;2883:2;2901:53;2946:7;2937:6;2926:9;2922:22;2901:53;;;2891:63;;2862:98;2687:283;;;;;;2977:491;;;;3115:2;3103:9;3094:7;3090:23;3086:32;3083:2;;;3131:1;3128;3121:12;3083:2;3166:1;3183:53;3228:7;3219:6;3208:9;3204:22;3183:53;;;3173:63;;3145:97;3273:2;3291:53;3336:7;3327:6;3316:9;3312:22;3291:53;;;3281:63;;3252:98;3381:2;3399:53;3444:7;3435:6;3424:9;3420:22;3399:53;;;3389:63;;3360:98;3077:391;;;;;;3475:721;;;;;3639:3;3627:9;3618:7;3614:23;3610:33;3607:2;;;3656:1;3653;3646:12;3607:2;3691:1;3708:53;3753:7;3744:6;3733:9;3729:22;3708:53;;;3698:63;;3670:97;3798:2;3816:53;3861:7;3852:6;3841:9;3837:22;3816:53;;;3806:63;;3777:98;3906:2;3924:53;3969:7;3960:6;3949:9;3945:22;3924:53;;;3914:63;;3885:98;4042:2;4031:9;4027:18;4014:32;4066:18;4058:6;4055:30;4052:2;;;4098:1;4095;4088:12;4052:2;4118:62;4172:7;4163:6;4152:9;4148:22;4118:62;;;4108:72;;3993:193;3601:595;;;;;;;;4203:360;;;4321:2;4309:9;4300:7;4296:23;4292:32;4289:2;;;4337:1;4334;4327:12;4289:2;4372:1;4389:53;4434:7;4425:6;4414:9;4410:22;4389:53;;;4379:63;;4351:97;4479:2;4497:50;4539:7;4530:6;4519:9;4515:22;4497:50;;;4487:60;;4458:95;4283:280;;;;;;4570:366;;;4691:2;4679:9;4670:7;4666:23;4662:32;4659:2;;;4707:1;4704;4697:12;4659:2;4742:1;4759:53;4804:7;4795:6;4784:9;4780:22;4759:53;;;4749:63;;4721:97;4849:2;4867:53;4912:7;4903:6;4892:9;4888:22;4867:53;;;4857:63;;4828:98;4653:283;;;;;;4943:392;;5083:2;5071:9;5062:7;5058:23;5054:32;5051:2;;;5099:1;5096;5089:12;5051:2;5155:1;5144:9;5140:17;5134:24;5178:18;5170:6;5167:30;5164:2;;;5210:1;5207;5200:12;5164:2;5230:89;5311:7;5302:6;5291:9;5287:22;5230:89;;;5220:99;;5113:212;5045:290;;;;;5342:257;;5454:2;5442:9;5433:7;5429:23;5425:32;5422:2;;;5470:1;5467;5460:12;5422:2;5505:1;5522:61;5575:7;5566:6;5555:9;5551:22;5522:61;;;5512:71;;5484:105;5416:183;;;;;5606:239;;5709:2;5697:9;5688:7;5684:23;5680:32;5677:2;;;5725:1;5722;5715:12;5677:2;5760:1;5777:52;5821:7;5812:6;5801:9;5797:22;5777:52;;;5767:62;;5739:96;5671:174;;;;;5852:261;;5966:2;5954:9;5945:7;5941:23;5937:32;5934:2;;;5982:1;5979;5972:12;5934:2;6017:1;6034:63;6089:7;6080:6;6069:9;6065:22;6034:63;;;6024:73;;5996:107;5928:185;;;;;6120:321;;6264:2;6252:9;6243:7;6239:23;6235:32;6232:2;;;6280:1;6277;6270:12;6232:2;6315:1;6332:93;6417:7;6408:6;6397:9;6393:22;6332:93;;;6322:103;;6294:137;6226:215;;;;;6448:241;;6552:2;6540:9;6531:7;6527:23;6523:32;6520:2;;;6568:1;6565;6558:12;6520:2;6603:1;6620:53;6665:7;6656:6;6645:9;6641:22;6620:53;;;6610:63;;6582:97;6514:175;;;;;6696:263;;6811:2;6799:9;6790:7;6786:23;6782:32;6779:2;;;6827:1;6824;6817:12;6779:2;6862:1;6879:64;6935:7;6926:6;6915:9;6911:22;6879:64;;;6869:74;;6841:108;6773:186;;;;;6966:142;7057:45;7096:5;7057:45;;;7052:3;7045:58;7039:69;;;7115:137;7214:32;7240:5;7214:32;;;7209:3;7202:45;7196:56;;;7259:113;7342:24;7360:5;7342:24;;;7337:3;7330:37;7324:48;;;7379:104;7456:21;7471:5;7456:21;;;7451:3;7444:34;7438:45;;;7490:343;;7600:38;7632:5;7600:38;;;7650:70;7713:6;7708:3;7650:70;;;7643:77;;7725:52;7770:6;7765:3;7758:4;7751:5;7747:16;7725:52;;;7798:29;7820:6;7798:29;;;7793:3;7789:39;7782:46;;7580:253;;;;;;7840:356;;7968:38;8000:5;7968:38;;;8018:88;8099:6;8094:3;8018:88;;;8011:95;;8111:52;8156:6;8151:3;8144:4;8137:5;8133:16;8111:52;;;8184:6;8179:3;8175:16;8168:23;;7948:248;;;;;;8203:156;8301:52;8347:5;8301:52;;;8296:3;8289:65;8283:76;;;8366:347;;8478:39;8511:5;8478:39;;;8529:71;8593:6;8588:3;8529:71;;;8522:78;;8605:52;8650:6;8645:3;8638:4;8631:5;8627:16;8605:52;;;8678:29;8700:6;8678:29;;;8673:3;8669:39;8662:46;;8458:255;;;;;;8720:360;;8850:39;8883:5;8850:39;;;8901:89;8983:6;8978:3;8901:89;;;8894:96;;8995:52;9040:6;9035:3;9028:4;9021:5;9017:16;8995:52;;;9068:6;9063:3;9059:16;9052:23;;8830:250;;;;;;9088:379;;9248:67;9312:2;9307:3;9248:67;;;9241:74;;9348:34;9344:1;9339:3;9335:11;9328:55;9417:12;9412:2;9407:3;9403:12;9396:34;9458:2;9453:3;9449:12;9442:19;;9234:233;;;;9476:380;;9636:67;9700:2;9695:3;9636:67;;;9629:74;;9736:34;9732:1;9727:3;9723:11;9716:55;9805:13;9800:2;9795:3;9791:12;9784:35;9847:2;9842:3;9838:12;9831:19;;9622:234;;;;9865:387;;10025:67;10089:2;10084:3;10025:67;;;10018:74;;10125:34;10121:1;10116:3;10112:11;10105:55;10194:20;10189:2;10184:3;10180:12;10173:42;10243:2;10238:3;10234:12;10227:19;;10011:241;;;;10261:375;;10421:67;10485:2;10480:3;10421:67;;;10414:74;;10521:34;10517:1;10512:3;10508:11;10501:55;10590:8;10585:2;10580:3;10576:12;10569:30;10627:2;10622:3;10618:12;10611:19;;10407:229;;;;10645:328;;10805:67;10869:2;10864:3;10805:67;;;10798:74;;10905:30;10901:1;10896:3;10892:11;10885:51;10964:2;10959:3;10955:12;10948:19;;10791:182;;;;10982:373;;11142:67;11206:2;11201:3;11142:67;;;11135:74;;11242:34;11238:1;11233:3;11229:11;11222:55;11311:6;11306:2;11301:3;11297:12;11290:28;11346:2;11341:3;11337:12;11330:19;;11128:227;;;;11364:325;;11524:67;11588:2;11583:3;11524:67;;;11517:74;;11624:27;11620:1;11615:3;11611:11;11604:48;11680:2;11675:3;11671:12;11664:19;;11510:179;;;;11698:387;;11858:67;11922:2;11917:3;11858:67;;;11851:74;;11958:34;11954:1;11949:3;11945:11;11938:55;12027:20;12022:2;12017:3;12013:12;12006:42;12076:2;12071:3;12067:12;12060:19;;11844:241;;;;12094:381;;12254:67;12318:2;12313:3;12254:67;;;12247:74;;12354:34;12350:1;12345:3;12341:11;12334:55;12423:14;12418:2;12413:3;12409:12;12402:36;12466:2;12461:3;12457:12;12450:19;;12240:235;;;;12484:393;;12644:67;12708:2;12703:3;12644:67;;;12637:74;;12744:34;12740:1;12735:3;12731:11;12724:55;12813:26;12808:2;12803:3;12799:12;12792:48;12868:2;12863:3;12859:12;12852:19;;12630:247;;;;12886:379;;13046:67;13110:2;13105:3;13046:67;;;13039:74;;13146:34;13142:1;13137:3;13133:11;13126:55;13215:12;13210:2;13205:3;13201:12;13194:34;13256:2;13251:3;13247:12;13240:19;;13032:233;;;;13274:378;;13434:67;13498:2;13493:3;13434:67;;;13427:74;;13534:34;13530:1;13525:3;13521:11;13514:55;13603:11;13598:2;13593:3;13589:12;13582:33;13643:2;13638:3;13634:12;13627:19;;13420:232;;;;13661:393;;13821:67;13885:2;13880:3;13821:67;;;13814:74;;13921:34;13917:1;13912:3;13908:11;13901:55;13990:26;13985:2;13980:3;13976:12;13969:48;14045:2;14040:3;14036:12;14029:19;;13807:247;;;;14063:374;;14223:67;14287:2;14282:3;14223:67;;;14216:74;;14323:34;14319:1;14314:3;14310:11;14303:55;14392:7;14387:2;14382:3;14378:12;14371:29;14428:2;14423:3;14419:12;14412:19;;14209:228;;;;14446:370;;14606:67;14670:2;14665:3;14606:67;;;14599:74;;14706:34;14702:1;14697:3;14693:11;14686:55;14775:3;14770:2;14765:3;14761:12;14754:25;14807:2;14802:3;14798:12;14791:19;;14592:224;;;;14825:332;;14985:67;15049:2;15044:3;14985:67;;;14978:74;;15085:34;15081:1;15076:3;15072:11;15065:55;15148:2;15143:3;15139:12;15132:19;;14971:186;;;;15166:381;;15326:67;15390:2;15385:3;15326:67;;;15319:74;;15426:34;15422:1;15417:3;15413:11;15406:55;15495:14;15490:2;15485:3;15481:12;15474:36;15538:2;15533:3;15529:12;15522:19;;15312:235;;;;15556:339;;15734:84;15816:1;15811:3;15734:84;;;15727:91;;15851:7;15847:1;15842:3;15838:11;15831:28;15887:1;15882:3;15878:11;15871:18;;15720:175;;;;15904:332;;16064:67;16128:2;16123:3;16064:67;;;16057:74;;16164:34;16160:1;16155:3;16151:11;16144:55;16227:2;16222:3;16218:12;16211:19;;16050:186;;;;16245:378;;16405:67;16469:2;16464:3;16405:67;;;16398:74;;16505:34;16501:1;16496:3;16492:11;16485:55;16574:11;16569:2;16564:3;16560:12;16553:33;16614:2;16609:3;16605:12;16598:19;;16391:232;;;;16632:384;;16792:67;16856:2;16851:3;16792:67;;;16785:74;;16892:34;16888:1;16883:3;16879:11;16872:55;16961:17;16956:2;16951:3;16947:12;16940:39;17007:2;17002:3;16998:12;16991:19;;16778:238;;;;17025:370;;17185:67;17249:2;17244:3;17185:67;;;17178:74;;17285:34;17281:1;17276:3;17272:11;17265:55;17354:3;17349:2;17344:3;17340:12;17333:25;17386:2;17381:3;17377:12;17370:19;;17171:224;;;;17404:386;;17564:67;17628:2;17623:3;17564:67;;;17557:74;;17664:34;17660:1;17655:3;17651:11;17644:55;17733:19;17728:2;17723:3;17719:12;17712:41;17781:2;17776:3;17772:12;17765:19;;17550:240;;;;17799:381;;17959:67;18023:2;18018:3;17959:67;;;17952:74;;18059:34;18055:1;18050:3;18046:11;18039:55;18128:14;18123:2;18118:3;18114:12;18107:36;18171:2;18166:3;18162:12;18155:19;;17945:235;;;;18189:374;;18349:67;18413:2;18408:3;18349:67;;;18342:74;;18449:34;18445:1;18440:3;18436:11;18429:55;18518:7;18513:2;18508:3;18504:12;18497:29;18554:2;18549:3;18545:12;18538:19;;18335:228;;;;18571:113;18654:24;18672:5;18654:24;;;18649:3;18642:37;18636:48;;;18691:262;;18835:93;18924:3;18915:6;18835:93;;;18828:100;;18945:3;18938:10;;18816:137;;;;;18960:694;;19255:95;19346:3;19337:6;19255:95;;;19248:102;;19368:95;19459:3;19450:6;19368:95;;;19361:102;;19481:148;19625:3;19481:148;;;19474:155;;19646:3;19639:10;;19236:418;;;;;;19661:213;;19779:2;19768:9;19764:18;19756:26;;19793:71;19861:1;19850:9;19846:17;19837:6;19793:71;;;19750:124;;;;;19881:229;;20007:2;19996:9;19992:18;19984:26;;20021:79;20097:1;20086:9;20082:17;20073:6;20021:79;;;19978:132;;;;;20117:340;;20271:2;20260:9;20256:18;20248:26;;20285:79;20361:1;20350:9;20346:17;20337:6;20285:79;;;20375:72;20443:2;20432:9;20428:18;20419:6;20375:72;;;20242:215;;;;;;20464:451;;20646:2;20635:9;20631:18;20623:26;;20660:79;20736:1;20725:9;20721:17;20712:6;20660:79;;;20750:72;20818:2;20807:9;20803:18;20794:6;20750:72;;;20833;20901:2;20890:9;20886:18;20877:6;20833:72;;;20617:298;;;;;;;20922:663;;21158:3;21147:9;21143:19;21135:27;;21173:87;21257:1;21246:9;21242:17;21233:6;21173:87;;;21271:72;21339:2;21328:9;21324:18;21315:6;21271:72;;;21354;21422:2;21411:9;21407:18;21398:6;21354:72;;;21474:9;21468:4;21464:20;21459:2;21448:9;21444:18;21437:48;21499:76;21570:4;21561:6;21499:76;;;21491:84;;21129:456;;;;;;;;21592:340;;21746:2;21735:9;21731:18;21723:26;;21760:79;21836:1;21825:9;21821:17;21812:6;21760:79;;;21850:72;21918:2;21907:9;21903:18;21894:6;21850:72;;;21717:215;;;;;;21939:201;;22051:2;22040:9;22036:18;22028:26;;22065:65;22127:1;22116:9;22112:17;22103:6;22065:65;;;22022:118;;;;;22147:243;;22280:2;22269:9;22265:18;22257:26;;22294:86;22377:1;22366:9;22362:17;22353:6;22294:86;;;22251:139;;;;;22397:301;;22535:2;22524:9;22520:18;22512:26;;22585:9;22579:4;22575:20;22571:1;22560:9;22556:17;22549:47;22610:78;22683:4;22674:6;22610:78;;;22602:86;;22506:192;;;;;22705:407;;22896:2;22885:9;22881:18;22873:26;;22946:9;22940:4;22936:20;22932:1;22921:9;22917:17;22910:47;22971:131;23097:4;22971:131;;;22963:139;;22867:245;;;;23119:407;;23310:2;23299:9;23295:18;23287:26;;23360:9;23354:4;23350:20;23346:1;23335:9;23331:17;23324:47;23385:131;23511:4;23385:131;;;23377:139;;23281:245;;;;23533:407;;23724:2;23713:9;23709:18;23701:26;;23774:9;23768:4;23764:20;23760:1;23749:9;23745:17;23738:47;23799:131;23925:4;23799:131;;;23791:139;;23695:245;;;;23947:407;;24138:2;24127:9;24123:18;24115:26;;24188:9;24182:4;24178:20;24174:1;24163:9;24159:17;24152:47;24213:131;24339:4;24213:131;;;24205:139;;24109:245;;;;24361:407;;24552:2;24541:9;24537:18;24529:26;;24602:9;24596:4;24592:20;24588:1;24577:9;24573:17;24566:47;24627:131;24753:4;24627:131;;;24619:139;;24523:245;;;;24775:407;;24966:2;24955:9;24951:18;24943:26;;25016:9;25010:4;25006:20;25002:1;24991:9;24987:17;24980:47;25041:131;25167:4;25041:131;;;25033:139;;24937:245;;;;25189:407;;25380:2;25369:9;25365:18;25357:26;;25430:9;25424:4;25420:20;25416:1;25405:9;25401:17;25394:47;25455:131;25581:4;25455:131;;;25447:139;;25351:245;;;;25603:407;;25794:2;25783:9;25779:18;25771:26;;25844:9;25838:4;25834:20;25830:1;25819:9;25815:17;25808:47;25869:131;25995:4;25869:131;;;25861:139;;25765:245;;;;26017:407;;26208:2;26197:9;26193:18;26185:26;;26258:9;26252:4;26248:20;26244:1;26233:9;26229:17;26222:47;26283:131;26409:4;26283:131;;;26275:139;;26179:245;;;;26431:407;;26622:2;26611:9;26607:18;26599:26;;26672:9;26666:4;26662:20;26658:1;26647:9;26643:17;26636:47;26697:131;26823:4;26697:131;;;26689:139;;26593:245;;;;26845:407;;27036:2;27025:9;27021:18;27013:26;;27086:9;27080:4;27076:20;27072:1;27061:9;27057:17;27050:47;27111:131;27237:4;27111:131;;;27103:139;;27007:245;;;;27259:407;;27450:2;27439:9;27435:18;27427:26;;27500:9;27494:4;27490:20;27486:1;27475:9;27471:17;27464:47;27525:131;27651:4;27525:131;;;27517:139;;27421:245;;;;27673:407;;27864:2;27853:9;27849:18;27841:26;;27914:9;27908:4;27904:20;27900:1;27889:9;27885:17;27878:47;27939:131;28065:4;27939:131;;;27931:139;;27835:245;;;;28087:407;;28278:2;28267:9;28263:18;28255:26;;28328:9;28322:4;28318:20;28314:1;28303:9;28299:17;28292:47;28353:131;28479:4;28353:131;;;28345:139;;28249:245;;;;28501:407;;28692:2;28681:9;28677:18;28669:26;;28742:9;28736:4;28732:20;28728:1;28717:9;28713:17;28706:47;28767:131;28893:4;28767:131;;;28759:139;;28663:245;;;;28915:407;;29106:2;29095:9;29091:18;29083:26;;29156:9;29150:4;29146:20;29142:1;29131:9;29127:17;29120:47;29181:131;29307:4;29181:131;;;29173:139;;29077:245;;;;29329:407;;29520:2;29509:9;29505:18;29497:26;;29570:9;29564:4;29560:20;29556:1;29545:9;29541:17;29534:47;29595:131;29721:4;29595:131;;;29587:139;;29491:245;;;;29743:407;;29934:2;29923:9;29919:18;29911:26;;29984:9;29978:4;29974:20;29970:1;29959:9;29955:17;29948:47;30009:131;30135:4;30009:131;;;30001:139;;29905:245;;;;30157:407;;30348:2;30337:9;30333:18;30325:26;;30398:9;30392:4;30388:20;30384:1;30373:9;30369:17;30362:47;30423:131;30549:4;30423:131;;;30415:139;;30319:245;;;;30571:407;;30762:2;30751:9;30747:18;30739:26;;30812:9;30806:4;30802:20;30798:1;30787:9;30783:17;30776:47;30837:131;30963:4;30837:131;;;30829:139;;30733:245;;;;30985:407;;31176:2;31165:9;31161:18;31153:26;;31226:9;31220:4;31216:20;31212:1;31201:9;31197:17;31190:47;31251:131;31377:4;31251:131;;;31243:139;;31147:245;;;;31399:407;;31590:2;31579:9;31575:18;31567:26;;31640:9;31634:4;31630:20;31626:1;31615:9;31611:17;31604:47;31665:131;31791:4;31665:131;;;31657:139;;31561:245;;;;31813:407;;32004:2;31993:9;31989:18;31981:26;;32054:9;32048:4;32044:20;32040:1;32029:9;32025:17;32018:47;32079:131;32205:4;32079:131;;;32071:139;;31975:245;;;;32227:407;;32418:2;32407:9;32403:18;32395:26;;32468:9;32462:4;32458:20;32454:1;32443:9;32439:17;32432:47;32493:131;32619:4;32493:131;;;32485:139;;32389:245;;;;32641:213;;32759:2;32748:9;32744:18;32736:26;;32773:71;32841:1;32830:9;32826:17;32817:6;32773:71;;;32730:124;;;;;32861:256;;32923:2;32917:9;32907:19;;32961:4;32953:6;32949:17;33060:6;33048:10;33045:22;33024:18;33012:10;33009:34;33006:62;33003:2;;;33081:1;33078;33071:12;33003:2;33101:10;33097:2;33090:22;32901:216;;;;;33124:304;;33283:18;33275:6;33272:30;33269:2;;;33315:1;33312;33305:12;33269:2;33350:4;33342:6;33338:17;33330:25;;33413:4;33407;33403:15;33395:23;;33206:222;;;;33435:321;;33578:18;33570:6;33567:30;33564:2;;;33610:1;33607;33600:12;33564:2;33677:4;33673:9;33666:4;33658:6;33654:17;33650:33;33642:41;;33741:4;33735;33731:15;33723:23;;33501:255;;;;33763:121;;33856:5;33850:12;33840:22;;33821:63;;;;33891:122;;33985:5;33979:12;33969:22;;33950:63;;;;34021:162;;34135:6;34130:3;34123:19;34172:4;34167:3;34163:14;34148:29;;34116:67;;;;;34192:144;;34327:3;34312:18;;34305:31;;;;;34345:163;;34460:6;34455:3;34448:19;34497:4;34492:3;34488:14;34473:29;;34441:67;;;;;34517:145;;34653:3;34638:18;;34631:31;;;;;34670:91;;34732:24;34750:5;34732:24;;;34721:35;;34715:46;;;;34768:99;;34838:24;34856:5;34838:24;;;34827:35;;34821:46;;;;34874:85;;34947:5;34940:13;34933:21;34922:32;;34916:43;;;;34966:144;;35038:66;35031:5;35027:78;35016:89;;35010:100;;;;35117:120;;35208:24;35226:5;35208:24;;;35197:35;;35191:46;;;;35244:121;;35317:42;35310:5;35306:54;35295:65;;35289:76;;;;35372:72;;35434:5;35423:16;;35417:27;;;;35451:129;;35538:37;35569:5;35538:37;;;35525:50;;35519:61;;;;35587:151;;35681:52;35727:5;35681:52;;;35668:65;;35662:76;;;;35745:123;;35839:24;35857:5;35839:24;;;35826:37;;35820:48;;;;35875:121;;35954:37;35985:5;35954:37;;;35941:50;;35935:61;;;;36003:108;;36082:24;36100:5;36082:24;;;36069:37;;36063:48;;;;36119:145;36200:6;36195:3;36190;36177:30;36256:1;36247:6;36242:3;36238:16;36231:27;36170:94;;;;36273:268;36338:1;36345:101;36359:6;36356:1;36353:13;36345:101;;;36435:1;36430:3;36426:11;36420:18;36416:1;36411:3;36407:11;36400:39;36381:2;36378:1;36374:10;36369:15;;36345:101;;;36461:6;36458:1;36455:13;36452:2;;;36526:1;36517:6;36512:3;36508:16;36501:27;36452:2;36322:219;;;;;36549:97;;36637:2;36633:7;36628:2;36621:5;36617:14;36613:28;36603:38;;36597:49;;;;36654:117;36723:24;36741:5;36723:24;;;36716:5;36713:35;36703:2;;36762:1;36759;36752:12;36703:2;36697:74;;36778:111;36844:21;36859:5;36844:21;;;36837:5;36834:32;36824:2;;36880:1;36877;36870:12;36824:2;36818:71;;36896:115;36964:23;36981:5;36964:23;;;36957:5;36954:34;36944:2;;37002:1;36999;36992:12;36944:2;36938:73;;37018:175;37116:53;37163:5;37116:53;;;37109:5;37106:64;37096:2;;37184:1;37181;37174:12;37096:2;37090:103;;37200:117;37269:24;37287:5;37269:24;;;37262:5;37259:35;37249:2;;37308:1;37305;37298:12;37249:2;37243:74;
Swarm Source
bzzr://fe9778c866f13098422aaa1bf3d7a6c3ca6d82e9b692291075df8331c0abfa50
Loading...
Loading
Loading...
Loading
OVERVIEW
Digital Zones of Immaterial Pictorial Sensibility, wrapped.Multichain Portfolio | 27 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.