Source Code
Overview
S Balance
More Info
ContractCreator
TokenTracker
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Berps
Compiler Version
v0.8.28+commit.7893614a
Contract Source Code (Solidity)
/** *Submitted for verification at testnet.sonicscan.org on 2025-02-17 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.19; 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); } interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } interface ITokenURIProvider { function tokenURI(uint256 tokenId) external view returns (string memory); } interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); } abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } contract Berps is ERC2981, ERC721Enumerable, ReentrancyGuard, Ownable { using Strings for uint256; address public feedingContract; address public tokenURIContract; address public royaltyReceiver; uint256 private _nextTokenId = 1; uint256 public constant MAX_SUPPLY = 69420; uint256 public current_max_supply = 10000; string baseURI = ""; constructor(address _royaltyReceiver) ERC721("Berps", "BERP") Ownable() { royaltyReceiver = _royaltyReceiver; _setDefaultRoyalty(_royaltyReceiver, 500); } /** * @dev Sets the feeding contract address. Can only be called by the owner. * @param _feedingContract The address of the feeding contract. */ function setFeedingContract(address _feedingContract) external onlyOwner { feedingContract = _feedingContract; } /** * @dev Sets the token URI provider contract address. Can only be called by the owner. * @param _tokenURIContract The address of the contract that provides token URIs. */ function setTokenURIContract(address _tokenURIContract) external onlyOwner { tokenURIContract = _tokenURIContract; } function setBaseURI(string memory newURI) external onlyOwner { baseURI = newURI; } function setCurrentMaxSupply(uint256 newMax) external onlyOwner { require(newMax <= MAX_SUPPLY, "current max cannot exceed hardcap"); current_max_supply = newMax; } /** * @dev Mints a token to a specific address. Can only be called by the feeding contract. * @param to The address that will receive the NFT. */ function mintTo(address to) external { require(msg.sender == feedingContract, "Not authorized"); require(_nextTokenId <= MAX_SUPPLY, "Max supply reached"); require(_nextTokenId <= current_max_supply, "Current Max Supply Reached"); uint256 tokenId = _nextTokenId; _nextTokenId++; _mint(to, tokenId); } /** * @dev Overrides tokenURI to fetch metadata from an external contract. * @param tokenId The ID of the token. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "Token does not exist"); if (tokenURIContract != address(0)) { return bytes(baseURI).length > 0 ? string.concat(baseURI, tokenId.toString(),".json") : ""; } else { return ITokenURIProvider(tokenURIContract).tokenURI(tokenId); } } function setDefaultRoyalty( address receiver, uint96 feeNumerator ) external onlyOwner { _setDefaultRoyalty(receiver, feeNumerator); } function setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) external onlyOwner { _setTokenRoyalty(tokenId,receiver,feeNumerator); } function supportsInterface( bytes4 interfaceId ) public view virtual override(ERC2981, ERC721Enumerable) returns (bool) { return interfaceId == type(IERC2981).interfaceId || interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_royaltyReceiver","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"current_max_supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feedingContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setCurrentMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feedingContract","type":"address"}],"name":"setFeedingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenURIContract","type":"address"}],"name":"setTokenURIContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600160115561271060125560a06040525f608090815260139061002290826102cc565b5034801561002e575f5ffd5b5060405161334338038061334383398101604081905261004d91610386565b60405180604001604052806005815260200164426572707360d81b815250604051806040016040528060048152602001630424552560e41b815250816002908161009791906102cc565b5060036100a482826102cc565b50506001600c55506100b5336100e2565b601080546001600160a01b0319166001600160a01b0383161790556100dc816101f4610133565b506103b3565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6127106001600160601b03821611156101a65760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084015b60405180910390fd5b6001600160a01b0382166101fc5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c696420726563656976657200000000000000604482015260640161019d565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b909102175f55565b634e487b7160e01b5f52604160045260245ffd5b600181811c9082168061025c57607f821691505b60208210810361027a57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156102c757805f5260205f20601f840160051c810160208510156102a55750805b601f840160051c820191505b818110156102c4575f81556001016102b1565b50505b505050565b81516001600160401b038111156102e5576102e5610234565b6102f9816102f38454610248565b84610280565b6020601f82116001811461032b575f83156103145750848201515b5f19600385901b1c1916600184901b1784556102c4565b5f84815260208120601f198516915b8281101561035a578785015182556020948501946001909201910161033a565b508482101561037757868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f60208284031215610396575f5ffd5b81516001600160a01b03811681146103ac575f5ffd5b9392505050565b612f83806103c05f395ff3fe608060405234801561000f575f5ffd5b50600436106101e7575f3560e01c8063698f87be116101095780639fbc87131161009e578063c87b56dd1161006e578063c87b56dd14610471578063e985e9c514610484578063f2e7a054146104cc578063f2fde38b146104df575f5ffd5b80639fbc871314610422578063a22cb46514610442578063a4dae98414610455578063b88d4fde1461045e575f5ffd5b8063755edd17116100d9578063755edd17146103d657806382fc3147146103e95780638da5cb5b146103fc57806395d89b411461041a575f5ffd5b8063698f87be1461038857806370a08231146103a8578063715018a6146103bb57806373022011146103c3575f5ffd5b80632a55205a1161017f5780634f6ccce71161014f5780634f6ccce71461033c57806355f804b31461034f5780635944c753146103625780636352211e14610375575f5ffd5b80632a55205a146102cd5780632f745c591461030c57806332cb6b0c1461031f57806342842e0e14610329575f5ffd5b8063095ea7b3116101ba578063095ea7b31461027557806318160ddd146102885780631c70c8571461029a57806323b872dd146102ba575f5ffd5b806301ffc9a7146101eb57806304634d8d1461021357806306fdde0314610228578063081812fc1461023d575b5f5ffd5b6101fe6101f93660046126ae565b6104f2565b60405190151581526020015b60405180910390f35b61022661022136600461270e565b610599565b005b610230610613565b60405161020a919061278b565b61025061024b36600461279d565b6106a3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020a565b6102266102833660046127b4565b610761565b600a545b60405190815260200161020a565b600e546102509073ffffffffffffffffffffffffffffffffffffffff1681565b6102266102c83660046127dc565b6108b8565b6102e06102db366004612816565b61093f565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161020a565b61028c61031a3660046127b4565b610a33565b61028c62010f2c81565b6102266103373660046127dc565b610ae6565b61028c61034a36600461279d565b610b00565b61022661035d366004612932565b610ba1565b610226610370366004612977565b610c14565b61025061038336600461279d565b610c86565b600f546102509073ffffffffffffffffffffffffffffffffffffffff1681565b61028c6103b63660046129b0565b610d1d565b610226610dcf565b6102266103d136600461279d565b610e41565b6102266103e43660046129b0565b610f26565b6102266103f73660046129b0565b611056565b600d5473ffffffffffffffffffffffffffffffffffffffff16610250565b610230611104565b6010546102509073ffffffffffffffffffffffffffffffffffffffff1681565b6102266104503660046129c9565b611113565b61028c60125481565b61022661046c366004612a02565b61120e565b61023061047f36600461279d565b61129c565b6101fe610492366004612a79565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260076020908152604080832093909416825291909152205460ff1690565b6102266104da3660046129b0565b61143d565b6102266104ed3660046129b0565b6114eb565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061058457507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b806105935750610593826115e7565b92915050565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146106055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61060f828261163c565b5050565b60606002805461062290612aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461064e90612aa1565b80156106995780601f1061067057610100808354040283529160200191610699565b820191905f5260205f20905b81548152906001019060200180831161067c57829003601f168201915b5050505050905090565b5f8181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff166107395760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016105fc565b505f9081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b5f61076b82610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361080e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105fc565b3373ffffffffffffffffffffffffffffffffffffffff8216148061083757506108378133610492565b6108a95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105fc565b6108b38383611780565b505050565b6108c2338261181f565b6109345760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105fc565b6108b3838383611972565b5f82815260016020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916109f85750604080518082019091525f5473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101515f9061271090610a1b906bffffffffffffffffffffffff1687612b1f565b610a259190612b63565b915196919550909350505050565b5f610a3d83610d1d565b8210610ab15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016105fc565b5073ffffffffffffffffffffffffffffffffffffffff919091165f908152600860209081526040808320938352929052205490565b6108b383838360405180602001604052805f81525061120e565b5f610b0a600a5490565b8210610b7e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016105fc565b600a8281548110610b9157610b91612b76565b905f5260205f2001549050919050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610c085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b601361060f8282612bee565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610c7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b6108b3838383611bac565b5f8181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016105fc565b5f73ffffffffffffffffffffffffffffffffffffffff8216610da75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016105fc565b5073ffffffffffffffffffffffffffffffffffffffff165f9081526005602052604090205490565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610e365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b610e3f5f611d01565b565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610ea85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b62010f2c811115610f215760405162461bcd60e51b815260206004820152602160248201527f63757272656e74206d61782063616e6e6f74206578636565642068617264636160448201527f700000000000000000000000000000000000000000000000000000000000000060648201526084016105fc565b601255565b600e5473ffffffffffffffffffffffffffffffffffffffff163314610f8d5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420617574686f72697a656400000000000000000000000000000000000060448201526064016105fc565b62010f2c6011541115610fe25760405162461bcd60e51b815260206004820152601260248201527f4d617820737570706c792072656163686564000000000000000000000000000060448201526064016105fc565b60125460115411156110365760405162461bcd60e51b815260206004820152601a60248201527f43757272656e74204d617820537570706c79205265616368656400000000000060448201526064016105fc565b601180549081905f61104783612d05565b919050555061060f8282611d77565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146110bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606003805461062290612aa1565b3373ffffffffffffffffffffffffffffffffffffffff8316036111785760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105fc565b335f81815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611218338361181f565b61128a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105fc565b61129684848484611f0d565b50505050565b5f8181526004602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661130f5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f6573206e6f7420657869737400000000000000000000000060448201526064016105fc565b600f5473ffffffffffffffffffffffffffffffffffffffff1615611387575f6013805461133b90612aa1565b9050116113565760405180602001604052805f815250610593565b601361136183611f96565b604051602001611372929190612d3c565b60405160208183030381529060405292915050565b600f546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff9091169063c87b56dd906024015f60405180830381865afa1580156113f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105939190810190612dfd565b919050565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146114a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146115525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b73ffffffffffffffffffffffffffffffffffffffff81166115db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105fc565b6115e481611d01565b50565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806105935750610593826120c7565b6127106bffffffffffffffffffffffff821611156116c25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016105fc565b73ffffffffffffffffffffffffffffffffffffffff82166117255760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016105fc565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9092168083526bffffffffffffffffffffffff909116602090920182905274010000000000000000000000000000000000000000909102175f55565b5f81815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906117d982610c86565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f8181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff166118b55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016105fc565b5f6118bf83610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061192e57508373ffffffffffffffffffffffffffffffffffffffff16611916846106a3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061196a575073ffffffffffffffffffffffffffffffffffffffff8082165f9081526007602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661199282610c86565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016105fc565b73ffffffffffffffffffffffffffffffffffffffff8216611aa35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105fc565b611aae838383612168565b611ab85f82611780565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600560205260408120805460019290611aed908490612e72565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f908152600560205260408120805460019290611b27908490612e85565b90915550505f8181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6127106bffffffffffffffffffffffff82161115611c325760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016105fc565b73ffffffffffffffffffffffffffffffffffffffff8216611c955760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016105fc565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff93841681526bffffffffffffffffffffffff92831660208083019182525f96875260019052919094209351905190911674010000000000000000000000000000000000000000029116179055565b600d805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff8216611dda5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105fc565b5f8181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611e4b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105fc565b611e565f8383612168565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600560205260408120805460019290611e8b908490612e85565b90915550505f8181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611f18848484611972565b611f248484848461226d565b6112965760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105fc565b6060815f03611fd857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b815f5b81156120015780611feb81612d05565b9150611ffa9050600a83612b63565b9150611fdb565b5f8167ffffffffffffffff81111561201b5761201b612836565b6040519080825280601f01601f191660200182016040528015612045576020820181803683370190505b5090505b841561196a5761205a600183612e72565b9150612067600a86612e98565b612072906030612e85565b60f81b81838151811061208757612087612b76565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506120c0600a86612b63565b9450612049565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061215957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610593575061059382612442565b73ffffffffffffffffffffffffffffffffffffffff83166121cf576121ca81600a80545f838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61220c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461220c5761220c83826124d8565b73ffffffffffffffffffffffffffffffffffffffff8216612230576108b38161258b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146108b3576108b38282612632565b5f73ffffffffffffffffffffffffffffffffffffffff84163b15612437576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906122e3903390899088908890600401612eab565b6020604051808303815f875af192505050801561233b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261233891810190612f05565b60015b6123ec573d808015612368576040519150601f19603f3d011682016040523d82523d5f602084013e61236d565b606091505b5080515f036123e45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105fc565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061196a565b506001949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061059357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610593565b5f60016124e484610d1d565b6124ee9190612e72565b5f8381526009602052604090205490915080821461254c5773ffffffffffffffffffffffffffffffffffffffff84165f9081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b505f91825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a545f9061259c90600190612e72565b5f838152600b6020526040812054600a80549394509092849081106125c3576125c3612b76565b905f5260205f200154905080600a83815481106125e2576125e2612b76565b5f918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061261957612619612f20565b600190038181905f5260205f20015f9055905550505050565b5f61263c83610d1d565b73ffffffffffffffffffffffffffffffffffffffff9093165f908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146115e4575f5ffd5b5f602082840312156126be575f5ffd5b81356126c981612681565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611438575f5ffd5b80356bffffffffffffffffffffffff81168114611438575f5ffd5b5f5f6040838503121561271f575f5ffd5b612728836126d0565b9150612736602084016126f3565b90509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6126c9602083018461273f565b5f602082840312156127ad575f5ffd5b5035919050565b5f5f604083850312156127c5575f5ffd5b6127ce836126d0565b946020939093013593505050565b5f5f5f606084860312156127ee575f5ffd5b6127f7846126d0565b9250612805602085016126d0565b929592945050506040919091013590565b5f5f60408385031215612827575f5ffd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128aa576128aa612836565b604052919050565b5f67ffffffffffffffff8211156128cb576128cb612836565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f612909612904846128b2565b612863565b905082815283838301111561291c575f5ffd5b828260208301375f602084830101529392505050565b5f60208284031215612942575f5ffd5b813567ffffffffffffffff811115612958575f5ffd5b8201601f81018413612968575f5ffd5b61196a848235602084016128f7565b5f5f5f60608486031215612989575f5ffd5b83359250612999602085016126d0565b91506129a7604085016126f3565b90509250925092565b5f602082840312156129c0575f5ffd5b6126c9826126d0565b5f5f604083850312156129da575f5ffd5b6129e3836126d0565b9150602083013580151581146129f7575f5ffd5b809150509250929050565b5f5f5f5f60808587031215612a15575f5ffd5b612a1e856126d0565b9350612a2c602086016126d0565b925060408501359150606085013567ffffffffffffffff811115612a4e575f5ffd5b8501601f81018713612a5e575f5ffd5b612a6d878235602084016128f7565b91505092959194509250565b5f5f60408385031215612a8a575f5ffd5b612a93836126d0565b9150612736602084016126d0565b600181811c90821680612ab557607f821691505b602082108103612aec577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761059357610593612af2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82612b7157612b71612b36565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b601f8211156108b357805f5260205f20601f840160051c81016020851015612bc85750805b601f840160051c820191505b81811015612be7575f8155600101612bd4565b5050505050565b815167ffffffffffffffff811115612c0857612c08612836565b612c1c81612c168454612aa1565b84612ba3565b6020601f821160018114612c6d575f8315612c375750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455612be7565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015612cba5787850151825560209485019460019092019101612c9a565b5084821015612cf657868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d3557612d35612af2565b5060010190565b5f5f8454612d4981612aa1565b600182168015612d605760018114612d9357612dc0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083168652811515820286019350612dc0565b875f5260205f205f5b83811015612db857815488820152600190910190602001612d9c565b505081860193505b50505083518060208601835e7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b5f60208284031215612e0d575f5ffd5b815167ffffffffffffffff811115612e23575f5ffd5b8201601f81018413612e33575f5ffd5b8051612e41612904826128b2565b818152856020838501011115612e55575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8181038181111561059357610593612af2565b8082018082111561059357610593612af2565b5f82612ea657612ea6612b36565b500690565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201525f612efb608083018461273f565b9695505050505050565b5f60208284031215612f15575f5ffd5b81516126c981612681565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208143312d794e306ff3d17b41ddd8619f561fadaa20562c647d879787fce4608264736f6c634300081c00330000000000000000000000008de3c3891268502f77db7e876d727257dec0f852
Deployed Bytecode
0x608060405234801561000f575f5ffd5b50600436106101e7575f3560e01c8063698f87be116101095780639fbc87131161009e578063c87b56dd1161006e578063c87b56dd14610471578063e985e9c514610484578063f2e7a054146104cc578063f2fde38b146104df575f5ffd5b80639fbc871314610422578063a22cb46514610442578063a4dae98414610455578063b88d4fde1461045e575f5ffd5b8063755edd17116100d9578063755edd17146103d657806382fc3147146103e95780638da5cb5b146103fc57806395d89b411461041a575f5ffd5b8063698f87be1461038857806370a08231146103a8578063715018a6146103bb57806373022011146103c3575f5ffd5b80632a55205a1161017f5780634f6ccce71161014f5780634f6ccce71461033c57806355f804b31461034f5780635944c753146103625780636352211e14610375575f5ffd5b80632a55205a146102cd5780632f745c591461030c57806332cb6b0c1461031f57806342842e0e14610329575f5ffd5b8063095ea7b3116101ba578063095ea7b31461027557806318160ddd146102885780631c70c8571461029a57806323b872dd146102ba575f5ffd5b806301ffc9a7146101eb57806304634d8d1461021357806306fdde0314610228578063081812fc1461023d575b5f5ffd5b6101fe6101f93660046126ae565b6104f2565b60405190151581526020015b60405180910390f35b61022661022136600461270e565b610599565b005b610230610613565b60405161020a919061278b565b61025061024b36600461279d565b6106a3565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161020a565b6102266102833660046127b4565b610761565b600a545b60405190815260200161020a565b600e546102509073ffffffffffffffffffffffffffffffffffffffff1681565b6102266102c83660046127dc565b6108b8565b6102e06102db366004612816565b61093f565b6040805173ffffffffffffffffffffffffffffffffffffffff909316835260208301919091520161020a565b61028c61031a3660046127b4565b610a33565b61028c62010f2c81565b6102266103373660046127dc565b610ae6565b61028c61034a36600461279d565b610b00565b61022661035d366004612932565b610ba1565b610226610370366004612977565b610c14565b61025061038336600461279d565b610c86565b600f546102509073ffffffffffffffffffffffffffffffffffffffff1681565b61028c6103b63660046129b0565b610d1d565b610226610dcf565b6102266103d136600461279d565b610e41565b6102266103e43660046129b0565b610f26565b6102266103f73660046129b0565b611056565b600d5473ffffffffffffffffffffffffffffffffffffffff16610250565b610230611104565b6010546102509073ffffffffffffffffffffffffffffffffffffffff1681565b6102266104503660046129c9565b611113565b61028c60125481565b61022661046c366004612a02565b61120e565b61023061047f36600461279d565b61129c565b6101fe610492366004612a79565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260076020908152604080832093909416825291909152205460ff1690565b6102266104da3660046129b0565b61143d565b6102266104ed3660046129b0565b6114eb565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061058457507fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d6300000000000000000000000000000000000000000000000000000000145b806105935750610593826115e7565b92915050565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146106055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b61060f828261163c565b5050565b60606002805461062290612aa1565b80601f016020809104026020016040519081016040528092919081815260200182805461064e90612aa1565b80156106995780601f1061067057610100808354040283529160200191610699565b820191905f5260205f20905b81548152906001019060200180831161067c57829003601f168201915b5050505050905090565b5f8181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff166107395760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016105fc565b505f9081526006602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b5f61076b82610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361080e5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105fc565b3373ffffffffffffffffffffffffffffffffffffffff8216148061083757506108378133610492565b6108a95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016105fc565b6108b38383611780565b505050565b6108c2338261181f565b6109345760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105fc565b6108b3838383611972565b5f82815260016020908152604080832081518083019092525473ffffffffffffffffffffffffffffffffffffffff8116808352740100000000000000000000000000000000000000009091046bffffffffffffffffffffffff169282019290925282916109f85750604080518082019091525f5473ffffffffffffffffffffffffffffffffffffffff811682527401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1660208201525b60208101515f9061271090610a1b906bffffffffffffffffffffffff1687612b1f565b610a259190612b63565b915196919550909350505050565b5f610a3d83610d1d565b8210610ab15760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016105fc565b5073ffffffffffffffffffffffffffffffffffffffff919091165f908152600860209081526040808320938352929052205490565b6108b383838360405180602001604052805f81525061120e565b5f610b0a600a5490565b8210610b7e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016105fc565b600a8281548110610b9157610b91612b76565b905f5260205f2001549050919050565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610c085760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b601361060f8282612bee565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610c7b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b6108b3838383611bac565b5f8181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff16806105935760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016105fc565b5f73ffffffffffffffffffffffffffffffffffffffff8216610da75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016105fc565b5073ffffffffffffffffffffffffffffffffffffffff165f9081526005602052604090205490565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610e365760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b610e3f5f611d01565b565b600d5473ffffffffffffffffffffffffffffffffffffffff163314610ea85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b62010f2c811115610f215760405162461bcd60e51b815260206004820152602160248201527f63757272656e74206d61782063616e6e6f74206578636565642068617264636160448201527f700000000000000000000000000000000000000000000000000000000000000060648201526084016105fc565b601255565b600e5473ffffffffffffffffffffffffffffffffffffffff163314610f8d5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420617574686f72697a656400000000000000000000000000000000000060448201526064016105fc565b62010f2c6011541115610fe25760405162461bcd60e51b815260206004820152601260248201527f4d617820737570706c792072656163686564000000000000000000000000000060448201526064016105fc565b60125460115411156110365760405162461bcd60e51b815260206004820152601a60248201527f43757272656e74204d617820537570706c79205265616368656400000000000060448201526064016105fc565b601180549081905f61104783612d05565b919050555061060f8282611d77565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146110bd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b600f80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60606003805461062290612aa1565b3373ffffffffffffffffffffffffffffffffffffffff8316036111785760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016105fc565b335f81815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b611218338361181f565b61128a5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016105fc565b61129684848484611f0d565b50505050565b5f8181526004602052604090205460609073ffffffffffffffffffffffffffffffffffffffff1661130f5760405162461bcd60e51b815260206004820152601460248201527f546f6b656e20646f6573206e6f7420657869737400000000000000000000000060448201526064016105fc565b600f5473ffffffffffffffffffffffffffffffffffffffff1615611387575f6013805461133b90612aa1565b9050116113565760405180602001604052805f815250610593565b601361136183611f96565b604051602001611372929190612d3c565b60405160208183030381529060405292915050565b600f546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff9091169063c87b56dd906024015f60405180830381865afa1580156113f3573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526105939190810190612dfd565b919050565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146114a45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b600e80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600d5473ffffffffffffffffffffffffffffffffffffffff1633146115525760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105fc565b73ffffffffffffffffffffffffffffffffffffffff81166115db5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105fc565b6115e481611d01565b50565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f780e9d630000000000000000000000000000000000000000000000000000000014806105935750610593826120c7565b6127106bffffffffffffffffffffffff821611156116c25760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016105fc565b73ffffffffffffffffffffffffffffffffffffffff82166117255760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016105fc565b6040805180820190915273ffffffffffffffffffffffffffffffffffffffff9092168083526bffffffffffffffffffffffff909116602090920182905274010000000000000000000000000000000000000000909102175f55565b5f81815260066020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906117d982610c86565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f8181526004602052604081205473ffffffffffffffffffffffffffffffffffffffff166118b55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016105fc565b5f6118bf83610c86565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061192e57508373ffffffffffffffffffffffffffffffffffffffff16611916846106a3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061196a575073ffffffffffffffffffffffffffffffffffffffff8082165f9081526007602090815260408083209388168352929052205460ff165b949350505050565b8273ffffffffffffffffffffffffffffffffffffffff1661199282610c86565b73ffffffffffffffffffffffffffffffffffffffff1614611a1b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e000000000000000000000000000000000000000000000060648201526084016105fc565b73ffffffffffffffffffffffffffffffffffffffff8216611aa35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105fc565b611aae838383612168565b611ab85f82611780565b73ffffffffffffffffffffffffffffffffffffffff83165f908152600560205260408120805460019290611aed908490612e72565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f908152600560205260408120805460019290611b27908490612e85565b90915550505f8181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6127106bffffffffffffffffffffffff82161115611c325760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c6550726963650000000000000000000000000000000000000000000060648201526084016105fc565b73ffffffffffffffffffffffffffffffffffffffff8216611c955760405162461bcd60e51b815260206004820152601b60248201527f455243323938313a20496e76616c696420706172616d6574657273000000000060448201526064016105fc565b60408051808201825273ffffffffffffffffffffffffffffffffffffffff93841681526bffffffffffffffffffffffff92831660208083019182525f96875260019052919094209351905190911674010000000000000000000000000000000000000000029116179055565b600d805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b73ffffffffffffffffffffffffffffffffffffffff8216611dda5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016105fc565b5f8181526004602052604090205473ffffffffffffffffffffffffffffffffffffffff1615611e4b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016105fc565b611e565f8383612168565b73ffffffffffffffffffffffffffffffffffffffff82165f908152600560205260408120805460019290611e8b908490612e85565b90915550505f8181526004602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b611f18848484611972565b611f248484848461226d565b6112965760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105fc565b6060815f03611fd857505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b815f5b81156120015780611feb81612d05565b9150611ffa9050600a83612b63565b9150611fdb565b5f8167ffffffffffffffff81111561201b5761201b612836565b6040519080825280601f01601f191660200182016040528015612045576020820181803683370190505b5090505b841561196a5761205a600183612e72565b9150612067600a86612e98565b612072906030612e85565b60f81b81838151811061208757612087612b76565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506120c0600a86612b63565b9450612049565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061215957507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610593575061059382612442565b73ffffffffffffffffffffffffffffffffffffffff83166121cf576121ca81600a80545f838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b61220c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461220c5761220c83826124d8565b73ffffffffffffffffffffffffffffffffffffffff8216612230576108b38161258b565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146108b3576108b38282612632565b5f73ffffffffffffffffffffffffffffffffffffffff84163b15612437576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a02906122e3903390899088908890600401612eab565b6020604051808303815f875af192505050801561233b575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261233891810190612f05565b60015b6123ec573d808015612368576040519150601f19603f3d011682016040523d82523d5f602084013e61236d565b606091505b5080515f036123e45760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016105fc565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061196a565b506001949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f2a55205a00000000000000000000000000000000000000000000000000000000148061059357507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610593565b5f60016124e484610d1d565b6124ee9190612e72565b5f8381526009602052604090205490915080821461254c5773ffffffffffffffffffffffffffffffffffffffff84165f9081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b505f91825260096020908152604080842084905573ffffffffffffffffffffffffffffffffffffffff9094168352600881528383209183525290812055565b600a545f9061259c90600190612e72565b5f838152600b6020526040812054600a80549394509092849081106125c3576125c3612b76565b905f5260205f200154905080600a83815481106125e2576125e2612b76565b5f918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061261957612619612f20565b600190038181905f5260205f20015f9055905550505050565b5f61263c83610d1d565b73ffffffffffffffffffffffffffffffffffffffff9093165f908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b7fffffffff00000000000000000000000000000000000000000000000000000000811681146115e4575f5ffd5b5f602082840312156126be575f5ffd5b81356126c981612681565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611438575f5ffd5b80356bffffffffffffffffffffffff81168114611438575f5ffd5b5f5f6040838503121561271f575f5ffd5b612728836126d0565b9150612736602084016126f3565b90509250929050565b5f81518084528060208401602086015e5f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b602081525f6126c9602083018461273f565b5f602082840312156127ad575f5ffd5b5035919050565b5f5f604083850312156127c5575f5ffd5b6127ce836126d0565b946020939093013593505050565b5f5f5f606084860312156127ee575f5ffd5b6127f7846126d0565b9250612805602085016126d0565b929592945050506040919091013590565b5f5f60408385031215612827575f5ffd5b50508035926020909101359150565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128aa576128aa612836565b604052919050565b5f67ffffffffffffffff8211156128cb576128cb612836565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f612909612904846128b2565b612863565b905082815283838301111561291c575f5ffd5b828260208301375f602084830101529392505050565b5f60208284031215612942575f5ffd5b813567ffffffffffffffff811115612958575f5ffd5b8201601f81018413612968575f5ffd5b61196a848235602084016128f7565b5f5f5f60608486031215612989575f5ffd5b83359250612999602085016126d0565b91506129a7604085016126f3565b90509250925092565b5f602082840312156129c0575f5ffd5b6126c9826126d0565b5f5f604083850312156129da575f5ffd5b6129e3836126d0565b9150602083013580151581146129f7575f5ffd5b809150509250929050565b5f5f5f5f60808587031215612a15575f5ffd5b612a1e856126d0565b9350612a2c602086016126d0565b925060408501359150606085013567ffffffffffffffff811115612a4e575f5ffd5b8501601f81018713612a5e575f5ffd5b612a6d878235602084016128f7565b91505092959194509250565b5f5f60408385031215612a8a575f5ffd5b612a93836126d0565b9150612736602084016126d0565b600181811c90821680612ab557607f821691505b602082108103612aec577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761059357610593612af2565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82612b7157612b71612b36565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b601f8211156108b357805f5260205f20601f840160051c81016020851015612bc85750805b601f840160051c820191505b81811015612be7575f8155600101612bd4565b5050505050565b815167ffffffffffffffff811115612c0857612c08612836565b612c1c81612c168454612aa1565b84612ba3565b6020601f821160018114612c6d575f8315612c375750848201515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178455612be7565b5f848152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015612cba5787850151825560209485019460019092019101612c9a565b5084821015612cf657868401517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600387901b60f8161c191681555b50505050600190811b01905550565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612d3557612d35612af2565b5060010190565b5f5f8454612d4981612aa1565b600182168015612d605760018114612d9357612dc0565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0083168652811515820286019350612dc0565b875f5260205f205f5b83811015612db857815488820152600190910190602001612d9c565b505081860193505b50505083518060208601835e7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b5f60208284031215612e0d575f5ffd5b815167ffffffffffffffff811115612e23575f5ffd5b8201601f81018413612e33575f5ffd5b8051612e41612904826128b2565b818152856020838501011115612e55575f5ffd5b8160208401602083015e5f91810160200191909152949350505050565b8181038181111561059357610593612af2565b8082018082111561059357610593612af2565b5f82612ea657612ea6612b36565b500690565b73ffffffffffffffffffffffffffffffffffffffff8516815273ffffffffffffffffffffffffffffffffffffffff84166020820152826040820152608060608201525f612efb608083018461273f565b9695505050505050565b5f60208284031215612f15575f5ffd5b81516126c981612681565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea26469706673582212208143312d794e306ff3d17b41ddd8619f561fadaa20562c647d879787fce4608264736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008de3c3891268502f77db7e876d727257dec0f852
-----Decoded View---------------
Arg [0] : _royaltyReceiver (address): 0x8DE3c3891268502F77DB7E876d727257DEc0F852
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000008de3c3891268502f77db7e876d727257dec0f852
Deployed Bytecode Sourcemap
47715:3338:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50711:337;;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;50711:337:0;;;;;;;;50313:172;;;;;;:::i;:::-;;:::i;:::-;;25085:100;;;:::i;:::-;;;;;;;:::i;26644:221::-;;;;;;:::i;:::-;;:::i;:::-;;;2271:42:1;2259:55;;;2241:74;;2229:2;2214:18;26644:221:0;2095:226:1;26167:411:0;;;;;;:::i;:::-;;:::i;38611:113::-;38699:10;:17;38611:113;;;2777:25:1;;;2765:2;2750:18;38611:113:0;2631:177:1;47824:30:0;;;;;;;;;27534:339;;;;;;:::i;:::-;;:::i;45256:438::-;;;;;;:::i;:::-;;:::i;:::-;;;;3747:42:1;3735:55;;;3717:74;;3822:2;3807:18;;3800:34;;;;3690:18;45256:438:0;3543:297:1;38279:256:0;;;;;;:::i;:::-;;:::i;47976:42::-;;48013:5;47976:42;;27944:185;;;;;;:::i;:::-;;:::i;38801:233::-;;;;;;:::i;:::-;;:::i;48927:96::-;;;;;;:::i;:::-;;:::i;50493:206::-;;;;;;:::i;:::-;;:::i;24779:239::-;;;;;;:::i;:::-;;:::i;47861:31::-;;;;;;;;;24509:208;;;;;;:::i;:::-;;:::i;9483:94::-;;;:::i;49031:187::-;;;;;;:::i;:::-;;:::i;49395:359::-;;;;;;:::i;:::-;;:::i;48789:130::-;;;;;;:::i;:::-;;:::i;8832:87::-;8905:6;;;;8832:87;;25254:104;;;:::i;47899:30::-;;;;;;;;;26937:295;;;;;;:::i;:::-;;:::i;48025:41::-;;;;;;28200:328;;;;;;:::i;:::-;;:::i;49901:404::-;;;;;;:::i;:::-;;:::i;27303:164::-;;;;;;:::i;:::-;27424:25;;;;27400:4;27424:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27303:164;48458:126;;;;;;:::i;:::-;;:::i;9732:192::-;;;;;;:::i;:::-;;:::i;50711:337::-;50839:4;50877:41;;;50892:26;50877:41;;:108;;-1:-1:-1;50935:50:0;;;50950:35;50935:50;50877:108;:163;;;;51004:36;51028:11;51004:23;:36::i;:::-;50856:184;50711:337;-1:-1:-1;;50711:337:0:o;50313:172::-;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;;;;;;;;;50435:42:::1;50454:8;50464:12;50435:18;:42::i;:::-;50313:172:::0;;:::o;25085:100::-;25139:13;25172:5;25165:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25085:100;:::o;26644:221::-;26720:7;30127:16;;;:7;:16;;;;;;:30;:16;26740:73;;;;-1:-1:-1;;;26740:73:0;;8331:2:1;26740:73:0;;;8313:21:1;8370:2;8350:18;;;8343:30;8409:34;8389:18;;;8382:62;8480:14;8460:18;;;8453:42;8512:19;;26740:73:0;8129:408:1;26740:73:0;-1:-1:-1;26833:24:0;;;;:15;:24;;;;;;;;;26644:221::o;26167:411::-;26248:13;26264:23;26279:7;26264:14;:23::i;:::-;26248:39;;26312:5;26306:11;;:2;:11;;;26298:57;;;;-1:-1:-1;;;26298:57:0;;8744:2:1;26298:57:0;;;8726:21:1;8783:2;8763:18;;;8756:30;8822:34;8802:18;;;8795:62;8893:3;8873:18;;;8866:31;8914:19;;26298:57:0;8542:397:1;26298:57:0;7772:10;26390:21;;;;;:62;;-1:-1:-1;26415:37:0;26432:5;7772:10;27303:164;:::i;26415:37::-;26368:168;;;;-1:-1:-1;;;26368:168:0;;9146:2:1;26368:168:0;;;9128:21:1;9185:2;9165:18;;;9158:30;9224:34;9204:18;;;9197:62;9295:26;9275:18;;;9268:54;9339:19;;26368:168:0;8944:420:1;26368:168:0;26549:21;26558:2;26562:7;26549:8;:21::i;:::-;26237:341;26167:411;;:::o;27534:339::-;27729:41;7772:10;27762:7;27729:18;:41::i;:::-;27721:103;;;;-1:-1:-1;;;27721:103:0;;9571:2:1;27721:103:0;;;9553:21:1;9610:2;9590:18;;;9583:30;9649:34;9629:18;;;9622:62;9720:19;9700:18;;;9693:47;9757:19;;27721:103:0;9369:413:1;27721:103:0;27837:28;27847:4;27853:2;27857:7;27837:9;:28::i;45256:438::-;45351:7;45409:26;;;:17;:26;;;;;;;;45380:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;45351:7;;45448:92;;-1:-1:-1;45499:29:0;;;;;;;;;-1:-1:-1;45499:29:0;;;;;;;;;;;;;;;45448:92;45589:23;;;;45552:21;;46060:5;;45577:35;;45576:57;45577:35;:9;:35;:::i;:::-;45576:57;;;;:::i;:::-;45654:16;;;;;-1:-1:-1;45256:438:0;;-1:-1:-1;;;;45256:438:0:o;38279:256::-;38376:7;38412:23;38429:5;38412:16;:23::i;:::-;38404:5;:31;38396:87;;;;-1:-1:-1;;;38396:87:0;;10665:2:1;38396:87:0;;;10647:21:1;10704:2;10684:18;;;10677:30;10743:34;10723:18;;;10716:62;10814:13;10794:18;;;10787:41;10845:19;;38396:87:0;10463:407:1;38396:87:0;-1:-1:-1;38501:19:0;;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38279:256::o;27944:185::-;28082:39;28099:4;28105:2;28109:7;28082:39;;;;;;;;;;;;:16;:39::i;38801:233::-;38876:7;38912:30;38699:10;:17;;38611:113;38912:30;38904:5;:38;38896:95;;;;-1:-1:-1;;;38896:95:0;;11077:2:1;38896:95:0;;;11059:21:1;11116:2;11096:18;;;11089:30;11155:34;11135:18;;;11128:62;11226:14;11206:18;;;11199:42;11258:19;;38896:95:0;10875:408:1;38896:95:0;39009:10;39020:5;39009:17;;;;;;;;:::i;:::-;;;;;;;;;39002:24;;38801:233;;;:::o;48927:96::-;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;7326:356:1;9044:68:0;48999:7:::1;:16;49009:6:::0;48999:7;:16:::1;:::i;50493:206::-:0;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;7326:356:1;9044:68:0;50644:47:::1;50661:7;50669:8;50678:12;50644:16;:47::i;24779:239::-:0;24851:7;24887:16;;;:7;:16;;;;;;;;;24914:73;;;;-1:-1:-1;;;24914:73:0;;13982:2:1;24914:73:0;;;13964:21:1;14021:2;14001:18;;;13994:30;14060:34;14040:18;;;14033:62;14131:11;14111:18;;;14104:39;14160:19;;24914:73:0;13780:405:1;24509:208:0;24581:7;24609:19;;;24601:74;;;;-1:-1:-1;;;24601:74:0;;14392:2:1;24601:74:0;;;14374:21:1;14431:2;14411:18;;;14404:30;14470:34;14450:18;;;14443:62;14541:12;14521:18;;;14514:40;14571:19;;24601:74:0;14190:406:1;24601:74:0;-1:-1:-1;24693:16:0;;;;;;:9;:16;;;;;;;24509:208::o;9483:94::-;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;7326:356:1;9044:68:0;9548:21:::1;9566:1;9548:9;:21::i;:::-;9483:94::o:0;49031:187::-;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;7326:356:1;9044:68:0;48013:5:::1;49114:6;:20;;49106:66;;;::::0;-1:-1:-1;;;49106:66:0;;14803:2:1;49106:66:0::1;::::0;::::1;14785:21:1::0;14842:2;14822:18;;;14815:30;14881:34;14861:18;;;14854:62;14952:3;14932:18;;;14925:31;14973:19;;49106:66:0::1;14601:397:1::0;49106:66:0::1;49183:18;:27:::0;49031:187::o;49395:359::-;49465:15;;;;49451:10;:29;49443:56;;;;-1:-1:-1;;;49443:56:0;;15205:2:1;49443:56:0;;;15187:21:1;15244:2;15224:18;;;15217:30;15283:16;15263:18;;;15256:44;15317:18;;49443:56:0;15003:338:1;49443:56:0;48013:5;49518:12;;:26;;49510:57;;;;-1:-1:-1;;;49510:57:0;;15548:2:1;49510:57:0;;;15530:21:1;15587:2;15567:18;;;15560:30;15626:20;15606:18;;;15599:48;15664:18;;49510:57:0;15346:342:1;49510:57:0;49602:18;;49586:12;;:34;;49578:73;;;;-1:-1:-1;;;49578:73:0;;15895:2:1;49578:73:0;;;15877:21:1;15934:2;15914:18;;;15907:30;15973:28;15953:18;;;15946:56;16019:18;;49578:73:0;15693:350:1;49578:73:0;49680:12;;;;;;49662:15;49703:14;49680:12;49703:14;:::i;:::-;;;;;;49728:18;49734:2;49738:7;49728:5;:18::i;48789:130::-;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;7326:356:1;9044:68:0;48875:16:::1;:36:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;48789:130::o;25254:104::-;25310:13;25343:7;25336:14;;;;;:::i;26937:295::-;7772:10;27040:24;;;;27032:62;;;;-1:-1:-1;;;27032:62:0;;16450:2:1;27032:62:0;;;16432:21:1;16489:2;16469:18;;;16462:30;16528:27;16508:18;;;16501:55;16573:18;;27032:62:0;16248:349:1;27032:62:0;7772:10;27107:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;27176:48;;586:41:1;;;27107:42:0;;7772:10;27176:48;;559:18:1;27176:48:0;;;;;;;26937:295;;:::o;28200:328::-;28375:41;7772:10;28408:7;28375:18;:41::i;:::-;28367:103;;;;-1:-1:-1;;;28367:103:0;;9571:2:1;28367:103:0;;;9553:21:1;9610:2;9590:18;;;9583:30;9649:34;9629:18;;;9622:62;9720:19;9700:18;;;9693:47;9757:19;;28367:103:0;9369:413:1;28367:103:0;28481:39;28495:4;28501:2;28505:7;28514:5;28481:13;:39::i;:::-;28200:328;;;;:::o;49901:404::-;30103:4;30127:16;;;:7;:16;;;;;;49966:13;;30127:30;:16;49992:49;;;;-1:-1:-1;;;49992:49:0;;16804:2:1;49992:49:0;;;16786:21:1;16843:2;16823:18;;;16816:30;16882:22;16862:18;;;16855:50;16922:18;;49992:49:0;16602:344:1;49992:49:0;50056:16;;:30;:16;:30;50052:246;;50134:1;50116:7;50110:21;;;;;:::i;:::-;;;:25;:83;;;;;;;;;;;;;;;;;50152:7;50161:18;:7;:16;:18::i;:::-;50138:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50103:90;49901:404;-1:-1:-1;;49901:404:0:o;50052:246::-;50251:16;;50233:53;;;;;;;;2777:25:1;;;50251:16:0;;;;;50233:44;;2750:18:1;;50233:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50052:246::-;49901:404;;;:::o;48458:126::-;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;7326:356:1;9044:68:0;48542:15:::1;:34:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;48458:126::o;9732:192::-;8905:6;;9052:23;8905:6;7772:10;9052:23;9044:68;;;;-1:-1:-1;;;9044:68:0;;7528:2:1;9044:68:0;;;7510:21:1;;;7547:18;;;7540:30;7606:34;7586:18;;;7579:62;7658:18;;9044:68:0;7326:356:1;9044:68:0;9821:22:::1;::::0;::::1;9813:73;;;::::0;-1:-1:-1;;;9813:73:0;;19104:2:1;9813:73:0::1;::::0;::::1;19086:21:1::0;19143:2;19123:18;;;19116:30;19182:34;19162:18;;;19155:62;19253:8;19233:18;;;19226:36;19279:19;;9813:73:0::1;18902:402:1::0;9813:73:0::1;9897:19;9907:8;9897:9;:19::i;:::-;9732:192:::0;:::o;37971:224::-;38073:4;38097:50;;;38112:35;38097:50;;:90;;;38151:36;38175:11;38151:23;:36::i;46344:332::-;46060:5;46447:33;;;;;46439:88;;;;-1:-1:-1;;;46439:88:0;;19511:2:1;46439:88:0;;;19493:21:1;19550:2;19530:18;;;19523:30;19589:34;19569:18;;;19562:62;19660:12;19640:18;;;19633:40;19690:19;;46439:88:0;19309:406:1;46439:88:0;46546:22;;;46538:60;;;;-1:-1:-1;;;46538:60:0;;19922:2:1;46538:60:0;;;19904:21:1;19961:2;19941:18;;;19934:30;20000:27;19980:18;;;19973:55;20045:18;;46538:60:0;19720:349:1;46538:60:0;46633:35;;;;;;;;;;;;;;;;;;;;;;;;;;;46611:57;;;;;-1:-1:-1;46611:57:0;46344:332::o;34020:174::-;34095:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;34149:23;34095:24;34149:14;:23::i;:::-;34140:46;;;;;;;;;;;;34020:174;;:::o;30332:348::-;30425:4;30127:16;;;:7;:16;;;;;;:30;:16;30442:73;;;;-1:-1:-1;;;30442:73:0;;20276:2:1;30442:73:0;;;20258:21:1;20315:2;20295:18;;;20288:30;20354:34;20334:18;;;20327:62;20425:14;20405:18;;;20398:42;20457:19;;30442:73:0;20074:408:1;30442:73:0;30526:13;30542:23;30557:7;30542:14;:23::i;:::-;30526:39;;30595:5;30584:16;;:7;:16;;;:51;;;;30628:7;30604:31;;:20;30616:7;30604:11;:20::i;:::-;:31;;;30584:51;:87;;;-1:-1:-1;27424:25:0;;;;27400:4;27424:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30639:32;30576:96;30332:348;-1:-1:-1;;;;30332:348:0:o;33324:578::-;33483:4;33456:31;;:23;33471:7;33456:14;:23::i;:::-;:31;;;33448:85;;;;-1:-1:-1;;;33448:85:0;;20689:2:1;33448:85:0;;;20671:21:1;20728:2;20708:18;;;20701:30;20767:34;20747:18;;;20740:62;20838:11;20818:18;;;20811:39;20867:19;;33448:85:0;20487:405:1;33448:85:0;33552:16;;;33544:65;;;;-1:-1:-1;;;33544:65:0;;21099:2:1;33544:65:0;;;21081:21:1;21138:2;21118:18;;;21111:30;21177:34;21157:18;;;21150:62;21248:6;21228:18;;;21221:34;21272:19;;33544:65:0;20897:400:1;33544:65:0;33622:39;33643:4;33649:2;33653:7;33622:20;:39::i;:::-;33726:29;33743:1;33747:7;33726:8;:29::i;:::-;33768:15;;;;;;;:9;:15;;;;;:20;;33787:1;;33768:15;:20;;33787:1;;33768:20;:::i;:::-;;;;-1:-1:-1;;33799:13:0;;;;;;;:9;:13;;;;;:18;;33816:1;;33799:13;:18;;33816:1;;33799:18;:::i;:::-;;;;-1:-1:-1;;33828:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;33867:27;;33828:16;;33867:27;;;;;;;33324:578;;;:::o;47127:356::-;46060:5;47245:33;;;;;47237:88;;;;-1:-1:-1;;;47237:88:0;;19511:2:1;47237:88:0;;;19493:21:1;19550:2;19530:18;;;19523:30;19589:34;19569:18;;;19562:62;19660:12;19640:18;;;19633:40;19690:19;;47237:88:0;19309:406:1;47237:88:0;47344:22;;;47336:62;;;;-1:-1:-1;;;47336:62:0;;21767:2:1;47336:62:0;;;21749:21:1;21806:2;21786:18;;;21779:30;21845:29;21825:18;;;21818:57;21892:18;;47336:62:0;21565:351:1;47336:62:0;47440:35;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47411:26:0;;;:17;:26;;;;;;:64;;;;;;;;;;;;;;47127:356::o;9932:173::-;10007:6;;;;10024:17;;;;;;;;;;;10057:40;;10007:6;;;10024:17;10007:6;;10057:40;;9988:16;;10057:40;9977:128;9932:173;:::o;32016:382::-;32096:16;;;32088:61;;;;-1:-1:-1;;;32088:61:0;;22123:2:1;32088:61:0;;;22105:21:1;;;22142:18;;;22135:30;22201:34;22181:18;;;22174:62;22253:18;;32088:61:0;21921:356:1;32088:61:0;30103:4;30127:16;;;:7;:16;;;;;;:30;:16;:30;32160:58;;;;-1:-1:-1;;;32160:58:0;;22484:2:1;32160:58:0;;;22466:21:1;22523:2;22503:18;;;22496:30;22562;22542:18;;;22535:58;22610:18;;32160:58:0;22282:352:1;32160:58:0;32231:45;32260:1;32264:2;32268:7;32231:20;:45::i;:::-;32289:13;;;;;;;:9;:13;;;;;:18;;32306:1;;32289:13;:18;;32306:1;;32289:18;:::i;:::-;;;;-1:-1:-1;;32318:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;32357:33;;32318:16;;;32357:33;;32318:16;;32357:33;32016:382;;:::o;29410:315::-;29567:28;29577:4;29583:2;29587:7;29567:9;:28::i;:::-;29614:48;29637:4;29643:2;29647:7;29656:5;29614:22;:48::i;:::-;29606:111;;;;-1:-1:-1;;;29606:111:0;;22841:2:1;29606:111:0;;;22823:21:1;22880:2;22860:18;;;22853:30;22919:34;22899:18;;;22892:62;22990:20;22970:18;;;22963:48;23028:19;;29606:111:0;22639:414:1;5388:723:0;5444:13;5665:5;5674:1;5665:10;5661:53;;-1:-1:-1;;5692:10:0;;;;;;;;;;;;;;;;;;5388:723::o;5661:53::-;5739:5;5724:12;5780:78;5787:9;;5780:78;;5813:8;;;;:::i;:::-;;-1:-1:-1;5836:10:0;;-1:-1:-1;5844:2:0;5836:10;;:::i;:::-;;;5780:78;;;5868:19;5900:6;5890:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5890:17:0;;5868:39;;5918:154;5925:10;;5918:154;;5952:11;5962:1;5952:11;;:::i;:::-;;-1:-1:-1;6021:10:0;6029:2;6021:5;:10;:::i;:::-;6008:24;;:2;:24;:::i;:::-;5995:39;;5978:6;5985;5978:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;6049:11:0;6058:2;6049:11;;:::i;:::-;;;5918:154;;24140:305;24242:4;24279:40;;;24294:25;24279:40;;:105;;-1:-1:-1;24336:48:0;;;24351:33;24336:48;24279:105;:158;;;;24401:36;24425:11;24401:23;:36::i;39647:589::-;39853:18;;;39849:187;;39888:40;39920:7;41063:10;:17;;41036:24;;;;:15;:24;;;;;:44;;;41091:24;;;;;;;;;;;;40959:164;39888:40;39849:187;;;39958:2;39950:10;;:4;:10;;;39946:90;;39977:47;40010:4;40016:7;39977:32;:47::i;:::-;40050:16;;;40046:183;;40083:45;40120:7;40083:36;:45::i;40046:183::-;40156:4;40150:10;;:2;:10;;;40146:83;;40177:40;40205:2;40209:7;40177:27;:40::i;34759:803::-;34914:4;34935:13;;;15242:20;15290:8;34931:624;;34971:72;;;;;:36;;;;;;:72;;7772:10;;35022:4;;35028:7;;35037:5;;34971:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34971:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34967:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35217:6;:13;35234:1;35217:18;35213:272;;35260:60;;-1:-1:-1;;;35260:60:0;;22841:2:1;35260:60:0;;;22823:21:1;22880:2;22860:18;;;22853:30;22919:34;22899:18;;;22892:62;22990:20;22970:18;;;22963:48;23028:19;;35260:60:0;22639:414:1;35213:272:0;35435:6;35429:13;35420:6;35416:2;35412:15;35405:38;34967:533;35094:55;;35104:45;35094:55;;-1:-1:-1;35087:62:0;;34931:624;-1:-1:-1;35539:4:0;34759:803;;;;;;:::o;44986:215::-;45088:4;45112:41;;;45127:26;45112:41;;:81;;-1:-1:-1;22871:25:0;22856:40;;;;45157:36;22747:157;41750:988;42016:22;42066:1;42041:22;42058:4;42041:16;:22::i;:::-;:26;;;;:::i;:::-;42078:18;42099:26;;;:17;:26;;;;;;42016:51;;-1:-1:-1;42232:28:0;;;42228:328;;42299:18;;;42277:19;42299:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42350:30;;;;;;:44;;;42467:30;;:17;:30;;;;;:43;;;42228:328;-1:-1:-1;42652:26:0;;;;:17;:26;;;;;;;;42645:33;;;42696:18;;;;;;:12;:18;;;;;:34;;;;;;;42689:41;41750:988::o;43033:1079::-;43311:10;:17;43286:22;;43311:21;;43331:1;;43311:21;:::i;:::-;43343:18;43364:24;;;:15;:24;;;;;;43737:10;:26;;43286:46;;-1:-1:-1;43364:24:0;;43286:46;;43737:26;;;;;;:::i;:::-;;;;;;;;;43715:48;;43801:11;43776:10;43787;43776:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;43881:28;;;:15;:28;;;;;;;:41;;;44053:24;;;;;44046:31;44088:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43104:1008;;;43033:1079;:::o;40537:221::-;40622:14;40639:20;40656:2;40639:16;:20::i;:::-;40670:16;;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40715:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40537:221:0:o;14:177:1:-;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;:::-;430:5;196:245;-1:-1:-1;;;196:245:1:o;638:196::-;706:20;;766:42;755:54;;745:65;;735:93;;824:1;821;814:12;839:179;906:20;;966:26;955:38;;945:49;;935:77;;1008:1;1005;998:12;1023:258;1090:6;1098;1151:2;1139:9;1130:7;1126:23;1122:32;1119:52;;;1167:1;1164;1157:12;1119:52;1190:29;1209:9;1190:29;:::i;:::-;1180:39;;1238:37;1271:2;1260:9;1256:18;1238:37;:::i;:::-;1228:47;;1023:258;;;;;:::o;1286:348::-;1328:3;1366:5;1360:12;1393:6;1388:3;1381:19;1449:6;1442:4;1435:5;1431:16;1424:4;1419:3;1415:14;1409:47;1501:1;1494:4;1485:6;1480:3;1476:16;1472:27;1465:38;1623:4;1553:66;1548:2;1540:6;1536:15;1532:88;1527:3;1523:98;1519:109;1512:116;;;1286:348;;;;:::o;1639:220::-;1788:2;1777:9;1770:21;1751:4;1808:45;1849:2;1838:9;1834:18;1826:6;1808:45;:::i;1864:226::-;1923:6;1976:2;1964:9;1955:7;1951:23;1947:32;1944:52;;;1992:1;1989;1982:12;1944:52;-1:-1:-1;2037:23:1;;1864:226;-1:-1:-1;1864:226:1:o;2326:300::-;2394:6;2402;2455:2;2443:9;2434:7;2430:23;2426:32;2423:52;;;2471:1;2468;2461:12;2423:52;2494:29;2513:9;2494:29;:::i;:::-;2484:39;2592:2;2577:18;;;;2564:32;;-1:-1:-1;;;2326:300:1:o;2813:374::-;2890:6;2898;2906;2959:2;2947:9;2938:7;2934:23;2930:32;2927:52;;;2975:1;2972;2965:12;2927:52;2998:29;3017:9;2998:29;:::i;:::-;2988:39;;3046:38;3080:2;3069:9;3065:18;3046:38;:::i;:::-;2813:374;;3036:48;;-1:-1:-1;;;3153:2:1;3138:18;;;;3125:32;;2813:374::o;3192:346::-;3260:6;3268;3321:2;3309:9;3300:7;3296:23;3292:32;3289:52;;;3337:1;3334;3327:12;3289:52;-1:-1:-1;;3382:23:1;;;3502:2;3487:18;;;3474:32;;-1:-1:-1;3192:346:1:o;3845:184::-;3897:77;3894:1;3887:88;3994:4;3991:1;3984:15;4018:4;4015:1;4008:15;4034:334;4105:2;4099:9;4161:2;4151:13;;4166:66;4147:86;4135:99;;4264:18;4249:34;;4285:22;;;4246:62;4243:88;;;4311:18;;:::i;:::-;4347:2;4340:22;4034:334;;-1:-1:-1;4034:334:1:o;4373:246::-;4422:4;4455:18;4447:6;4444:30;4441:56;;;4477:18;;:::i;:::-;-1:-1:-1;4534:2:1;4522:15;4539:66;4518:88;4608:4;4514:99;;4373:246::o;4624:338::-;4689:5;4718:53;4734:36;4763:6;4734:36;:::i;:::-;4718:53;:::i;:::-;4709:62;;4794:6;4787:5;4780:21;4834:3;4825:6;4820:3;4816:16;4813:25;4810:45;;;4851:1;4848;4841:12;4810:45;4900:6;4895:3;4888:4;4881:5;4877:16;4864:43;4954:1;4947:4;4938:6;4931:5;4927:18;4923:29;4916:40;4624:338;;;;;:::o;4967:451::-;5036:6;5089:2;5077:9;5068:7;5064:23;5060:32;5057:52;;;5105:1;5102;5095:12;5057:52;5145:9;5132:23;5178:18;5170:6;5167:30;5164:50;;;5210:1;5207;5200:12;5164:50;5233:22;;5286:4;5278:13;;5274:27;-1:-1:-1;5264:55:1;;5315:1;5312;5305:12;5264:55;5338:74;5404:7;5399:2;5386:16;5381:2;5377;5373:11;5338:74;:::i;5423:372::-;5499:6;5507;5515;5568:2;5556:9;5547:7;5543:23;5539:32;5536:52;;;5584:1;5581;5574:12;5536:52;5629:23;;;-1:-1:-1;5695:38:1;5729:2;5714:18;;5695:38;:::i;:::-;5685:48;;5752:37;5785:2;5774:9;5770:18;5752:37;:::i;:::-;5742:47;;5423:372;;;;;:::o;5800:186::-;5859:6;5912:2;5900:9;5891:7;5887:23;5883:32;5880:52;;;5928:1;5925;5918:12;5880:52;5951:29;5970:9;5951:29;:::i;5991:347::-;6056:6;6064;6117:2;6105:9;6096:7;6092:23;6088:32;6085:52;;;6133:1;6130;6123:12;6085:52;6156:29;6175:9;6156:29;:::i;:::-;6146:39;;6235:2;6224:9;6220:18;6207:32;6282:5;6275:13;6268:21;6261:5;6258:32;6248:60;;6304:1;6301;6294:12;6248:60;6327:5;6317:15;;;5991:347;;;;;:::o;6343:713::-;6438:6;6446;6454;6462;6515:3;6503:9;6494:7;6490:23;6486:33;6483:53;;;6532:1;6529;6522:12;6483:53;6555:29;6574:9;6555:29;:::i;:::-;6545:39;;6603:38;6637:2;6626:9;6622:18;6603:38;:::i;:::-;6593:48;-1:-1:-1;6710:2:1;6695:18;;6682:32;;-1:-1:-1;6789:2:1;6774:18;;6761:32;6816:18;6805:30;;6802:50;;;6848:1;6845;6838:12;6802:50;6871:22;;6924:4;6916:13;;6912:27;-1:-1:-1;6902:55:1;;6953:1;6950;6943:12;6902:55;6976:74;7042:7;7037:2;7024:16;7019:2;7015;7011:11;6976:74;:::i;:::-;6966:84;;;6343:713;;;;;;;:::o;7061:260::-;7129:6;7137;7190:2;7178:9;7169:7;7165:23;7161:32;7158:52;;;7206:1;7203;7196:12;7158:52;7229:29;7248:9;7229:29;:::i;:::-;7219:39;;7277:38;7311:2;7300:9;7296:18;7277:38;:::i;7687:437::-;7766:1;7762:12;;;;7809;;;7830:61;;7884:4;7876:6;7872:17;7862:27;;7830:61;7937:2;7929:6;7926:14;7906:18;7903:38;7900:218;;7974:77;7971:1;7964:88;8075:4;8072:1;8065:15;8103:4;8100:1;8093:15;7900:218;;7687:437;;;:::o;9787:184::-;9839:77;9836:1;9829:88;9936:4;9933:1;9926:15;9960:4;9957:1;9950:15;9976:168;10049:9;;;10080;;10097:15;;;10091:22;;10077:37;10067:71;;10118:18;;:::i;10149:184::-;10201:77;10198:1;10191:88;10298:4;10295:1;10288:15;10322:4;10319:1;10312:15;10338:120;10378:1;10404;10394:35;;10409:18;;:::i;:::-;-1:-1:-1;10443:9:1;;10338:120::o;11288:184::-;11340:77;11337:1;11330:88;11437:4;11434:1;11427:15;11461:4;11458:1;11451:15;11603:518;11705:2;11700:3;11697:11;11694:421;;;11741:5;11738:1;11731:16;11785:4;11782:1;11772:18;11855:2;11843:10;11839:19;11836:1;11832:27;11826:4;11822:38;11891:4;11879:10;11876:20;11873:47;;;-1:-1:-1;11914:4:1;11873:47;11969:2;11964:3;11960:12;11957:1;11953:20;11947:4;11943:31;11933:41;;12024:81;12042:2;12035:5;12032:13;12024:81;;;12101:1;12087:16;;12068:1;12057:13;12024:81;;;12028:3;;11603:518;;;:::o;12357:1418::-;12483:3;12477:10;12510:18;12502:6;12499:30;12496:56;;;12532:18;;:::i;:::-;12561:97;12651:6;12611:38;12643:4;12637:11;12611:38;:::i;:::-;12605:4;12561:97;:::i;:::-;12707:4;12738:2;12727:14;;12755:1;12750:768;;;;13562:1;13579:6;13576:89;;;-1:-1:-1;13631:19:1;;;13625:26;13576:89;12263:66;12254:1;12250:11;;;12246:84;12242:89;12232:100;12338:1;12334:11;;;12229:117;13678:81;;12720:1049;;12750:768;11550:1;11543:14;;;11587:4;11574:18;;12798:66;12786:79;;;12963:222;12977:7;12974:1;12971:14;12963:222;;;13059:19;;;13053:26;13038:42;;13166:4;13151:20;;;;13119:1;13107:14;;;;12993:12;12963:222;;;12967:3;13213:6;13204:7;13201:19;13198:261;;;13274:19;;;13268:26;13375:66;13357:1;13353:14;;;13369:3;13349:24;13345:97;13341:102;13326:118;13311:134;;13198:261;-1:-1:-1;;;;13505:1:1;13489:14;;;13485:22;13472:36;;-1:-1:-1;12357:1418:1:o;16048:195::-;16087:3;16118:66;16111:5;16108:77;16105:103;;16188:18;;:::i;:::-;-1:-1:-1;16235:1:1;16224:13;;16048:195::o;17023:1182::-;17289:3;17318:1;17351:6;17345:13;17381:36;17407:9;17381:36;:::i;:::-;17448:1;17433:17;;17459:191;;;;17664:1;17659:332;;;;17426:565;;17459:191;17507:66;17496:9;17492:82;17487:3;17480:95;17630:6;17623:14;17616:22;17608:6;17604:35;17599:3;17595:45;17588:52;;17459:191;;17659:332;17690:6;17687:1;17680:17;17738:4;17735:1;17725:18;17765:1;17779:166;17793:6;17790:1;17787:13;17779:166;;;17873:14;;17860:11;;;17853:35;17929:1;17916:15;;;;17815:4;17808:12;17779:166;;;17783:3;;17974:6;17969:3;17965:16;17958:23;;17426:565;;;;18022:6;18016:13;18068:8;18061:4;18053:6;18049:17;18044:3;18038:39;17008:7;18096:18;;16996:20;;;18197:1;18189:10;;17023:1182;-1:-1:-1;;;;17023:1182:1:o;18210:687::-;18290:6;18343:2;18331:9;18322:7;18318:23;18314:32;18311:52;;;18359:1;18356;18349:12;18311:52;18392:9;18386:16;18425:18;18417:6;18414:30;18411:50;;;18457:1;18454;18447:12;18411:50;18480:22;;18533:4;18525:13;;18521:27;-1:-1:-1;18511:55:1;;18562:1;18559;18552:12;18511:55;18595:2;18589:9;18620:53;18636:36;18665:6;18636:36;:::i;18620:53::-;18696:6;18689:5;18682:21;18744:7;18739:2;18730:6;18726:2;18722:15;18718:24;18715:37;18712:57;;;18765:1;18762;18755:12;18712:57;18813:6;18808:2;18804;18800:11;18795:2;18788:5;18784:14;18778:42;18865:1;18840:18;;;18860:2;18836:27;18829:38;;;;18844:5;18210:687;-1:-1:-1;;;;18210:687:1:o;21302:128::-;21369:9;;;21390:11;;;21387:37;;;21404:18;;:::i;21435:125::-;21500:9;;;21521:10;;;21518:36;;;21534:18;;:::i;23058:112::-;23090:1;23116;23106:35;;23121:18;;:::i;:::-;-1:-1:-1;23155:9:1;;23058:112::o;23175:531::-;23418:42;23410:6;23406:55;23395:9;23388:74;23510:42;23502:6;23498:55;23493:2;23482:9;23478:18;23471:83;23590:6;23585:2;23574:9;23570:18;23563:34;23633:3;23628:2;23617:9;23613:18;23606:31;23369:4;23654:46;23695:3;23684:9;23680:19;23672:6;23654:46;:::i;:::-;23646:54;23175:531;-1:-1:-1;;;;;;23175:531:1:o;23711:249::-;23780:6;23833:2;23821:9;23812:7;23808:23;23804:32;23801:52;;;23849:1;23846;23839:12;23801:52;23881:9;23875:16;23900:30;23924:5;23900:30;:::i;23965:184::-;24017:77;24014:1;24007:88;24114:4;24111:1;24104:15;24138:4;24135:1;24128:15
Swarm Source
ipfs://8143312d794e306ff3d17b41ddd8619f561fadaa20562c647d879787fce46082
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.