Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 8 from a total of 8 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Renounce Ownersh... | 15466096 | 955 days ago | IN | 0 ETH | 0.00013601 | ||||
Setcan Flip Hat ... | 14441643 | 1120 days ago | IN | 0 ETH | 0.02516916 | ||||
Set Original Eye... | 14441643 | 1120 days ago | IN | 0 ETH | 0.01755218 | ||||
Set Lacks Visibl... | 14441643 | 1120 days ago | IN | 0 ETH | 0.0177233 | ||||
Set Visor Looks ... | 14441643 | 1120 days ago | IN | 0 ETH | 0.00608952 | ||||
Set Available Ha... | 14441643 | 1120 days ago | IN | 0 ETH | 0.10939426 | ||||
Set Attr Value T... | 14441643 | 1120 days ago | IN | 0 ETH | 0.04313334 | ||||
Set Attr String ... | 14441643 | 1120 days ago | IN | 0 ETH | 0.08689964 |
Loading...
Loading
Contract Name:
FashionHatPunksData
Compiler Version
v0.8.12+commit.f00d7308
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 "./StringUtilsLib.sol"; interface PunkDataInterface { function punkImage(uint16 index) external view returns (bytes memory); function punkAttributes(uint16 index) external view returns (string memory); } contract FashionHatPunksData is Ownable { using StringUtils for string; using Strings for uint16; using Strings for uint8; using Strings for uint256; PunkDataInterface immutable punkDataContract; enum HatType { BASEBALL, BUCKET, COWBOY, VISOR } enum HatSize { REGULAR, SMALL } enum HatColor { BLACK, GREY, RED, WHITE, TAN, BROWN } enum HatPosition { REGULAR, FLIPPED } 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} constructor(address punkDataContractAddress) { punkDataContract = PunkDataInterface(punkDataContractAddress); } function punkHatType(Punk memory punk) public view returns (HatType result) { uint[] memory choiceWeights = new uint[](4); for (uint i; i < 4; i++) { choiceWeights[i] = 25e8; } if (!visorLooksGood[punk.hair][punk.sex]) { choiceWeights[uint(HatType.VISOR)] = 5e8; } if (punk.hair == PunkAttributeValue.COWBOY_HAT) { return HatType.COWBOY; } if (punk.hair == PunkAttributeValue.CAP || punk.hair == PunkAttributeValue.BEANIE || (punk.sex != PunkAttributeValue.FEMALE && originalEyePixelGap(punk) == 2) ) { return HatType.BASEBALL; } if ((punk.sex == PunkAttributeValue.FEMALE || originalEyePixelGap(punk) == 1) && punk.mouth == PunkAttributeValue.CIGARETTE && (canWearHat(punk, HatType.BUCKET) || (canWearHat(punk, HatType.BASEBALL) && canFlipHat(punk))) ) { choiceWeights[uint(HatType.COWBOY)] /= 5; choiceWeights[uint(HatType.VISOR)] /= 5; if (!canFlipHat(punk)) { choiceWeights[uint(HatType.BASEBALL)] /= 5; } } if (punk.seed < 55 && canWearHat(punk, HatType.BASEBALL) && punk.sex != PunkAttributeValue.FEMALE && (punk.eyes == PunkAttributeValue.VR || punk.eyes == PunkAttributeValue.BIG_SHADES) && originalEyePixelGap(punk) != 1 ) { return HatType.BASEBALL; } if (punk.seed < 75 && punk.sex != PunkAttributeValue.FEMALE && (punk.eyes == PunkAttributeValue.VR || punk.eyes == PunkAttributeValue.BIG_SHADES) && (canWearHat(punk, HatType.COWBOY) || canWearHat(punk, HatType.BUCKET)) ) { choiceWeights[uint(HatType.BASEBALL)] = 0; choiceWeights[uint(HatType.VISOR)] = 0; } if (!visibleHairAttribute(punk) && (canWearHat(punk, HatType.COWBOY) || canWearHat(punk, HatType.BASEBALL) || canWearHat(punk, HatType.BUCKET)) ) { choiceWeights[uint(HatType.VISOR)] = 0; } if (punk.sex != PunkAttributeValue.FEMALE && punk.hair == PunkAttributeValue.CLOWN_HAIR_GREEN && (punk.eyes == PunkAttributeValue.VR || punk.eyes == PunkAttributeValue.BIG_SHADES) ) { choiceWeights[uint(HatType.VISOR)] = 0; } if (punk.eyes == PunkAttributeValue.WELDING_GOGGLES && (canWearHat(punk, HatType.COWBOY) || canWearHat(punk, HatType.BASEBALL) || canWearHat(punk, HatType.BUCKET)) ) { choiceWeights[uint(HatType.VISOR)] = 0; } for (uint i; i < 4; i++) { if (!canWearHat(punk, HatType(i))) { choiceWeights[i] = 0; } } uint8 choiceIndex = weightedChoice(punk, choiceWeights, "hat_type"); return HatType(choiceIndex); } function punkHatColor(Punk memory punk) public view returns (HatColor result) { HatType hatType = punkHatType(punk); uint[] memory choiceWeights = new uint[](6); if (hatType == HatType.BASEBALL) { choiceWeights[uint(HatColor.BLACK)] = 22.5e8; choiceWeights[uint(HatColor.GREY)] = 25e8; choiceWeights[uint(HatColor.RED)] = 20e8; choiceWeights[uint(HatColor.WHITE)] = 25e8; choiceWeights[uint(HatColor.TAN)] = 20e8; choiceWeights[uint(HatColor.BROWN)] = 0; } else if (hatType == HatType.BUCKET) { choiceWeights[uint(HatColor.BLACK)] = 50e8; choiceWeights[uint(HatColor.GREY)] = 0; choiceWeights[uint(HatColor.RED)] = 0; choiceWeights[uint(HatColor.WHITE)] = 0; choiceWeights[uint(HatColor.TAN)] = 50e8; choiceWeights[uint(HatColor.BROWN)] = 50e8; } else if (hatType == HatType.COWBOY) { choiceWeights[uint(HatColor.BLACK)] = 60e8; choiceWeights[uint(HatColor.GREY)] = 20e8; choiceWeights[uint(HatColor.RED)] = 0; choiceWeights[uint(HatColor.WHITE)] = 0; choiceWeights[uint(HatColor.TAN)] = 40e8; choiceWeights[uint(HatColor.BROWN)] = 0; } else if (hatType == HatType.VISOR) { choiceWeights[uint(HatColor.BLACK)] = 22.5e8; choiceWeights[uint(HatColor.GREY)] = 25e8; choiceWeights[uint(HatColor.RED)] = 20e8; choiceWeights[uint(HatColor.WHITE)] = 25e8; choiceWeights[uint(HatColor.TAN)] = 20e8; choiceWeights[uint(HatColor.BROWN)] = 0; } if (punk.hair == PunkAttributeValue.HOODIE) { choiceWeights[uint(HatColor.BLACK)] = 0; choiceWeights[uint(HatColor.GREY)] = 0; choiceWeights[uint(HatColor.RED)] = 10e8; choiceWeights[uint(HatColor.WHITE)] = 30e8; choiceWeights[uint(HatColor.TAN)] = 30e8; } if (punk.eyes == PunkAttributeValue.THREE_D_GLASSES || punk.hair == PunkAttributeValue.WILD_WHITE_HAIR) { choiceWeights[uint(HatColor.WHITE)] = 0; } if (punk.hair == PunkAttributeValue.DARK_HAIR && hatType == HatType.BUCKET) { choiceWeights[uint(HatColor.BLACK)] /= 10; } if (hatType == HatType.VISOR) { if (punk.hair == PunkAttributeValue.WILD_HAIR || punk.hair == PunkAttributeValue.HALF_SHAVED || ((punk.hair == PunkAttributeValue.HEADBAND && punk.sex == PunkAttributeValue.FEMALE))) { choiceWeights[uint(HatColor.BLACK)] = 0; } if (punk.hair == PunkAttributeValue.WILD_BLONDE) { choiceWeights[uint(HatColor.TAN)] = 0; } } if (hatType == HatType.COWBOY || hatType == HatType.BUCKET) { if ( eyesWithBlackTop(punk) || punk.hair == PunkAttributeValue.FRUMPY_HAIR || punk.hair == PunkAttributeValue.WILD_HAIR || punk.hair == PunkAttributeValue.HALF_SHAVED ) { choiceWeights[uint(HatColor.BLACK)] = 0; } } if (punk.sex != PunkAttributeValue.FEMALE && (punk.eyes == PunkAttributeValue.VR || punk.eyes == PunkAttributeValue.BIG_SHADES)) { choiceWeights[uint(HatColor.BLACK)] = 0; } if (punk.hair == PunkAttributeValue.CRAZY_HAIR && (punk.sex == PunkAttributeValue.FEMALE || hatType == HatType.VISOR)) { choiceWeights[uint(HatColor.RED)] = 0; } uint8 choiceIndex = weightedChoice(punk, choiceWeights, "hat_color"); return HatColor(choiceIndex); } function punkHatPosition(Punk memory punk) public view returns (HatPosition result) { HatType hatType = punkHatType(punk); if (hatType != HatType.BASEBALL) { return HatPosition.REGULAR; } uint[] memory choiceWeights = new uint[](2); choiceWeights[uint(HatPosition.REGULAR)] = 50e8; choiceWeights[uint(HatPosition.FLIPPED)] = 50e8; if (punk.hair == PunkAttributeValue.HALF_SHAVED) { return HatPosition.FLIPPED; } if (!canFlipHat(punk)) { return HatPosition.REGULAR; } if ( punk.sex != PunkAttributeValue.FEMALE && (punk.eyes == PunkAttributeValue.VR || punk.eyes == PunkAttributeValue.BIG_SHADES) && hatEyePixelGap(punk) == 1 ) { return (punk.eyes == PunkAttributeValue.BIG_SHADES ? HatPosition.REGULAR : HatPosition.FLIPPED); } if ((punk.sex == PunkAttributeValue.FEMALE || originalEyePixelGap(punk) == 1) && punk.mouth == PunkAttributeValue.CIGARETTE ) { choiceWeights[uint(HatPosition.REGULAR)] /= 10; } if ( punk.hair == PunkAttributeValue.HOODIE || punk.hair == PunkAttributeValue.BEANIE || originalEyePixelGap(punk) == 2 ) { return HatPosition.REGULAR; } uint8 choiceIndex = weightedChoice(punk, choiceWeights, "hat_position"); return HatPosition(choiceIndex); } function hatEyePixelGap(Punk memory punk) public view returns (uint8 gap) { HatType currentHat = punkHatType(punk); if ( currentHat == HatType.VISOR || currentHat == HatType.BUCKET || currentHat == HatType.COWBOY ) { return 1; } if (punk.hair == PunkAttributeValue.BANDANA) { if (punk.sex == PunkAttributeValue.FEMALE) { return 1; } else { if (punk.eyes == PunkAttributeValue.BIG_SHADES || punk.eyes == PunkAttributeValue.VR) { return 2; } else { return 1; } } } uint8 originalGap = originalEyePixelGap(punk); if (punk.sex != PunkAttributeValue.FEMALE) { if ( punk.hair == PunkAttributeValue.CLOWN_HAIR_GREEN || punk.hair == PunkAttributeValue.HOODIE ) { return 1; } else { return (originalGap > 0 ? originalGap : 2); } } if ( (currentHat == HatType.BASEBALL && (punk.hair == PunkAttributeValue.DARK_HAIR || punk.hair == PunkAttributeValue.ORANGE_SIDE)) || (punk.hair == PunkAttributeValue.PINK_WITH_HAT || punk.hair == PunkAttributeValue.STRAIGHT_HAIR || punk.hair == PunkAttributeValue.STRAIGHT_HAIR_BLONDE || punk.hair == PunkAttributeValue.STRAIGHT_HAIR_DARK) ) { return 1; } return (originalGap > 0 ? originalGap : 2); } function punkHatSize(Punk memory punk) public view returns (HatSize result) { HatType currentHat = punkHatType(punk); if (punk.sex != PunkAttributeValue.FEMALE) { return HatSize.REGULAR; } if (currentHat == HatType.BASEBALL && punk.hair == PunkAttributeValue.CRAZY_HAIR) { return HatSize.REGULAR; } if (currentHat == HatType.BUCKET && punk.hair == PunkAttributeValue.WILD_HAIR) { return HatSize.REGULAR; } if ( currentHat == HatType.BUCKET || currentHat == HatType.BASEBALL ) { if ( punk.hair == PunkAttributeValue.BLONDE_BOB || punk.hair == PunkAttributeValue.BLONDE_SHORT ) { return HatSize.REGULAR; } } if ( currentHat == HatType.COWBOY || currentHat == HatType.BUCKET || currentHat == HatType.BASEBALL ) { if ( punk.hair == PunkAttributeValue.FRUMPY_HAIR ) { return HatSize.REGULAR; } } if ( currentHat == HatType.COWBOY || currentHat == HatType.BUCKET ) { if ( punk.hair == PunkAttributeValue.HALF_SHAVED || punk.hair == PunkAttributeValue.WILD_BLONDE ) { return HatSize.REGULAR; } } if ( punk.hair == PunkAttributeValue.STRAIGHT_HAIR_BLONDE || punk.hair == PunkAttributeValue.STRAIGHT_HAIR || punk.hair == PunkAttributeValue.STRAIGHT_HAIR_DARK ) { return HatSize.REGULAR; } return HatSize.SMALL; } mapping(PunkAttributeValue => mapping(PunkAttributeValue => bool)) public canFlipHatMapping; function setcanFlipHatMapping(PunkAttributeValue[] memory hairs, PunkAttributeValue[] memory sexes) external onlyOwner { for (uint i; i < hairs.length; i++) { PunkAttributeValue hair = hairs[i]; PunkAttributeValue sex = sexes[i]; canFlipHatMapping[hair][sex] = true; } } function canFlipHat(Punk memory punk) public view returns (bool) { if (!canWearHat(punk, HatType.BASEBALL)) { return false; } return canFlipHatMapping[punk.hair][punk.sex]; } function randomNumber(Punk memory punk, uint lessThanNumb, string memory seedAddition) public pure returns (uint) { uint16 seed = punk.seed; uint256 randomNum = uint256( keccak256(abi.encodePacked(punk.id.toString(), ":", seed.toString(), seedAddition)) ); return uint(randomNum % lessThanNumb); } function weightedChoice(Punk memory punk, uint[] memory choiceWeights, string memory seedAddition) public pure returns (uint8) { uint sumOfWeights; uint numChoices = choiceWeights.length; for (uint i; i < numChoices; i++) { sumOfWeights += choiceWeights[i]; } uint randomNumberInstance = randomNumber(punk, sumOfWeights, seedAddition); for (uint8 i; i < numChoices; i++) { if (randomNumberInstance < choiceWeights[i]) { return i; } else { randomNumberInstance -= choiceWeights[i]; } } } mapping(PunkAttributeValue => mapping(PunkAttributeValue => bool)) public visorLooksGood; function setVisorLooksGood(PunkAttributeValue[] memory hairs, PunkAttributeValue[] memory sexes) external onlyOwner { for (uint i = 0; i < hairs.length; i++) { PunkAttributeValue hair = hairs[i]; PunkAttributeValue sex = sexes[i]; visorLooksGood[hair][sex] = true; } } mapping(PunkAttributeValue => mapping(PunkAttributeValue => bool)) public lacksVisibleHairAttribute; function setLacksVisibleHairAttribute(PunkAttributeValue[] memory hairs, PunkAttributeValue[] memory sexes) external onlyOwner { for (uint i = 0; i < hairs.length; i++) { PunkAttributeValue hair = hairs[i]; PunkAttributeValue sex = sexes[i]; lacksVisibleHairAttribute[hair][sex] = true; } } function visibleHairAttribute(Punk memory punk) public view returns (bool) { return !lacksVisibleHairAttribute[punk.hair][punk.sex]; } mapping(PunkAttributeValue => mapping(PunkAttributeValue => uint8)) public originalEyePixelGapMapping; function setOriginalEyePixelGap(PunkAttributeValue[] memory hairs, PunkAttributeValue[] memory sexes, uint8[] memory gaps) external onlyOwner { for (uint i = 0; i < hairs.length; i++) { PunkAttributeValue hair = hairs[i]; PunkAttributeValue sex = sexes[i]; originalEyePixelGapMapping[hair][sex] = gaps[i]; } } function originalEyePixelGap(Punk memory punk) public view returns (uint8 gap) { return originalEyePixelGapMapping[punk.hair][punk.sex]; } function eyesWithBlackTop(Punk memory punk) public pure returns (bool) { if (punk.sex == PunkAttributeValue.FEMALE && punk.eyes == PunkAttributeValue.REGULAR_SHADES) { return true; } return ( punk.eyes == PunkAttributeValue.NERD_GLASSES || punk.eyes == PunkAttributeValue.HORNED_RIM_GLASSES || punk.eyes == PunkAttributeValue.EYE_PATCH || punk.eyes == PunkAttributeValue.EYE_MASK || punk.eyes == PunkAttributeValue.CLASSIC_SHADES || punk.eyes == PunkAttributeValue.BIG_SHADES || punk.eyes == PunkAttributeValue.VR ); } struct Punk { uint16 id; uint16 seed; 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; } function initializePunk(uint16 punkId, uint16 punkSeed) public view returns (Punk memory) { Punk memory punk = Punk({ id: punkId, seed: punkSeed, 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 }); string memory attributes = punkDataContract.punkAttributes(punk.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 = attrStringToEnumMapping[trimmedAttribute]; PunkAttributeType attrType = attrValueToTypeEnumMapping[attrValue]; if (attrType == PunkAttributeType.SEX) { punk.sex = attrValue; } else if (attrType == PunkAttributeType.HAIR) { punk.hair = attrValue; } else if (attrType == PunkAttributeType.EYES) { punk.eyes = attrValue; } else if (attrType == PunkAttributeType.BEARD) { punk.beard = attrValue; } else if (attrType == PunkAttributeType.EARS) { punk.ears = attrValue; } else if (attrType == PunkAttributeType.LIPS) { punk.lips = attrValue; } else if (attrType == PunkAttributeType.MOUTH) { punk.mouth = attrValue; } else if (attrType == PunkAttributeType.FACE) { punk.face = attrValue; } else if (attrType == PunkAttributeType.EMOTION) { punk.emotion = attrValue; } else if (attrType == PunkAttributeType.NECK) { punk.neck = attrValue; } else if (attrType == PunkAttributeType.NOSE) { punk.nose = attrValue; } else if (attrType == PunkAttributeType.CHEEKS) { punk.cheeks = attrValue; } else if (attrType == PunkAttributeType.TEETH) { punk.teeth = attrValue; } } return punk; } function punkAttributesAsJSON(uint16 punkId, uint16 punkSeed) public view returns (string memory json) { Punk memory punk = initializePunk(punkId, punkSeed); PunkAttributeValue none = PunkAttributeValue.NONE; bytes memory output = "["; HatType hat = punkHatType(punk); HatColor hatColor = punkHatColor(punk); HatPosition hatPosition = punkHatPosition(punk); PunkAttributeValue[13] memory attrArray = [ punk.sex, (visibleHair(punk) ? punk.hair : none), punk.eyes, punk.beard, punk.ears, punk.lips, punk.mouth, punk.face, punk.emotion, punk.neck, punk.nose, punk.cheeks, punk.teeth ]; bytes memory hatColorBytes; if (hatColor == HatColor.BLACK) { hatColorBytes = "Black"; } else if (hatColor == HatColor.GREY) { hatColorBytes = "Grey"; } else if (hatColor == HatColor.RED) { hatColorBytes = "Red"; } else if (hatColor == HatColor.WHITE) { hatColorBytes = "White"; } else if (hatColor == HatColor.TAN) { hatColorBytes = "Tan"; } else if (hatColor == HatColor.BROWN) { hatColorBytes = "Brown"; } bytes memory hatTypeBytes; if (hat == HatType.BASEBALL) { hatTypeBytes = "Baseball Cap"; } else if (hat == HatType.BUCKET) { hatTypeBytes = "Bucket Hat"; } else if (hat == HatType.COWBOY) { hatTypeBytes = "Cowboy Hat"; } else if (hat == HatType.VISOR) { hatTypeBytes = "Visor"; } for (uint i = 0; i < 13; ++i) { PunkAttributeValue attrVal = attrArray[i]; if (attrVal != none) { output = abi.encodePacked(output, punkAttributeAsJSON(attrVal), ","); } } bytes memory hatName = abi.encodePacked(hatColorBytes, " ", hatTypeBytes); if (hatPosition == HatPosition.FLIPPED) { hatName = abi.encodePacked("Backwards ", hatName); } bytes memory hatTrait = abi.encodePacked( '{"trait_type":"Fashion Hat", "value":"', hatName, '"}' ); return string(abi.encodePacked(output, hatTrait, "]")); } function punkAttributeAsJSON(PunkAttributeValue attribute) internal view returns (string memory json) { require(attribute != PunkAttributeValue.NONE); string memory attributeAsString = attrEnumToStringMapping[attribute]; string memory attributeTypeAsString; PunkAttributeType attrType = attrValueToTypeEnumMapping[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 visibleHair(Punk memory punk) public view returns (bool) { HatType hat = punkHatType(punk); if (visibleHairAttribute(punk)) { return true; } if (punk.hair == PunkAttributeValue.BEANIE && hat == HatType.BASEBALL) { return true; } bool tiaraBlocked = punk.eyes == PunkAttributeValue.REGULAR_SHADES || punk.eyes == PunkAttributeValue.CLASSIC_SHADES || punk.eyes == PunkAttributeValue.HORNED_RIM_GLASSES || punk.eyes == PunkAttributeValue.THREE_D_GLASSES || punk.eyes == PunkAttributeValue.EYE_PATCH || punk.eyes == PunkAttributeValue.EYE_MASK; if (punk.hair == PunkAttributeValue.TIARA && (!tiaraBlocked || hatEyePixelGap(punk) == 2)) { return true; } return false; } mapping(PunkAttributeValue => PunkAttributeType) public attrValueToTypeEnumMapping; function setAttrValueToTypeEnumMapping(uint8[][] memory attrValuesAndTypes) external onlyOwner { for (uint i; i < attrValuesAndTypes.length; i++) { PunkAttributeValue attrVal = PunkAttributeValue(attrValuesAndTypes[i][0]); PunkAttributeType attrType = PunkAttributeType(attrValuesAndTypes[i][1]); attrValueToTypeEnumMapping[attrVal] = attrType; } } mapping(string => PunkAttributeValue) public attrStringToEnumMapping; mapping(PunkAttributeValue => string) public attrEnumToStringMapping; function setAttrStringToEnumMapping(string[] memory attrStrs, PunkAttributeValue[] memory attrEnums) external onlyOwner { for (uint i; i < attrStrs.length; i++) { string memory attrString = attrStrs[i]; PunkAttributeValue attrEnum = attrEnums[i]; attrStringToEnumMapping[attrString] = attrEnum; attrEnumToStringMapping[attrEnum] = attrString; } } mapping(PunkAttributeValue => mapping(PunkAttributeValue => mapping(HatType => bool))) public hatAvailableBySexAndHair; function canWearHat(Punk memory punk, HatType hat) public view returns (bool) { return hatAvailableBySexAndHair[punk.hair][punk.sex][hat]; } function setAvailableHats(PunkAttributeValue[] memory hairs, PunkAttributeValue[] memory sexes, HatType[] memory hats) external onlyOwner { for (uint i; i < hairs.length; i++) { PunkAttributeValue hair = hairs[i]; PunkAttributeValue sex = sexes[i]; HatType hat = hats[i]; hatAvailableBySexAndHair[hair][sex][hat] = true; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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 // 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 v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
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; } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "details": { "constantOptimizer": true, "cse": true, "deduplicate": true, "inliner": true, "jumpdestRemover": true, "orderLiterals": true, "peephole": true, "yul": false }, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"punkDataContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"}],"name":"attrEnumToStringMapping","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"attrStringToEnumMapping","outputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"}],"name":"attrValueToTypeEnumMapping","outputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"canFlipHat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"}],"name":"canFlipHatMapping","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"},{"internalType":"enum FashionHatPunksData.HatType","name":"hat","type":"uint8"}],"name":"canWearHat","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"eyesWithBlackTop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"},{"internalType":"enum FashionHatPunksData.HatType","name":"","type":"uint8"}],"name":"hatAvailableBySexAndHair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"hatEyePixelGap","outputs":[{"internalType":"uint8","name":"gap","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"punkId","type":"uint16"},{"internalType":"uint16","name":"punkSeed","type":"uint16"}],"name":"initializePunk","outputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"}],"name":"lacksVisibleHairAttribute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"originalEyePixelGap","outputs":[{"internalType":"uint8","name":"gap","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"}],"name":"originalEyePixelGapMapping","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"punkId","type":"uint16"},{"internalType":"uint16","name":"punkSeed","type":"uint16"}],"name":"punkAttributesAsJSON","outputs":[{"internalType":"string","name":"json","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"punkHatColor","outputs":[{"internalType":"enum FashionHatPunksData.HatColor","name":"result","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"punkHatPosition","outputs":[{"internalType":"enum FashionHatPunksData.HatPosition","name":"result","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"punkHatSize","outputs":[{"internalType":"enum FashionHatPunksData.HatSize","name":"result","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"punkHatType","outputs":[{"internalType":"enum FashionHatPunksData.HatType","name":"result","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"},{"internalType":"uint256","name":"lessThanNumb","type":"uint256"},{"internalType":"string","name":"seedAddition","type":"string"}],"name":"randomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"attrStrs","type":"string[]"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"attrEnums","type":"uint8[]"}],"name":"setAttrStringToEnumMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[][]","name":"attrValuesAndTypes","type":"uint8[][]"}],"name":"setAttrValueToTypeEnumMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"hairs","type":"uint8[]"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"sexes","type":"uint8[]"},{"internalType":"enum FashionHatPunksData.HatType[]","name":"hats","type":"uint8[]"}],"name":"setAvailableHats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"hairs","type":"uint8[]"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"sexes","type":"uint8[]"}],"name":"setLacksVisibleHairAttribute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"hairs","type":"uint8[]"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"sexes","type":"uint8[]"},{"internalType":"uint8[]","name":"gaps","type":"uint8[]"}],"name":"setOriginalEyePixelGap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"hairs","type":"uint8[]"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"sexes","type":"uint8[]"}],"name":"setVisorLooksGood","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"hairs","type":"uint8[]"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue[]","name":"sexes","type":"uint8[]"}],"name":"setcanFlipHatMapping","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"visibleHair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"}],"name":"visibleHairAttribute","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"","type":"uint8"}],"name":"visorLooksGood","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"id","type":"uint16"},{"internalType":"uint16","name":"seed","type":"uint16"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"sex","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"hair","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"eyes","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"beard","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"ears","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"lips","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"mouth","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"face","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"emotion","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"neck","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"nose","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"cheeks","type":"uint8"},{"internalType":"enum FashionHatPunksData.PunkAttributeValue","name":"teeth","type":"uint8"}],"internalType":"struct FashionHatPunksData.Punk","name":"punk","type":"tuple"},{"internalType":"uint256[]","name":"choiceWeights","type":"uint256[]"},{"internalType":"string","name":"seedAddition","type":"string"}],"name":"weightedChoice","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200538a3803806200538a8339810160408190526200003491620000db565b6200003f3362000051565b6001600160a01b031660805262000108565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0382165b92915050565b620000bf81620000a1565b8114620000cb57600080fd5b50565b8051620000ae81620000b4565b600060208284031215620000f257620000f2600080fd5b6000620001008484620000ce565b949350505050565b60805161526662000124600039600061144301526152666000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638da5cb5b1161011a578063d16c48d8116100ad578063f1c4439f1161007c578063f1c4439f14610539578063f295426714610567578063f2fde38b1461057a578063fc9faca51461058d578063ff213f89146105a057600080fd5b8063d16c48d8146104a4578063dc6e449e146104df578063e1a944a6146104f2578063ecd560161461052657600080fd5b8063c1597dab116100e9578063c1597dab14610458578063c63da44d1461046b578063c7fa47ce1461047e578063cf7ac36e1461049157600080fd5b80638da5cb5b146103de578063a1f70561146103f7578063b963da0114610425578063c14adbce1461044557600080fd5b8063683375c4116101925780638664d6fd116101615780638664d6fd146103855780638b7b2afa146103985780638bc61064146103ab5780638bcbf89a146103be57600080fd5b8063683375c4146102ff5780636f065ea51461032f578063715018a61461035d57806372ff70491461036557600080fd5b80635586b160116101ce5780635586b1601461029957806355ac3d88146102b957806357bc535b146102cc5780636424a214146102ec57600080fd5b806314c5f1e214610200578063234cbd65146102155780633f4af2d11461025957806340a0020514610279575b600080fd5b61021361020e3660046141ec565b6105b3565b005b61024361022336600461423e565b600360209081526000928352604080842090915290825290205460ff1681565b6040516102509190614285565b60405180910390f35b61026c610267366004614406565b6106fa565b604051610250919061446c565b61028c610287366004614521565b610f1f565b6040516102509190614594565b6102ac6102a7366004614406565b610f89565b60405161025091906145d0565b6102136102c7366004614653565b61122f565b6102df6102da3660046146b9565b611336565b604051610250919061484e565b6102436102fa366004614406565b6118b6565b61032261030d36600461485d565b60056020526000908152604090205460ff1681565b60405161025091906148ac565b61024361033d36600461423e565b600260209081526000928352604080842090915290825290205460ff1681565b6102136119dd565b61037861037336600461492f565b611a13565b6040516102509190614989565b610378610393366004614406565b611af1565b6102ac6103a6366004614406565b611d35565b6102436103b9366004614406565b611fcb565b6103d16103cc3660046146b9565b612138565b60405161025091906149f5565b6000546001600160a01b03166040516102509190614a20565b61037861040536600461423e565b600460209081526000928352604080842090915290825290205460ff1681565b610438610433366004614406565b61279a565b6040516102509190614a5c565b610213610453366004614afb565b612df6565b610213610466366004614653565b612f06565b610243610479366004614406565b613007565b61021361048c366004614bc3565b613086565b61021361049f366004614c56565b6131e1565b6104d26104b2366004614ce9565b805160208183018101805160068252928201919093012091525460ff1681565b6040516102509190614d23565b6102136104ed366004614653565b613302565b610243610500366004614d31565b600860209081526000938452604080852082529284528284209052825290205460ff1681565b610378610534366004614406565b613404565b61024361054736600461423e565b600160209081526000928352604080842090915290825290205460ff1681565b610243610575366004614d77565b613482565b610213610588366004614dc0565b613534565b6103d161059b36600461485d565b613590565b6102436105ae366004614406565b61362a565b6000546001600160a01b031633146105e65760405162461bcd60e51b81526004016105dd90614de1565b60405180910390fd5b60005b81518110156106f657600082828151811061060657610606614e1b565b602002602001015160008151811061062057610620614e1b565b602002602001015160ff16605c81111561063c5761063c614428565b9050600083838151811061065257610652614e1b565b602002602001015160018151811061066c5761066c614e1b565b602002602001015160ff16600c81111561068857610688614428565b9050806005600084605c8111156106a1576106a1614428565b605c8111156106b2576106b2614428565b81526020810191909152604001600020805460ff1916600183600c8111156106dc576106dc614428565b0217905550505080806106ee90614e47565b9150506105e9565b5050565b6000806107068361279a565b60408051600680825260e08201909252919250600091906020820160c080368337019050509050600082600381111561074157610741614428565b141561081e5763861c46808160008151811061075f5761075f614e1b565b6020908102919091010152639502f9008160018151811061078257610782614e1b565b60209081029190910101526377359400816002815181106107a5576107a5614e1b565b6020908102919091010152639502f900816003815181106107c8576107c8614e1b565b602090810291909101015263773594008160045b815181106107ec576107ec614e1b565b602090810291909101015260008160055b8151811061080d5761080d614e1b565b602002602001018181525050610a87565b600182600381111561083257610832614428565b14156108ee5764012a05f2008160008151811061085157610851614e1b565b602090810291909101015260008160018151811061087157610871614e1b565b602090810291909101015260008160028151811061089157610891614e1b565b60209081029190910101526000816003815181106108b1576108b1614e1b565b602090810291909101015264012a05f200816004815181106108d5576108d5614e1b565b602090810291909101015264012a05f2008160056107fd565b600282600381111561090257610902614428565b141561099c57640165a0bc008160008151811061092157610921614e1b565b602090810291909101015263773594008160018151811061094457610944614e1b565b602090810291909101015260008160028151811061096457610964614e1b565b602090810291909101015260008160038151811061098457610984614e1b565b602090810291909101015263ee6b28008160046107dc565b60038260038111156109b0576109b0614428565b1415610a875763861c4680816000815181106109ce576109ce614e1b565b6020908102919091010152639502f900816001815181106109f1576109f1614e1b565b6020908102919091010152637735940081600281518110610a1457610a14614e1b565b6020908102919091010152639502f90081600381518110610a3757610a37614e1b565b6020908102919091010152637735940081600481518110610a5a57610a5a614e1b565b6020908102919091010152600081600581518110610a7a57610a7a614e1b565b6020026020010181815250505b60298460600151605c811115610a9f57610a9f614428565b1415610b4f576000818181518110610ab957610ab9614e1b565b6020908102919091010152600081600181518110610ad957610ad9614e1b565b6020908102919091010152633b9aca0081600281518110610afc57610afc614e1b565b602090810291909101015263b2d05e0081600381518110610b1f57610b1f614e1b565b602090810291909101015263b2d05e0081600481518110610b4257610b42614e1b565b6020026020010181815250505b60528460800151605c811115610b6757610b67614428565b1480610b885750605b8460600151605c811115610b8657610b86614428565b145b15610baf57600081600381518110610ba257610ba2614e1b565b6020026020010181815250505b60188460600151605c811115610bc757610bc7614428565b148015610be557506001826003811115610be357610be3614428565b145b15610c1757600a81600081518110610bff57610bff614e1b565b60200260200101818151610c139190614e78565b9052505b6003826003811115610c2b57610c2b614428565b1415610d1057605a8460600151605c811115610c4957610c49614428565b1480610c6a575060268460600151605c811115610c6857610c68614428565b145b80610caa575060288460600151605c811115610c8857610c88614428565b148015610caa5750601e8460400151605c811115610ca857610ca8614428565b145b15610cd0576000818181518110610cc357610cc3614e1b565b6020026020010181815250505b60598460600151605c811115610ce857610ce8614428565b1415610d1057600081600481518110610d0357610d03614e1b565b6020026020010181815250505b6002826003811115610d2457610d24614428565b1480610d4157506001826003811115610d3f57610d3f614428565b145b15610dd557610d4f846118b6565b80610d6f575060228460600151605c811115610d6d57610d6d614428565b145b80610d8f5750605a8460600151605c811115610d8d57610d8d614428565b145b80610daf575060268460600151605c811115610dad57610dad614428565b145b15610dd5576000818181518110610dc857610dc8614e1b565b6020026020010181815250505b601e8460400151605c811115610ded57610ded614428565b14158015610e2f575060578460800151605c811115610e0e57610e0e614428565b1480610e2f575060068460800151605c811115610e2d57610e2d614428565b145b15610e55576000818181518110610e4857610e48614e1b565b6020026020010181815250505b60178460600151605c811115610e6d57610e6d614428565b148015610eaa5750601e8460400151605c811115610e8d57610e8d614428565b1480610eaa57506003826003811115610ea857610ea8614428565b145b15610ed157600081600281518110610ec457610ec4614e1b565b6020026020010181815250505b6000610eff8583604051806040016040528060098152602001683430ba2fb1b7b637b960b91b815250611a13565b90508060ff166005811115610f1657610f16614428565b95945050505050565b60208301518351600091908290610f399061ffff1661365d565b610f468361ffff1661365d565b85604051602001610f5993929190614ebc565b60408051601f1981840301815291905280516020909101209050610f7d8582614eeb565b925050505b9392505050565b600080610f958361279a565b90506000816003811115610fab57610fab614428565b14610fb95750600092915050565b60408051600280825260608201835260009260208301908036833701905050905064012a05f20081600081518110610ff357610ff3614e1b565b602090810291909101015264012a05f2008160018151811061101757611017614e1b565b602090810291909101015260268460600151605c81111561103a5761103a614428565b141561104a575060019392505050565b6110538461362a565b611061575060009392505050565b601e8460400151605c81111561107957611079614428565b141580156110bb575060578460800151605c81111561109a5761109a614428565b14806110bb575060068460800151605c8111156110b9576110b9614428565b145b80156110d257506110cb84611af1565b60ff166001145b156111065760068460800151605c8111156110ef576110ef614428565b146110fb5760016110fe565b60005b949350505050565b601e8460400151605c81111561111e5761111e614428565b1480611135575061112e84613404565b60ff166001145b801561115757506010846101000151605c81111561115557611155614428565b145b1561118957600a8160008151811061117157611171614e1b565b602002602001018181516111859190614e78565b9052505b60298460600151605c8111156111a1576111a1614428565b14806111c2575060048460600151605c8111156111c0576111c0614428565b145b806111d857506111d184613404565b60ff166002145b156111e7575060009392505050565b600061121885836040518060400160405280600c81526020016b3430ba2fb837b9b4ba34b7b760a11b815250611a13565b90508060ff166001811115610f1657610f16614428565b6000546001600160a01b031633146112595760405162461bcd60e51b81526004016105dd90614de1565b60005b825181101561133157600083828151811061127957611279614e1b565b60200260200101519050600083838151811061129757611297614e1b565b6020026020010151905060016003600084605c8111156112b9576112b9614428565b605c8111156112ca576112ca614428565b8152602001908152602001600020600083605c8111156112ec576112ec614428565b605c8111156112fd576112fd614428565b81526020810191909152604001600020805460ff19169115159190911790555081905061132981614e47565b91505061125c565b505050565b6113ae604080516101e0810182526000808252602082018190529091820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101e08101825261ffff808616825284166020820152600091810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905280516040516376dfe29760e01b81529192506000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916376dfe297916114779190600401614eff565b600060405180830381865afa158015611494573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114bc9190810190614f65565b905060006114ec604051806040016040528060018152602001600b60fa1b8152508361375a90919063ffffffff16565b905060005b81518110156118a957600082828151811061150e5761150e614e1b565b6020026020010151905060606001831015611567576040805180820190915260018152600160fd1b602082015261154690839061375a565b60008151811061155857611558614e1b565b60200260200101519050611584565b611581600183516115789190614f9f565b8390600161394d565b90505b60006006826040516115969190614fb6565b9081526040519081900360200190205460ff169050600060058183605c8111156115c2576115c2614428565b605c8111156115d3576115d3614428565b8152602081019190915260400160009081205460ff16915081600c8111156115fd576115fd614428565b1415611634576040880182605c81111561161957611619614428565b9081605c81111561162c5761162c614428565b905250611892565b600181600c81111561164857611648614428565b1415611664576060880182605c81111561161957611619614428565b600281600c81111561167857611678614428565b1415611694576080880182605c81111561161957611619614428565b600381600c8111156116a8576116a8614428565b14156116c45760a0880182605c81111561161957611619614428565b600481600c8111156116d8576116d8614428565b14156116f45760c0880182605c81111561161957611619614428565b600581600c81111561170857611708614428565b14156117245760e0880182605c81111561161957611619614428565b600681600c81111561173857611738614428565b141561175557610100880182605c81111561161957611619614428565b600781600c81111561176957611769614428565b141561178657610120880182605c81111561161957611619614428565b600881600c81111561179a5761179a614428565b14156117b757610140880182605c81111561161957611619614428565b600981600c8111156117cb576117cb614428565b14156117e857610160880182605c81111561161957611619614428565b600a81600c8111156117fc576117fc614428565b141561181957610180880182605c81111561161957611619614428565b600b81600c81111561182d5761182d614428565b141561184a576101a0880182605c81111561161957611619614428565b600c81600c81111561185e5761185e614428565b1415611892576101c0880182605c81111561187b5761187b614428565b9081605c81111561188e5761188e614428565b9052505b5050505080806118a190614e47565b9150506114f1565b5091925050505b92915050565b6000601e8260400151605c8111156118d0576118d0614428565b1480156118f2575060458260800151605c8111156118f0576118f0614428565b145b156118ff57506001919050565b60378260800151605c81111561191757611917614428565b14806119385750602a8260800151605c81111561193657611936614428565b145b806119585750601c8260800151605c81111561195657611956614428565b145b806119785750601b8260800151605c81111561197657611976614428565b145b80611998575060118260800151605c81111561199657611996614428565b145b806119b8575060068260800151605c8111156119b6576119b6614428565b145b806118b0575060578260800151605c8111156119d6576119d6614428565b1492915050565b6000546001600160a01b03163314611a075760405162461bcd60e51b81526004016105dd90614de1565b611a116000613a3d565b565b81516000908190815b81811015611a5d57858181518110611a3657611a36614e1b565b602002602001015183611a499190614fc2565b925080611a5581614e47565b915050611a1c565b506000611a6b878487610f1f565b905060005b828160ff161015611ae657868160ff1681518110611a9057611a90614e1b565b6020026020010151821015611aaa579350610f8292505050565b868160ff1681518110611abf57611abf614e1b565b602002602001015182611ad29190614f9f565b915080611ade81614fda565b915050611a70565b505050509392505050565b600080611afd8361279a565b90506003816003811115611b1357611b13614428565b1480611b3057506001816003811115611b2e57611b2e614428565b145b80611b4c57506002816003811115611b4a57611b4a614428565b145b15611b5a5750600192915050565b60038360600151605c811115611b7257611b72614428565b1415611bef57601e8360400151605c811115611b9057611b90614428565b1415611b9f5750600192915050565b60068360800151605c811115611bb757611bb7614428565b1480611bd8575060578360800151605c811115611bd657611bd6614428565b145b15611be65750600292915050565b50600192915050565b6000611bfa84613404565b9050601e8460400151605c811115611c1457611c14614428565b14611c745760148460600151605c811115611c3157611c31614428565b1480611c53575060295b8460600151605c811115611c5157611c51614428565b145b15611c62575060019392505050565b60008160ff1611610f825760026110fe565b6000826003811115611c8857611c88614428565b148015611cc9575060188460600151605c811115611ca857611ca8614428565b1480611cc95750603a8460600151605c811115611cc757611cc7614428565b145b80611c535750603e8460600151605c811115611ce757611ce7614428565b1480611d085750604d8460600151605c811115611d0657611d06614428565b145b80611d285750604e8460600151605c811115611d2657611d26614428565b145b80611c535750604f611c3b565b600080611d418361279a565b9050601e8360400151605c811115611d5b57611d5b614428565b14611d695750600092915050565b6000816003811115611d7d57611d7d614428565b148015611d9f575060178360600151605c811115611d9d57611d9d614428565b145b15611dad5750600092915050565b6001816003811115611dc157611dc1614428565b148015611de35750605a8360600151605c811115611de157611de1614428565b145b15611df15750600092915050565b6001816003811115611e0557611e05614428565b1480611e2257506000816003811115611e2057611e20614428565b145b15611e6e5760088360600151605c811115611e3f57611e3f614428565b1480611e60575060098360600151605c811115611e5e57611e5e614428565b145b15611e6e5750600092915050565b6002816003811115611e8257611e82614428565b1480611e9f57506001816003811115611e9d57611e9d614428565b145b80611ebb57506000816003811115611eb957611eb9614428565b145b15611ee75760228360600151605c811115611ed857611ed8614428565b1415611ee75750600092915050565b6002816003811115611efb57611efb614428565b1480611f1857506001816003811115611f1657611f16614428565b145b15611f645760268360600151605c811115611f3557611f35614428565b1480611f56575060598360600151605c811115611f5457611f54614428565b145b15611f645750600092915050565b604e8360600151605c811115611f7c57611f7c614428565b1480611f9d5750604d8360600151605c811115611f9b57611f9b614428565b145b80611fbd5750604f8360600151605c811115611fbb57611fbb614428565b145b15611be65750600092915050565b600080611fd78361279a565b9050611fe283613007565b15611ff05750600192915050565b60048360600151605c81111561200857612008614428565b1480156120265750600081600381111561202457612024614428565b145b156120345750600192915050565b600060458460800151605c81111561204e5761204e614428565b148061206f575060118460800151605c81111561206d5761206d614428565b145b8061208f5750602a8460800151605c81111561208d5761208d614428565b145b806120af575060528460800151605c8111156120ad576120ad614428565b145b806120cf5750601c8460800151605c8111156120cd576120cd614428565b145b806120ef5750601b8460800151605c8111156120ed576120ed614428565b145b905060538460600151605c81111561210957612109614428565b1480156121295750801580612129575061212284611af1565b60ff166002145b156110fb575060019392505050565b606060006121468484611336565b6040805180820190915260018152605b60f81b60208201529091506000908161216e8461279a565b9050600061217b856106fa565b9050600061218886610f89565b90506000604051806101a001604052808860400151605c8111156121ae576121ae614428565b605c8111156121bf576121bf614428565b81526020016121cd89611fcb565b6121d757876121dd565b88606001515b605c8111156121ee576121ee614428565b605c8111156121ff576121ff614428565b81526020018860800151605c81111561221a5761221a614428565b605c81111561222b5761222b614428565b81526020018860a00151605c81111561224657612246614428565b605c81111561225757612257614428565b81526020018860c00151605c81111561227257612272614428565b605c81111561228357612283614428565b81526020018860e00151605c81111561229e5761229e614428565b605c8111156122af576122af614428565b8152602001886101000151605c8111156122cb576122cb614428565b605c8111156122dc576122dc614428565b8152602001886101200151605c8111156122f8576122f8614428565b605c81111561230957612309614428565b8152602001886101400151605c81111561232557612325614428565b605c81111561233657612336614428565b8152602001886101600151605c81111561235257612352614428565b605c81111561236357612363614428565b8152602001886101800151605c81111561237f5761237f614428565b605c81111561239057612390614428565b8152602001886101a00151605c8111156123ac576123ac614428565b605c8111156123bd576123bd614428565b8152602001886101c00151605c8111156123d9576123d9614428565b605c8111156123ea576123ea614428565b905290506060600084600581111561240457612404614428565b141561242c5750604080518082019091526005815264426c61636b60d81b602082015261254f565b600184600581111561244057612440614428565b141561246757506040805180820190915260048152634772657960e01b602082015261254f565b600284600581111561247b5761247b614428565b14156124a1575060408051808201909152600381526214995960ea1b602082015261254f565b60038460058111156124b5576124b5614428565b14156124dd5750604080518082019091526005815264576869746560d81b602082015261254f565b60048460058111156124f1576124f1614428565b141561251757506040805180820190915260038152622a30b760e91b602082015261254f565b600584600581111561252b5761252b614428565b141561254f5750604080518082019091526005815264213937bbb760d91b60208201525b6060600086600381111561256557612565614428565b1415612594575060408051808201909152600c81526b04261736562616c6c204361760a41b602082015261264e565b60018660038111156125a8576125a8614428565b14156125d5575060408051808201909152600a815269109d58dad95d0812185d60b21b602082015261264e565b60028660038111156125e9576125e9614428565b1415612616575060408051808201909152600a81526910dbddd89bde4812185d60b21b602082015261264e565b600386600381111561262a5761262a614428565b141561264e57506040805180820190915260058152642b34b9b7b960d91b60208201525b60005b600d8110156126dc5760008482600d811061266e5761266e614e1b565b6020020151905089605c81111561268757612687614428565b81605c81111561269957612699614428565b146126cb57886126a882613a8d565b6040516020016126b9929190615001565b60405160208183030381529060405298505b506126d581614e47565b9050612651565b50600082826040516020016126f2929190615032565b60408051601f198184030181529190529050600185600181111561271857612718614428565b1415612741578060405160200161272f9190615055565b60405160208183030381529060405290505b6000816040516020016127549190615074565b604051602081830303815290604052905088816040516020016127789291906150d6565b6040516020818303038152906040529b50505050505050505050505092915050565b60408051600480825260a082019092526000918291906020820160808036833701905050905060005b600481101561280057639502f9008282815181106127e3576127e3614e1b565b6020908102919091010152806127f881614e47565b9150506127c3565b50600260008460600151605c81111561281b5761281b614428565b605c81111561282c5761282c614428565b815260200190815260200160002060008460400151605c81111561285257612852614428565b605c81111561286357612863614428565b815260208101919091526040016000205460ff166128a057631dcd65008160038151811061289357612893614e1b565b6020026020010181815250505b60168360600151605c8111156128b8576128b8614428565b14156128c75750600292915050565b600c8360600151605c8111156128df576128df614428565b1480612900575060048360600151605c8111156128fe576128fe614428565b145b806129375750601e8360400151605c81111561291e5761291e614428565b14158015612937575061293083613404565b60ff166002145b156129455750600092915050565b601e8360400151605c81111561295d5761295d614428565b1480612974575061296d83613404565b60ff166001145b801561299657506010836101000151605c81111561299457612994614428565b145b80156129c957506129a8836001613482565b806129c957506129b9836000613482565b80156129c957506129c98361362a565b15612a60576005816002815181106129e3576129e3614e1b565b602002602001018181516129f79190614e78565b905250600581600381518110612a0f57612a0f614e1b565b60200260200101818151612a239190614e78565b905250612a2f8361362a565b612a6057600581600081518110612a4857612a48614e1b565b60200260200101818151612a5c9190614e78565b9052505b6037836020015161ffff16108015612a7e5750612a7e836000613482565b8015612aa05750601e8360400151605c811115612a9d57612a9d614428565b14155b8015612ae0575060578360800151605c811115612abf57612abf614428565b1480612ae0575060068360800151605c811115612ade57612ade614428565b145b8015612af85750612af083613404565b60ff16600114155b15612b065750600092915050565b604b836020015161ffff16108015612b345750601e8360400151605c811115612b3157612b31614428565b14155b8015612b74575060578360800151605c811115612b5357612b53614428565b1480612b74575060068360800151605c811115612b7257612b72614428565b145b8015612b975750612b86836002613482565b80612b975750612b97836001613482565b15612bdd576000818181518110612bb057612bb0614e1b565b6020908102919091010152600081600381518110612bd057612bd0614e1b565b6020026020010181815250505b612be683613007565b158015612c1b5750612bf9836002613482565b80612c0a5750612c0a836000613482565b80612c1b5750612c1b836001613482565b15612c4257600081600381518110612c3557612c35614e1b565b6020026020010181815250505b601e8360400151605c811115612c5a57612c5a614428565b14158015612c7d575060148360600151605c811115612c7b57612c7b614428565b145b8015612cbd575060578360800151605c811115612c9c57612c9c614428565b1480612cbd575060068360800151605c811115612cbb57612cbb614428565b145b15612ce457600081600381518110612cd757612cd7614e1b565b6020026020010181815250505b60588360800151605c811115612cfc57612cfc614428565b148015612d315750612d0f836002613482565b80612d205750612d20836000613482565b80612d315750612d31836001613482565b15612d5857600081600381518110612d4b57612d4b614e1b565b6020026020010181815250505b60005b6004811015612db157612d7a8482600381111561057557610575614428565b612d9f576000828281518110612d9257612d92614e1b565b6020026020010181815250505b80612da981614e47565b915050612d5b565b506000612ddf8483604051806040016040528060088152602001676861745f7479706560c01b815250611a13565b90508060ff1660038111156110fe576110fe614428565b6000546001600160a01b03163314612e205760405162461bcd60e51b81526004016105dd90614de1565b60005b8251811015611331576000838281518110612e4057612e40614e1b565b602002602001015190506000838381518110612e5e57612e5e614e1b565b6020026020010151905080600683604051612e799190614fb6565b908152604051908190036020019020805460ff1916600183605c811115612ea257612ea2614428565b0217905550816007600083605c811115612ebe57612ebe614428565b605c811115612ecf57612ecf614428565b81526020019081526020016000209080519060200190612ef0929190613fa2565b5050508080612efe90614e47565b915050612e23565b6000546001600160a01b03163314612f305760405162461bcd60e51b81526004016105dd90614de1565b60005b8251811015611331576000838281518110612f5057612f50614e1b565b602002602001015190506000838381518110612f6e57612f6e614e1b565b60200260200101519050600180600084605c811115612f8f57612f8f614428565b605c811115612fa057612fa0614428565b8152602001908152602001600020600083605c811115612fc257612fc2614428565b605c811115612fd357612fd3614428565b81526020810191909152604001600020805460ff191691151591909117905550819050612fff81614e47565b915050612f33565b6000600360008360600151605c81111561302357613023614428565b605c81111561303457613034614428565b815260200190815260200160002060008360400151605c81111561305a5761305a614428565b605c81111561306b5761306b614428565b815260208101919091526040016000205460ff161592915050565b6000546001600160a01b031633146130b05760405162461bcd60e51b81526004016105dd90614de1565b60005b83518110156131db5760008482815181106130d0576130d0614e1b565b6020026020010151905060008483815181106130ee576130ee614e1b565b60200260200101519050600084848151811061310c5761310c614e1b565b6020026020010151905060016008600085605c81111561312e5761312e614428565b605c81111561313f5761313f614428565b8152602001908152602001600020600084605c81111561316157613161614428565b605c81111561317257613172614428565b8152602001908152602001600020600083600381111561319457613194614428565b60038111156131a5576131a5614428565b81526020810191909152604001600020805460ff1916911515919091179055508291506131d3905081614e47565b9150506130b3565b50505050565b6000546001600160a01b0316331461320b5760405162461bcd60e51b81526004016105dd90614de1565b60005b83518110156131db57600084828151811061322b5761322b614e1b565b60200260200101519050600084838151811061324957613249614e1b565b6020026020010151905083838151811061326557613265614e1b565b60200260200101516004600084605c81111561328357613283614428565b605c81111561329457613294614428565b8152602001908152602001600020600083605c8111156132b6576132b6614428565b605c8111156132c7576132c7614428565b815260200190815260200160002060006101000a81548160ff021916908360ff160217905550505080806132fa90614e47565b91505061320e565b6000546001600160a01b0316331461332c5760405162461bcd60e51b81526004016105dd90614de1565b60005b825181101561133157600083828151811061334c5761334c614e1b565b60200260200101519050600083838151811061336a5761336a614e1b565b6020026020010151905060016002600084605c81111561338c5761338c614428565b605c81111561339d5761339d614428565b8152602001908152602001600020600083605c8111156133bf576133bf614428565b605c8111156133d0576133d0614428565b81526020810191909152604001600020805460ff1916911515919091179055508190506133fc81614e47565b91505061332f565b6000600460008360600151605c81111561342057613420614428565b605c81111561343157613431614428565b815260200190815260200160002060008360400151605c81111561345757613457614428565b605c81111561346857613468614428565b815260208101919091526040016000205460ff1692915050565b6000600860008460600151605c81111561349e5761349e614428565b605c8111156134af576134af614428565b815260200190815260200160002060008460400151605c8111156134d5576134d5614428565b605c8111156134e6576134e6614428565b8152602001908152602001600020600083600381111561350857613508614428565b600381111561351957613519614428565b815260208101919091526040016000205460ff169392505050565b6000546001600160a01b0316331461355e5760405162461bcd60e51b81526004016105dd90614de1565b6001600160a01b0381166135845760405162461bcd60e51b81526004016105dd906150f9565b61358d81613a3d565b50565b600760205260009081526040902080546135a990615159565b80601f01602080910402602001604051908101604052809291908181526020018280546135d590615159565b80156136225780601f106135f757610100808354040283529160200191613622565b820191906000526020600020905b81548152906001019060200180831161360557829003601f168201915b505050505081565b6000613637826000613482565b61364357506000919050565b600160008360600151605c81111561342057613420614428565b6060816136815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136ab578061369581614e47565b91506136a49050600a83614e78565b9150613685565b6000816001600160401b038111156136c5576136c561403b565b6040519080825280601f01601f1916602001820160405280156136ef576020820181803683370190505b5090505b84156110fe57613704600183614f9f565b9150613711600a86614eeb565b61371c906030614fc2565b60f81b81838151811061373157613731614e1b565b60200101906001600160f81b031916908160001a905350613753600a86614e78565b94506136f3565b606082600060015b600183516137709190614f9f565b8210156137b7576000613784878785613f06565b905080600019141561379657506137b7565b816137a081614e47565b92506137af9050816001614fc2565b925050613762565b806001600160401b038111156137cf576137cf61403b565b60405190808252806020026020018201604052801561380257816020015b60608152602001906001900390816137ed5790505b50935060009150600090505b6001835161381c9190614f9f565b821015613944576000613830878785613f06565b9050806000191415613840575082515b600061384c8483614f9f565b6001600160401b038111156138635761386361403b565b6040519080825280601f01601f19166020018201604052801561388d576020820181803683370190505b509050806000855b84811015613904578781815181106138af576138af614e1b565b01602001516001600160f81b03191683836138c981614e47565b9450815181106138db576138db614e1b565b60200101906001600160f81b031916908160001a905350806138fc81614e47565b915050613895565b50613910846001614fc2565b955081888661391e81614e47565b97508151811061393057613930614e1b565b60200260200101819052505050505061380e565b50505092915050565b8251606090849061395e8585615186565b111561396c5761396c6151c2565b6000846001600160401b038111156139865761398661403b565b6040519080825280601f01601f1916602001820160405280156139b0576020820181803683370190505b509050806000855b6139c28888615186565b811015613a30578481815181106139db576139db614e1b565b01602001516001600160f81b03191683836139f581614e47565b945081518110613a0757613a07614e1b565b60200101906001600160f81b031916908160001a90535080613a2881614e47565b9150506139b8565b5090979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600082605c811115613aa357613aa3614428565b1415613aae57600080fd5b60006007600084605c811115613ac657613ac6614428565b605c811115613ad757613ad7614428565b81526020019081526020016000208054613af090615159565b80601f0160208091040260200160405190810160405280929190818152602001828054613b1c90615159565b8015613b695780601f10613b3e57610100808354040283529160200191613b69565b820191906000526020600020905b815481529060010190602001808311613b4c57829003601f168201915b50505050509050606060006005600086605c811115613b8a57613b8a614428565b605c811115613b9b57613b9b614428565b8152602081019190915260400160009081205460ff16915081600c811115613bc557613bc5614428565b1415613bee57604051806040016040528060038152602001620a6caf60eb1b8152509150613eda565b600181600c811115613c0257613c02614428565b1415613c2c57604051806040016040528060048152602001632430b4b960e11b8152509150613eda565b600281600c811115613c4057613c40614428565b1415613c6a57604051806040016040528060048152602001634579657360e01b8152509150613eda565b600381600c811115613c7e57613c7e614428565b1415613ca957604051806040016040528060058152602001641099585c9960da1b8152509150613eda565b600481600c811115613cbd57613cbd614428565b1415613ce757604051806040016040528060048152602001634561727360e01b8152509150613eda565b600581600c811115613cfb57613cfb614428565b1415613d2557604051806040016040528060048152602001634c69707360e01b8152509150613eda565b600681600c811115613d3957613d39614428565b1415613d64576040518060400160405280600581526020016409adeeae8d60db1b8152509150613eda565b600781600c811115613d7857613d78614428565b1415613da257604051806040016040528060048152602001634661636560e01b8152509150613eda565b600881600c811115613db657613db6614428565b1415613de3576040518060400160405280600781526020016622b6b7ba34b7b760c91b8152509150613eda565b600981600c811115613df757613df7614428565b1415613e2157604051806040016040528060048152602001634e65636b60e01b8152509150613eda565b600a81600c811115613e3557613e35614428565b1415613e5f57604051806040016040528060048152602001634e6f736560e01b8152509150613eda565b600b81600c811115613e7357613e73614428565b1415613e9f5760405180604001604052806006815260200165436865656b7360d01b8152509150613eda565b600c81600c811115613eb357613eb3614428565b1415613eda57604051806040016040528060058152602001640a8cacae8d60db1b81525091505b8183604051602001613eed9291906151d8565b6040516020818303038152906040529350505050919050565b815160009084908490600114613f1e57613f1e6151c2565b835b8251811015613f945781600081518110613f3c57613f3c614e1b565b602001015160f81c60f81b6001600160f81b031916838281518110613f6357613f63614e1b565b01602001516001600160f81b0319161415613f82579250610f82915050565b80613f8c81614e47565b915050613f20565b506000199695505050505050565b828054613fae90615159565b90600052602060002090601f016020900481019282613fd05760008555614016565b82601f10613fe957805160ff1916838001178555614016565b82800160010185558215614016579182015b82811115614016578251825591602001919060010190613ffb565b50614022929150614026565b5090565b5b808211156140225760008155600101614027565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b03821117156140765761407661403b565b6040525050565b600061408860405190565b90506140948282614051565b919050565b60006001600160401b038211156140b2576140b261403b565b5060209081020190565b60ff81165b811461358d57600080fd5b80356118b0816140bc565b60006140ea6140e584614099565b61407d565b8381529050602080820190840283018581111561410957614109600080fd5b835b8181101561412d578061411e88826140cc565b8452506020928301920161410b565b5050509392505050565b600082601f83011261414b5761414b600080fd5b81356110fe8482602086016140d7565b60006141696140e584614099565b8381529050602080820190840283018581111561418857614188600080fd5b835b8181101561412d5780356001600160401b038111156141ab576141ab600080fd5b8086016141b88982614137565b855250506020928301920161418a565b600082601f8301126141dc576141dc600080fd5b81356110fe84826020860161415b565b60006020828403121561420157614201600080fd5b81356001600160401b0381111561421a5761421a600080fd5b6110fe848285016141c8565b605d811061358d57600080fd5b80356118b081614226565b6000806040838503121561425457614254600080fd5b60006142608585614233565b925050602061427185828601614233565b9150509250929050565b8015155b82525050565b602081016118b0828461427b565b61ffff81166140c1565b80356118b081614293565b60006101e082840312156142be576142be600080fd5b6142c96101e061407d565b905060006142d7848461429d565b82525060206142e88484830161429d565b60208301525060406142fc84828501614233565b604083015250606061431084828501614233565b606083015250608061432484828501614233565b60808301525060a061433884828501614233565b60a08301525060c061434c84828501614233565b60c08301525060e061436084828501614233565b60e08301525061010061437584828501614233565b6101008301525061012061438b84828501614233565b610120830152506101406143a184828501614233565b610140830152506101606143b784828501614233565b610160830152506101806143cd84828501614233565b610180830152506101a06143e384828501614233565b6101a0830152506101c06143f984828501614233565b6101c08301525092915050565b60006101e0828403121561441c5761441c600080fd5b60006110fe84846142a8565b634e487b7160e01b600052602160045260246000fd5b6006811061358d5761358d614428565b806140948161443e565b60006118b08261444e565b61427f81614458565b602081016118b08284614463565b806140c1565b80356118b08161447a565b60006001600160401b038211156144a4576144a461403b565b601f19601f83011660200192915050565b82818337506000910152565b60006144cf6140e58461448b565b9050828152602081018484840111156144ea576144ea600080fd5b6144f58482856144b5565b509392505050565b600082601f83011261451157614511600080fd5b81356110fe8482602086016144c1565b6000806000610220848603121561453a5761453a600080fd5b600061454686866142a8565b9350506101e061455886828701614480565b9250506102008401356001600160401b0381111561457857614578600080fd5b614584868287016144fd565b9150509250925092565b8061427f565b602081016118b0828461458e565b6002811061358d5761358d614428565b80614094816145a2565b60006118b0826145b2565b61427f816145bc565b602081016118b082846145c7565b60006145ec6140e584614099565b8381529050602080820190840283018581111561460b5761460b600080fd5b835b8181101561412d57806146208882614233565b8452506020928301920161460d565b600082601f83011261464357614643600080fd5b81356110fe8482602086016145de565b6000806040838503121561466957614669600080fd5b82356001600160401b0381111561468257614682600080fd5b61468e8582860161462f565b92505060208301356001600160401b038111156146ad576146ad600080fd5b6142718582860161462f565b600080604083850312156146cf576146cf600080fd5b60006146db858561429d565b92505060206142718582860161429d565b61ffff811661427f565b605d811061358d5761358d614428565b80614094816146f6565b60006118b082614706565b61427f81614710565b80516101e083019061473684826146ec565b50602082015161474960208501826146ec565b50604082015161475c604085018261471b565b50606082015161476f606085018261471b565b506080820151614782608085018261471b565b5060a082015161479560a085018261471b565b5060c08201516147a860c085018261471b565b5060e08201516147bb60e085018261471b565b506101008201516147d061010085018261471b565b506101208201516147e561012085018261471b565b506101408201516147fa61014085018261471b565b5061016082015161480f61016085018261471b565b5061018082015161482461018085018261471b565b506101a08201516148396101a085018261471b565b506101c08201516131db6101c085018261471b565b6101e081016118b08284614724565b60006020828403121561487257614872600080fd5b60006110fe8484614233565b600d811061358d5761358d614428565b806140948161487e565b60006118b08261488e565b61427f81614898565b602081016118b082846148a3565b60006148c86140e584614099565b838152905060208082019084028301858111156148e7576148e7600080fd5b835b8181101561412d57806148fc8882614480565b845250602092830192016148e9565b600082601f83011261491f5761491f600080fd5b81356110fe8482602086016148ba565b6000806000610220848603121561494857614948600080fd5b600061495486866142a8565b9350506101e08401356001600160401b0381111561497457614974600080fd5b6145588682870161490b565b60ff811661427f565b602081016118b08284614980565b60005b838110156149b257818101518382015260200161499a565b838111156131db5750506000910152565b60006149cd825190565b8084526020840193506149e4818560208601614997565b601f01601f19169290920192915050565b60208082528101610f8281846149c3565b60006001600160a01b0382166118b0565b61427f81614a06565b602081016118b08284614a17565b6004811061358d5761358d614428565b8061409481614a2e565b60006118b082614a3e565b61427f81614a48565b602081016118b08284614a53565b6000614a786140e584614099565b83815290506020808201908402830185811115614a9757614a97600080fd5b835b8181101561412d5780356001600160401b03811115614aba57614aba600080fd5b808601614ac789826144fd565b8552505060209283019201614a99565b600082601f830112614aeb57614aeb600080fd5b81356110fe848260208601614a6a565b60008060408385031215614b1157614b11600080fd5b82356001600160401b03811115614b2a57614b2a600080fd5b61468e85828601614ad7565b6004811061358d57600080fd5b80356118b081614b36565b6000614b5c6140e584614099565b83815290506020808201908402830185811115614b7b57614b7b600080fd5b835b8181101561412d5780614b908882614b43565b84525060209283019201614b7d565b600082601f830112614bb357614bb3600080fd5b81356110fe848260208601614b4e565b600080600060608486031215614bdb57614bdb600080fd5b83356001600160401b03811115614bf457614bf4600080fd5b614c008682870161462f565b93505060208401356001600160401b03811115614c1f57614c1f600080fd5b614c2b8682870161462f565b92505060408401356001600160401b03811115614c4a57614c4a600080fd5b61458486828701614b9f565b600080600060608486031215614c6e57614c6e600080fd5b83356001600160401b03811115614c8757614c87600080fd5b614c938682870161462f565b93505060208401356001600160401b03811115614cb257614cb2600080fd5b614cbe8682870161462f565b92505060408401356001600160401b03811115614cdd57614cdd600080fd5b61458486828701614137565b600060208284031215614cfe57614cfe600080fd5b81356001600160401b03811115614d1757614d17600080fd5b6110fe848285016144fd565b602081016118b0828461471b565b600080600060608486031215614d4957614d49600080fd5b6000614d558686614233565b9350506020614d6686828701614233565b925050604061458486828701614b43565b6000806102008385031215614d8e57614d8e600080fd5b6000614d9a85856142a8565b9250506101e061427185828601614b43565b6140c181614a06565b80356118b081614dac565b600060208284031215614dd557614dd5600080fd5b60006110fe8484614db5565b60208082528181019081527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726040830152606082016118b0565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614e5b57614e5b614e31565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082614e8757614e87614e62565b500490565b6000614e96825190565b614ea4818560208601614997565b9290920192915050565b601d60f91b81526000614e5b565b6000614ec88286614e8c565b9150614ed382614eae565b9150614edf8285614e8c565b9150610f168284614e8c565b600082614efa57614efa614e62565b500690565b602081016118b082846146ec565b6000614f1b6140e58461448b565b905082815260208101848484011115614f3657614f36600080fd5b6144f5848285614997565b600082601f830112614f5557614f55600080fd5b81516110fe848260208601614f0d565b600060208284031215614f7a57614f7a600080fd5b81516001600160401b03811115614f9357614f93600080fd5b6110fe84828501614f41565b600082821015614fb157614fb1614e31565b500390565b6000610f828284614e8c565b60008219821115614fd557614fd5614e31565b500190565b600060ff8216915060ff821415614e5b57614e5b614e31565b600b60fa1b81526000614e5b565b600061500d8285614e8c565b91506150198284614e8c565b91506110fe82614ff3565b600160fd1b81526000614e5b565b600061503e8285614e8c565b915061504982615024565b91506110fe8284614e8c565b6902130b1b5bbb0b93239960b51b8152600a016000610f828284614e8c565b7f7b2274726169745f74797065223a2246617368696f6e20486174222c20227661815265363ab2911d1160d11b602082015260260160006150b58284614e8c565b61227d60f01b8152915060028201610f82565b605d60f81b81526000614e5b565b60006150e28285614e8c565b91506150ee8284614e8c565b91506110fe826150c8565b602080825281016118b081602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201526564647265737360d01b604082015260600190565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061516d57607f821691505b6020821081141561518057615180615143565b50919050565b6000816001600160ff1b03038313600083121516156151a7576151a7614e31565b81600160ff1b038312600083121615614fd557614fd5614e31565b634e487b7160e01b600052600160045260246000fd5b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0160006151fc8285614e8c565b6b111610113b30b63ab2911d1160a11b8152600c01915061521d8284614e8c565b61227d60f01b81529150600282016110fe56fea264697066735822122070b36de543765af6077df3b1c5e7a21ae006357c8ab3eadbbf90b80e2d699d4d64736f6c634300080c003300000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638da5cb5b1161011a578063d16c48d8116100ad578063f1c4439f1161007c578063f1c4439f14610539578063f295426714610567578063f2fde38b1461057a578063fc9faca51461058d578063ff213f89146105a057600080fd5b8063d16c48d8146104a4578063dc6e449e146104df578063e1a944a6146104f2578063ecd560161461052657600080fd5b8063c1597dab116100e9578063c1597dab14610458578063c63da44d1461046b578063c7fa47ce1461047e578063cf7ac36e1461049157600080fd5b80638da5cb5b146103de578063a1f70561146103f7578063b963da0114610425578063c14adbce1461044557600080fd5b8063683375c4116101925780638664d6fd116101615780638664d6fd146103855780638b7b2afa146103985780638bc61064146103ab5780638bcbf89a146103be57600080fd5b8063683375c4146102ff5780636f065ea51461032f578063715018a61461035d57806372ff70491461036557600080fd5b80635586b160116101ce5780635586b1601461029957806355ac3d88146102b957806357bc535b146102cc5780636424a214146102ec57600080fd5b806314c5f1e214610200578063234cbd65146102155780633f4af2d11461025957806340a0020514610279575b600080fd5b61021361020e3660046141ec565b6105b3565b005b61024361022336600461423e565b600360209081526000928352604080842090915290825290205460ff1681565b6040516102509190614285565b60405180910390f35b61026c610267366004614406565b6106fa565b604051610250919061446c565b61028c610287366004614521565b610f1f565b6040516102509190614594565b6102ac6102a7366004614406565b610f89565b60405161025091906145d0565b6102136102c7366004614653565b61122f565b6102df6102da3660046146b9565b611336565b604051610250919061484e565b6102436102fa366004614406565b6118b6565b61032261030d36600461485d565b60056020526000908152604090205460ff1681565b60405161025091906148ac565b61024361033d36600461423e565b600260209081526000928352604080842090915290825290205460ff1681565b6102136119dd565b61037861037336600461492f565b611a13565b6040516102509190614989565b610378610393366004614406565b611af1565b6102ac6103a6366004614406565b611d35565b6102436103b9366004614406565b611fcb565b6103d16103cc3660046146b9565b612138565b60405161025091906149f5565b6000546001600160a01b03166040516102509190614a20565b61037861040536600461423e565b600460209081526000928352604080842090915290825290205460ff1681565b610438610433366004614406565b61279a565b6040516102509190614a5c565b610213610453366004614afb565b612df6565b610213610466366004614653565b612f06565b610243610479366004614406565b613007565b61021361048c366004614bc3565b613086565b61021361049f366004614c56565b6131e1565b6104d26104b2366004614ce9565b805160208183018101805160068252928201919093012091525460ff1681565b6040516102509190614d23565b6102136104ed366004614653565b613302565b610243610500366004614d31565b600860209081526000938452604080852082529284528284209052825290205460ff1681565b610378610534366004614406565b613404565b61024361054736600461423e565b600160209081526000928352604080842090915290825290205460ff1681565b610243610575366004614d77565b613482565b610213610588366004614dc0565b613534565b6103d161059b36600461485d565b613590565b6102436105ae366004614406565b61362a565b6000546001600160a01b031633146105e65760405162461bcd60e51b81526004016105dd90614de1565b60405180910390fd5b60005b81518110156106f657600082828151811061060657610606614e1b565b602002602001015160008151811061062057610620614e1b565b602002602001015160ff16605c81111561063c5761063c614428565b9050600083838151811061065257610652614e1b565b602002602001015160018151811061066c5761066c614e1b565b602002602001015160ff16600c81111561068857610688614428565b9050806005600084605c8111156106a1576106a1614428565b605c8111156106b2576106b2614428565b81526020810191909152604001600020805460ff1916600183600c8111156106dc576106dc614428565b0217905550505080806106ee90614e47565b9150506105e9565b5050565b6000806107068361279a565b60408051600680825260e08201909252919250600091906020820160c080368337019050509050600082600381111561074157610741614428565b141561081e5763861c46808160008151811061075f5761075f614e1b565b6020908102919091010152639502f9008160018151811061078257610782614e1b565b60209081029190910101526377359400816002815181106107a5576107a5614e1b565b6020908102919091010152639502f900816003815181106107c8576107c8614e1b565b602090810291909101015263773594008160045b815181106107ec576107ec614e1b565b602090810291909101015260008160055b8151811061080d5761080d614e1b565b602002602001018181525050610a87565b600182600381111561083257610832614428565b14156108ee5764012a05f2008160008151811061085157610851614e1b565b602090810291909101015260008160018151811061087157610871614e1b565b602090810291909101015260008160028151811061089157610891614e1b565b60209081029190910101526000816003815181106108b1576108b1614e1b565b602090810291909101015264012a05f200816004815181106108d5576108d5614e1b565b602090810291909101015264012a05f2008160056107fd565b600282600381111561090257610902614428565b141561099c57640165a0bc008160008151811061092157610921614e1b565b602090810291909101015263773594008160018151811061094457610944614e1b565b602090810291909101015260008160028151811061096457610964614e1b565b602090810291909101015260008160038151811061098457610984614e1b565b602090810291909101015263ee6b28008160046107dc565b60038260038111156109b0576109b0614428565b1415610a875763861c4680816000815181106109ce576109ce614e1b565b6020908102919091010152639502f900816001815181106109f1576109f1614e1b565b6020908102919091010152637735940081600281518110610a1457610a14614e1b565b6020908102919091010152639502f90081600381518110610a3757610a37614e1b565b6020908102919091010152637735940081600481518110610a5a57610a5a614e1b565b6020908102919091010152600081600581518110610a7a57610a7a614e1b565b6020026020010181815250505b60298460600151605c811115610a9f57610a9f614428565b1415610b4f576000818181518110610ab957610ab9614e1b565b6020908102919091010152600081600181518110610ad957610ad9614e1b565b6020908102919091010152633b9aca0081600281518110610afc57610afc614e1b565b602090810291909101015263b2d05e0081600381518110610b1f57610b1f614e1b565b602090810291909101015263b2d05e0081600481518110610b4257610b42614e1b565b6020026020010181815250505b60528460800151605c811115610b6757610b67614428565b1480610b885750605b8460600151605c811115610b8657610b86614428565b145b15610baf57600081600381518110610ba257610ba2614e1b565b6020026020010181815250505b60188460600151605c811115610bc757610bc7614428565b148015610be557506001826003811115610be357610be3614428565b145b15610c1757600a81600081518110610bff57610bff614e1b565b60200260200101818151610c139190614e78565b9052505b6003826003811115610c2b57610c2b614428565b1415610d1057605a8460600151605c811115610c4957610c49614428565b1480610c6a575060268460600151605c811115610c6857610c68614428565b145b80610caa575060288460600151605c811115610c8857610c88614428565b148015610caa5750601e8460400151605c811115610ca857610ca8614428565b145b15610cd0576000818181518110610cc357610cc3614e1b565b6020026020010181815250505b60598460600151605c811115610ce857610ce8614428565b1415610d1057600081600481518110610d0357610d03614e1b565b6020026020010181815250505b6002826003811115610d2457610d24614428565b1480610d4157506001826003811115610d3f57610d3f614428565b145b15610dd557610d4f846118b6565b80610d6f575060228460600151605c811115610d6d57610d6d614428565b145b80610d8f5750605a8460600151605c811115610d8d57610d8d614428565b145b80610daf575060268460600151605c811115610dad57610dad614428565b145b15610dd5576000818181518110610dc857610dc8614e1b565b6020026020010181815250505b601e8460400151605c811115610ded57610ded614428565b14158015610e2f575060578460800151605c811115610e0e57610e0e614428565b1480610e2f575060068460800151605c811115610e2d57610e2d614428565b145b15610e55576000818181518110610e4857610e48614e1b565b6020026020010181815250505b60178460600151605c811115610e6d57610e6d614428565b148015610eaa5750601e8460400151605c811115610e8d57610e8d614428565b1480610eaa57506003826003811115610ea857610ea8614428565b145b15610ed157600081600281518110610ec457610ec4614e1b565b6020026020010181815250505b6000610eff8583604051806040016040528060098152602001683430ba2fb1b7b637b960b91b815250611a13565b90508060ff166005811115610f1657610f16614428565b95945050505050565b60208301518351600091908290610f399061ffff1661365d565b610f468361ffff1661365d565b85604051602001610f5993929190614ebc565b60408051601f1981840301815291905280516020909101209050610f7d8582614eeb565b925050505b9392505050565b600080610f958361279a565b90506000816003811115610fab57610fab614428565b14610fb95750600092915050565b60408051600280825260608201835260009260208301908036833701905050905064012a05f20081600081518110610ff357610ff3614e1b565b602090810291909101015264012a05f2008160018151811061101757611017614e1b565b602090810291909101015260268460600151605c81111561103a5761103a614428565b141561104a575060019392505050565b6110538461362a565b611061575060009392505050565b601e8460400151605c81111561107957611079614428565b141580156110bb575060578460800151605c81111561109a5761109a614428565b14806110bb575060068460800151605c8111156110b9576110b9614428565b145b80156110d257506110cb84611af1565b60ff166001145b156111065760068460800151605c8111156110ef576110ef614428565b146110fb5760016110fe565b60005b949350505050565b601e8460400151605c81111561111e5761111e614428565b1480611135575061112e84613404565b60ff166001145b801561115757506010846101000151605c81111561115557611155614428565b145b1561118957600a8160008151811061117157611171614e1b565b602002602001018181516111859190614e78565b9052505b60298460600151605c8111156111a1576111a1614428565b14806111c2575060048460600151605c8111156111c0576111c0614428565b145b806111d857506111d184613404565b60ff166002145b156111e7575060009392505050565b600061121885836040518060400160405280600c81526020016b3430ba2fb837b9b4ba34b7b760a11b815250611a13565b90508060ff166001811115610f1657610f16614428565b6000546001600160a01b031633146112595760405162461bcd60e51b81526004016105dd90614de1565b60005b825181101561133157600083828151811061127957611279614e1b565b60200260200101519050600083838151811061129757611297614e1b565b6020026020010151905060016003600084605c8111156112b9576112b9614428565b605c8111156112ca576112ca614428565b8152602001908152602001600020600083605c8111156112ec576112ec614428565b605c8111156112fd576112fd614428565b81526020810191909152604001600020805460ff19169115159190911790555081905061132981614e47565b91505061125c565b505050565b6113ae604080516101e0810182526000808252602082018190529091820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101e08101825261ffff808616825284166020820152600091810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905280516040516376dfe29760e01b81529192506000916001600160a01b037f00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b216916376dfe297916114779190600401614eff565b600060405180830381865afa158015611494573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114bc9190810190614f65565b905060006114ec604051806040016040528060018152602001600b60fa1b8152508361375a90919063ffffffff16565b905060005b81518110156118a957600082828151811061150e5761150e614e1b565b6020026020010151905060606001831015611567576040805180820190915260018152600160fd1b602082015261154690839061375a565b60008151811061155857611558614e1b565b60200260200101519050611584565b611581600183516115789190614f9f565b8390600161394d565b90505b60006006826040516115969190614fb6565b9081526040519081900360200190205460ff169050600060058183605c8111156115c2576115c2614428565b605c8111156115d3576115d3614428565b8152602081019190915260400160009081205460ff16915081600c8111156115fd576115fd614428565b1415611634576040880182605c81111561161957611619614428565b9081605c81111561162c5761162c614428565b905250611892565b600181600c81111561164857611648614428565b1415611664576060880182605c81111561161957611619614428565b600281600c81111561167857611678614428565b1415611694576080880182605c81111561161957611619614428565b600381600c8111156116a8576116a8614428565b14156116c45760a0880182605c81111561161957611619614428565b600481600c8111156116d8576116d8614428565b14156116f45760c0880182605c81111561161957611619614428565b600581600c81111561170857611708614428565b14156117245760e0880182605c81111561161957611619614428565b600681600c81111561173857611738614428565b141561175557610100880182605c81111561161957611619614428565b600781600c81111561176957611769614428565b141561178657610120880182605c81111561161957611619614428565b600881600c81111561179a5761179a614428565b14156117b757610140880182605c81111561161957611619614428565b600981600c8111156117cb576117cb614428565b14156117e857610160880182605c81111561161957611619614428565b600a81600c8111156117fc576117fc614428565b141561181957610180880182605c81111561161957611619614428565b600b81600c81111561182d5761182d614428565b141561184a576101a0880182605c81111561161957611619614428565b600c81600c81111561185e5761185e614428565b1415611892576101c0880182605c81111561187b5761187b614428565b9081605c81111561188e5761188e614428565b9052505b5050505080806118a190614e47565b9150506114f1565b5091925050505b92915050565b6000601e8260400151605c8111156118d0576118d0614428565b1480156118f2575060458260800151605c8111156118f0576118f0614428565b145b156118ff57506001919050565b60378260800151605c81111561191757611917614428565b14806119385750602a8260800151605c81111561193657611936614428565b145b806119585750601c8260800151605c81111561195657611956614428565b145b806119785750601b8260800151605c81111561197657611976614428565b145b80611998575060118260800151605c81111561199657611996614428565b145b806119b8575060068260800151605c8111156119b6576119b6614428565b145b806118b0575060578260800151605c8111156119d6576119d6614428565b1492915050565b6000546001600160a01b03163314611a075760405162461bcd60e51b81526004016105dd90614de1565b611a116000613a3d565b565b81516000908190815b81811015611a5d57858181518110611a3657611a36614e1b565b602002602001015183611a499190614fc2565b925080611a5581614e47565b915050611a1c565b506000611a6b878487610f1f565b905060005b828160ff161015611ae657868160ff1681518110611a9057611a90614e1b565b6020026020010151821015611aaa579350610f8292505050565b868160ff1681518110611abf57611abf614e1b565b602002602001015182611ad29190614f9f565b915080611ade81614fda565b915050611a70565b505050509392505050565b600080611afd8361279a565b90506003816003811115611b1357611b13614428565b1480611b3057506001816003811115611b2e57611b2e614428565b145b80611b4c57506002816003811115611b4a57611b4a614428565b145b15611b5a5750600192915050565b60038360600151605c811115611b7257611b72614428565b1415611bef57601e8360400151605c811115611b9057611b90614428565b1415611b9f5750600192915050565b60068360800151605c811115611bb757611bb7614428565b1480611bd8575060578360800151605c811115611bd657611bd6614428565b145b15611be65750600292915050565b50600192915050565b6000611bfa84613404565b9050601e8460400151605c811115611c1457611c14614428565b14611c745760148460600151605c811115611c3157611c31614428565b1480611c53575060295b8460600151605c811115611c5157611c51614428565b145b15611c62575060019392505050565b60008160ff1611610f825760026110fe565b6000826003811115611c8857611c88614428565b148015611cc9575060188460600151605c811115611ca857611ca8614428565b1480611cc95750603a8460600151605c811115611cc757611cc7614428565b145b80611c535750603e8460600151605c811115611ce757611ce7614428565b1480611d085750604d8460600151605c811115611d0657611d06614428565b145b80611d285750604e8460600151605c811115611d2657611d26614428565b145b80611c535750604f611c3b565b600080611d418361279a565b9050601e8360400151605c811115611d5b57611d5b614428565b14611d695750600092915050565b6000816003811115611d7d57611d7d614428565b148015611d9f575060178360600151605c811115611d9d57611d9d614428565b145b15611dad5750600092915050565b6001816003811115611dc157611dc1614428565b148015611de35750605a8360600151605c811115611de157611de1614428565b145b15611df15750600092915050565b6001816003811115611e0557611e05614428565b1480611e2257506000816003811115611e2057611e20614428565b145b15611e6e5760088360600151605c811115611e3f57611e3f614428565b1480611e60575060098360600151605c811115611e5e57611e5e614428565b145b15611e6e5750600092915050565b6002816003811115611e8257611e82614428565b1480611e9f57506001816003811115611e9d57611e9d614428565b145b80611ebb57506000816003811115611eb957611eb9614428565b145b15611ee75760228360600151605c811115611ed857611ed8614428565b1415611ee75750600092915050565b6002816003811115611efb57611efb614428565b1480611f1857506001816003811115611f1657611f16614428565b145b15611f645760268360600151605c811115611f3557611f35614428565b1480611f56575060598360600151605c811115611f5457611f54614428565b145b15611f645750600092915050565b604e8360600151605c811115611f7c57611f7c614428565b1480611f9d5750604d8360600151605c811115611f9b57611f9b614428565b145b80611fbd5750604f8360600151605c811115611fbb57611fbb614428565b145b15611be65750600092915050565b600080611fd78361279a565b9050611fe283613007565b15611ff05750600192915050565b60048360600151605c81111561200857612008614428565b1480156120265750600081600381111561202457612024614428565b145b156120345750600192915050565b600060458460800151605c81111561204e5761204e614428565b148061206f575060118460800151605c81111561206d5761206d614428565b145b8061208f5750602a8460800151605c81111561208d5761208d614428565b145b806120af575060528460800151605c8111156120ad576120ad614428565b145b806120cf5750601c8460800151605c8111156120cd576120cd614428565b145b806120ef5750601b8460800151605c8111156120ed576120ed614428565b145b905060538460600151605c81111561210957612109614428565b1480156121295750801580612129575061212284611af1565b60ff166002145b156110fb575060019392505050565b606060006121468484611336565b6040805180820190915260018152605b60f81b60208201529091506000908161216e8461279a565b9050600061217b856106fa565b9050600061218886610f89565b90506000604051806101a001604052808860400151605c8111156121ae576121ae614428565b605c8111156121bf576121bf614428565b81526020016121cd89611fcb565b6121d757876121dd565b88606001515b605c8111156121ee576121ee614428565b605c8111156121ff576121ff614428565b81526020018860800151605c81111561221a5761221a614428565b605c81111561222b5761222b614428565b81526020018860a00151605c81111561224657612246614428565b605c81111561225757612257614428565b81526020018860c00151605c81111561227257612272614428565b605c81111561228357612283614428565b81526020018860e00151605c81111561229e5761229e614428565b605c8111156122af576122af614428565b8152602001886101000151605c8111156122cb576122cb614428565b605c8111156122dc576122dc614428565b8152602001886101200151605c8111156122f8576122f8614428565b605c81111561230957612309614428565b8152602001886101400151605c81111561232557612325614428565b605c81111561233657612336614428565b8152602001886101600151605c81111561235257612352614428565b605c81111561236357612363614428565b8152602001886101800151605c81111561237f5761237f614428565b605c81111561239057612390614428565b8152602001886101a00151605c8111156123ac576123ac614428565b605c8111156123bd576123bd614428565b8152602001886101c00151605c8111156123d9576123d9614428565b605c8111156123ea576123ea614428565b905290506060600084600581111561240457612404614428565b141561242c5750604080518082019091526005815264426c61636b60d81b602082015261254f565b600184600581111561244057612440614428565b141561246757506040805180820190915260048152634772657960e01b602082015261254f565b600284600581111561247b5761247b614428565b14156124a1575060408051808201909152600381526214995960ea1b602082015261254f565b60038460058111156124b5576124b5614428565b14156124dd5750604080518082019091526005815264576869746560d81b602082015261254f565b60048460058111156124f1576124f1614428565b141561251757506040805180820190915260038152622a30b760e91b602082015261254f565b600584600581111561252b5761252b614428565b141561254f5750604080518082019091526005815264213937bbb760d91b60208201525b6060600086600381111561256557612565614428565b1415612594575060408051808201909152600c81526b04261736562616c6c204361760a41b602082015261264e565b60018660038111156125a8576125a8614428565b14156125d5575060408051808201909152600a815269109d58dad95d0812185d60b21b602082015261264e565b60028660038111156125e9576125e9614428565b1415612616575060408051808201909152600a81526910dbddd89bde4812185d60b21b602082015261264e565b600386600381111561262a5761262a614428565b141561264e57506040805180820190915260058152642b34b9b7b960d91b60208201525b60005b600d8110156126dc5760008482600d811061266e5761266e614e1b565b6020020151905089605c81111561268757612687614428565b81605c81111561269957612699614428565b146126cb57886126a882613a8d565b6040516020016126b9929190615001565b60405160208183030381529060405298505b506126d581614e47565b9050612651565b50600082826040516020016126f2929190615032565b60408051601f198184030181529190529050600185600181111561271857612718614428565b1415612741578060405160200161272f9190615055565b60405160208183030381529060405290505b6000816040516020016127549190615074565b604051602081830303815290604052905088816040516020016127789291906150d6565b6040516020818303038152906040529b50505050505050505050505092915050565b60408051600480825260a082019092526000918291906020820160808036833701905050905060005b600481101561280057639502f9008282815181106127e3576127e3614e1b565b6020908102919091010152806127f881614e47565b9150506127c3565b50600260008460600151605c81111561281b5761281b614428565b605c81111561282c5761282c614428565b815260200190815260200160002060008460400151605c81111561285257612852614428565b605c81111561286357612863614428565b815260208101919091526040016000205460ff166128a057631dcd65008160038151811061289357612893614e1b565b6020026020010181815250505b60168360600151605c8111156128b8576128b8614428565b14156128c75750600292915050565b600c8360600151605c8111156128df576128df614428565b1480612900575060048360600151605c8111156128fe576128fe614428565b145b806129375750601e8360400151605c81111561291e5761291e614428565b14158015612937575061293083613404565b60ff166002145b156129455750600092915050565b601e8360400151605c81111561295d5761295d614428565b1480612974575061296d83613404565b60ff166001145b801561299657506010836101000151605c81111561299457612994614428565b145b80156129c957506129a8836001613482565b806129c957506129b9836000613482565b80156129c957506129c98361362a565b15612a60576005816002815181106129e3576129e3614e1b565b602002602001018181516129f79190614e78565b905250600581600381518110612a0f57612a0f614e1b565b60200260200101818151612a239190614e78565b905250612a2f8361362a565b612a6057600581600081518110612a4857612a48614e1b565b60200260200101818151612a5c9190614e78565b9052505b6037836020015161ffff16108015612a7e5750612a7e836000613482565b8015612aa05750601e8360400151605c811115612a9d57612a9d614428565b14155b8015612ae0575060578360800151605c811115612abf57612abf614428565b1480612ae0575060068360800151605c811115612ade57612ade614428565b145b8015612af85750612af083613404565b60ff16600114155b15612b065750600092915050565b604b836020015161ffff16108015612b345750601e8360400151605c811115612b3157612b31614428565b14155b8015612b74575060578360800151605c811115612b5357612b53614428565b1480612b74575060068360800151605c811115612b7257612b72614428565b145b8015612b975750612b86836002613482565b80612b975750612b97836001613482565b15612bdd576000818181518110612bb057612bb0614e1b565b6020908102919091010152600081600381518110612bd057612bd0614e1b565b6020026020010181815250505b612be683613007565b158015612c1b5750612bf9836002613482565b80612c0a5750612c0a836000613482565b80612c1b5750612c1b836001613482565b15612c4257600081600381518110612c3557612c35614e1b565b6020026020010181815250505b601e8360400151605c811115612c5a57612c5a614428565b14158015612c7d575060148360600151605c811115612c7b57612c7b614428565b145b8015612cbd575060578360800151605c811115612c9c57612c9c614428565b1480612cbd575060068360800151605c811115612cbb57612cbb614428565b145b15612ce457600081600381518110612cd757612cd7614e1b565b6020026020010181815250505b60588360800151605c811115612cfc57612cfc614428565b148015612d315750612d0f836002613482565b80612d205750612d20836000613482565b80612d315750612d31836001613482565b15612d5857600081600381518110612d4b57612d4b614e1b565b6020026020010181815250505b60005b6004811015612db157612d7a8482600381111561057557610575614428565b612d9f576000828281518110612d9257612d92614e1b565b6020026020010181815250505b80612da981614e47565b915050612d5b565b506000612ddf8483604051806040016040528060088152602001676861745f7479706560c01b815250611a13565b90508060ff1660038111156110fe576110fe614428565b6000546001600160a01b03163314612e205760405162461bcd60e51b81526004016105dd90614de1565b60005b8251811015611331576000838281518110612e4057612e40614e1b565b602002602001015190506000838381518110612e5e57612e5e614e1b565b6020026020010151905080600683604051612e799190614fb6565b908152604051908190036020019020805460ff1916600183605c811115612ea257612ea2614428565b0217905550816007600083605c811115612ebe57612ebe614428565b605c811115612ecf57612ecf614428565b81526020019081526020016000209080519060200190612ef0929190613fa2565b5050508080612efe90614e47565b915050612e23565b6000546001600160a01b03163314612f305760405162461bcd60e51b81526004016105dd90614de1565b60005b8251811015611331576000838281518110612f5057612f50614e1b565b602002602001015190506000838381518110612f6e57612f6e614e1b565b60200260200101519050600180600084605c811115612f8f57612f8f614428565b605c811115612fa057612fa0614428565b8152602001908152602001600020600083605c811115612fc257612fc2614428565b605c811115612fd357612fd3614428565b81526020810191909152604001600020805460ff191691151591909117905550819050612fff81614e47565b915050612f33565b6000600360008360600151605c81111561302357613023614428565b605c81111561303457613034614428565b815260200190815260200160002060008360400151605c81111561305a5761305a614428565b605c81111561306b5761306b614428565b815260208101919091526040016000205460ff161592915050565b6000546001600160a01b031633146130b05760405162461bcd60e51b81526004016105dd90614de1565b60005b83518110156131db5760008482815181106130d0576130d0614e1b565b6020026020010151905060008483815181106130ee576130ee614e1b565b60200260200101519050600084848151811061310c5761310c614e1b565b6020026020010151905060016008600085605c81111561312e5761312e614428565b605c81111561313f5761313f614428565b8152602001908152602001600020600084605c81111561316157613161614428565b605c81111561317257613172614428565b8152602001908152602001600020600083600381111561319457613194614428565b60038111156131a5576131a5614428565b81526020810191909152604001600020805460ff1916911515919091179055508291506131d3905081614e47565b9150506130b3565b50505050565b6000546001600160a01b0316331461320b5760405162461bcd60e51b81526004016105dd90614de1565b60005b83518110156131db57600084828151811061322b5761322b614e1b565b60200260200101519050600084838151811061324957613249614e1b565b6020026020010151905083838151811061326557613265614e1b565b60200260200101516004600084605c81111561328357613283614428565b605c81111561329457613294614428565b8152602001908152602001600020600083605c8111156132b6576132b6614428565b605c8111156132c7576132c7614428565b815260200190815260200160002060006101000a81548160ff021916908360ff160217905550505080806132fa90614e47565b91505061320e565b6000546001600160a01b0316331461332c5760405162461bcd60e51b81526004016105dd90614de1565b60005b825181101561133157600083828151811061334c5761334c614e1b565b60200260200101519050600083838151811061336a5761336a614e1b565b6020026020010151905060016002600084605c81111561338c5761338c614428565b605c81111561339d5761339d614428565b8152602001908152602001600020600083605c8111156133bf576133bf614428565b605c8111156133d0576133d0614428565b81526020810191909152604001600020805460ff1916911515919091179055508190506133fc81614e47565b91505061332f565b6000600460008360600151605c81111561342057613420614428565b605c81111561343157613431614428565b815260200190815260200160002060008360400151605c81111561345757613457614428565b605c81111561346857613468614428565b815260208101919091526040016000205460ff1692915050565b6000600860008460600151605c81111561349e5761349e614428565b605c8111156134af576134af614428565b815260200190815260200160002060008460400151605c8111156134d5576134d5614428565b605c8111156134e6576134e6614428565b8152602001908152602001600020600083600381111561350857613508614428565b600381111561351957613519614428565b815260208101919091526040016000205460ff169392505050565b6000546001600160a01b0316331461355e5760405162461bcd60e51b81526004016105dd90614de1565b6001600160a01b0381166135845760405162461bcd60e51b81526004016105dd906150f9565b61358d81613a3d565b50565b600760205260009081526040902080546135a990615159565b80601f01602080910402602001604051908101604052809291908181526020018280546135d590615159565b80156136225780601f106135f757610100808354040283529160200191613622565b820191906000526020600020905b81548152906001019060200180831161360557829003601f168201915b505050505081565b6000613637826000613482565b61364357506000919050565b600160008360600151605c81111561342057613420614428565b6060816136815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156136ab578061369581614e47565b91506136a49050600a83614e78565b9150613685565b6000816001600160401b038111156136c5576136c561403b565b6040519080825280601f01601f1916602001820160405280156136ef576020820181803683370190505b5090505b84156110fe57613704600183614f9f565b9150613711600a86614eeb565b61371c906030614fc2565b60f81b81838151811061373157613731614e1b565b60200101906001600160f81b031916908160001a905350613753600a86614e78565b94506136f3565b606082600060015b600183516137709190614f9f565b8210156137b7576000613784878785613f06565b905080600019141561379657506137b7565b816137a081614e47565b92506137af9050816001614fc2565b925050613762565b806001600160401b038111156137cf576137cf61403b565b60405190808252806020026020018201604052801561380257816020015b60608152602001906001900390816137ed5790505b50935060009150600090505b6001835161381c9190614f9f565b821015613944576000613830878785613f06565b9050806000191415613840575082515b600061384c8483614f9f565b6001600160401b038111156138635761386361403b565b6040519080825280601f01601f19166020018201604052801561388d576020820181803683370190505b509050806000855b84811015613904578781815181106138af576138af614e1b565b01602001516001600160f81b03191683836138c981614e47565b9450815181106138db576138db614e1b565b60200101906001600160f81b031916908160001a905350806138fc81614e47565b915050613895565b50613910846001614fc2565b955081888661391e81614e47565b97508151811061393057613930614e1b565b60200260200101819052505050505061380e565b50505092915050565b8251606090849061395e8585615186565b111561396c5761396c6151c2565b6000846001600160401b038111156139865761398661403b565b6040519080825280601f01601f1916602001820160405280156139b0576020820181803683370190505b509050806000855b6139c28888615186565b811015613a30578481815181106139db576139db614e1b565b01602001516001600160f81b03191683836139f581614e47565b945081518110613a0757613a07614e1b565b60200101906001600160f81b031916908160001a90535080613a2881614e47565b9150506139b8565b5090979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600082605c811115613aa357613aa3614428565b1415613aae57600080fd5b60006007600084605c811115613ac657613ac6614428565b605c811115613ad757613ad7614428565b81526020019081526020016000208054613af090615159565b80601f0160208091040260200160405190810160405280929190818152602001828054613b1c90615159565b8015613b695780601f10613b3e57610100808354040283529160200191613b69565b820191906000526020600020905b815481529060010190602001808311613b4c57829003601f168201915b50505050509050606060006005600086605c811115613b8a57613b8a614428565b605c811115613b9b57613b9b614428565b8152602081019190915260400160009081205460ff16915081600c811115613bc557613bc5614428565b1415613bee57604051806040016040528060038152602001620a6caf60eb1b8152509150613eda565b600181600c811115613c0257613c02614428565b1415613c2c57604051806040016040528060048152602001632430b4b960e11b8152509150613eda565b600281600c811115613c4057613c40614428565b1415613c6a57604051806040016040528060048152602001634579657360e01b8152509150613eda565b600381600c811115613c7e57613c7e614428565b1415613ca957604051806040016040528060058152602001641099585c9960da1b8152509150613eda565b600481600c811115613cbd57613cbd614428565b1415613ce757604051806040016040528060048152602001634561727360e01b8152509150613eda565b600581600c811115613cfb57613cfb614428565b1415613d2557604051806040016040528060048152602001634c69707360e01b8152509150613eda565b600681600c811115613d3957613d39614428565b1415613d64576040518060400160405280600581526020016409adeeae8d60db1b8152509150613eda565b600781600c811115613d7857613d78614428565b1415613da257604051806040016040528060048152602001634661636560e01b8152509150613eda565b600881600c811115613db657613db6614428565b1415613de3576040518060400160405280600781526020016622b6b7ba34b7b760c91b8152509150613eda565b600981600c811115613df757613df7614428565b1415613e2157604051806040016040528060048152602001634e65636b60e01b8152509150613eda565b600a81600c811115613e3557613e35614428565b1415613e5f57604051806040016040528060048152602001634e6f736560e01b8152509150613eda565b600b81600c811115613e7357613e73614428565b1415613e9f5760405180604001604052806006815260200165436865656b7360d01b8152509150613eda565b600c81600c811115613eb357613eb3614428565b1415613eda57604051806040016040528060058152602001640a8cacae8d60db1b81525091505b8183604051602001613eed9291906151d8565b6040516020818303038152906040529350505050919050565b815160009084908490600114613f1e57613f1e6151c2565b835b8251811015613f945781600081518110613f3c57613f3c614e1b565b602001015160f81c60f81b6001600160f81b031916838281518110613f6357613f63614e1b565b01602001516001600160f81b0319161415613f82579250610f82915050565b80613f8c81614e47565b915050613f20565b506000199695505050505050565b828054613fae90615159565b90600052602060002090601f016020900481019282613fd05760008555614016565b82601f10613fe957805160ff1916838001178555614016565b82800160010185558215614016579182015b82811115614016578251825591602001919060010190613ffb565b50614022929150614026565b5090565b5b808211156140225760008155600101614027565b634e487b7160e01b600052604160045260246000fd5b601f19601f83011681018181106001600160401b03821117156140765761407661403b565b6040525050565b600061408860405190565b90506140948282614051565b919050565b60006001600160401b038211156140b2576140b261403b565b5060209081020190565b60ff81165b811461358d57600080fd5b80356118b0816140bc565b60006140ea6140e584614099565b61407d565b8381529050602080820190840283018581111561410957614109600080fd5b835b8181101561412d578061411e88826140cc565b8452506020928301920161410b565b5050509392505050565b600082601f83011261414b5761414b600080fd5b81356110fe8482602086016140d7565b60006141696140e584614099565b8381529050602080820190840283018581111561418857614188600080fd5b835b8181101561412d5780356001600160401b038111156141ab576141ab600080fd5b8086016141b88982614137565b855250506020928301920161418a565b600082601f8301126141dc576141dc600080fd5b81356110fe84826020860161415b565b60006020828403121561420157614201600080fd5b81356001600160401b0381111561421a5761421a600080fd5b6110fe848285016141c8565b605d811061358d57600080fd5b80356118b081614226565b6000806040838503121561425457614254600080fd5b60006142608585614233565b925050602061427185828601614233565b9150509250929050565b8015155b82525050565b602081016118b0828461427b565b61ffff81166140c1565b80356118b081614293565b60006101e082840312156142be576142be600080fd5b6142c96101e061407d565b905060006142d7848461429d565b82525060206142e88484830161429d565b60208301525060406142fc84828501614233565b604083015250606061431084828501614233565b606083015250608061432484828501614233565b60808301525060a061433884828501614233565b60a08301525060c061434c84828501614233565b60c08301525060e061436084828501614233565b60e08301525061010061437584828501614233565b6101008301525061012061438b84828501614233565b610120830152506101406143a184828501614233565b610140830152506101606143b784828501614233565b610160830152506101806143cd84828501614233565b610180830152506101a06143e384828501614233565b6101a0830152506101c06143f984828501614233565b6101c08301525092915050565b60006101e0828403121561441c5761441c600080fd5b60006110fe84846142a8565b634e487b7160e01b600052602160045260246000fd5b6006811061358d5761358d614428565b806140948161443e565b60006118b08261444e565b61427f81614458565b602081016118b08284614463565b806140c1565b80356118b08161447a565b60006001600160401b038211156144a4576144a461403b565b601f19601f83011660200192915050565b82818337506000910152565b60006144cf6140e58461448b565b9050828152602081018484840111156144ea576144ea600080fd5b6144f58482856144b5565b509392505050565b600082601f83011261451157614511600080fd5b81356110fe8482602086016144c1565b6000806000610220848603121561453a5761453a600080fd5b600061454686866142a8565b9350506101e061455886828701614480565b9250506102008401356001600160401b0381111561457857614578600080fd5b614584868287016144fd565b9150509250925092565b8061427f565b602081016118b0828461458e565b6002811061358d5761358d614428565b80614094816145a2565b60006118b0826145b2565b61427f816145bc565b602081016118b082846145c7565b60006145ec6140e584614099565b8381529050602080820190840283018581111561460b5761460b600080fd5b835b8181101561412d57806146208882614233565b8452506020928301920161460d565b600082601f83011261464357614643600080fd5b81356110fe8482602086016145de565b6000806040838503121561466957614669600080fd5b82356001600160401b0381111561468257614682600080fd5b61468e8582860161462f565b92505060208301356001600160401b038111156146ad576146ad600080fd5b6142718582860161462f565b600080604083850312156146cf576146cf600080fd5b60006146db858561429d565b92505060206142718582860161429d565b61ffff811661427f565b605d811061358d5761358d614428565b80614094816146f6565b60006118b082614706565b61427f81614710565b80516101e083019061473684826146ec565b50602082015161474960208501826146ec565b50604082015161475c604085018261471b565b50606082015161476f606085018261471b565b506080820151614782608085018261471b565b5060a082015161479560a085018261471b565b5060c08201516147a860c085018261471b565b5060e08201516147bb60e085018261471b565b506101008201516147d061010085018261471b565b506101208201516147e561012085018261471b565b506101408201516147fa61014085018261471b565b5061016082015161480f61016085018261471b565b5061018082015161482461018085018261471b565b506101a08201516148396101a085018261471b565b506101c08201516131db6101c085018261471b565b6101e081016118b08284614724565b60006020828403121561487257614872600080fd5b60006110fe8484614233565b600d811061358d5761358d614428565b806140948161487e565b60006118b08261488e565b61427f81614898565b602081016118b082846148a3565b60006148c86140e584614099565b838152905060208082019084028301858111156148e7576148e7600080fd5b835b8181101561412d57806148fc8882614480565b845250602092830192016148e9565b600082601f83011261491f5761491f600080fd5b81356110fe8482602086016148ba565b6000806000610220848603121561494857614948600080fd5b600061495486866142a8565b9350506101e08401356001600160401b0381111561497457614974600080fd5b6145588682870161490b565b60ff811661427f565b602081016118b08284614980565b60005b838110156149b257818101518382015260200161499a565b838111156131db5750506000910152565b60006149cd825190565b8084526020840193506149e4818560208601614997565b601f01601f19169290920192915050565b60208082528101610f8281846149c3565b60006001600160a01b0382166118b0565b61427f81614a06565b602081016118b08284614a17565b6004811061358d5761358d614428565b8061409481614a2e565b60006118b082614a3e565b61427f81614a48565b602081016118b08284614a53565b6000614a786140e584614099565b83815290506020808201908402830185811115614a9757614a97600080fd5b835b8181101561412d5780356001600160401b03811115614aba57614aba600080fd5b808601614ac789826144fd565b8552505060209283019201614a99565b600082601f830112614aeb57614aeb600080fd5b81356110fe848260208601614a6a565b60008060408385031215614b1157614b11600080fd5b82356001600160401b03811115614b2a57614b2a600080fd5b61468e85828601614ad7565b6004811061358d57600080fd5b80356118b081614b36565b6000614b5c6140e584614099565b83815290506020808201908402830185811115614b7b57614b7b600080fd5b835b8181101561412d5780614b908882614b43565b84525060209283019201614b7d565b600082601f830112614bb357614bb3600080fd5b81356110fe848260208601614b4e565b600080600060608486031215614bdb57614bdb600080fd5b83356001600160401b03811115614bf457614bf4600080fd5b614c008682870161462f565b93505060208401356001600160401b03811115614c1f57614c1f600080fd5b614c2b8682870161462f565b92505060408401356001600160401b03811115614c4a57614c4a600080fd5b61458486828701614b9f565b600080600060608486031215614c6e57614c6e600080fd5b83356001600160401b03811115614c8757614c87600080fd5b614c938682870161462f565b93505060208401356001600160401b03811115614cb257614cb2600080fd5b614cbe8682870161462f565b92505060408401356001600160401b03811115614cdd57614cdd600080fd5b61458486828701614137565b600060208284031215614cfe57614cfe600080fd5b81356001600160401b03811115614d1757614d17600080fd5b6110fe848285016144fd565b602081016118b0828461471b565b600080600060608486031215614d4957614d49600080fd5b6000614d558686614233565b9350506020614d6686828701614233565b925050604061458486828701614b43565b6000806102008385031215614d8e57614d8e600080fd5b6000614d9a85856142a8565b9250506101e061427185828601614b43565b6140c181614a06565b80356118b081614dac565b600060208284031215614dd557614dd5600080fd5b60006110fe8484614db5565b60208082528181019081527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726040830152606082016118b0565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614e5b57614e5b614e31565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082614e8757614e87614e62565b500490565b6000614e96825190565b614ea4818560208601614997565b9290920192915050565b601d60f91b81526000614e5b565b6000614ec88286614e8c565b9150614ed382614eae565b9150614edf8285614e8c565b9150610f168284614e8c565b600082614efa57614efa614e62565b500690565b602081016118b082846146ec565b6000614f1b6140e58461448b565b905082815260208101848484011115614f3657614f36600080fd5b6144f5848285614997565b600082601f830112614f5557614f55600080fd5b81516110fe848260208601614f0d565b600060208284031215614f7a57614f7a600080fd5b81516001600160401b03811115614f9357614f93600080fd5b6110fe84828501614f41565b600082821015614fb157614fb1614e31565b500390565b6000610f828284614e8c565b60008219821115614fd557614fd5614e31565b500190565b600060ff8216915060ff821415614e5b57614e5b614e31565b600b60fa1b81526000614e5b565b600061500d8285614e8c565b91506150198284614e8c565b91506110fe82614ff3565b600160fd1b81526000614e5b565b600061503e8285614e8c565b915061504982615024565b91506110fe8284614e8c565b6902130b1b5bbb0b93239960b51b8152600a016000610f828284614e8c565b7f7b2274726169745f74797065223a2246617368696f6e20486174222c20227661815265363ab2911d1160d11b602082015260260160006150b58284614e8c565b61227d60f01b8152915060028201610f82565b605d60f81b81526000614e5b565b60006150e28285614e8c565b91506150ee8284614e8c565b91506110fe826150c8565b602080825281016118b081602681527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160208201526564647265737360d01b604082015260600190565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061516d57607f821691505b6020821081141561518057615180615143565b50919050565b6000816001600160ff1b03038313600083121516156151a7576151a7614e31565b81600160ff1b038312600083121615614fd557614fd5614e31565b634e487b7160e01b600052600160045260246000fd5b6e3d913a3930b4ba2fba3cb832911d1160891b8152600f0160006151fc8285614e8c565b6b111610113b30b63ab2911d1160a11b8152600c01915061521d8284614e8c565b61227d60f01b81529150600282016110fe56fea264697066735822122070b36de543765af6077df3b1c5e7a21ae006357c8ab3eadbbf90b80e2d699d4d64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b2
-----Decoded View---------------
Arg [0] : punkDataContractAddress (address): 0x16F5A35647D6F03D5D3da7b35409D65ba03aF3B2
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000016f5a35647d6f03d5d3da7b35409d65ba03af3b2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 34 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.