Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 15 from a total of 15 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17606145 | 421 days ago | IN | 0 ETH | 0.00075398 | ||||
Withdraw | 15889990 | 662 days ago | IN | 0 ETH | 0.00052375 | ||||
Mint | 15826692 | 671 days ago | IN | 0.008 ETH | 0.00270058 | ||||
Flip Mint State | 15819379 | 672 days ago | IN | 0 ETH | 0.0013125 | ||||
Flip Mint State | 15818449 | 672 days ago | IN | 0 ETH | 0.00120253 | ||||
Mint | 15818345 | 672 days ago | IN | 0.008 ETH | 0.00199197 | ||||
Mint | 15817191 | 672 days ago | IN | 0.016 ETH | 0.00164977 | ||||
Airdrop | 15816998 | 672 days ago | IN | 0.016 ETH | 0.00167907 | ||||
Airdrop | 15816993 | 672 days ago | IN | 0.016 ETH | 0.00145599 | ||||
Mint | 15815892 | 672 days ago | IN | 0.008 ETH | 0.00111186 | ||||
Withdraw | 15815533 | 672 days ago | IN | 0 ETH | 0.00031331 | ||||
Mint | 15815454 | 672 days ago | IN | 0.016 ETH | 0.00166255 | ||||
Flip Mint State | 15815438 | 672 days ago | IN | 0 ETH | 0.00043551 | ||||
Set Color Mappin... | 15815438 | 672 days ago | IN | 0 ETH | 0.05324728 | ||||
0x60e06040 | 15815425 | 672 days ago | IN | 0 ETH | 0.05062793 |
Loading...
Loading
Contract Name:
Phunkverse
Compiler Version
v0.8.16+commit.07a7930e
Optimization Enabled:
Yes with 2000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.8.0 <0.9.0; pragma abicoder v2; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "base64-sol/base64.sol"; import "./ERC721r.sol"; import "./utils/DynamicBuffer.sol"; import "./StringUtilsLib.sol"; import "hardhat/console.sol"; interface PunkDataInterface { function punkImage(uint16 index) external view returns (bytes memory); function punkAttributes(uint16 index) external view returns (string memory); } interface ExtendedPunkDataInterface { enum PunkAttributeType {SEX, HAIR, EYES, BEARD, EARS, LIPS, MOUTH, FACE, EMOTION, NECK, NOSE, CHEEKS, TEETH} enum PunkAttributeValue {NONE, ALIEN, APE, BANDANA, BEANIE, BIG_BEARD, BIG_SHADES, BLACK_LIPSTICK, BLONDE_BOB, BLONDE_SHORT, BLUE_EYE_SHADOW, BUCK_TEETH, CAP, CAP_FORWARD, CHINSTRAP, CHOKER, CIGARETTE, CLASSIC_SHADES, CLOWN_EYES_BLUE, CLOWN_EYES_GREEN, CLOWN_HAIR_GREEN, CLOWN_NOSE, COWBOY_HAT, CRAZY_HAIR, DARK_HAIR, DO_RAG, EARRING, EYE_MASK, EYE_PATCH, FEDORA, FEMALE, FRONT_BEARD, FRONT_BEARD_DARK, FROWN, FRUMPY_HAIR, GOAT, GOLD_CHAIN, GREEN_EYE_SHADOW, HALF_SHAVED, HANDLEBARS, HEADBAND, HOODIE, HORNED_RIM_GLASSES, HOT_LIPSTICK, KNITTED_CAP, LUXURIOUS_BEARD, MALE, MEDICAL_MASK, MESSY_HAIR, MOHAWK, MOHAWK_DARK, MOHAWK_THIN, MOLE, MUSTACHE, MUTTONCHOPS, NERD_GLASSES, NORMAL_BEARD, NORMAL_BEARD_BLACK, ORANGE_SIDE, PEAK_SPIKE, PIGTAILS, PILOT_HELMET, PINK_WITH_HAT, PIPE, POLICE_CAP, PURPLE_EYE_SHADOW, PURPLE_HAIR, PURPLE_LIPSTICK, RED_MOHAWK, REGULAR_SHADES, ROSY_CHEEKS, SHADOW_BEARD, SHAVED_HEAD, SILVER_CHAIN, SMALL_SHADES, SMILE, SPOTS, STRAIGHT_HAIR, STRAIGHT_HAIR_BLONDE, STRAIGHT_HAIR_DARK, STRINGY_HAIR, TASSLE_HAT, THREE_D_GLASSES, TIARA, TOP_HAT, VAMPIRE_HAIR, VAPE, VR, WELDING_GOGGLES, WILD_BLONDE, WILD_HAIR, WILD_WHITE_HAIR, ZOMBIE} function attrStringToEnumMapping(string memory) external view returns (ExtendedPunkDataInterface.PunkAttributeValue); function attrEnumToStringMapping(PunkAttributeValue) external view returns (string memory); function attrValueToTypeEnumMapping(PunkAttributeValue) external view returns (ExtendedPunkDataInterface.PunkAttributeType); } contract Phunkverse is Ownable, ERC721r { enum PunkAttributeType {SEX, HAIR, EYES, BEARD, EARS, LIPS, MOUTH, FACE, EMOTION, NECK, NOSE, CHEEKS, TEETH} enum PunkAttributeValue {NONE, ALIEN, APE, BANDANA, BEANIE, BIG_BEARD, BIG_SHADES, BLACK_LIPSTICK, BLONDE_BOB, BLONDE_SHORT, BLUE_EYE_SHADOW, BUCK_TEETH, CAP, CAP_FORWARD, CHINSTRAP, CHOKER, CIGARETTE, CLASSIC_SHADES, CLOWN_EYES_BLUE, CLOWN_EYES_GREEN, CLOWN_HAIR_GREEN, CLOWN_NOSE, COWBOY_HAT, CRAZY_HAIR, DARK_HAIR, DO_RAG, EARRING, EYE_MASK, EYE_PATCH, FEDORA, FEMALE, FRONT_BEARD, FRONT_BEARD_DARK, FROWN, FRUMPY_HAIR, GOAT, GOLD_CHAIN, GREEN_EYE_SHADOW, HALF_SHAVED, HANDLEBARS, HEADBAND, HOODIE, HORNED_RIM_GLASSES, HOT_LIPSTICK, KNITTED_CAP, LUXURIOUS_BEARD, MALE, MEDICAL_MASK, MESSY_HAIR, MOHAWK, MOHAWK_DARK, MOHAWK_THIN, MOLE, MUSTACHE, MUTTONCHOPS, NERD_GLASSES, NORMAL_BEARD, NORMAL_BEARD_BLACK, ORANGE_SIDE, PEAK_SPIKE, PIGTAILS, PILOT_HELMET, PINK_WITH_HAT, PIPE, POLICE_CAP, PURPLE_EYE_SHADOW, PURPLE_HAIR, PURPLE_LIPSTICK, RED_MOHAWK, REGULAR_SHADES, ROSY_CHEEKS, SHADOW_BEARD, SHAVED_HEAD, SILVER_CHAIN, SMALL_SHADES, SMILE, SPOTS, STRAIGHT_HAIR, STRAIGHT_HAIR_BLONDE, STRAIGHT_HAIR_DARK, STRINGY_HAIR, TASSLE_HAT, THREE_D_GLASSES, TIARA, TOP_HAT, VAMPIRE_HAIR, VAPE, VR, WELDING_GOGGLES, WILD_BLONDE, WILD_HAIR, WILD_WHITE_HAIR, ZOMBIE} struct Munk { uint16 id; PunkAttributeValue sex; PunkAttributeValue hair; PunkAttributeValue eyes; PunkAttributeValue beard; PunkAttributeValue ears; PunkAttributeValue lips; PunkAttributeValue mouth; PunkAttributeValue face; PunkAttributeValue emotion; PunkAttributeValue neck; PunkAttributeValue nose; PunkAttributeValue cheeks; PunkAttributeValue teeth; } using StringUtils for string; using Address for address; using DynamicBuffer for bytes; using Strings for *; uint public constant price = 0.008 ether; bool public isMintActive; bytes public constant externalLink = "https://phunkverse.com"; bool public contractSealed; bytes constant tokenDescription = "One of 10,000 on-chain Aliens from the Phunkverse, randomly facing Phunk or Punk. Inspired by the growing Phunkverse of dreamers and builders."; PunkDataInterface public immutable punkDataContract; ExtendedPunkDataInterface public immutable extendedPunkDataContract; mapping(string => string) public colorMapping; function setColorMapping(string[][] calldata _colorMapping) external onlyOwner unsealed { for (uint i; i < _colorMapping.length; ++i) { colorMapping[_colorMapping[i][0]] = _colorMapping[i][1]; } } modifier unsealed() { require(!contractSealed, "Contract sealed."); _; } function sealContract() external onlyOwner unsealed { contractSealed = true; } function flipMintState() external onlyOwner { isMintActive = !isMintActive; } constructor(address punkDataContractAddress, address extendedPunkDataContractAddress) ERC721r("Phunkverse", "PHNKVRS", 10_000) { punkDataContract = PunkDataInterface(punkDataContractAddress); extendedPunkDataContract = ExtendedPunkDataInterface(extendedPunkDataContractAddress); } function _internalMint(address toAddress, uint numTokens) private { require(msg.value == totalMintCost(numTokens), "Need exact payment"); require(isMintActive, "Mint is not active"); _mintRandom(toAddress, numTokens); } function airdrop(address toAddress, uint numTokens) external payable { _internalMint(toAddress, numTokens); } function mint(uint numTokens) external payable { _internalMint(msg.sender, numTokens); } function exists(uint tokenId) external view returns (bool) { return _exists(tokenId); } function tokenURI(uint256 id) public view override returns (string memory) { require(_exists(id), "Token does not exist"); return constructTokenURI(uint16(id)); } function constructTokenURI(uint16 tokenId) private view returns (string memory) { bytes memory svg = bytes(tokenImage(tokenId)); bytes memory title = abi.encodePacked("Phunkverse Punk #", tokenId.toString()); if (isPhunk(tokenId)){ title = abi.encodePacked("Phunkverse Phunk #", tokenId.toString()); } return string( abi.encodePacked( "data:application/json;base64,", Base64.encode( bytes( abi.encodePacked( '{', '"name":"', title, '",' '"description":"', tokenDescription, '",' '"image_data":"data:image/svg+xml;base64,', Base64.encode(svg), '",' '"external_url":"', externalLink, '",' '"attributes": ', punkAttributesAsJSON(tokenId), '}' ) ) ) ) ); } bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; function isPhunk(uint16 tokenId) internal view returns (bool) { if (uint(keccak256(abi.encodePacked(block.timestamp, msg.sender,tokenId))) % 2 == 0) {return true;} else {return false;} } function returnColor (uint16 tokenId) private view returns (bytes memory) { uint _color = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender,tokenId))) % 6; bytes memory _colorString = '5387D4'; if (_color == 0) { _colorString = '787F4D'; } else if (_color == 1) { _colorString = 'B01030'; } else if (_color == 2) { _colorString = '5387D4'; } else if (_color == 3) { _colorString = 'D59F23'; } else if (_color == 4) { _colorString = '884BAB'; } else if (_color == 5) { _colorString = '7D6041'; } else { _colorString = '5387d4'; } return _colorString; } function tokenImage(uint16 tokenId) public view returns (string memory) { bytes memory pixels = punkDataContract.punkImage(uint16(tokenId)); bytes memory svgBytes = DynamicBuffer.allocate(1024 * 128); if (isPhunk(tokenId)) {svgBytes.appendSafe('<svg width="1200" height="1200" shape-rendering="crispEdges" xmlns="http://www.w3.org/2000/svg" version="1.2" viewBox="0 0 24 24" style="-moz-transform: scaleX(-1); -o-transform: scaleX(-1); -webkit-transform: scaleX(-1); transform: scaleX(-1);"><style>rect{width:1px;height:1px}</style><defs><filter id="roughpaper"><feTurbulence type="fractalNoise" baseFrequency="50" numOctaves="2" /><feBlend in="SourceGraphic" mode="multiply" /></filter></defs>');} else {svgBytes.appendSafe('<svg width="1200" height="1200" shape-rendering="crispEdges" xmlns="http://www.w3.org/2000/svg" version="1.2" viewBox="0 0 24 24"><style>rect{width:1px;height:1px}</style><defs><filter id="roughpaper"><feTurbulence type="fractalNoise" baseFrequency="50" numOctaves="2" /><feBlend in="SourceGraphic" mode="multiply" /></filter></defs>');} svgBytes.appendSafe('<g filter="url(#roughpaper)"><rect x="0" y="0" style="width:100%;height:100%" fill="#'); svgBytes.appendSafe(returnColor(tokenId)); svgBytes.appendSafe('"/>'); bytes memory buffer = new bytes(8); for (uint256 y = 0; y < 24; y++) { for (uint256 x = 0; x < 24; x++) { uint256 p = (y * 24 + x) * 4; if (uint8(pixels[p + 3]) > 0) { for (uint256 i = 0; i < 4; i++) { uint8 value = uint8(pixels[p + i]); buffer[i * 2 + 1] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; buffer[i * 2] = _HEX_SYMBOLS[value & 0xf]; } string memory newColor = colorMapping[string(buffer)]; svgBytes.appendSafe( abi.encodePacked( '<rect x="', x.toString(), '" y="', y.toString(), '" fill="#', newColor, '"/>' ) ); } } } svgBytes.appendSafe('</g>'); svgBytes.appendSafe('</svg>'); return string(svgBytes); } address constant conceptAddress = 0xbAEfD9E4ACB25de5124C08cEd07DB14D6cBeD005; function withdraw() external { require(address(this).balance > 0, "Nothing to withdraw"); uint conceptShare = address(this).balance; Address.sendValue(payable(conceptAddress), conceptShare); } function totalMintCost(uint numTokens) public pure returns (uint) { return numTokens * price; } function initializePunk(uint16 punkId) private view returns (Munk memory) { Munk memory phunk = Munk({ id: punkId, sex: PunkAttributeValue.NONE, hair: PunkAttributeValue.NONE, eyes: PunkAttributeValue.NONE, beard: PunkAttributeValue.NONE, ears: PunkAttributeValue.NONE, lips: PunkAttributeValue.NONE, mouth: PunkAttributeValue.NONE, face: PunkAttributeValue.NONE, emotion: PunkAttributeValue.NONE, neck: PunkAttributeValue.NONE, nose: PunkAttributeValue.NONE, cheeks: PunkAttributeValue.NONE, teeth: PunkAttributeValue.NONE }); phunk.id = punkId; string memory attributes = punkDataContract.punkAttributes(phunk.id); string[] memory attributeArray = attributes.split(","); for (uint i = 0; i < attributeArray.length; i++) { string memory untrimmedAttribute = attributeArray[i]; string memory trimmedAttribute; if (i < 1) { trimmedAttribute = untrimmedAttribute.split(' ')[0]; } else { trimmedAttribute = untrimmedAttribute._substring(int(bytes(untrimmedAttribute).length - 1), 1); } PunkAttributeValue attrValue = PunkAttributeValue(uint(extendedPunkDataContract.attrStringToEnumMapping(trimmedAttribute))); PunkAttributeType attrType = PunkAttributeType(uint(extendedPunkDataContract.attrValueToTypeEnumMapping(ExtendedPunkDataInterface.PunkAttributeValue(uint(attrValue))))); if (attrType == PunkAttributeType.SEX) { phunk.sex = attrValue; } else if (attrType == PunkAttributeType.HAIR) { phunk.hair = attrValue; } else if (attrType == PunkAttributeType.EYES) { phunk.eyes = attrValue; } else if (attrType == PunkAttributeType.BEARD) { phunk.beard = attrValue; } else if (attrType == PunkAttributeType.EARS) { phunk.ears = attrValue; } else if (attrType == PunkAttributeType.LIPS) { phunk.lips = attrValue; } else if (attrType == PunkAttributeType.MOUTH) { phunk.mouth = attrValue; } else if (attrType == PunkAttributeType.FACE) { phunk.face = attrValue; } else if (attrType == PunkAttributeType.EMOTION) { phunk.emotion = attrValue; } else if (attrType == PunkAttributeType.NECK) { phunk.neck = attrValue; } else if (attrType == PunkAttributeType.NOSE) { phunk.nose = attrValue; } else if (attrType == PunkAttributeType.CHEEKS) { phunk.cheeks = attrValue; } else if (attrType == PunkAttributeType.TEETH) { phunk.teeth = attrValue; } } return phunk; } function punkAttributeCount(Munk memory phunk) public pure returns (uint totalCount) { PunkAttributeValue[13] memory attrArray = [ phunk.sex, phunk.hair, phunk.eyes, phunk.beard, phunk.ears, phunk.lips, phunk.mouth, phunk.face, phunk.emotion, phunk.neck, phunk.nose, phunk.cheeks, phunk.teeth ]; for (uint i = 0; i < 13; ++i) { if (attrArray[i] != PunkAttributeValue.NONE) { totalCount++; } } } function punkAttributesAsJSON(uint16 punkId) public view returns (string memory json) { Munk memory phunk = initializePunk(punkId); PunkAttributeValue none = PunkAttributeValue.NONE; bytes memory outputBytes = DynamicBuffer.allocate(1024 * 64); outputBytes.appendSafe("["); outputBytes.appendSafe('{"trait_type":"Facing", "value":"'); if (isPhunk(punkId)){outputBytes.appendSafe(bytes("Phunk"));} else {outputBytes.appendSafe(bytes("Punk"));} outputBytes.appendSafe('"},'); PunkAttributeValue[13] memory attrArray = [ phunk.sex, phunk.hair, phunk.eyes, phunk.beard, phunk.ears, phunk.lips, phunk.mouth, phunk.face, phunk.emotion, phunk.neck, phunk.nose, phunk.cheeks, phunk.teeth ]; uint attrCount = punkAttributeCount(phunk); uint attrsCounted; for (uint i; i < 13; ++i) { PunkAttributeValue attrVal = attrArray[i]; if (attrVal != none) { attrsCounted++; outputBytes.appendSafe(bytes(punkAttributeAsJSON(attrVal))); if (attrsCounted < attrCount) { outputBytes.appendSafe(","); } } } return string(abi.encodePacked(outputBytes, "]")); } function punkAttributeAsJSON(PunkAttributeValue attribute) internal view returns (string memory json) { require(attribute != PunkAttributeValue.NONE); string memory attributeAsString = extendedPunkDataContract.attrEnumToStringMapping(ExtendedPunkDataInterface.PunkAttributeValue(uint(attribute))); string memory attributeTypeAsString; PunkAttributeType attrType = PunkAttributeType( uint( extendedPunkDataContract.attrValueToTypeEnumMapping( ExtendedPunkDataInterface.PunkAttributeValue( uint( attribute ))))); if (attrType == PunkAttributeType.SEX) { attributeTypeAsString = "Sex"; } else if (attrType == PunkAttributeType.HAIR) { attributeTypeAsString = "Hair"; } else if (attrType == PunkAttributeType.EYES) { attributeTypeAsString = "Eyes"; } else if (attrType == PunkAttributeType.BEARD) { attributeTypeAsString = "Beard"; } else if (attrType == PunkAttributeType.EARS) { attributeTypeAsString = "Ears"; } else if (attrType == PunkAttributeType.LIPS) { attributeTypeAsString = "Lips"; } else if (attrType == PunkAttributeType.MOUTH) { attributeTypeAsString = "Mouth"; } else if (attrType == PunkAttributeType.FACE) { attributeTypeAsString = "Face"; } else if (attrType == PunkAttributeType.EMOTION) { attributeTypeAsString = "Emotion"; } else if (attrType == PunkAttributeType.NECK) { attributeTypeAsString = "Neck"; } else if (attrType == PunkAttributeType.NOSE) { attributeTypeAsString = "Nose"; } else if (attrType == PunkAttributeType.CHEEKS) { attributeTypeAsString = "Cheeks"; } else if (attrType == PunkAttributeType.TEETH) { attributeTypeAsString = "Teeth"; } return string(abi.encodePacked('{"trait_type":"', attributeTypeAsString, '", "value":"', attributeAsString, '"}')); } function walletOfOwner(address _owner) external view returns (uint16[] memory) { uint ownerTokenCount = balanceOf(_owner); uint16[] memory ownedTokenIds = new uint16[](ownerTokenCount); uint currentTokenId = 0; uint ownedTokenIndex = 0; while (ownedTokenIndex < ownerTokenCount && currentTokenId < maxSupply()) { address currentTokenOwner = _exists(currentTokenId) ? ownerOf(currentTokenId) : address(0); if (currentTokenOwner == _owner) { ownedTokenIds[ownedTokenIndex] = uint16(currentTokenId); ownedTokenIndex++; } currentTokenId++; } return ownedTokenIds; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension. This does random batch minting. */ contract ERC721r is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; mapping(uint => uint) private _availableTokens; uint256 private _numAvailableTokens; uint256 immutable _maxSupply; // 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_, uint maxSupply_) { _name = name_; _symbol = symbol_; _maxSupply = maxSupply_; _numAvailableTokens = maxSupply_; } /** * @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); } function totalSupply() public view virtual returns (uint256) { return _maxSupply - _numAvailableTokens; } function maxSupply() public view virtual returns (uint256) { return _maxSupply; } /** * @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 overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721r.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 { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: 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 = ERC721r.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _mintIdWithoutBalanceUpdate(address to, uint256 tokenId) private { _beforeTokenTransfer(address(0), to, tokenId); _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } function _mintRandom(address to, uint _numToMint) internal virtual { require(_msgSender() == tx.origin, "Contracts cannot mint"); require(to != address(0), "ERC721: mint to the zero address"); require(_numToMint > 0, "ERC721r: need to mint at least one token"); // TODO: Probably don't need this as it will underflow and revert automatically in this case require(_numAvailableTokens >= _numToMint, "ERC721r: minting more tokens than available"); uint updatedNumAvailableTokens = _numAvailableTokens; for (uint256 i; i < _numToMint; ++i) { // Do this ++ unchecked? uint256 tokenId = getRandomAvailableTokenId(to, updatedNumAvailableTokens); _mintIdWithoutBalanceUpdate(to, tokenId); --updatedNumAvailableTokens; } _numAvailableTokens = updatedNumAvailableTokens; _balances[to] += _numToMint; } function getRandomAvailableTokenId(address to, uint updatedNumAvailableTokens) internal returns (uint256) { uint256 randomNum = uint256( keccak256( abi.encode( to, tx.gasprice, block.number, block.timestamp, block.difficulty, blockhash(block.number - 1), address(this), updatedNumAvailableTokens ) ) ); uint256 randomIndex = randomNum % updatedNumAvailableTokens; return getAvailableTokenAtIndex(randomIndex, updatedNumAvailableTokens); } // Implements https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle. Code taken from CryptoPhunksV2 function getAvailableTokenAtIndex(uint256 indexToUse, uint updatedNumAvailableTokens) internal returns (uint256) { uint256 valAtIndex = _availableTokens[indexToUse]; uint256 result; if (valAtIndex == 0) { // This means the index itself is still an available token result = indexToUse; } else { // This means the index itself is not an available token, but the val at that index is. result = valAtIndex; } uint256 lastIndex = updatedNumAvailableTokens - 1; if (indexToUse != lastIndex) { // Replace the value at indexToUse, now that it's been used. // Replace it with the data from the last index in the array, since we are going to decrease the array size afterwards. uint256 lastValInArray = _availableTokens[lastIndex]; if (lastValInArray == 0) { // This means the index itself is still an available token _availableTokens[indexToUse] = lastIndex; } else { // This means the index itself is not an available token, but the val at that index is. _availableTokens[indexToUse] = lastValInArray; // Gas refund courtsey of @dievardump delete _availableTokens[lastIndex]; } } return result; } // Not as good as minting a specific tokenId, but will behave the same at the start // allowing you to explicitly mint some tokens at launch. function _mintAtIndex(address to, uint index) internal virtual { require(_msgSender() == tx.origin, "Contracts cannot mint"); require(to != address(0), "ERC721: mint to the zero address"); require(_numAvailableTokens >= 1, "ERC721r: minting more tokens than available"); uint tokenId = getAvailableTokenAtIndex(index, _numAvailableTokens); --_numAvailableTokens; _mintIdWithoutBalanceUpdate(to, tokenId); _balances[to] += 1; } /** * @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(ERC721r.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721r.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
pragma solidity ^0.8.0; /** * Strings Library * * In summary this is a simple library of string functions which make simple * string operations less tedious in solidity. * * Please be aware these functions can be quite gas heavy so use them only when * necessary not to clog the blockchain with expensive transactions. * * @author James Lockhart <[email protected]> */ library StringUtils { /** * Concat (High gas cost) * * Appends two strings together and returns a new value * * @param _base When being used for a data type this is the extended object * otherwise this is the string which will be the concatenated * prefix * @param _value The value to be the concatenated suffix * @return string The resulting string from combinging the base and value */ function concat(string memory _base, string memory _value) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); assert(_valueBytes.length > 0); string memory _tmpValue = new string(_baseBytes.length + _valueBytes.length); bytes memory _newValue = bytes(_tmpValue); uint i; uint j; for (i = 0; i < _baseBytes.length; i++) { _newValue[j++] = _baseBytes[i]; } for (i = 0; i < _valueBytes.length; i++) { _newValue[j++] = _valueBytes[i]; } return string(_newValue); } /** * Index Of * * Locates and returns the position of a character within a string * * @param _base When being used for a data type this is the extended object * otherwise this is the string acting as the haystack to be * searched * @param _value The needle to search for, at present this is currently * limited to one character * @return int The position of the needle starting from 0 and returning -1 * in the case of no matches found */ function indexOf(string memory _base, string memory _value) internal pure returns (int) { return _indexOf(_base, _value, 0); } /** * Index Of * * Locates and returns the position of a character within a string starting * from a defined offset * * @param _base When being used for a data type this is the extended object * otherwise this is the string acting as the haystack to be * searched * @param _value The needle to search for, at present this is currently * limited to one character * @param _offset The starting point to start searching from which can start * from 0, but must not exceed the length of the string * @return int The position of the needle starting from 0 and returning -1 * in the case of no matches found */ function _indexOf(string memory _base, string memory _value, uint _offset) internal pure returns (int) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); assert(_valueBytes.length == 1); for (uint i = _offset; i < _baseBytes.length; i++) { if (_baseBytes[i] == _valueBytes[0]) { return int(i); } } return -1; } /** * Length * * Returns the length of the specified string * * @param _base When being used for a data type this is the extended object * otherwise this is the string to be measured * @return uint The length of the passed string */ function length(string memory _base) internal pure returns (uint) { bytes memory _baseBytes = bytes(_base); return _baseBytes.length; } /** * Sub String * * Extracts the beginning part of a string based on the desired length * * @param _base When being used for a data type this is the extended object * otherwise this is the string that will be used for * extracting the sub string from * @param _length The length of the sub string to be extracted from the base * @return string The extracted sub string */ function substring(string memory _base, int _length) internal pure returns (string memory) { return _substring(_base, _length, 0); } /** * Sub String * * Extracts the part of a string based on the desired length and offset. The * offset and length must not exceed the lenth of the base string. * * @param _base When being used for a data type this is the extended object * otherwise this is the string that will be used for * extracting the sub string from * @param _length The length of the sub string to be extracted from the base * @param _offset The starting point to extract the sub string from * @return string The extracted sub string */ function _substring(string memory _base, int _length, int _offset) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); assert(uint(_offset + _length) <= _baseBytes.length); string memory _tmp = new string(uint(_length)); bytes memory _tmpBytes = bytes(_tmp); uint j = 0; for (uint i = uint(_offset); i < uint(_offset + _length); i++) { _tmpBytes[j++] = _baseBytes[i]; } return string(_tmpBytes); } function split(string memory _base, string memory _value) internal pure returns (string[] memory splitArr) { bytes memory _baseBytes = bytes(_base); uint _offset = 0; uint _splitsCount = 1; while (_offset < _baseBytes.length - 1) { int _limit = _indexOf(_base, _value, _offset); if (_limit == -1) break; else { _splitsCount++; _offset = uint(_limit) + 1; } } splitArr = new string[](_splitsCount); _offset = 0; _splitsCount = 0; while (_offset < _baseBytes.length - 1) { int _limit = _indexOf(_base, _value, _offset); if (_limit == - 1) { _limit = int(_baseBytes.length); } string memory _tmp = new string(uint(_limit) - _offset); bytes memory _tmpBytes = bytes(_tmp); uint j = 0; for (uint i = _offset; i < uint(_limit); i++) { _tmpBytes[j++] = _baseBytes[i]; } _offset = uint(_limit) + 1; splitArr[_splitsCount++] = string(_tmpBytes); } return splitArr; } /** * Compare To * * Compares the characters of two strings, to ensure that they have an * identical footprint * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to compare against * @param _value The string the base is being compared to * @return bool Simply notates if the two string have an equivalent */ function compareTo(string memory _base, string memory _value) internal pure returns (bool) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); if (_baseBytes.length != _valueBytes.length) { return false; } for (uint i = 0; i < _baseBytes.length; i++) { if (_baseBytes[i] != _valueBytes[i]) { return false; } } return true; } /** * Compare To Ignore Case (High gas cost) * * Compares the characters of two strings, converting them to the same case * where applicable to alphabetic characters to distinguish if the values * match. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to compare against * @param _value The string the base is being compared to * @return bool Simply notates if the two string have an equivalent value * discarding case */ function compareToIgnoreCase(string memory _base, string memory _value) internal pure returns (bool) { bytes memory _baseBytes = bytes(_base); bytes memory _valueBytes = bytes(_value); if (_baseBytes.length != _valueBytes.length) { return false; } for (uint i = 0; i < _baseBytes.length; i++) { if (_baseBytes[i] != _valueBytes[i] && _upper(_baseBytes[i]) != _upper(_valueBytes[i])) { return false; } } return true; } /** * Upper * * Converts all the values of a string to their corresponding upper case * value. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to convert to upper case * @return string */ function upper(string memory _base) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { _baseBytes[i] = _upper(_baseBytes[i]); } return string(_baseBytes); } /** * Lower * * Converts all the values of a string to their corresponding lower case * value. * * @param _base When being used for a data type this is the extended object * otherwise this is the string base to convert to lower case * @return string */ function lower(string memory _base) internal pure returns (string memory) { bytes memory _baseBytes = bytes(_base); for (uint i = 0; i < _baseBytes.length; i++) { _baseBytes[i] = _lower(_baseBytes[i]); } return string(_baseBytes); } /** * Upper * * Convert an alphabetic character to upper case and return the original * value when not alphabetic * * @param _b1 The byte to be converted to upper case * @return bytes1 The converted value if the passed value was alphabetic * and in a lower case otherwise returns the original value */ function _upper(bytes1 _b1) private pure returns (bytes1) { if (_b1 >= 0x61 && _b1 <= 0x7A) { return bytes1(uint8(_b1) - 32); } return _b1; } /** * Lower * * Convert an alphabetic character to lower case and return the original * value when not alphabetic * * @param _b1 The byte to be converted to lower case * @return bytes1 The converted value if the passed value was alphabetic * and in a upper case otherwise returns the original value */ function _lower(bytes1 _b1) private pure returns (bytes1) { if (_b1 >= 0x41 && _b1 <= 0x5A) { return bytes1(uint8(_b1) + 32); } return _b1; } }
// SPDX-License-Identifier: MIT // Copyright (c) 2021 the ethier authors (github.com/divergencetech/ethier) pragma solidity >=0.8.0; /// @title DynamicBuffer /// @author David Huber (@cxkoda) and Simon Fremaux (@dievardump). See also /// https://raw.githubusercontent.com/dievardump/solidity-dynamic-buffer /// @notice This library is used to allocate a big amount of container memory // which will be subsequently filled without needing to reallocate /// memory. /// @dev First, allocate memory. /// Then use `buffer.appendUnchecked(theBytes)` or `appendSafe()` if /// bounds checking is required. library DynamicBuffer { /// @notice Allocates container space for the DynamicBuffer /// @param capacity The intended max amount of bytes in the buffer /// @return buffer The memory location of the buffer /// @dev Allocates `capacity + 0x60` bytes of space /// The buffer array starts at the first container data position, /// (i.e. `buffer = container + 0x20`) function allocate(uint256 capacity) internal pure returns (bytes memory buffer) { assembly { // Get next-free memory address let container := mload(0x40) // Allocate memory by setting a new next-free address { // Add 2 x 32 bytes in size for the two length fields // Add 32 bytes safety space for 32B chunked copy let size := add(capacity, 0x60) let newNextFree := add(container, size) mstore(0x40, newNextFree) } // Set the correct container length { let length := add(capacity, 0x40) mstore(container, length) } // The buffer starts at idx 1 in the container (0 is length) buffer := add(container, 0x20) // Init content with length 0 mstore(buffer, 0) } return buffer; } /// @notice Appends data to buffer, and update buffer length /// @param buffer the buffer to append the data to /// @param data the data to append /// @dev Does not perform out-of-bound checks (container capacity) /// for efficiency. function appendUnchecked(bytes memory buffer, bytes memory data) internal pure { assembly { let length := mload(data) for { data := add(data, 0x20) let dataEnd := add(data, length) let copyTo := add(buffer, add(mload(buffer), 0x20)) } lt(data, dataEnd) { data := add(data, 0x20) copyTo := add(copyTo, 0x20) } { // Copy 32B chunks from data to buffer. // This may read over data array boundaries and copy invalid // bytes, which doesn't matter in the end since we will // later set the correct buffer length, and have allocated an // additional word to avoid buffer overflow. mstore(copyTo, mload(data)) } // Update buffer length mstore(buffer, add(mload(buffer), length)) } } /// @notice Appends data to buffer, and update buffer length /// @param buffer the buffer to append the data to /// @param data the data to append /// @dev Performs out-of-bound checks and calls `appendUnchecked`. function appendSafe(bytes memory buffer, bytes memory data) internal pure { uint256 capacity; uint256 length; assembly { capacity := sub(mload(sub(buffer, 0x20)), 0x40) length := mload(buffer) } require( length + data.length <= capacity, "DynamicBuffer: Appending out of bounds." ); appendUnchecked(buffer, data); } }
// SPDX-License-Identifier: MIT pragma solidity >= 0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67); function _sendLogPayload(bytes memory payload) private view { uint256 payloadLength = payload.length; address consoleAddress = CONSOLE_ADDRESS; assembly { let payloadStart := add(payload, 32) let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0) } } function log() internal view { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal view { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal view { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0; /// @title Base64 /// @author Brecht Devos - <[email protected]> /// @notice Provides functions for encoding/decoding base64 library Base64 { string internal constant TABLE_ENCODE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; bytes internal constant TABLE_DECODE = hex"0000000000000000000000000000000000000000000000000000000000000000" hex"00000000000000000000003e0000003f3435363738393a3b3c3d000000000000" hex"00000102030405060708090a0b0c0d0e0f101112131415161718190000000000" hex"001a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132330000000000"; function encode(bytes memory data) internal pure returns (string memory) { if (data.length == 0) return ''; // load the table into memory string memory table = TABLE_ENCODE; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((data.length + 2) / 3); // add some extra buffer at the end required for the writing string memory result = new string(encodedLen + 32); assembly { // set the actual output length mstore(result, encodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 3 bytes at a time for {} lt(dataPtr, endPtr) {} { // read 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // write 4 characters mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and(shr( 6, input), 0x3F)))) resultPtr := add(resultPtr, 1) mstore8(resultPtr, mload(add(tablePtr, and( input, 0x3F)))) resultPtr := add(resultPtr, 1) } // padding with '=' switch mod(mload(data), 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } } return result; } function decode(string memory _data) internal pure returns (bytes memory) { bytes memory data = bytes(_data); if (data.length == 0) return new bytes(0); require(data.length % 4 == 0, "invalid base64 decoder input"); // load the table into memory bytes memory table = TABLE_DECODE; // every 4 characters represent 3 bytes uint256 decodedLen = (data.length / 4) * 3; // add some extra buffer at the end required for the writing bytes memory result = new bytes(decodedLen + 32); assembly { // padding with '=' let lastBytes := mload(add(data, mload(data))) if eq(and(lastBytes, 0xFF), 0x3d) { decodedLen := sub(decodedLen, 1) if eq(and(lastBytes, 0xFFFF), 0x3d3d) { decodedLen := sub(decodedLen, 1) } } // set the actual output length mstore(result, decodedLen) // prepare the lookup table let tablePtr := add(table, 1) // input ptr let dataPtr := data let endPtr := add(dataPtr, mload(data)) // result ptr, jump over length let resultPtr := add(result, 32) // run over the input, 4 characters at a time for {} lt(dataPtr, endPtr) {} { // read 4 characters dataPtr := add(dataPtr, 4) let input := mload(dataPtr) // write 3 bytes let output := add( add( shl(18, and(mload(add(tablePtr, and(shr(24, input), 0xFF))), 0xFF)), shl(12, and(mload(add(tablePtr, and(shr(16, input), 0xFF))), 0xFF))), add( shl( 6, and(mload(add(tablePtr, and(shr( 8, input), 0xFF))), 0xFF)), and(mload(add(tablePtr, and( input , 0xFF))), 0xFF) ) ) mstore(resultPtr, shl(232, output)) resultPtr := add(resultPtr, 3) } } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": true, "runs": 2000, "details": { "yul": true, "yulDetails": { "stackAllocation": true, "optimizerSteps": "dhfoDgvulfnTUtnIf" } } }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"punkDataContractAddress","type":"address"},{"internalType":"address","name":"extendedPunkDataContractAddress","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":[{"internalType":"address","name":"toAddress","type":"address"},{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"payable","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":[{"internalType":"string","name":"","type":"string"}],"name":"colorMapping","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extendedPunkDataContract","outputs":[{"internalType":"contract ExtendedPunkDataInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"externalLink","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum Phunkverse.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct Phunkverse.Munk","name":"phunk","type":"tuple"}],"name":"punkAttributeCount","outputs":[{"internalType":"uint256","name":"totalCount","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"punkId","type":"uint16"}],"name":"punkAttributesAsJSON","outputs":[{"internalType":"string","name":"json","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"punkDataContract","outputs":[{"internalType":"contract PunkDataInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":[],"name":"sealContract","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":"_colorMapping","type":"string[][]"}],"name":"setColorMapping","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":"uint16","name":"tokenId","type":"uint16"}],"name":"tokenImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"totalMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60e06040523480156200001157600080fd5b5060405162005edc38038062005edc833981016040819052620000349162000162565b6040518060400160405280600a8152602001695068756e6b766572736560b01b8152506040518060400160405280600781526020016650484e4b56525360c81b815250612710620000946200008e620000d460201b60201c565b620000d8565b6001620000a28482620002b8565b506002620000b18382620002b8565b50608081905260045550506001600160a01b0391821660a0521660c05262000384565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b620001468162000128565b81146200015257600080fd5b50565b805162000135816200013b565b600080604083850312156200017a576200017a600080fd5b600062000188858562000155565b92505060206200019b8582860162000155565b9150509250929050565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052602260045260246000fd5b600281046001821680620001e657607f821691505b602082108103620001fb57620001fb620001bb565b50919050565b6000620001356200020f8381565b90565b6200021d8362000201565b81546008840282811b60001990911b908116901990911617825550505050565b60006200024c81848462000212565b505050565b818110156200027057620002676000826200023d565b60010162000251565b5050565b601f8211156200024c576000818152602090206020601f850104810160208510156200029d5750805b620002b16020601f86010483018262000251565b5050505050565b81516001600160401b03811115620002d457620002d4620001a5565b620002e08254620001d1565b620002ed82828562000274565b506020601f8211600181146200032557600083156200030c5750848201515b600019600885021c1981166002850217855550620002b1565b600084815260208120601f198516915b8281101562000357578785015182556020948501946001909201910162000335565b5084821015620003755783870151600019601f87166008021c191681555b50505050600202600101905550565b60805160a05160c051615af0620003ec600039600081816103b501528181611eb501528181611f53015281816123bf01526124780152600081816103740152818161154b0152611d090152600081816106f201528181610f7101526110930152615af06000f3fe6080604052600436106102695760003560e01c80635b9db89811610153578063a035b1fe116100cb578063b88d4fde1161007f578063d5abeb0111610064578063d5abeb01146106e3578063e985e9c514610716578063f2fde38b1461075f57600080fd5b8063b88d4fde146106a3578063c87b56dd146106c357600080fd5b8063a22cb465116100b0578063a22cb46514610644578063b5b949d214610664578063b65016371461068457600080fd5b8063a035b1fe14610616578063a0712d681461063157600080fd5b8063715018a6116101225780638da5cb5b116101075780638da5cb5b146105c357806395d89b41146105e15780639896ed11146105f657600080fd5b8063715018a61461059b5780638ba4cc3c146105b057600080fd5b80635b9db898146104fd5780636352211e1461054657806368bd580e1461056657806370a082311461057b57600080fd5b806318160ddd116101e6578063438b6300116101b55780634f558e791161019a5780634f558e79146104ae57806359c74f29146104ce5780635b92ac0d146104e357600080fd5b8063438b6300146104615780634f02f4d21461048e57600080fd5b806318160ddd146103f757806323b872dd1461040c5780633ccfd60b1461042c57806342842e0e1461044157600080fd5b8063081812fc1161023d5780630f5a9f89116102225780630f5a9f8914610362578063137fee32146103a357806314dbd3d8146103d757600080fd5b8063081812fc14610313578063095ea7b31461034057600080fd5b806270cb321461026e57806301ffc9a7146102a4578063023abe2b146102d157806306fdde03146102fe575b600080fd5b34801561027a57600080fd5b5061028e610289366004613c66565b61077f565b60405161029b9190613c8f565b60405180910390f35b3480156102b057600080fd5b506102c46102bf366004613cd0565b610798565b60405161029b9190613cf9565b3480156102dd57600080fd5b506102f16102ec366004613d1c565b61087b565b60405161029b9190613d93565b34801561030a57600080fd5b506102f1610d37565b34801561031f57600080fd5b5061033361032e366004613c66565b610dc9565b60405161029b9190613dbe565b34801561034c57600080fd5b5061036061035b366004613de0565b610e22565b005b34801561036e57600080fd5b506103967f000000000000000000000000000000000000000000000000000000000000000081565b60405161029b9190613e5f565b3480156103af57600080fd5b506103967f000000000000000000000000000000000000000000000000000000000000000081565b3480156103e357600080fd5b506102f16103f2366004613f5b565b610ec5565b34801561040357600080fd5b5061028e610f6a565b34801561041857600080fd5b50610360610427366004613f96565b610f9f565b34801561043857600080fd5b50610360610fd0565b34801561044d57600080fd5b5061036061045c366004613f96565b611012565b34801561046d57600080fd5b5061048161047c366004613fe6565b61102d565b60405161029b919061406f565b34801561049a57600080fd5b5061028e6104a93660046141c1565b611152565b3480156104ba57600080fd5b506102c46104c9366004613c66565b611402565b3480156104da57600080fd5b50610360611421565b3480156104ef57600080fd5b506009546102c49060ff1681565b34801561050957600080fd5b506102f16040518060400160405280601681526020017f68747470733a2f2f7068756e6b76657273652e636f6d0000000000000000000081525081565b34801561055257600080fd5b50610333610561366004613c66565b61143d565b34801561057257600080fd5b50610360611472565b34801561058757600080fd5b5061028e610596366004613fe6565b6114d0565b3480156105a757600080fd5b50610360611514565b6103606105be366004613de0565b611528565b3480156105cf57600080fd5b506000546001600160a01b0316610333565b3480156105ed57600080fd5b506102f1611536565b34801561060257600080fd5b506102f1610611366004613d1c565b611545565b34801561062257600080fd5b5061028e661c6bf52634000081565b61036061063f366004613c66565b611a1f565b34801561065057600080fd5b5061036061065f3660046141f6565b611a29565b34801561067057600080fd5b5061036061067f36600461427b565b611a34565b34801561069057600080fd5b506009546102c490610100900460ff1681565b3480156106af57600080fd5b506103606106be3660046142c3565b611b39565b3480156106cf57600080fd5b506102f16106de366004613c66565b611b71565b3480156106ef57600080fd5b507f000000000000000000000000000000000000000000000000000000000000000061028e565b34801561072257600080fd5b506102c4610731366004614342565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561076b57600080fd5b5061036061077a366004613fe6565b611bb1565b6000610792661c6bf5263400008361438b565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061082b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061079257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610792565b6060600061088883611be8565b6040805162010060810190915262010040815260006020909101818152919250906108f16040518060400160405280600181526020017f5b00000000000000000000000000000000000000000000000000000000000000815250826122e090919063ffffffff16565b610914604051806060016040528060218152602001615a9a6021913982906122e0565b61091d85612343565b156109665760408051808201909152600581527f5068756e6b00000000000000000000000000000000000000000000000000000060208201526109619082906122e0565b6109a5565b60408051808201909152600481527f50756e6b0000000000000000000000000000000000000000000000000000000060208201526109a59082906122e0565b60408051808201909152600381527f227d2c000000000000000000000000000000000000000000000000000000000060208201526109e49082906122e0565b6000604051806101a001604052808560200151605c811115610a0857610a086143aa565b605c811115610a1957610a196143aa565b81526020018560400151605c811115610a3457610a346143aa565b605c811115610a4557610a456143aa565b81526020018560600151605c811115610a6057610a606143aa565b605c811115610a7157610a716143aa565b81526020018560800151605c811115610a8c57610a8c6143aa565b605c811115610a9d57610a9d6143aa565b81526020018560a00151605c811115610ab857610ab86143aa565b605c811115610ac957610ac96143aa565b81526020018560c00151605c811115610ae457610ae46143aa565b605c811115610af557610af56143aa565b81526020018560e00151605c811115610b1057610b106143aa565b605c811115610b2157610b216143aa565b8152602001856101000151605c811115610b3d57610b3d6143aa565b605c811115610b4e57610b4e6143aa565b8152602001856101200151605c811115610b6a57610b6a6143aa565b605c811115610b7b57610b7b6143aa565b8152602001856101400151605c811115610b9757610b976143aa565b605c811115610ba857610ba86143aa565b8152602001856101600151605c811115610bc457610bc46143aa565b605c811115610bd557610bd56143aa565b8152602001856101800151605c811115610bf157610bf16143aa565b605c811115610c0257610c026143aa565b8152602001856101a00151605c811115610c1e57610c1e6143aa565b605c811115610c2f57610c2f6143aa565b905290506000610c3e85611152565b90506000805b600d811015610d095760008482600d8110610c6157610c616143c0565b6020020151905086605c811115610c7a57610c7a6143aa565b81605c811115610c8c57610c8c6143aa565b14610cf85782610c9b816143d6565b935050610cb1610caa8261239b565b87906122e0565b83831015610cf85760408051808201909152600181527f2c000000000000000000000000000000000000000000000000000000000000006020820152610cf89087906122e0565b50610d02816143d6565b9050610c44565b5083604051602001610d1b919061443c565b6040516020818303038152906040529650505050505050919050565b606060018054610d4690614467565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7290614467565b8015610dbf5780601f10610d9457610100808354040283529160200191610dbf565b820191906000526020600020905b815481529060010190602001808311610da257829003601f168201915b5050505050905090565b6000818152600560205260408120546001600160a01b0316610e065760405162461bcd60e51b8152600401610dfd906144ed565b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610e2d8261143d565b9050806001600160a01b0316836001600160a01b031603610e605760405162461bcd60e51b8152600401610dfd90614555565b336001600160a01b0382161480610e9a57506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610eb65760405162461bcd60e51b8152600401610dfd906145bd565b610ec083836129cf565b505050565b8051602081830181018051600a8252928201919093012091528054610ee990614467565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1590614467565b8015610f625780601f10610f3757610100808354040283529160200191610f62565b820191906000526020600020905b815481529060010190602001808311610f4557829003601f168201915b505050505081565b60006004547f0000000000000000000000000000000000000000000000000000000000000000610f9a91906145cd565b905090565b610fa93382612a4a565b610fc55760405162461bcd60e51b8152600401610dfd90614638565b610ec0838383612afc565b60004711610ff05760405162461bcd60e51b8152600401610dfd9061467a565b4761100f73baefd9e4acb25de5124c08ced07db14d6cbed00582612c2b565b50565b610ec083838360405180602001604052806000815250611b39565b6060600061103a836114d0565b905060008167ffffffffffffffff81111561105757611057613e6d565b604051908082528060200260200182016040528015611080578160200160208202803683370190505b5090506000805b83811080156110b557507f000000000000000000000000000000000000000000000000000000000000000082105b15611148576000828152600560205260408120546001600160a01b03166110dd5760006110e6565b6110e68361143d565b9050866001600160a01b0316816001600160a01b0316036111355782848381518110611114576111146143c0565b61ffff9092166020928302919091019091015281611131816143d6565b9250505b8261113f816143d6565b93505050611087565b5090949350505050565b600080604051806101a001604052808460200151605c811115611177576111776143aa565b605c811115611188576111886143aa565b81526020018460400151605c8111156111a3576111a36143aa565b605c8111156111b4576111b46143aa565b81526020018460600151605c8111156111cf576111cf6143aa565b605c8111156111e0576111e06143aa565b81526020018460800151605c8111156111fb576111fb6143aa565b605c81111561120c5761120c6143aa565b81526020018460a00151605c811115611227576112276143aa565b605c811115611238576112386143aa565b81526020018460c00151605c811115611253576112536143aa565b605c811115611264576112646143aa565b81526020018460e00151605c81111561127f5761127f6143aa565b605c811115611290576112906143aa565b8152602001846101000151605c8111156112ac576112ac6143aa565b605c8111156112bd576112bd6143aa565b8152602001846101200151605c8111156112d9576112d96143aa565b605c8111156112ea576112ea6143aa565b8152602001846101400151605c811115611306576113066143aa565b605c811115611317576113176143aa565b8152602001846101600151605c811115611333576113336143aa565b605c811115611344576113446143aa565b8152602001846101800151605c811115611360576113606143aa565b605c811115611371576113716143aa565b8152602001846101a00151605c81111561138d5761138d6143aa565b605c81111561139e5761139e6143aa565b9052905060005b600d8110156113fb5760008282600d81106113c2576113c26143c0565b6020020151605c8111156113d8576113d86143aa565b146113eb57826113e7816143d6565b9350505b6113f4816143d6565b90506113a5565b5050919050565b6000818152600560205260408120546001600160a01b03161515610792565b611429612cbe565b6009805460ff19811660ff90911615179055565b6000818152600560205260408120546001600160a01b0316806107925760405162461bcd60e51b8152600401610dfd906146e2565b61147a612cbe565b600954610100900460ff16156114a25760405162461bcd60e51b8152600401610dfd90614724565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b60006001600160a01b0382166114f85760405162461bcd60e51b8152600401610dfd9061478c565b506001600160a01b031660009081526006602052604090205490565b61151c612cbe565b6115266000612ce8565b565b6115328282612d45565b5050565b606060028054610d4690614467565b606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316633e5e0a96846040518263ffffffff1660e01b8152600401611595919061479c565b600060405180830381865afa1580156115b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115da9190810190614802565b604080516202006081019091526202004081526000602090910190815290915061160384612343565b156116335761162e6040518061020001604052806101c181526020016156be6101c1913982906122e0565b611659565b61165960405180610180016040528061014d815260200161594d61014d913982906122e0565b61167c6040518060800160405280605581526020016156696055913982906122e0565b61168f61168885612d98565b82906122e0565b60408051808201909152600381527f222f3e000000000000000000000000000000000000000000000000000000000060208201526116ce9082906122e0565b60408051600880825281830190925260009160208201818036833701905050905060005b60188110156119985760005b60188110156119855760008161171584601861438b565b61171f919061483d565b61172a90600461438b565b905060008661173a83600361483d565b8151811061174a5761174a6143c0565b016020015160f81c11156119725760005b600481101561188557600087611771838561483d565b81518110611781576117816143c0565b016020015160f81c90507f3031323334353637383961626364656600000000000000000000000000000000600f8216601081106117c0576117c06143c0565b1a60f81b866117d084600261438b565b6117db90600161483d565b815181106117eb576117eb6143c0565b60200101906001600160f81b031916908160001a90535060041c600f167f3031323334353637383961626364656600000000000000000000000000000000816010811061183a5761183a6143c0565b1a60f81b8661184a84600261438b565b8151811061185a5761185a6143c0565b60200101906001600160f81b031916908160001a90535050808061187d906143d6565b91505061175b565b506000600a856040516118989190614850565b908152602001604051809103902080546118b190614467565b80601f01602080910402602001604051908101604052809291908181526020018280546118dd90614467565b801561192a5780601f106118ff5761010080835404028352916020019161192a565b820191906000526020600020905b81548152906001019060200180831161190d57829003601f168201915b5050505050905061197061193d84612fd7565b61194686612fd7565b83604051602001611959939291906148ac565b60408051601f1981840301815291905287906122e0565b505b508061197d816143d6565b9150506116fe565b5080611990816143d6565b9150506116f2565b5060408051808201909152600481527f3c2f673e0000000000000000000000000000000000000000000000000000000060208201526119d89083906122e0565b60408051808201909152600681527f3c2f7376673e00000000000000000000000000000000000000000000000000006020820152611a179083906122e0565b509392505050565b61100f3382612d45565b6115323383836130f4565b611a3c612cbe565b600954610100900460ff1615611a645760405162461bcd60e51b8152600401610dfd90614724565b60005b81811015610ec057828282818110611a8157611a816143c0565b9050602002810190611a939190614938565b6001818110611aa457611aa46143c0565b9050602002810190611ab6919061498b565b600a858585818110611aca57611aca6143c0565b9050602002810190611adc9190614938565b6000818110611aed57611aed6143c0565b9050602002810190611aff919061498b565b604051611b0d9291906149f0565b90815260200160405180910390209182611b28929190614a98565b50611b32816143d6565b9050611a67565b611b433383612a4a565b611b5f5760405162461bcd60e51b8152600401610dfd90614638565b611b6b84848484613196565b50505050565b6000818152600560205260409020546060906001600160a01b0316611ba85760405162461bcd60e51b8152600401610dfd90614b8f565b610792826131c9565b611bb9612cbe565b6001600160a01b038116611bdf5760405162461bcd60e51b8152600401610dfd90614bf7565b61100f81612ce8565b611c5a604080516101c0810190915260008082526020820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101c0810190915261ffff831681526000906020810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905261ffff84168082526040517f76dfe2970000000000000000000000000000000000000000000000000000000081529192506000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916376dfe29791611d3d919060040161479c565b600060405180830381865afa158015611d5a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d829190810190614802565b90506000611dce6040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250836132fa90919063ffffffff16565b905060005b81518110156122d6576000828281518110611df057611df06143c0565b6020026020010151905060606001831015611e655760408051808201909152600181527f20000000000000000000000000000000000000000000000000000000000000006020820152611e449083906132fa565b600081518110611e5657611e566143c0565b60200260200101519050611e82565b611e7f60018351611e7691906145cd565b839060016134ff565b90505b6040517fd16c48d80000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d16c48d890611eea908590600401613d93565b602060405180830381865afa158015611f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2b9190614c12565b605c811115611f3c57611f3c6143aa565b605c811115611f4d57611f4d6143aa565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663683375c483605c811115611f9257611f926143aa565b605c811115611fa357611fa36143aa565b6040518263ffffffff1660e01b8152600401611fbf9190614c61565b602060405180830381865afa158015611fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120009190614c87565b600c811115612011576120116143aa565b600c811115612022576120226143aa565b9050600081600c811115612038576120386143aa565b0361206e576020880182605c811115612053576120536143aa565b9081605c811115612066576120666143aa565b9052506122bf565b600181600c811115612082576120826143aa565b0361209d576040880182605c811115612053576120536143aa565b600281600c8111156120b1576120b16143aa565b036120cc576060880182605c811115612053576120536143aa565b600381600c8111156120e0576120e06143aa565b036120fb576080880182605c811115612053576120536143aa565b600481600c81111561210f5761210f6143aa565b0361212a5760a0880182605c811115612053576120536143aa565b600581600c81111561213e5761213e6143aa565b036121595760c0880182605c811115612053576120536143aa565b600681600c81111561216d5761216d6143aa565b036121885760e0880182605c811115612053576120536143aa565b600781600c81111561219c5761219c6143aa565b036121b857610100880182605c811115612053576120536143aa565b600881600c8111156121cc576121cc6143aa565b036121e857610120880182605c811115612053576120536143aa565b600981600c8111156121fc576121fc6143aa565b0361221857610140880182605c811115612053576120536143aa565b600a81600c81111561222c5761222c6143aa565b0361224857610160880182605c811115612053576120536143aa565b600b81600c81111561225c5761225c6143aa565b0361227857610180880182605c811115612053576120536143aa565b600c81600c81111561228c5761228c6143aa565b036122bf576101a0880182605c8111156122a8576122a86143aa565b9081605c8111156122bb576122bb6143aa565b9052505b5050505080806122ce906143d6565b915050611dd3565b5091949350505050565b601f19820151825182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc090920191829061231b908361483d565b11156123395760405162461bcd60e51b8152600401610dfd90614d00565b611b6b8484613608565b6000600242338460405160200161235c93929190614d57565b6040516020818303038152906040528051906020012060001c61237f9190614d9b565b60000361238e57506001919050565b506000919050565b919050565b6060600082605c8111156123b1576123b16143aa565b036123bb57600080fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fc9faca584605c8111156123fe576123fe6143aa565b605c81111561240f5761240f6143aa565b6040518263ffffffff1660e01b815260040161242b9190614c61565b600060405180830381865afa158015612448573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124709190810190614802565b9050606060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663683375c486605c8111156124b7576124b76143aa565b605c8111156124c8576124c86143aa565b6040518263ffffffff1660e01b81526004016124e49190614c61565b602060405180830381865afa158015612501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125259190614c87565b600c811115612536576125366143aa565b600c811115612547576125476143aa565b9050600081600c81111561255d5761255d6143aa565b0361259f576040518060400160405280600381526020017f536578000000000000000000000000000000000000000000000000000000000081525091506129a3565b600181600c8111156125b3576125b36143aa565b036125f5576040518060400160405280600481526020017f486169720000000000000000000000000000000000000000000000000000000081525091506129a3565b600281600c811115612609576126096143aa565b0361264b576040518060400160405280600481526020017f457965730000000000000000000000000000000000000000000000000000000081525091506129a3565b600381600c81111561265f5761265f6143aa565b036126a1576040518060400160405280600581526020017f426561726400000000000000000000000000000000000000000000000000000081525091506129a3565b600481600c8111156126b5576126b56143aa565b036126f7576040518060400160405280600481526020017f456172730000000000000000000000000000000000000000000000000000000081525091506129a3565b600581600c81111561270b5761270b6143aa565b0361274d576040518060400160405280600481526020017f4c6970730000000000000000000000000000000000000000000000000000000081525091506129a3565b600681600c811115612761576127616143aa565b036127a3576040518060400160405280600581526020017f4d6f75746800000000000000000000000000000000000000000000000000000081525091506129a3565b600781600c8111156127b7576127b76143aa565b036127f9576040518060400160405280600481526020017f466163650000000000000000000000000000000000000000000000000000000081525091506129a3565b600881600c81111561280d5761280d6143aa565b0361284f576040518060400160405280600781526020017f456d6f74696f6e0000000000000000000000000000000000000000000000000081525091506129a3565b600981600c811115612863576128636143aa565b036128a5576040518060400160405280600481526020017f4e65636b0000000000000000000000000000000000000000000000000000000081525091506129a3565b600a81600c8111156128b9576128b96143aa565b036128fb576040518060400160405280600481526020017f4e6f73650000000000000000000000000000000000000000000000000000000081525091506129a3565b600b81600c81111561290f5761290f6143aa565b03612951576040518060400160405280600681526020017f436865656b73000000000000000000000000000000000000000000000000000081525091506129a3565b600c81600c811115612965576129656143aa565b036129a3576040518060400160405280600581526020017f546565746800000000000000000000000000000000000000000000000000000081525091505b81836040516020016129b6929190614daf565b6040516020818303038152906040529350505050919050565b6000818152600760205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190612a118261143d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b0316612a7e5760405162461bcd60e51b8152600401610dfd90614e97565b6000612a898361143d565b9050806001600160a01b0316846001600160a01b03161480612ac45750836001600160a01b0316612ab984610dc9565b6001600160a01b0316145b80612af457506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b0f8261143d565b6001600160a01b031614612b355760405162461bcd60e51b8152600401610dfd90614eff565b6001600160a01b038216612b5b5760405162461bcd60e51b8152600401610dfd90614f67565b612b666000826129cf565b6001600160a01b0383166000908152600660205260408120805460019290612b8f9084906145cd565b90915550506001600160a01b0382166000908152600660205260408120805460019290612bbd90849061483d565b9091555050600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b80471015612c4b5760405162461bcd60e51b8152600401610dfd90614fa9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c98576040519150601f19603f3d011682016040523d82523d6000602084013e612c9d565b606091505b5050905080610ec05760405162461bcd60e51b8152600401610dfd90615011565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610dfd90615051565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d4e8161077f565b3414612d6c5760405162461bcd60e51b8152600401610dfd90615093565b60095460ff16612d8e5760405162461bcd60e51b8152600401610dfd906150d5565b611532828261363e565b606060006006423385604051602001612db393929190614d57565b6040516020818303038152906040528051906020012060001c612dd69190614d9b565b60408051808201909152600681527f353338374434000000000000000000000000000000000000000000000000000060208201529091506000829003612e50575060408051808201909152600681527f37383746344400000000000000000000000000000000000000000000000000006020820152612fd0565b81600103612e92575060408051808201909152600681527f42303130333000000000000000000000000000000000000000000000000000006020820152612fd0565b81600203612ed4575060408051808201909152600681527f35333837443400000000000000000000000000000000000000000000000000006020820152612fd0565b81600303612f16575060408051808201909152600681527f44353946323300000000000000000000000000000000000000000000000000006020820152612fd0565b81600403612f58575060408051808201909152600681527f38383442414200000000000000000000000000000000000000000000000000006020820152612fd0565b81600503612f9a575060408051808201909152600681527f37443630343100000000000000000000000000000000000000000000000000006020820152612fd0565b5060408051808201909152600681527f353338376434000000000000000000000000000000000000000000000000000060208201525b9392505050565b60608160000361301a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613044578061302e816143d6565b915061303d9050600a836150e5565b915061301e565b60008167ffffffffffffffff81111561305f5761305f613e6d565b6040519080825280601f01601f191660200182016040528015613089576020820181803683370190505b5090505b8415612af45761309e6001836145cd565b91506130ab600a86614d9b565b6130b690603061483d565b60f81b8183815181106130cb576130cb6143c0565b60200101906001600160f81b031916908160001a9053506130ed600a866150e5565b945061308d565b816001600160a01b0316836001600160a01b0316036131255760405162461bcd60e51b8152600401610dfd9061512b565b6001600160a01b0383811660008181526008602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190613189908590613cf9565b60405180910390a3505050565b6131a1848484612afc565b6131ad84848484613740565b611b6b5760405162461bcd60e51b8152600401610dfd90615193565b606060006131d683611545565b905060006131e78461ffff16612fd7565b6040516020016131f791906151cd565b604051602081830303815290604052905061321184612343565b15613245576132238461ffff16612fd7565b604051602001613233919061520c565b60405160208183030381529060405290505b6132d2816040518060c00160405280608e81526020016158bf608e913961326b8561388b565b6040518060400160405280601681526020017f68747470733a2f2f7068756e6b76657273652e636f6d000000000000000000008152506132aa8961087b565b6040516020016132be9594939291906152b5565b60405160208183030381529060405261388b565b6040516020016132e291906153bd565b60405160208183030381529060405292505050919050565b606082600060015b6001835161331091906145cd565b821015613353576000613324878785613a45565b905080196133325750613353565b8161333c816143d6565b925061334b905081600161483d565b925050613302565b8067ffffffffffffffff81111561336c5761336c613e6d565b60405190808252806020026020018201604052801561339f57816020015b606081526020019060019003908161338a5790505b50935060009150600090505b600183516133b991906145cd565b8210156134f65760006133cd878785613a45565b905080196133d9575082515b60006133e584836145cd565b67ffffffffffffffff8111156133fd576133fd613e6d565b6040519080825280601f01601f191660200182016040528015613427576020820181803683370190505b509050806000855b848110156134b657878181518110613449576134496143c0565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361347b816143d6565b94508151811061348d5761348d6143c0565b60200101906001600160f81b031916908160001a905350806134ae816143d6565b91505061342f565b506134c284600161483d565b95508188866134d0816143d6565b9750815181106134e2576134e26143c0565b6020026020010181905250505050506133ab565b50505092915050565b8251606090849061351085856153e9565b111561351e5761351e61540c565b60008467ffffffffffffffff81111561353957613539613e6d565b6040519080825280601f01601f191660200182016040528015613563576020820181803683370190505b509050806000855b61357588886153e9565b8110156135fb5784818151811061358e5761358e6143c0565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836135c0816143d6565b9450815181106135d2576135d26143c0565b60200101906001600160f81b031916908160001a905350806135f3816143d6565b91505061356b565b5090979650505050505050565b8051602082019150808201602084510184015b8184101561363357835181526020938401930161361b565b505082510190915250565b33321461365d5760405162461bcd60e51b8152600401610dfd90615454565b6001600160a01b0382166136835760405162461bcd60e51b8152600401610dfd90615494565b600081116136a35760405162461bcd60e51b8152600401610dfd906154fc565b8060045410156136c55760405162461bcd60e51b8152600401610dfd90615564565b60045460005b828110156137085760006136df8584613af8565b90506136eb8582613b60565b6136f483615574565b92505080613701906143d6565b90506136cb565b5060048190556001600160a01b0383166000908152600660205260408120805484929061373690849061483d565b9091555050505050565b60006001600160a01b0384163b15613880576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061379d90339089908890889060040161558b565b6020604051808303816000875af19250505080156137d8575060408051601f3d908101601f191682019092526137d5918101906155d0565b60015b613835573d808015613806576040519150601f19603f3d011682016040523d82523d6000602084013e61380b565b606091505b50805160000361382d5760405162461bcd60e51b8152600401610dfd90615193565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612af4565b506001949350505050565b606081516000036138aa57505060408051602081019091526000815290565b600060405180606001604052806040815260200161587f60409139905060006003845160026138d9919061483d565b6138e391906150e5565b6138ee90600461438b565b905060006138fd82602061483d565b67ffffffffffffffff81111561391557613915613e6d565b6040519080825280601f01601f19166020018201604052801561393f576020820181803683370190505b509050818152600183018586518101602084015b818310156139ab576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613953565b6003895106600181146139c55760028114613a0f57613a37565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152613a37565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b509398975050505050505050565b815160009084908490600114613a5d57613a5d61540c565b835b8251811015613aea5781600081518110613a7b57613a7b6143c0565b602001015160f81c60f81b6001600160f81b031916838281518110613aa257613aa26143c0565b01602001517fff000000000000000000000000000000000000000000000000000000000000001603613ad8579250612fd0915050565b80613ae2816143d6565b915050613a5f565b506000199695505050505050565b600080833a434244613b0b6001846145cd565b403089604051602001613b259897969594939291906155f1565b60408051601f19818403018152919052805160209091012090506000613b4b8483614d9b565b9050613b578185613bc6565b95945050505050565b600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008281526003602052604081205481818103613be4575083613be7565b50805b6000613bf46001866145cd565b9050808614613c455760008181526003602052604081205490819003613c2a576000878152600360205260409020829055613c43565b6000878152600360205260408082208390558382528120555b505b50949350505050565b805b811461100f57600080fd5b803561079281613c4e565b600060208284031215613c7b57613c7b600080fd5b6000612af48484613c5b565b805b82525050565b602081016107928284613c87565b7fffffffff000000000000000000000000000000000000000000000000000000008116613c50565b803561079281613c9d565b600060208284031215613ce557613ce5600080fd5b6000612af48484613cc5565b801515613c89565b602081016107928284613cf1565b61ffff8116613c50565b803561079281613d07565b600060208284031215613d3157613d31600080fd5b6000612af48484613d11565b60005b83811015613d58578181015183820152602001613d40565b50506000910152565b6000613d6b825190565b808452602084019350613d82818560208601613d3d565b601f01601f19169290920192915050565b60208082528101612fd08184613d61565b60006001600160a01b038216610792565b613c8981613da4565b602081016107928284613db5565b613c5081613da4565b803561079281613dcc565b60008060408385031215613df657613df6600080fd5b6000613e028585613dd5565b9250506020613e1385828601613c5b565b9150509250929050565b60006107926001600160a01b038316613e34565b90565b6001600160a01b031690565b600061079282613e1d565b600061079282613e40565b613c8981613e4b565b602081016107928284613e56565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715613ea957613ea9613e6d565b6040525050565b6000613ebb60405190565b90506123968282613e83565b600067ffffffffffffffff821115613ee157613ee1613e6d565b601f19601f83011660200192915050565b82818337506000910152565b6000613f11613f0c84613ec7565b613eb0565b905082815260208101848484011115613f2c57613f2c600080fd5b611a17848285613ef2565b600082601f830112613f4b57613f4b600080fd5b8135612af4848260208601613efe565b600060208284031215613f7057613f70600080fd5b813567ffffffffffffffff811115613f8a57613f8a600080fd5b612af484828501613f37565b600080600060608486031215613fae57613fae600080fd5b6000613fba8686613dd5565b9350506020613fcb86828701613dd5565b9250506040613fdc86828701613c5b565b9150509250925092565b600060208284031215613ffb57613ffb600080fd5b6000612af48484613dd5565b61ffff8116613c89565b61401b8282614007565b5060200190565b60200190565b6000614032825190565b808452602093840193830160005b828110156140655781516140548782614011565b965050602082019150600101614040565b5093949350505050565b60208082528101612fd08184614028565b605d811061100f57600080fd5b803561079281614080565b60006101c082840312156140ae576140ae600080fd5b6140b96101c0613eb0565b905060006140c78484613d11565b9082015260206140d98484830161408d565b9082015260406140eb8484830161408d565b9082015260606140fd8484830161408d565b90820152608061410f8484830161408d565b9082015260a06141218484830161408d565b9082015260c06141338484830161408d565b9082015260e06141458484830161408d565b908201526101006141588484830161408d565b9082015261012061416b8484830161408d565b9082015261014061417e8484830161408d565b908201526101606141918484830161408d565b908201526101806141a48484830161408d565b908201526101a06141b78484830161408d565b9082015292915050565b60006101c082840312156141d7576141d7600080fd5b6000612af48484614098565b801515613c50565b8035610792816141e3565b6000806040838503121561420c5761420c600080fd5b60006142188585613dd5565b9250506020613e13858286016141eb565b60008083601f84011261423e5761423e600080fd5b50813567ffffffffffffffff81111561425957614259600080fd5b60208301915083602082028301111561427457614274600080fd5b9250929050565b6000806020838503121561429157614291600080fd5b823567ffffffffffffffff8111156142ab576142ab600080fd5b6142b785828601614229565b92509250509250929050565b600080600080608085870312156142dc576142dc600080fd5b60006142e88787613dd5565b94505060206142f987828801613dd5565b935050604061430a87828801613c5b565b925050606085013567ffffffffffffffff81111561432a5761432a600080fd5b61433687828801613f37565b91505092959194509250565b6000806040838503121561435857614358600080fd5b60006143648585613dd5565b9250506020613e1385828601613dd5565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156143a5576143a5614375565b500290565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060001982036143e9576143e9614375565b5060010190565b60006143fa825190565b614408818560208601613d3d565b9290920192915050565b7f5d0000000000000000000000000000000000000000000000000000000000000081525b60010190565b61444681836143f0565b905061079281614412565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061447b57607f821691505b60208210810361448d5761448d614451565b50919050565b602c8152602081017f4552433732313a20617070726f76656420717565727920666f72206e6f6e657881527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015290505b60400190565b6020808252810161079281614493565b60218152602081017f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6581527f7200000000000000000000000000000000000000000000000000000000000000602082015290506144e7565b60208082528101610792816144fd565b60388152602081017f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7781527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015290506144e7565b6020808252810161079281614565565b8181038181111561079257610792614375565b60318152602081017f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f81527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015290506144e7565b60208082528101610792816145e0565b60138152602081017f4e6f7468696e6720746f2077697468647261770000000000000000000000000081529050614022565b6020808252810161079281614648565b60298152602081017f4552433732313a206f776e657220717565727920666f72206e6f6e657869737481527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015290506144e7565b602080825281016107928161468a565b60108152602081017f436f6e7472616374207365616c65642e0000000000000000000000000000000081529050614022565b60208082528101610792816146f2565b602a8152602081017f4552433732313a2062616c616e636520717565727920666f7220746865207a6581527f726f206164647265737300000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614734565b602081016107928284614007565b60006147b8613f0c84613ec7565b9050828152602081018484840111156147d3576147d3600080fd5b611a17848285613d3d565b600082601f8301126147f2576147f2600080fd5b8151612af48482602086016147aa565b60006020828403121561481757614817600080fd5b815167ffffffffffffffff81111561483157614831600080fd5b612af4848285016147de565b8082018082111561079257610792614375565b61079281836143f0565b7f3c7265637420783d22000000000000000000000000000000000000000000000081525b60090190565b7f222066696c6c3d22230000000000000000000000000000000000000000000000815261487e565b6148b58161485a565b90506148c181856143f0565b7f2220793d22000000000000000000000000000000000000000000000000000000815260050190506148f381846143f0565b90506148fe81614884565b905061490a81836143f0565b7f222f3e00000000000000000000000000000000000000000000000000000000008152905060038101612af4565b6000808335601e193685900301811261495357614953600080fd5b8301915050803567ffffffffffffffff81111561497257614972600080fd5b6020918201918102360382131561427457614274600080fd5b6000808335601e19368590030181126149a6576149a6600080fd5b8301915050803567ffffffffffffffff8111156149c5576149c5600080fd5b60208201915060018102360382131561427457614274600080fd5b6149eb828483613ef2565b500190565b612fd08183856149e0565b6000610792613e318381565b614a10836149fb565b81546008840282811b60001990911b908116901990911617825550505050565b6000610ec0818484614a07565b8181101561153257614a50600082614a30565b600101614a3d565b601f821115610ec0576000818152602090206020601f85010481016020851015614a7f5750805b614a916020601f860104830182614a3d565b5050505050565b8267ffffffffffffffff811115614ab157614ab1613e6d565b614abb8254614467565b614ac6828285614a58565b506000601f821160018114614afb5760008315614ae35750848201355b600019600885021c1981166002850217855550614b55565b600084815260209020601f19841690835b82811015614b2c5787850135825560209485019460019092019101614b0c565b5084821015614b4957600019601f86166008021c19848801351681555b50506001600284020184555b505050505050565b60148152602081017f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081529050614022565b6020808252810161079281614b5d565b60268152602081017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181527f6464726573730000000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614b9f565b805161079281614080565b600060208284031215614c2757614c27600080fd5b6000612af48484614c07565b605d811061100f5761100f6143aa565b8061239681614c33565b600061079282614c43565b613c8981614c4d565b602081016107928284614c58565b600d811061100f57600080fd5b805161079281614c6f565b600060208284031215614c9c57614c9c600080fd5b6000612af48484614c7c565b60278152602081017f44796e616d69634275666665723a20417070656e64696e67206f7574206f662081527f626f756e64732e00000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614ca8565b80613c89565b60006107928260601b90565b600061079282614d16565b613c89614d3982613da4565b614d22565b60006107928260f01b90565b613c8961ffff8216614d3e565b614d618185614d10565b602001614d6e8184614d2d565b601401614d7b8183614d4a565b6002019392505050565b634e487b7160e01b600052601260045260246000fd5b600082614daa57614daa614d85565b500690565b7f7b2274726169745f74797065223a2200000000000000000000000000000000008152600f01614ddf81846143f0565b7f222c202276616c7565223a2200000000000000000000000000000000000000008152600c019050614e1181836143f0565b7f227d0000000000000000000000000000000000000000000000000000000000008152905060028101612fd0565b602c8152602081017f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657881527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614e3f565b60258152602081017f4552433732313a207472616e736665722066726f6d20696e636f72726563742081527f6f776e6572000000000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614ea7565b60248152602081017f4552433732313a207472616e7366657220746f20746865207a65726f2061646481527f7265737300000000000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614f0f565b601d8152602081017f416464726573733a20696e73756666696369656e742062616c616e636500000081529050614022565b6020808252810161079281614f77565b603a8152602081017f416464726573733a20756e61626c6520746f2073656e642076616c75652c207281527f6563697069656e74206d61792068617665207265766572746564000000000000602082015290506144e7565b6020808252810161079281614fb9565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65729101908152614022565b6020808252810161079281615021565b60128152602081017f4e656564206578616374207061796d656e74000000000000000000000000000081529050614022565b6020808252810161079281615061565b60128152602081017f4d696e74206973206e6f7420616374697665000000000000000000000000000081529050614022565b60208082528101610792816150a3565b6000826150f4576150f4614d85565b500490565b60198152602081017f4552433732313a20617070726f766520746f2063616c6c65720000000000000081529050614022565b60208082528101610792816150f9565b60328152602081017f4552433732313a207472616e7366657220746f206e6f6e20455243373231526581527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015290506144e7565b602080825281016107928161513b565b7f5068756e6b76657273652050756e6b202300000000000000000000000000000081525b60110190565b6151d6816151a3565b905061079281836143f0565b7f5068756e6b7665727365205068756e6b2023000000000000000000000000000081525b60120190565b6151d6816151e2565b7f7b000000000000000000000000000000000000000000000000000000000000008152614436565b7f222c226465736372697074696f6e223a2200000000000000000000000000000081526151c7565b7f222c2265787465726e616c5f75726c223a2200000000000000000000000000008152615206565b7f7d000000000000000000000000000000000000000000000000000000000000008152614436565b6152be81615215565b7f226e616d65223a22000000000000000000000000000000000000000000000000815260080190506152f081876143f0565b90506152fb8161523d565b905061530781866143f0565b7f222c22696d6167655f64617461223a22646174613a696d6167652f7376672b7881527f6d6c3b6261736536342c000000000000000000000000000000000000000000006020820152602a01905061535f81856143f0565b905061536a81615265565b905061537681846143f0565b7f222c2261747472696275746573223a2000000000000000000000000000000000815260100190506153a881836143f0565b90506153b38161528d565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152601d81016151d6565b808201600082128015848312908116901591909116171561079257610792614375565b634e487b7160e01b600052600160045260246000fd5b60158152602081017f436f6e7472616374732063616e6e6f74206d696e74000000000000000000000081529050614022565b6020808252810161079281615422565b60208082527f4552433732313a206d696e7420746f20746865207a65726f20616464726573739101908152614022565b6020808252810161079281615464565b60288152602081017f455243373231723a206e65656420746f206d696e74206174206c65617374206f81527f6e6520746f6b656e000000000000000000000000000000000000000000000000602082015290506144e7565b60208082528101610792816154a4565b602b8152602081017f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686181527f6e20617661696c61626c65000000000000000000000000000000000000000000602082015290506144e7565b602080825281016107928161550c565b60008161558357615583614375565b506000190190565b608081016155998287613db5565b6155a66020830186613db5565b6155b36040830185613c87565b81810360608301526153b38184613d61565b805161079281613c9d565b6000602082840312156155e5576155e5600080fd5b6000612af484846155c5565b6101008101615600828b613db5565b61560d602083018a613c87565b61561a6040830189613c87565b6156276060830188613c87565b6156346080830187613c87565b61564160a0830186613c87565b61564e60c0830185613db5565b61565b60e0830184613c87565b999850505050505050505056fe3c672066696c7465723d2275726c2823726f756768706170657229223e3c7265637420783d22302220793d223022207374796c653d2277696474683a313030253b6865696768743a31303025222066696c6c3d22233c7376672077696474683d223132303022206865696768743d2231323030222073686170652d72656e646572696e673d22637269737045646765732220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e32222076696577426f783d2230203020323420323422207374796c653d222d6d6f7a2d7472616e73666f726d3a207363616c6558282d31293b202d6f2d7472616e73666f726d3a207363616c6558282d31293b202d7765626b69742d7472616e73666f726d3a207363616c6558282d31293b207472616e73666f726d3a207363616c6558282d31293b223e3c7374796c653e726563747b77696474683a3170783b6865696768743a3170787d3c2f7374796c653e3c646566733e3c66696c7465722069643d22726f7567687061706572223e3c666554757262756c656e636520747970653d226672616374616c4e6f6973652220626173654672657175656e63793d22353022206e756d4f6374617665733d223222202f3e3c6665426c656e6420696e3d22536f757263654772617068696322206d6f64653d226d756c7469706c7922202f3e3c2f66696c7465723e3c2f646566733e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4f6e65206f662031302c303030206f6e2d636861696e20416c69656e732066726f6d20746865205068756e6b76657273652c2072616e646f6d6c7920666163696e67205068756e6b206f722050756e6b2e20496e737069726564206279207468652067726f77696e67205068756e6b7665727365206f6620647265616d65727320616e64206275696c646572732e3c7376672077696474683d223132303022206865696768743d2231323030222073686170652d72656e646572696e673d22637269737045646765732220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e32222076696577426f783d22302030203234203234223e3c7374796c653e726563747b77696474683a3170783b6865696768743a3170787d3c2f7374796c653e3c646566733e3c66696c7465722069643d22726f7567687061706572223e3c666554757262756c656e636520747970653d226672616374616c4e6f6973652220626173654672657175656e63793d22353022206e756d4f6374617665733d223222202f3e3c6665426c656e6420696e3d22536f757263654772617068696322206d6f64653d226d756c7469706c7922202f3e3c2f66696c7465723e3c2f646566733e7b2274726169745f74797065223a22466163696e67222c202276616c7565223a22a2646970667358221220b2ad4327ba2a7817a8dc4c3ab4f23392240de455820b3dfa3cd4892a3d3204e064736f6c6343000810003300000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b2000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a
Deployed Bytecode
0x6080604052600436106102695760003560e01c80635b9db89811610153578063a035b1fe116100cb578063b88d4fde1161007f578063d5abeb0111610064578063d5abeb01146106e3578063e985e9c514610716578063f2fde38b1461075f57600080fd5b8063b88d4fde146106a3578063c87b56dd146106c357600080fd5b8063a22cb465116100b0578063a22cb46514610644578063b5b949d214610664578063b65016371461068457600080fd5b8063a035b1fe14610616578063a0712d681461063157600080fd5b8063715018a6116101225780638da5cb5b116101075780638da5cb5b146105c357806395d89b41146105e15780639896ed11146105f657600080fd5b8063715018a61461059b5780638ba4cc3c146105b057600080fd5b80635b9db898146104fd5780636352211e1461054657806368bd580e1461056657806370a082311461057b57600080fd5b806318160ddd116101e6578063438b6300116101b55780634f558e791161019a5780634f558e79146104ae57806359c74f29146104ce5780635b92ac0d146104e357600080fd5b8063438b6300146104615780634f02f4d21461048e57600080fd5b806318160ddd146103f757806323b872dd1461040c5780633ccfd60b1461042c57806342842e0e1461044157600080fd5b8063081812fc1161023d5780630f5a9f89116102225780630f5a9f8914610362578063137fee32146103a357806314dbd3d8146103d757600080fd5b8063081812fc14610313578063095ea7b31461034057600080fd5b806270cb321461026e57806301ffc9a7146102a4578063023abe2b146102d157806306fdde03146102fe575b600080fd5b34801561027a57600080fd5b5061028e610289366004613c66565b61077f565b60405161029b9190613c8f565b60405180910390f35b3480156102b057600080fd5b506102c46102bf366004613cd0565b610798565b60405161029b9190613cf9565b3480156102dd57600080fd5b506102f16102ec366004613d1c565b61087b565b60405161029b9190613d93565b34801561030a57600080fd5b506102f1610d37565b34801561031f57600080fd5b5061033361032e366004613c66565b610dc9565b60405161029b9190613dbe565b34801561034c57600080fd5b5061036061035b366004613de0565b610e22565b005b34801561036e57600080fd5b506103967f00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b281565b60405161029b9190613e5f565b3480156103af57600080fd5b506103967f000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a81565b3480156103e357600080fd5b506102f16103f2366004613f5b565b610ec5565b34801561040357600080fd5b5061028e610f6a565b34801561041857600080fd5b50610360610427366004613f96565b610f9f565b34801561043857600080fd5b50610360610fd0565b34801561044d57600080fd5b5061036061045c366004613f96565b611012565b34801561046d57600080fd5b5061048161047c366004613fe6565b61102d565b60405161029b919061406f565b34801561049a57600080fd5b5061028e6104a93660046141c1565b611152565b3480156104ba57600080fd5b506102c46104c9366004613c66565b611402565b3480156104da57600080fd5b50610360611421565b3480156104ef57600080fd5b506009546102c49060ff1681565b34801561050957600080fd5b506102f16040518060400160405280601681526020017f68747470733a2f2f7068756e6b76657273652e636f6d0000000000000000000081525081565b34801561055257600080fd5b50610333610561366004613c66565b61143d565b34801561057257600080fd5b50610360611472565b34801561058757600080fd5b5061028e610596366004613fe6565b6114d0565b3480156105a757600080fd5b50610360611514565b6103606105be366004613de0565b611528565b3480156105cf57600080fd5b506000546001600160a01b0316610333565b3480156105ed57600080fd5b506102f1611536565b34801561060257600080fd5b506102f1610611366004613d1c565b611545565b34801561062257600080fd5b5061028e661c6bf52634000081565b61036061063f366004613c66565b611a1f565b34801561065057600080fd5b5061036061065f3660046141f6565b611a29565b34801561067057600080fd5b5061036061067f36600461427b565b611a34565b34801561069057600080fd5b506009546102c490610100900460ff1681565b3480156106af57600080fd5b506103606106be3660046142c3565b611b39565b3480156106cf57600080fd5b506102f16106de366004613c66565b611b71565b3480156106ef57600080fd5b507f000000000000000000000000000000000000000000000000000000000000271061028e565b34801561072257600080fd5b506102c4610731366004614342565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b34801561076b57600080fd5b5061036061077a366004613fe6565b611bb1565b6000610792661c6bf5263400008361438b565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd00000000000000000000000000000000000000000000000000000000148061082b57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b8061079257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff00000000000000000000000000000000000000000000000000000000831614610792565b6060600061088883611be8565b6040805162010060810190915262010040815260006020909101818152919250906108f16040518060400160405280600181526020017f5b00000000000000000000000000000000000000000000000000000000000000815250826122e090919063ffffffff16565b610914604051806060016040528060218152602001615a9a6021913982906122e0565b61091d85612343565b156109665760408051808201909152600581527f5068756e6b00000000000000000000000000000000000000000000000000000060208201526109619082906122e0565b6109a5565b60408051808201909152600481527f50756e6b0000000000000000000000000000000000000000000000000000000060208201526109a59082906122e0565b60408051808201909152600381527f227d2c000000000000000000000000000000000000000000000000000000000060208201526109e49082906122e0565b6000604051806101a001604052808560200151605c811115610a0857610a086143aa565b605c811115610a1957610a196143aa565b81526020018560400151605c811115610a3457610a346143aa565b605c811115610a4557610a456143aa565b81526020018560600151605c811115610a6057610a606143aa565b605c811115610a7157610a716143aa565b81526020018560800151605c811115610a8c57610a8c6143aa565b605c811115610a9d57610a9d6143aa565b81526020018560a00151605c811115610ab857610ab86143aa565b605c811115610ac957610ac96143aa565b81526020018560c00151605c811115610ae457610ae46143aa565b605c811115610af557610af56143aa565b81526020018560e00151605c811115610b1057610b106143aa565b605c811115610b2157610b216143aa565b8152602001856101000151605c811115610b3d57610b3d6143aa565b605c811115610b4e57610b4e6143aa565b8152602001856101200151605c811115610b6a57610b6a6143aa565b605c811115610b7b57610b7b6143aa565b8152602001856101400151605c811115610b9757610b976143aa565b605c811115610ba857610ba86143aa565b8152602001856101600151605c811115610bc457610bc46143aa565b605c811115610bd557610bd56143aa565b8152602001856101800151605c811115610bf157610bf16143aa565b605c811115610c0257610c026143aa565b8152602001856101a00151605c811115610c1e57610c1e6143aa565b605c811115610c2f57610c2f6143aa565b905290506000610c3e85611152565b90506000805b600d811015610d095760008482600d8110610c6157610c616143c0565b6020020151905086605c811115610c7a57610c7a6143aa565b81605c811115610c8c57610c8c6143aa565b14610cf85782610c9b816143d6565b935050610cb1610caa8261239b565b87906122e0565b83831015610cf85760408051808201909152600181527f2c000000000000000000000000000000000000000000000000000000000000006020820152610cf89087906122e0565b50610d02816143d6565b9050610c44565b5083604051602001610d1b919061443c565b6040516020818303038152906040529650505050505050919050565b606060018054610d4690614467565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7290614467565b8015610dbf5780601f10610d9457610100808354040283529160200191610dbf565b820191906000526020600020905b815481529060010190602001808311610da257829003601f168201915b5050505050905090565b6000818152600560205260408120546001600160a01b0316610e065760405162461bcd60e51b8152600401610dfd906144ed565b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b6000610e2d8261143d565b9050806001600160a01b0316836001600160a01b031603610e605760405162461bcd60e51b8152600401610dfd90614555565b336001600160a01b0382161480610e9a57506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610eb65760405162461bcd60e51b8152600401610dfd906145bd565b610ec083836129cf565b505050565b8051602081830181018051600a8252928201919093012091528054610ee990614467565b80601f0160208091040260200160405190810160405280929190818152602001828054610f1590614467565b8015610f625780601f10610f3757610100808354040283529160200191610f62565b820191906000526020600020905b815481529060010190602001808311610f4557829003601f168201915b505050505081565b60006004547f0000000000000000000000000000000000000000000000000000000000002710610f9a91906145cd565b905090565b610fa93382612a4a565b610fc55760405162461bcd60e51b8152600401610dfd90614638565b610ec0838383612afc565b60004711610ff05760405162461bcd60e51b8152600401610dfd9061467a565b4761100f73baefd9e4acb25de5124c08ced07db14d6cbed00582612c2b565b50565b610ec083838360405180602001604052806000815250611b39565b6060600061103a836114d0565b905060008167ffffffffffffffff81111561105757611057613e6d565b604051908082528060200260200182016040528015611080578160200160208202803683370190505b5090506000805b83811080156110b557507f000000000000000000000000000000000000000000000000000000000000271082105b15611148576000828152600560205260408120546001600160a01b03166110dd5760006110e6565b6110e68361143d565b9050866001600160a01b0316816001600160a01b0316036111355782848381518110611114576111146143c0565b61ffff9092166020928302919091019091015281611131816143d6565b9250505b8261113f816143d6565b93505050611087565b5090949350505050565b600080604051806101a001604052808460200151605c811115611177576111776143aa565b605c811115611188576111886143aa565b81526020018460400151605c8111156111a3576111a36143aa565b605c8111156111b4576111b46143aa565b81526020018460600151605c8111156111cf576111cf6143aa565b605c8111156111e0576111e06143aa565b81526020018460800151605c8111156111fb576111fb6143aa565b605c81111561120c5761120c6143aa565b81526020018460a00151605c811115611227576112276143aa565b605c811115611238576112386143aa565b81526020018460c00151605c811115611253576112536143aa565b605c811115611264576112646143aa565b81526020018460e00151605c81111561127f5761127f6143aa565b605c811115611290576112906143aa565b8152602001846101000151605c8111156112ac576112ac6143aa565b605c8111156112bd576112bd6143aa565b8152602001846101200151605c8111156112d9576112d96143aa565b605c8111156112ea576112ea6143aa565b8152602001846101400151605c811115611306576113066143aa565b605c811115611317576113176143aa565b8152602001846101600151605c811115611333576113336143aa565b605c811115611344576113446143aa565b8152602001846101800151605c811115611360576113606143aa565b605c811115611371576113716143aa565b8152602001846101a00151605c81111561138d5761138d6143aa565b605c81111561139e5761139e6143aa565b9052905060005b600d8110156113fb5760008282600d81106113c2576113c26143c0565b6020020151605c8111156113d8576113d86143aa565b146113eb57826113e7816143d6565b9350505b6113f4816143d6565b90506113a5565b5050919050565b6000818152600560205260408120546001600160a01b03161515610792565b611429612cbe565b6009805460ff19811660ff90911615179055565b6000818152600560205260408120546001600160a01b0316806107925760405162461bcd60e51b8152600401610dfd906146e2565b61147a612cbe565b600954610100900460ff16156114a25760405162461bcd60e51b8152600401610dfd90614724565b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b60006001600160a01b0382166114f85760405162461bcd60e51b8152600401610dfd9061478c565b506001600160a01b031660009081526006602052604090205490565b61151c612cbe565b6115266000612ce8565b565b6115328282612d45565b5050565b606060028054610d4690614467565b606060007f00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b26001600160a01b0316633e5e0a96846040518263ffffffff1660e01b8152600401611595919061479c565b600060405180830381865afa1580156115b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526115da9190810190614802565b604080516202006081019091526202004081526000602090910190815290915061160384612343565b156116335761162e6040518061020001604052806101c181526020016156be6101c1913982906122e0565b611659565b61165960405180610180016040528061014d815260200161594d61014d913982906122e0565b61167c6040518060800160405280605581526020016156696055913982906122e0565b61168f61168885612d98565b82906122e0565b60408051808201909152600381527f222f3e000000000000000000000000000000000000000000000000000000000060208201526116ce9082906122e0565b60408051600880825281830190925260009160208201818036833701905050905060005b60188110156119985760005b60188110156119855760008161171584601861438b565b61171f919061483d565b61172a90600461438b565b905060008661173a83600361483d565b8151811061174a5761174a6143c0565b016020015160f81c11156119725760005b600481101561188557600087611771838561483d565b81518110611781576117816143c0565b016020015160f81c90507f3031323334353637383961626364656600000000000000000000000000000000600f8216601081106117c0576117c06143c0565b1a60f81b866117d084600261438b565b6117db90600161483d565b815181106117eb576117eb6143c0565b60200101906001600160f81b031916908160001a90535060041c600f167f3031323334353637383961626364656600000000000000000000000000000000816010811061183a5761183a6143c0565b1a60f81b8661184a84600261438b565b8151811061185a5761185a6143c0565b60200101906001600160f81b031916908160001a90535050808061187d906143d6565b91505061175b565b506000600a856040516118989190614850565b908152602001604051809103902080546118b190614467565b80601f01602080910402602001604051908101604052809291908181526020018280546118dd90614467565b801561192a5780601f106118ff5761010080835404028352916020019161192a565b820191906000526020600020905b81548152906001019060200180831161190d57829003601f168201915b5050505050905061197061193d84612fd7565b61194686612fd7565b83604051602001611959939291906148ac565b60408051601f1981840301815291905287906122e0565b505b508061197d816143d6565b9150506116fe565b5080611990816143d6565b9150506116f2565b5060408051808201909152600481527f3c2f673e0000000000000000000000000000000000000000000000000000000060208201526119d89083906122e0565b60408051808201909152600681527f3c2f7376673e00000000000000000000000000000000000000000000000000006020820152611a179083906122e0565b509392505050565b61100f3382612d45565b6115323383836130f4565b611a3c612cbe565b600954610100900460ff1615611a645760405162461bcd60e51b8152600401610dfd90614724565b60005b81811015610ec057828282818110611a8157611a816143c0565b9050602002810190611a939190614938565b6001818110611aa457611aa46143c0565b9050602002810190611ab6919061498b565b600a858585818110611aca57611aca6143c0565b9050602002810190611adc9190614938565b6000818110611aed57611aed6143c0565b9050602002810190611aff919061498b565b604051611b0d9291906149f0565b90815260200160405180910390209182611b28929190614a98565b50611b32816143d6565b9050611a67565b611b433383612a4a565b611b5f5760405162461bcd60e51b8152600401610dfd90614638565b611b6b84848484613196565b50505050565b6000818152600560205260409020546060906001600160a01b0316611ba85760405162461bcd60e51b8152600401610dfd90614b8f565b610792826131c9565b611bb9612cbe565b6001600160a01b038116611bdf5760405162461bcd60e51b8152600401610dfd90614bf7565b61100f81612ce8565b611c5a604080516101c0810190915260008082526020820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101c0810190915261ffff831681526000906020810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905261ffff84168082526040517f76dfe2970000000000000000000000000000000000000000000000000000000081529192506000916001600160a01b037f00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b216916376dfe29791611d3d919060040161479c565b600060405180830381865afa158015611d5a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611d829190810190614802565b90506000611dce6040518060400160405280600181526020017f2c00000000000000000000000000000000000000000000000000000000000000815250836132fa90919063ffffffff16565b905060005b81518110156122d6576000828281518110611df057611df06143c0565b6020026020010151905060606001831015611e655760408051808201909152600181527f20000000000000000000000000000000000000000000000000000000000000006020820152611e449083906132fa565b600081518110611e5657611e566143c0565b60200260200101519050611e82565b611e7f60018351611e7691906145cd565b839060016134ff565b90505b6040517fd16c48d80000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a169063d16c48d890611eea908590600401613d93565b602060405180830381865afa158015611f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2b9190614c12565b605c811115611f3c57611f3c6143aa565b605c811115611f4d57611f4d6143aa565b905060007f000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a6001600160a01b031663683375c483605c811115611f9257611f926143aa565b605c811115611fa357611fa36143aa565b6040518263ffffffff1660e01b8152600401611fbf9190614c61565b602060405180830381865afa158015611fdc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120009190614c87565b600c811115612011576120116143aa565b600c811115612022576120226143aa565b9050600081600c811115612038576120386143aa565b0361206e576020880182605c811115612053576120536143aa565b9081605c811115612066576120666143aa565b9052506122bf565b600181600c811115612082576120826143aa565b0361209d576040880182605c811115612053576120536143aa565b600281600c8111156120b1576120b16143aa565b036120cc576060880182605c811115612053576120536143aa565b600381600c8111156120e0576120e06143aa565b036120fb576080880182605c811115612053576120536143aa565b600481600c81111561210f5761210f6143aa565b0361212a5760a0880182605c811115612053576120536143aa565b600581600c81111561213e5761213e6143aa565b036121595760c0880182605c811115612053576120536143aa565b600681600c81111561216d5761216d6143aa565b036121885760e0880182605c811115612053576120536143aa565b600781600c81111561219c5761219c6143aa565b036121b857610100880182605c811115612053576120536143aa565b600881600c8111156121cc576121cc6143aa565b036121e857610120880182605c811115612053576120536143aa565b600981600c8111156121fc576121fc6143aa565b0361221857610140880182605c811115612053576120536143aa565b600a81600c81111561222c5761222c6143aa565b0361224857610160880182605c811115612053576120536143aa565b600b81600c81111561225c5761225c6143aa565b0361227857610180880182605c811115612053576120536143aa565b600c81600c81111561228c5761228c6143aa565b036122bf576101a0880182605c8111156122a8576122a86143aa565b9081605c8111156122bb576122bb6143aa565b9052505b5050505080806122ce906143d6565b915050611dd3565b5091949350505050565b601f19820151825182517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc090920191829061231b908361483d565b11156123395760405162461bcd60e51b8152600401610dfd90614d00565b611b6b8484613608565b6000600242338460405160200161235c93929190614d57565b6040516020818303038152906040528051906020012060001c61237f9190614d9b565b60000361238e57506001919050565b506000919050565b919050565b6060600082605c8111156123b1576123b16143aa565b036123bb57600080fd5b60007f000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a6001600160a01b031663fc9faca584605c8111156123fe576123fe6143aa565b605c81111561240f5761240f6143aa565b6040518263ffffffff1660e01b815260040161242b9190614c61565b600060405180830381865afa158015612448573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124709190810190614802565b9050606060007f000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a6001600160a01b031663683375c486605c8111156124b7576124b76143aa565b605c8111156124c8576124c86143aa565b6040518263ffffffff1660e01b81526004016124e49190614c61565b602060405180830381865afa158015612501573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125259190614c87565b600c811115612536576125366143aa565b600c811115612547576125476143aa565b9050600081600c81111561255d5761255d6143aa565b0361259f576040518060400160405280600381526020017f536578000000000000000000000000000000000000000000000000000000000081525091506129a3565b600181600c8111156125b3576125b36143aa565b036125f5576040518060400160405280600481526020017f486169720000000000000000000000000000000000000000000000000000000081525091506129a3565b600281600c811115612609576126096143aa565b0361264b576040518060400160405280600481526020017f457965730000000000000000000000000000000000000000000000000000000081525091506129a3565b600381600c81111561265f5761265f6143aa565b036126a1576040518060400160405280600581526020017f426561726400000000000000000000000000000000000000000000000000000081525091506129a3565b600481600c8111156126b5576126b56143aa565b036126f7576040518060400160405280600481526020017f456172730000000000000000000000000000000000000000000000000000000081525091506129a3565b600581600c81111561270b5761270b6143aa565b0361274d576040518060400160405280600481526020017f4c6970730000000000000000000000000000000000000000000000000000000081525091506129a3565b600681600c811115612761576127616143aa565b036127a3576040518060400160405280600581526020017f4d6f75746800000000000000000000000000000000000000000000000000000081525091506129a3565b600781600c8111156127b7576127b76143aa565b036127f9576040518060400160405280600481526020017f466163650000000000000000000000000000000000000000000000000000000081525091506129a3565b600881600c81111561280d5761280d6143aa565b0361284f576040518060400160405280600781526020017f456d6f74696f6e0000000000000000000000000000000000000000000000000081525091506129a3565b600981600c811115612863576128636143aa565b036128a5576040518060400160405280600481526020017f4e65636b0000000000000000000000000000000000000000000000000000000081525091506129a3565b600a81600c8111156128b9576128b96143aa565b036128fb576040518060400160405280600481526020017f4e6f73650000000000000000000000000000000000000000000000000000000081525091506129a3565b600b81600c81111561290f5761290f6143aa565b03612951576040518060400160405280600681526020017f436865656b73000000000000000000000000000000000000000000000000000081525091506129a3565b600c81600c811115612965576129656143aa565b036129a3576040518060400160405280600581526020017f546565746800000000000000000000000000000000000000000000000000000081525091505b81836040516020016129b6929190614daf565b6040516020818303038152906040529350505050919050565b6000818152600760205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190612a118261143d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600560205260408120546001600160a01b0316612a7e5760405162461bcd60e51b8152600401610dfd90614e97565b6000612a898361143d565b9050806001600160a01b0316846001600160a01b03161480612ac45750836001600160a01b0316612ab984610dc9565b6001600160a01b0316145b80612af457506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b0f8261143d565b6001600160a01b031614612b355760405162461bcd60e51b8152600401610dfd90614eff565b6001600160a01b038216612b5b5760405162461bcd60e51b8152600401610dfd90614f67565b612b666000826129cf565b6001600160a01b0383166000908152600660205260408120805460019290612b8f9084906145cd565b90915550506001600160a01b0382166000908152600660205260408120805460019290612bbd90849061483d565b9091555050600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b80471015612c4b5760405162461bcd60e51b8152600401610dfd90614fa9565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c98576040519150601f19603f3d011682016040523d82523d6000602084013e612c9d565b606091505b5050905080610ec05760405162461bcd60e51b8152600401610dfd90615011565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610dfd90615051565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b612d4e8161077f565b3414612d6c5760405162461bcd60e51b8152600401610dfd90615093565b60095460ff16612d8e5760405162461bcd60e51b8152600401610dfd906150d5565b611532828261363e565b606060006006423385604051602001612db393929190614d57565b6040516020818303038152906040528051906020012060001c612dd69190614d9b565b60408051808201909152600681527f353338374434000000000000000000000000000000000000000000000000000060208201529091506000829003612e50575060408051808201909152600681527f37383746344400000000000000000000000000000000000000000000000000006020820152612fd0565b81600103612e92575060408051808201909152600681527f42303130333000000000000000000000000000000000000000000000000000006020820152612fd0565b81600203612ed4575060408051808201909152600681527f35333837443400000000000000000000000000000000000000000000000000006020820152612fd0565b81600303612f16575060408051808201909152600681527f44353946323300000000000000000000000000000000000000000000000000006020820152612fd0565b81600403612f58575060408051808201909152600681527f38383442414200000000000000000000000000000000000000000000000000006020820152612fd0565b81600503612f9a575060408051808201909152600681527f37443630343100000000000000000000000000000000000000000000000000006020820152612fd0565b5060408051808201909152600681527f353338376434000000000000000000000000000000000000000000000000000060208201525b9392505050565b60608160000361301a57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613044578061302e816143d6565b915061303d9050600a836150e5565b915061301e565b60008167ffffffffffffffff81111561305f5761305f613e6d565b6040519080825280601f01601f191660200182016040528015613089576020820181803683370190505b5090505b8415612af45761309e6001836145cd565b91506130ab600a86614d9b565b6130b690603061483d565b60f81b8183815181106130cb576130cb6143c0565b60200101906001600160f81b031916908160001a9053506130ed600a866150e5565b945061308d565b816001600160a01b0316836001600160a01b0316036131255760405162461bcd60e51b8152600401610dfd9061512b565b6001600160a01b0383811660008181526008602090815260408083209487168084529490915290819020805460ff1916851515179055517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3190613189908590613cf9565b60405180910390a3505050565b6131a1848484612afc565b6131ad84848484613740565b611b6b5760405162461bcd60e51b8152600401610dfd90615193565b606060006131d683611545565b905060006131e78461ffff16612fd7565b6040516020016131f791906151cd565b604051602081830303815290604052905061321184612343565b15613245576132238461ffff16612fd7565b604051602001613233919061520c565b60405160208183030381529060405290505b6132d2816040518060c00160405280608e81526020016158bf608e913961326b8561388b565b6040518060400160405280601681526020017f68747470733a2f2f7068756e6b76657273652e636f6d000000000000000000008152506132aa8961087b565b6040516020016132be9594939291906152b5565b60405160208183030381529060405261388b565b6040516020016132e291906153bd565b60405160208183030381529060405292505050919050565b606082600060015b6001835161331091906145cd565b821015613353576000613324878785613a45565b905080196133325750613353565b8161333c816143d6565b925061334b905081600161483d565b925050613302565b8067ffffffffffffffff81111561336c5761336c613e6d565b60405190808252806020026020018201604052801561339f57816020015b606081526020019060019003908161338a5790505b50935060009150600090505b600183516133b991906145cd565b8210156134f65760006133cd878785613a45565b905080196133d9575082515b60006133e584836145cd565b67ffffffffffffffff8111156133fd576133fd613e6d565b6040519080825280601f01601f191660200182016040528015613427576020820181803683370190505b509050806000855b848110156134b657878181518110613449576134496143c0565b01602001517fff0000000000000000000000000000000000000000000000000000000000000016838361347b816143d6565b94508151811061348d5761348d6143c0565b60200101906001600160f81b031916908160001a905350806134ae816143d6565b91505061342f565b506134c284600161483d565b95508188866134d0816143d6565b9750815181106134e2576134e26143c0565b6020026020010181905250505050506133ab565b50505092915050565b8251606090849061351085856153e9565b111561351e5761351e61540c565b60008467ffffffffffffffff81111561353957613539613e6d565b6040519080825280601f01601f191660200182016040528015613563576020820181803683370190505b509050806000855b61357588886153e9565b8110156135fb5784818151811061358e5761358e6143c0565b01602001517fff000000000000000000000000000000000000000000000000000000000000001683836135c0816143d6565b9450815181106135d2576135d26143c0565b60200101906001600160f81b031916908160001a905350806135f3816143d6565b91505061356b565b5090979650505050505050565b8051602082019150808201602084510184015b8184101561363357835181526020938401930161361b565b505082510190915250565b33321461365d5760405162461bcd60e51b8152600401610dfd90615454565b6001600160a01b0382166136835760405162461bcd60e51b8152600401610dfd90615494565b600081116136a35760405162461bcd60e51b8152600401610dfd906154fc565b8060045410156136c55760405162461bcd60e51b8152600401610dfd90615564565b60045460005b828110156137085760006136df8584613af8565b90506136eb8582613b60565b6136f483615574565b92505080613701906143d6565b90506136cb565b5060048190556001600160a01b0383166000908152600660205260408120805484929061373690849061483d565b9091555050505050565b60006001600160a01b0384163b15613880576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061379d90339089908890889060040161558b565b6020604051808303816000875af19250505080156137d8575060408051601f3d908101601f191682019092526137d5918101906155d0565b60015b613835573d808015613806576040519150601f19603f3d011682016040523d82523d6000602084013e61380b565b606091505b50805160000361382d5760405162461bcd60e51b8152600401610dfd90615193565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a0200000000000000000000000000000000000000000000000000000000149050612af4565b506001949350505050565b606081516000036138aa57505060408051602081019091526000815290565b600060405180606001604052806040815260200161587f60409139905060006003845160026138d9919061483d565b6138e391906150e5565b6138ee90600461438b565b905060006138fd82602061483d565b67ffffffffffffffff81111561391557613915613e6d565b6040519080825280601f01601f19166020018201604052801561393f576020820181803683370190505b509050818152600183018586518101602084015b818310156139ab576003830192508251603f8160121c168501518253600182019150603f81600c1c168501518253600182019150603f8160061c168501518253600182019150603f8116850151825350600101613953565b6003895106600181146139c55760028114613a0f57613a37565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe830152613a37565b7f3d000000000000000000000000000000000000000000000000000000000000006000198301525b509398975050505050505050565b815160009084908490600114613a5d57613a5d61540c565b835b8251811015613aea5781600081518110613a7b57613a7b6143c0565b602001015160f81c60f81b6001600160f81b031916838281518110613aa257613aa26143c0565b01602001517fff000000000000000000000000000000000000000000000000000000000000001603613ad8579250612fd0915050565b80613ae2816143d6565b915050613a5f565b506000199695505050505050565b600080833a434244613b0b6001846145cd565b403089604051602001613b259897969594939291906155f1565b60408051601f19818403018152919052805160209091012090506000613b4b8483614d9b565b9050613b578185613bc6565b95945050505050565b600081815260056020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008281526003602052604081205481818103613be4575083613be7565b50805b6000613bf46001866145cd565b9050808614613c455760008181526003602052604081205490819003613c2a576000878152600360205260409020829055613c43565b6000878152600360205260408082208390558382528120555b505b50949350505050565b805b811461100f57600080fd5b803561079281613c4e565b600060208284031215613c7b57613c7b600080fd5b6000612af48484613c5b565b805b82525050565b602081016107928284613c87565b7fffffffff000000000000000000000000000000000000000000000000000000008116613c50565b803561079281613c9d565b600060208284031215613ce557613ce5600080fd5b6000612af48484613cc5565b801515613c89565b602081016107928284613cf1565b61ffff8116613c50565b803561079281613d07565b600060208284031215613d3157613d31600080fd5b6000612af48484613d11565b60005b83811015613d58578181015183820152602001613d40565b50506000910152565b6000613d6b825190565b808452602084019350613d82818560208601613d3d565b601f01601f19169290920192915050565b60208082528101612fd08184613d61565b60006001600160a01b038216610792565b613c8981613da4565b602081016107928284613db5565b613c5081613da4565b803561079281613dcc565b60008060408385031215613df657613df6600080fd5b6000613e028585613dd5565b9250506020613e1385828601613c5b565b9150509250929050565b60006107926001600160a01b038316613e34565b90565b6001600160a01b031690565b600061079282613e1d565b600061079282613e40565b613c8981613e4b565b602081016107928284613e56565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715613ea957613ea9613e6d565b6040525050565b6000613ebb60405190565b90506123968282613e83565b600067ffffffffffffffff821115613ee157613ee1613e6d565b601f19601f83011660200192915050565b82818337506000910152565b6000613f11613f0c84613ec7565b613eb0565b905082815260208101848484011115613f2c57613f2c600080fd5b611a17848285613ef2565b600082601f830112613f4b57613f4b600080fd5b8135612af4848260208601613efe565b600060208284031215613f7057613f70600080fd5b813567ffffffffffffffff811115613f8a57613f8a600080fd5b612af484828501613f37565b600080600060608486031215613fae57613fae600080fd5b6000613fba8686613dd5565b9350506020613fcb86828701613dd5565b9250506040613fdc86828701613c5b565b9150509250925092565b600060208284031215613ffb57613ffb600080fd5b6000612af48484613dd5565b61ffff8116613c89565b61401b8282614007565b5060200190565b60200190565b6000614032825190565b808452602093840193830160005b828110156140655781516140548782614011565b965050602082019150600101614040565b5093949350505050565b60208082528101612fd08184614028565b605d811061100f57600080fd5b803561079281614080565b60006101c082840312156140ae576140ae600080fd5b6140b96101c0613eb0565b905060006140c78484613d11565b9082015260206140d98484830161408d565b9082015260406140eb8484830161408d565b9082015260606140fd8484830161408d565b90820152608061410f8484830161408d565b9082015260a06141218484830161408d565b9082015260c06141338484830161408d565b9082015260e06141458484830161408d565b908201526101006141588484830161408d565b9082015261012061416b8484830161408d565b9082015261014061417e8484830161408d565b908201526101606141918484830161408d565b908201526101806141a48484830161408d565b908201526101a06141b78484830161408d565b9082015292915050565b60006101c082840312156141d7576141d7600080fd5b6000612af48484614098565b801515613c50565b8035610792816141e3565b6000806040838503121561420c5761420c600080fd5b60006142188585613dd5565b9250506020613e13858286016141eb565b60008083601f84011261423e5761423e600080fd5b50813567ffffffffffffffff81111561425957614259600080fd5b60208301915083602082028301111561427457614274600080fd5b9250929050565b6000806020838503121561429157614291600080fd5b823567ffffffffffffffff8111156142ab576142ab600080fd5b6142b785828601614229565b92509250509250929050565b600080600080608085870312156142dc576142dc600080fd5b60006142e88787613dd5565b94505060206142f987828801613dd5565b935050604061430a87828801613c5b565b925050606085013567ffffffffffffffff81111561432a5761432a600080fd5b61433687828801613f37565b91505092959194509250565b6000806040838503121561435857614358600080fd5b60006143648585613dd5565b9250506020613e1385828601613dd5565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156143a5576143a5614375565b500290565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b600060001982036143e9576143e9614375565b5060010190565b60006143fa825190565b614408818560208601613d3d565b9290920192915050565b7f5d0000000000000000000000000000000000000000000000000000000000000081525b60010190565b61444681836143f0565b905061079281614412565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061447b57607f821691505b60208210810361448d5761448d614451565b50919050565b602c8152602081017f4552433732313a20617070726f76656420717565727920666f72206e6f6e657881527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015290505b60400190565b6020808252810161079281614493565b60218152602081017f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6581527f7200000000000000000000000000000000000000000000000000000000000000602082015290506144e7565b60208082528101610792816144fd565b60388152602081017f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7781527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015290506144e7565b6020808252810161079281614565565b8181038181111561079257610792614375565b60318152602081017f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f81527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015290506144e7565b60208082528101610792816145e0565b60138152602081017f4e6f7468696e6720746f2077697468647261770000000000000000000000000081529050614022565b6020808252810161079281614648565b60298152602081017f4552433732313a206f776e657220717565727920666f72206e6f6e657869737481527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015290506144e7565b602080825281016107928161468a565b60108152602081017f436f6e7472616374207365616c65642e0000000000000000000000000000000081529050614022565b60208082528101610792816146f2565b602a8152602081017f4552433732313a2062616c616e636520717565727920666f7220746865207a6581527f726f206164647265737300000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614734565b602081016107928284614007565b60006147b8613f0c84613ec7565b9050828152602081018484840111156147d3576147d3600080fd5b611a17848285613d3d565b600082601f8301126147f2576147f2600080fd5b8151612af48482602086016147aa565b60006020828403121561481757614817600080fd5b815167ffffffffffffffff81111561483157614831600080fd5b612af4848285016147de565b8082018082111561079257610792614375565b61079281836143f0565b7f3c7265637420783d22000000000000000000000000000000000000000000000081525b60090190565b7f222066696c6c3d22230000000000000000000000000000000000000000000000815261487e565b6148b58161485a565b90506148c181856143f0565b7f2220793d22000000000000000000000000000000000000000000000000000000815260050190506148f381846143f0565b90506148fe81614884565b905061490a81836143f0565b7f222f3e00000000000000000000000000000000000000000000000000000000008152905060038101612af4565b6000808335601e193685900301811261495357614953600080fd5b8301915050803567ffffffffffffffff81111561497257614972600080fd5b6020918201918102360382131561427457614274600080fd5b6000808335601e19368590030181126149a6576149a6600080fd5b8301915050803567ffffffffffffffff8111156149c5576149c5600080fd5b60208201915060018102360382131561427457614274600080fd5b6149eb828483613ef2565b500190565b612fd08183856149e0565b6000610792613e318381565b614a10836149fb565b81546008840282811b60001990911b908116901990911617825550505050565b6000610ec0818484614a07565b8181101561153257614a50600082614a30565b600101614a3d565b601f821115610ec0576000818152602090206020601f85010481016020851015614a7f5750805b614a916020601f860104830182614a3d565b5050505050565b8267ffffffffffffffff811115614ab157614ab1613e6d565b614abb8254614467565b614ac6828285614a58565b506000601f821160018114614afb5760008315614ae35750848201355b600019600885021c1981166002850217855550614b55565b600084815260209020601f19841690835b82811015614b2c5787850135825560209485019460019092019101614b0c565b5084821015614b4957600019601f86166008021c19848801351681555b50506001600284020184555b505050505050565b60148152602081017f546f6b656e20646f6573206e6f7420657869737400000000000000000000000081529050614022565b6020808252810161079281614b5d565b60268152602081017f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206181527f6464726573730000000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614b9f565b805161079281614080565b600060208284031215614c2757614c27600080fd5b6000612af48484614c07565b605d811061100f5761100f6143aa565b8061239681614c33565b600061079282614c43565b613c8981614c4d565b602081016107928284614c58565b600d811061100f57600080fd5b805161079281614c6f565b600060208284031215614c9c57614c9c600080fd5b6000612af48484614c7c565b60278152602081017f44796e616d69634275666665723a20417070656e64696e67206f7574206f662081527f626f756e64732e00000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614ca8565b80613c89565b60006107928260601b90565b600061079282614d16565b613c89614d3982613da4565b614d22565b60006107928260f01b90565b613c8961ffff8216614d3e565b614d618185614d10565b602001614d6e8184614d2d565b601401614d7b8183614d4a565b6002019392505050565b634e487b7160e01b600052601260045260246000fd5b600082614daa57614daa614d85565b500690565b7f7b2274726169745f74797065223a2200000000000000000000000000000000008152600f01614ddf81846143f0565b7f222c202276616c7565223a2200000000000000000000000000000000000000008152600c019050614e1181836143f0565b7f227d0000000000000000000000000000000000000000000000000000000000008152905060028101612fd0565b602c8152602081017f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657881527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614e3f565b60258152602081017f4552433732313a207472616e736665722066726f6d20696e636f72726563742081527f6f776e6572000000000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614ea7565b60248152602081017f4552433732313a207472616e7366657220746f20746865207a65726f2061646481527f7265737300000000000000000000000000000000000000000000000000000000602082015290506144e7565b6020808252810161079281614f0f565b601d8152602081017f416464726573733a20696e73756666696369656e742062616c616e636500000081529050614022565b6020808252810161079281614f77565b603a8152602081017f416464726573733a20756e61626c6520746f2073656e642076616c75652c207281527f6563697069656e74206d61792068617665207265766572746564000000000000602082015290506144e7565b6020808252810161079281614fb9565b60208082527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65729101908152614022565b6020808252810161079281615021565b60128152602081017f4e656564206578616374207061796d656e74000000000000000000000000000081529050614022565b6020808252810161079281615061565b60128152602081017f4d696e74206973206e6f7420616374697665000000000000000000000000000081529050614022565b60208082528101610792816150a3565b6000826150f4576150f4614d85565b500490565b60198152602081017f4552433732313a20617070726f766520746f2063616c6c65720000000000000081529050614022565b60208082528101610792816150f9565b60328152602081017f4552433732313a207472616e7366657220746f206e6f6e20455243373231526581527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015290506144e7565b602080825281016107928161513b565b7f5068756e6b76657273652050756e6b202300000000000000000000000000000081525b60110190565b6151d6816151a3565b905061079281836143f0565b7f5068756e6b7665727365205068756e6b2023000000000000000000000000000081525b60120190565b6151d6816151e2565b7f7b000000000000000000000000000000000000000000000000000000000000008152614436565b7f222c226465736372697074696f6e223a2200000000000000000000000000000081526151c7565b7f222c2265787465726e616c5f75726c223a2200000000000000000000000000008152615206565b7f7d000000000000000000000000000000000000000000000000000000000000008152614436565b6152be81615215565b7f226e616d65223a22000000000000000000000000000000000000000000000000815260080190506152f081876143f0565b90506152fb8161523d565b905061530781866143f0565b7f222c22696d6167655f64617461223a22646174613a696d6167652f7376672b7881527f6d6c3b6261736536342c000000000000000000000000000000000000000000006020820152602a01905061535f81856143f0565b905061536a81615265565b905061537681846143f0565b7f222c2261747472696275746573223a2000000000000000000000000000000000815260100190506153a881836143f0565b90506153b38161528d565b9695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152601d81016151d6565b808201600082128015848312908116901591909116171561079257610792614375565b634e487b7160e01b600052600160045260246000fd5b60158152602081017f436f6e7472616374732063616e6e6f74206d696e74000000000000000000000081529050614022565b6020808252810161079281615422565b60208082527f4552433732313a206d696e7420746f20746865207a65726f20616464726573739101908152614022565b6020808252810161079281615464565b60288152602081017f455243373231723a206e65656420746f206d696e74206174206c65617374206f81527f6e6520746f6b656e000000000000000000000000000000000000000000000000602082015290506144e7565b60208082528101610792816154a4565b602b8152602081017f455243373231723a206d696e74696e67206d6f726520746f6b656e732074686181527f6e20617661696c61626c65000000000000000000000000000000000000000000602082015290506144e7565b602080825281016107928161550c565b60008161558357615583614375565b506000190190565b608081016155998287613db5565b6155a66020830186613db5565b6155b36040830185613c87565b81810360608301526153b38184613d61565b805161079281613c9d565b6000602082840312156155e5576155e5600080fd5b6000612af484846155c5565b6101008101615600828b613db5565b61560d602083018a613c87565b61561a6040830189613c87565b6156276060830188613c87565b6156346080830187613c87565b61564160a0830186613c87565b61564e60c0830185613db5565b61565b60e0830184613c87565b999850505050505050505056fe3c672066696c7465723d2275726c2823726f756768706170657229223e3c7265637420783d22302220793d223022207374796c653d2277696474683a313030253b6865696768743a31303025222066696c6c3d22233c7376672077696474683d223132303022206865696768743d2231323030222073686170652d72656e646572696e673d22637269737045646765732220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e32222076696577426f783d2230203020323420323422207374796c653d222d6d6f7a2d7472616e73666f726d3a207363616c6558282d31293b202d6f2d7472616e73666f726d3a207363616c6558282d31293b202d7765626b69742d7472616e73666f726d3a207363616c6558282d31293b207472616e73666f726d3a207363616c6558282d31293b223e3c7374796c653e726563747b77696474683a3170783b6865696768743a3170787d3c2f7374796c653e3c646566733e3c66696c7465722069643d22726f7567687061706572223e3c666554757262756c656e636520747970653d226672616374616c4e6f6973652220626173654672657175656e63793d22353022206e756d4f6374617665733d223222202f3e3c6665426c656e6420696e3d22536f757263654772617068696322206d6f64653d226d756c7469706c7922202f3e3c2f66696c7465723e3c2f646566733e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4f6e65206f662031302c303030206f6e2d636861696e20416c69656e732066726f6d20746865205068756e6b76657273652c2072616e646f6d6c7920666163696e67205068756e6b206f722050756e6b2e20496e737069726564206279207468652067726f77696e67205068756e6b7665727365206f6620647265616d65727320616e64206275696c646572732e3c7376672077696474683d223132303022206865696768743d2231323030222073686170652d72656e646572696e673d22637269737045646765732220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667222076657273696f6e3d22312e32222076696577426f783d22302030203234203234223e3c7374796c653e726563747b77696474683a3170783b6865696768743a3170787d3c2f7374796c653e3c646566733e3c66696c7465722069643d22726f7567687061706572223e3c666554757262756c656e636520747970653d226672616374616c4e6f6973652220626173654672657175656e63793d22353022206e756d4f6374617665733d223222202f3e3c6665426c656e6420696e3d22536f757263654772617068696322206d6f64653d226d756c7469706c7922202f3e3c2f66696c7465723e3c2f646566733e7b2274726169745f74797065223a22466163696e67222c202276616c7565223a22a2646970667358221220b2ad4327ba2a7817a8dc4c3ab4f23392240de455820b3dfa3cd4892a3d3204e064736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b2000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a
-----Decoded View---------------
Arg [0] : punkDataContractAddress (address): 0x16F5A35647D6F03D5D3da7b35409D65ba03aF3B2
Arg [1] : extendedPunkDataContractAddress (address): 0xf03e345bB89Dc9cFaf8Fda381a9E4417BFB46e7A
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b2
Arg [1] : 000000000000000000000000f03e345bb89dc9cfaf8fda381a9e4417bfb46e7a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.