Overview
APE Balance
0 APE
APE Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 3894719 | 7 days ago | IN | 0 APE | 0.11301108 |
Loading...
Loading
Contract Name:
FashionHatPunksData
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-11-09 */ // File: openzeppelin/contracts/utils/Context.sol // 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; } } // File: openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // File: sonra/StringUtilsLib.sol 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; } } // File: sonra/apepunks.sol pragma solidity >=0.8.0 <0.9.0; pragma abicoder v2; 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; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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
60a06040523480156200001157600080fd5b5060405162004fd738038062004fd78339810160408190526200003491620000a1565b6200003f3362000051565b6001600160a01b0316608052620000d3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b457600080fd5b81516001600160a01b0381168114620000cc57600080fd5b9392505050565b608051614ee8620000ef60003960006114000152614ee86000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638da5cb5b1161011a578063d16c48d8116100ad578063f1c4439f1161007c578063f1c4439f14610540578063f29542671461056e578063f2fde38b14610581578063fc9faca514610594578063ff213f89146105a757600080fd5b8063d16c48d8146104ab578063dc6e449e146104e6578063e1a944a6146104f9578063ecd560161461052d57600080fd5b8063c1597dab116100e9578063c1597dab1461045f578063c63da44d14610472578063c7fa47ce14610485578063cf7ac36e1461049857600080fd5b80638da5cb5b146103e3578063a1f70561146103fe578063b963da011461042c578063c14adbce1461044c57600080fd5b8063683375c4116101925780638664d6fd116101615780638664d6fd1461038a5780638b7b2afa1461039d5780638bc61064146103b05780638bcbf89a146103c357600080fd5b8063683375c4146102ff5780636f065ea51461032f578063715018a61461035d57806372ff70491461036557600080fd5b80635586b160116101ce5780635586b1601461029957806355ac3d88146102b957806357bc535b146102cc5780636424a214146102ec57600080fd5b806314c5f1e214610200578063234cbd65146102155780633f4af2d11461025857806340a0020514610278575b600080fd5b61021361020e3660046140b3565b6105ba565b005b610243610223366004614177565b600360209081526000928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b61026b6102663660046142df565b6106d6565b60405161024f9190614312565b61028b6102863660046143a4565b610efb565b60405190815260200161024f565b6102ac6102a73660046142df565b610f65565b60405161024f919061440e565b6102136102c736600461447d565b61120b565b6102df6102da3660046144e0565b6112f0565b60405161024f919061451e565b6102436102fa3660046142df565b611871565b61032261030d36600461464c565b60056020526000908152604090205460ff1681565b60405161024f9190614667565b61024361033d366004614177565b600260209081526000928352604080842090915290825290205460ff1681565b610213611998565b61037861037336600461467b565b6119ac565b60405160ff909116815260200161024f565b6103786103983660046142df565b611a8a565b6102ac6103ab3660046142df565b611cce565b6102436103be3660046142df565b611f64565b6103d66103d13660046144e0565b6120d1565b60405161024f919061476c565b6000546040516001600160a01b03909116815260200161024f565b61037861040c366004614177565b600460209081526000928352604080842090915290825290205460ff1681565b61043f61043a3660046142df565b612733565b60405161024f919061479f565b61021361045a3660046147b3565b612d8f565b61021361046d36600461447d565b612e7d565b6102436104803660046142df565b612f5c565b61021361049336600461487e565b612fdb565b6102136104a6366004614962565b613114565b6104d96104b93660046149df565b805160208183018101805160068252928201919093012091525460ff1681565b60405161024f9190614a13565b6102136104f436600461447d565b613213565b610243610507366004614a21565b600860209081526000938452604080852082529284528284209052825290205460ff1681565b61037861053b3660046142df565b6132f3565b61024361054e366004614177565b600160209081526000928352604080842090915290825290205460ff1681565b61024361057c366004614a64565b613371565b61021361058f366004614a91565b613423565b6103d66105a236600461464c565b6134a1565b6102436105b53660046142df565b61353b565b6105c261356e565b60005b81518110156106d25760008282815181106105e2576105e2614aba565b60200260200101516000815181106105fc576105fc614aba565b602002602001015160ff16605c811115610618576106186142fc565b9050600083838151811061062e5761062e614aba565b602002602001015160018151811061064857610648614aba565b602002602001015160ff16600c811115610664576106646142fc565b9050806005600084605c81111561067d5761067d6142fc565b605c81111561068e5761068e6142fc565b81526020810191909152604001600020805460ff1916600183600c8111156106b8576106b86142fc565b0217905550505080806106ca90614ae6565b9150506105c5565b5050565b6000806106e283612733565b60408051600680825260e08201909252919250600091906020820160c080368337019050509050600082600381111561071d5761071d6142fc565b14156107fa5763861c46808160008151811061073b5761073b614aba565b6020908102919091010152639502f9008160018151811061075e5761075e614aba565b602090810291909101015263773594008160028151811061078157610781614aba565b6020908102919091010152639502f900816003815181106107a4576107a4614aba565b602090810291909101015263773594008160045b815181106107c8576107c8614aba565b602090810291909101015260008160055b815181106107e9576107e9614aba565b602002602001018181525050610a63565b600182600381111561080e5761080e6142fc565b14156108ca5764012a05f2008160008151811061082d5761082d614aba565b602090810291909101015260008160018151811061084d5761084d614aba565b602090810291909101015260008160028151811061086d5761086d614aba565b602090810291909101015260008160038151811061088d5761088d614aba565b602090810291909101015264012a05f200816004815181106108b1576108b1614aba565b602090810291909101015264012a05f2008160056107d9565b60028260038111156108de576108de6142fc565b141561097857640165a0bc00816000815181106108fd576108fd614aba565b602090810291909101015263773594008160018151811061092057610920614aba565b602090810291909101015260008160028151811061094057610940614aba565b602090810291909101015260008160038151811061096057610960614aba565b602090810291909101015263ee6b28008160046107b8565b600382600381111561098c5761098c6142fc565b1415610a635763861c4680816000815181106109aa576109aa614aba565b6020908102919091010152639502f900816001815181106109cd576109cd614aba565b60209081029190910101526377359400816002815181106109f0576109f0614aba565b6020908102919091010152639502f90081600381518110610a1357610a13614aba565b6020908102919091010152637735940081600481518110610a3657610a36614aba565b6020908102919091010152600081600581518110610a5657610a56614aba565b6020026020010181815250505b60298460600151605c811115610a7b57610a7b6142fc565b1415610b2b576000818181518110610a9557610a95614aba565b6020908102919091010152600081600181518110610ab557610ab5614aba565b6020908102919091010152633b9aca0081600281518110610ad857610ad8614aba565b602090810291909101015263b2d05e0081600381518110610afb57610afb614aba565b602090810291909101015263b2d05e0081600481518110610b1e57610b1e614aba565b6020026020010181815250505b60528460800151605c811115610b4357610b436142fc565b1480610b645750605b8460600151605c811115610b6257610b626142fc565b145b15610b8b57600081600381518110610b7e57610b7e614aba565b6020026020010181815250505b60188460600151605c811115610ba357610ba36142fc565b148015610bc157506001826003811115610bbf57610bbf6142fc565b145b15610bf357600a81600081518110610bdb57610bdb614aba565b60200260200101818151610bef9190614b17565b9052505b6003826003811115610c0757610c076142fc565b1415610cec57605a8460600151605c811115610c2557610c256142fc565b1480610c46575060268460600151605c811115610c4457610c446142fc565b145b80610c86575060288460600151605c811115610c6457610c646142fc565b148015610c865750601e8460400151605c811115610c8457610c846142fc565b145b15610cac576000818181518110610c9f57610c9f614aba565b6020026020010181815250505b60598460600151605c811115610cc457610cc46142fc565b1415610cec57600081600481518110610cdf57610cdf614aba565b6020026020010181815250505b6002826003811115610d0057610d006142fc565b1480610d1d57506001826003811115610d1b57610d1b6142fc565b145b15610db157610d2b84611871565b80610d4b575060228460600151605c811115610d4957610d496142fc565b145b80610d6b5750605a8460600151605c811115610d6957610d696142fc565b145b80610d8b575060268460600151605c811115610d8957610d896142fc565b145b15610db1576000818181518110610da457610da4614aba565b6020026020010181815250505b601e8460400151605c811115610dc957610dc96142fc565b14158015610e0b575060578460800151605c811115610dea57610dea6142fc565b1480610e0b575060068460800151605c811115610e0957610e096142fc565b145b15610e31576000818181518110610e2457610e24614aba565b6020026020010181815250505b60178460600151605c811115610e4957610e496142fc565b148015610e865750601e8460400151605c811115610e6957610e696142fc565b1480610e8657506003826003811115610e8457610e846142fc565b145b15610ead57600081600281518110610ea057610ea0614aba565b6020026020010181815250505b6000610edb8583604051806040016040528060098152602001683430ba2fb1b7b637b960b91b8152506119ac565b90508060ff166005811115610ef257610ef26142fc565b95945050505050565b60208301518351600091908290610f159061ffff166135c8565b610f228361ffff166135c8565b85604051602001610f3593929190614b2b565b60408051601f1981840301815291905280516020909101209050610f598582614b7e565b925050505b9392505050565b600080610f7183612733565b90506000816003811115610f8757610f876142fc565b14610f955750600092915050565b60408051600280825260608201835260009260208301908036833701905050905064012a05f20081600081518110610fcf57610fcf614aba565b602090810291909101015264012a05f20081600181518110610ff357610ff3614aba565b602090810291909101015260268460600151605c811115611016576110166142fc565b1415611026575060019392505050565b61102f8461353b565b61103d575060009392505050565b601e8460400151605c811115611055576110556142fc565b14158015611097575060578460800151605c811115611076576110766142fc565b1480611097575060068460800151605c811115611095576110956142fc565b145b80156110ae57506110a784611a8a565b60ff166001145b156110e25760068460800151605c8111156110cb576110cb6142fc565b146110d75760016110da565b60005b949350505050565b601e8460400151605c8111156110fa576110fa6142fc565b1480611111575061110a846132f3565b60ff166001145b801561113357506010846101000151605c811115611131576111316142fc565b145b1561116557600a8160008151811061114d5761114d614aba565b602002602001018181516111619190614b17565b9052505b60298460600151605c81111561117d5761117d6142fc565b148061119e575060048460600151605c81111561119c5761119c6142fc565b145b806111b457506111ad846132f3565b60ff166002145b156111c3575060009392505050565b60006111f485836040518060400160405280600c81526020016b3430ba2fb837b9b4ba34b7b760a11b8152506119ac565b90508060ff166001811115610ef257610ef26142fc565b61121361356e565b60005b82518110156112eb57600083828151811061123357611233614aba565b60200260200101519050600083838151811061125157611251614aba565b6020026020010151905060016003600084605c811115611273576112736142fc565b605c811115611284576112846142fc565b8152602001908152602001600020600083605c8111156112a6576112a66142fc565b605c8111156112b7576112b76142fc565b81526020810191909152604001600020805460ff1916911515919091179055508190506112e381614ae6565b915050611216565b505050565b611368604080516101e0810182526000808252602082018190529091820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101e08101825261ffff808616825284166020820152600091810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905280516040516376dfe29760e01b815261ffff90911660048201529091506000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906376dfe29790602401600060405180830381865afa15801561144f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114779190810190614b92565b905060006114a7604051806040016040528060018152602001600b60fa1b815250836136c590919063ffffffff16565b905060005b81518110156118645760008282815181106114c9576114c9614aba565b6020026020010151905060606001831015611522576040805180820190915260018152600160fd1b60208201526115019083906136c5565b60008151811061151357611513614aba565b6020026020010151905061153f565b61153c600183516115339190614bff565b839060016138b8565b90505b60006006826040516115519190614c16565b9081526040519081900360200190205460ff169050600060058183605c81111561157d5761157d6142fc565b605c81111561158e5761158e6142fc565b8152602081019190915260400160009081205460ff16915081600c8111156115b8576115b86142fc565b14156115ef576040880182605c8111156115d4576115d46142fc565b9081605c8111156115e7576115e76142fc565b90525061184d565b600181600c811115611603576116036142fc565b141561161f576060880182605c8111156115d4576115d46142fc565b600281600c811115611633576116336142fc565b141561164f576080880182605c8111156115d4576115d46142fc565b600381600c811115611663576116636142fc565b141561167f5760a0880182605c8111156115d4576115d46142fc565b600481600c811115611693576116936142fc565b14156116af5760c0880182605c8111156115d4576115d46142fc565b600581600c8111156116c3576116c36142fc565b14156116df5760e0880182605c8111156115d4576115d46142fc565b600681600c8111156116f3576116f36142fc565b141561171057610100880182605c8111156115d4576115d46142fc565b600781600c811115611724576117246142fc565b141561174157610120880182605c8111156115d4576115d46142fc565b600881600c811115611755576117556142fc565b141561177257610140880182605c8111156115d4576115d46142fc565b600981600c811115611786576117866142fc565b14156117a357610160880182605c8111156115d4576115d46142fc565b600a81600c8111156117b7576117b76142fc565b14156117d457610180880182605c8111156115d4576115d46142fc565b600b81600c8111156117e8576117e86142fc565b1415611805576101a0880182605c8111156115d4576115d46142fc565b600c81600c811115611819576118196142fc565b141561184d576101c0880182605c811115611836576118366142fc565b9081605c811115611849576118496142fc565b9052505b50505050808061185c90614ae6565b9150506114ac565b5091925050505b92915050565b6000601e8260400151605c81111561188b5761188b6142fc565b1480156118ad575060458260800151605c8111156118ab576118ab6142fc565b145b156118ba57506001919050565b60378260800151605c8111156118d2576118d26142fc565b14806118f35750602a8260800151605c8111156118f1576118f16142fc565b145b806119135750601c8260800151605c811115611911576119116142fc565b145b806119335750601b8260800151605c811115611931576119316142fc565b145b80611953575060118260800151605c811115611951576119516142fc565b145b80611973575060068260800151605c811115611971576119716142fc565b145b8061186b575060578260800151605c811115611991576119916142fc565b1492915050565b6119a061356e565b6119aa60006139a8565b565b81516000908190815b818110156119f6578581815181106119cf576119cf614aba565b6020026020010151836119e29190614c32565b9250806119ee81614ae6565b9150506119b5565b506000611a04878487610efb565b905060005b828160ff161015611a7f57868160ff1681518110611a2957611a29614aba565b6020026020010151821015611a43579350610f5e92505050565b868160ff1681518110611a5857611a58614aba565b602002602001015182611a6b9190614bff565b915080611a7781614c4a565b915050611a09565b505050509392505050565b600080611a9683612733565b90506003816003811115611aac57611aac6142fc565b1480611ac957506001816003811115611ac757611ac76142fc565b145b80611ae557506002816003811115611ae357611ae36142fc565b145b15611af35750600192915050565b60038360600151605c811115611b0b57611b0b6142fc565b1415611b8857601e8360400151605c811115611b2957611b296142fc565b1415611b385750600192915050565b60068360800151605c811115611b5057611b506142fc565b1480611b71575060578360800151605c811115611b6f57611b6f6142fc565b145b15611b7f5750600292915050565b50600192915050565b6000611b93846132f3565b9050601e8460400151605c811115611bad57611bad6142fc565b14611c0d5760148460600151605c811115611bca57611bca6142fc565b1480611bec575060295b8460600151605c811115611bea57611bea6142fc565b145b15611bfb575060019392505050565b60008160ff1611610f5e5760026110da565b6000826003811115611c2157611c216142fc565b148015611c62575060188460600151605c811115611c4157611c416142fc565b1480611c625750603a8460600151605c811115611c6057611c606142fc565b145b80611bec5750603e8460600151605c811115611c8057611c806142fc565b1480611ca15750604d8460600151605c811115611c9f57611c9f6142fc565b145b80611cc15750604e8460600151605c811115611cbf57611cbf6142fc565b145b80611bec5750604f611bd4565b600080611cda83612733565b9050601e8360400151605c811115611cf457611cf46142fc565b14611d025750600092915050565b6000816003811115611d1657611d166142fc565b148015611d38575060178360600151605c811115611d3657611d366142fc565b145b15611d465750600092915050565b6001816003811115611d5a57611d5a6142fc565b148015611d7c5750605a8360600151605c811115611d7a57611d7a6142fc565b145b15611d8a5750600092915050565b6001816003811115611d9e57611d9e6142fc565b1480611dbb57506000816003811115611db957611db96142fc565b145b15611e075760088360600151605c811115611dd857611dd86142fc565b1480611df9575060098360600151605c811115611df757611df76142fc565b145b15611e075750600092915050565b6002816003811115611e1b57611e1b6142fc565b1480611e3857506001816003811115611e3657611e366142fc565b145b80611e5457506000816003811115611e5257611e526142fc565b145b15611e805760228360600151605c811115611e7157611e716142fc565b1415611e805750600092915050565b6002816003811115611e9457611e946142fc565b1480611eb157506001816003811115611eaf57611eaf6142fc565b145b15611efd5760268360600151605c811115611ece57611ece6142fc565b1480611eef575060598360600151605c811115611eed57611eed6142fc565b145b15611efd5750600092915050565b604e8360600151605c811115611f1557611f156142fc565b1480611f365750604d8360600151605c811115611f3457611f346142fc565b145b80611f565750604f8360600151605c811115611f5457611f546142fc565b145b15611b7f5750600092915050565b600080611f7083612733565b9050611f7b83612f5c565b15611f895750600192915050565b60048360600151605c811115611fa157611fa16142fc565b148015611fbf57506000816003811115611fbd57611fbd6142fc565b145b15611fcd5750600192915050565b600060458460800151605c811115611fe757611fe76142fc565b1480612008575060118460800151605c811115612006576120066142fc565b145b806120285750602a8460800151605c811115612026576120266142fc565b145b80612048575060528460800151605c811115612046576120466142fc565b145b806120685750601c8460800151605c811115612066576120666142fc565b145b806120885750601b8460800151605c811115612086576120866142fc565b145b905060538460600151605c8111156120a2576120a26142fc565b1480156120c257508015806120c257506120bb84611a8a565b60ff166002145b156110d7575060019392505050565b606060006120df84846112f0565b6040805180820190915260018152605b60f81b60208201529091506000908161210784612733565b90506000612114856106d6565b9050600061212186610f65565b90506000604051806101a001604052808860400151605c811115612147576121476142fc565b605c811115612158576121586142fc565b815260200161216689611f64565b6121705787612176565b88606001515b605c811115612187576121876142fc565b605c811115612198576121986142fc565b81526020018860800151605c8111156121b3576121b36142fc565b605c8111156121c4576121c46142fc565b81526020018860a00151605c8111156121df576121df6142fc565b605c8111156121f0576121f06142fc565b81526020018860c00151605c81111561220b5761220b6142fc565b605c81111561221c5761221c6142fc565b81526020018860e00151605c811115612237576122376142fc565b605c811115612248576122486142fc565b8152602001886101000151605c811115612264576122646142fc565b605c811115612275576122756142fc565b8152602001886101200151605c811115612291576122916142fc565b605c8111156122a2576122a26142fc565b8152602001886101400151605c8111156122be576122be6142fc565b605c8111156122cf576122cf6142fc565b8152602001886101600151605c8111156122eb576122eb6142fc565b605c8111156122fc576122fc6142fc565b8152602001886101800151605c811115612318576123186142fc565b605c811115612329576123296142fc565b8152602001886101a00151605c811115612345576123456142fc565b605c811115612356576123566142fc565b8152602001886101c00151605c811115612372576123726142fc565b605c811115612383576123836142fc565b905290506060600084600581111561239d5761239d6142fc565b14156123c55750604080518082019091526005815264426c61636b60d81b60208201526124e8565b60018460058111156123d9576123d96142fc565b141561240057506040805180820190915260048152634772657960e01b60208201526124e8565b6002846005811115612414576124146142fc565b141561243a575060408051808201909152600381526214995960ea1b60208201526124e8565b600384600581111561244e5761244e6142fc565b14156124765750604080518082019091526005815264576869746560d81b60208201526124e8565b600484600581111561248a5761248a6142fc565b14156124b057506040805180820190915260038152622a30b760e91b60208201526124e8565b60058460058111156124c4576124c46142fc565b14156124e85750604080518082019091526005815264213937bbb760d91b60208201525b606060008660038111156124fe576124fe6142fc565b141561252d575060408051808201909152600c81526b04261736562616c6c204361760a41b60208201526125e7565b6001866003811115612541576125416142fc565b141561256e575060408051808201909152600a815269109d58dad95d0812185d60b21b60208201526125e7565b6002866003811115612582576125826142fc565b14156125af575060408051808201909152600a81526910dbddd89bde4812185d60b21b60208201526125e7565b60038660038111156125c3576125c36142fc565b14156125e757506040805180820190915260058152642b34b9b7b960d91b60208201525b60005b600d8110156126755760008482600d811061260757612607614aba565b6020020151905089605c811115612620576126206142fc565b81605c811115612632576126326142fc565b146126645788612641826139f8565b604051602001612652929190614c6a565b60405160208183030381529060405298505b5061266e81614ae6565b90506125ea565b506000828260405160200161268b929190614ca5565b60408051601f19818403018152919052905060018560018111156126b1576126b16142fc565b14156126da57806040516020016126c89190614ce1565b60405160208183030381529060405290505b6000816040516020016126ed9190614d13565b60405160208183030381529060405290508881604051602001612711929190614d73565b6040516020818303038152906040529b50505050505050505050505092915050565b60408051600480825260a082019092526000918291906020820160808036833701905050905060005b600481101561279957639502f90082828151811061277c5761277c614aba565b60209081029190910101528061279181614ae6565b91505061275c565b50600260008460600151605c8111156127b4576127b46142fc565b605c8111156127c5576127c56142fc565b815260200190815260200160002060008460400151605c8111156127eb576127eb6142fc565b605c8111156127fc576127fc6142fc565b815260208101919091526040016000205460ff1661283957631dcd65008160038151811061282c5761282c614aba565b6020026020010181815250505b60168360600151605c811115612851576128516142fc565b14156128605750600292915050565b600c8360600151605c811115612878576128786142fc565b1480612899575060048360600151605c811115612897576128976142fc565b145b806128d05750601e8360400151605c8111156128b7576128b76142fc565b141580156128d057506128c9836132f3565b60ff166002145b156128de5750600092915050565b601e8360400151605c8111156128f6576128f66142fc565b148061290d5750612906836132f3565b60ff166001145b801561292f57506010836101000151605c81111561292d5761292d6142fc565b145b80156129625750612941836001613371565b806129625750612952836000613371565b801561296257506129628361353b565b156129f95760058160028151811061297c5761297c614aba565b602002602001018181516129909190614b17565b9052506005816003815181106129a8576129a8614aba565b602002602001018181516129bc9190614b17565b9052506129c88361353b565b6129f9576005816000815181106129e1576129e1614aba565b602002602001018181516129f59190614b17565b9052505b6037836020015161ffff16108015612a175750612a17836000613371565b8015612a395750601e8360400151605c811115612a3657612a366142fc565b14155b8015612a79575060578360800151605c811115612a5857612a586142fc565b1480612a79575060068360800151605c811115612a7757612a776142fc565b145b8015612a915750612a89836132f3565b60ff16600114155b15612a9f5750600092915050565b604b836020015161ffff16108015612acd5750601e8360400151605c811115612aca57612aca6142fc565b14155b8015612b0d575060578360800151605c811115612aec57612aec6142fc565b1480612b0d575060068360800151605c811115612b0b57612b0b6142fc565b145b8015612b305750612b1f836002613371565b80612b305750612b30836001613371565b15612b76576000818181518110612b4957612b49614aba565b6020908102919091010152600081600381518110612b6957612b69614aba565b6020026020010181815250505b612b7f83612f5c565b158015612bb45750612b92836002613371565b80612ba35750612ba3836000613371565b80612bb45750612bb4836001613371565b15612bdb57600081600381518110612bce57612bce614aba565b6020026020010181815250505b601e8360400151605c811115612bf357612bf36142fc565b14158015612c16575060148360600151605c811115612c1457612c146142fc565b145b8015612c56575060578360800151605c811115612c3557612c356142fc565b1480612c56575060068360800151605c811115612c5457612c546142fc565b145b15612c7d57600081600381518110612c7057612c70614aba565b6020026020010181815250505b60588360800151605c811115612c9557612c956142fc565b148015612cca5750612ca8836002613371565b80612cb95750612cb9836000613371565b80612cca5750612cca836001613371565b15612cf157600081600381518110612ce457612ce4614aba565b6020026020010181815250505b60005b6004811015612d4a57612d138482600381111561057c5761057c6142fc565b612d38576000828281518110612d2b57612d2b614aba565b6020026020010181815250505b80612d4281614ae6565b915050612cf4565b506000612d788483604051806040016040528060088152602001676861745f7479706560c01b8152506119ac565b90508060ff1660038111156110da576110da6142fc565b612d9761356e565b60005b82518110156112eb576000838281518110612db757612db7614aba565b602002602001015190506000838381518110612dd557612dd5614aba565b6020026020010151905080600683604051612df09190614c16565b908152604051908190036020019020805460ff1916600183605c811115612e1957612e196142fc565b0217905550816007600083605c811115612e3557612e356142fc565b605c811115612e4657612e466142fc565b81526020019081526020016000209080519060200190612e67929190613f0d565b5050508080612e7590614ae6565b915050612d9a565b612e8561356e565b60005b82518110156112eb576000838281518110612ea557612ea5614aba565b602002602001015190506000838381518110612ec357612ec3614aba565b60200260200101519050600180600084605c811115612ee457612ee46142fc565b605c811115612ef557612ef56142fc565b8152602001908152602001600020600083605c811115612f1757612f176142fc565b605c811115612f2857612f286142fc565b81526020810191909152604001600020805460ff191691151591909117905550819050612f5481614ae6565b915050612e88565b6000600360008360600151605c811115612f7857612f786142fc565b605c811115612f8957612f896142fc565b815260200190815260200160002060008360400151605c811115612faf57612faf6142fc565b605c811115612fc057612fc06142fc565b815260208101919091526040016000205460ff161592915050565b612fe361356e565b60005b835181101561310e57600084828151811061300357613003614aba565b60200260200101519050600084838151811061302157613021614aba565b60200260200101519050600084848151811061303f5761303f614aba565b6020026020010151905060016008600085605c811115613061576130616142fc565b605c811115613072576130726142fc565b8152602001908152602001600020600084605c811115613094576130946142fc565b605c8111156130a5576130a56142fc565b815260200190815260200160002060008360038111156130c7576130c76142fc565b60038111156130d8576130d86142fc565b81526020810191909152604001600020805460ff191691151591909117905550829150613106905081614ae6565b915050612fe6565b50505050565b61311c61356e565b60005b835181101561310e57600084828151811061313c5761313c614aba565b60200260200101519050600084838151811061315a5761315a614aba565b6020026020010151905083838151811061317657613176614aba565b60200260200101516004600084605c811115613194576131946142fc565b605c8111156131a5576131a56142fc565b8152602001908152602001600020600083605c8111156131c7576131c76142fc565b605c8111156131d8576131d86142fc565b815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050808061320b90614ae6565b91505061311f565b61321b61356e565b60005b82518110156112eb57600083828151811061323b5761323b614aba565b60200260200101519050600083838151811061325957613259614aba565b6020026020010151905060016002600084605c81111561327b5761327b6142fc565b605c81111561328c5761328c6142fc565b8152602001908152602001600020600083605c8111156132ae576132ae6142fc565b605c8111156132bf576132bf6142fc565b81526020810191909152604001600020805460ff1916911515919091179055508190506132eb81614ae6565b91505061321e565b6000600460008360600151605c81111561330f5761330f6142fc565b605c811115613320576133206142fc565b815260200190815260200160002060008360400151605c811115613346576133466142fc565b605c811115613357576133576142fc565b815260208101919091526040016000205460ff1692915050565b6000600860008460600151605c81111561338d5761338d6142fc565b605c81111561339e5761339e6142fc565b815260200190815260200160002060008460400151605c8111156133c4576133c46142fc565b605c8111156133d5576133d56142fc565b815260200190815260200160002060008360038111156133f7576133f76142fc565b6003811115613408576134086142fc565b815260208101919091526040016000205460ff169392505050565b61342b61356e565b6001600160a01b0381166134955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61349e816139a8565b50565b600760205260009081526040902080546134ba90614dae565b80601f01602080910402602001604051908101604052809291908181526020018280546134e690614dae565b80156135335780601f1061350857610100808354040283529160200191613533565b820191906000526020600020905b81548152906001019060200180831161351657829003601f168201915b505050505081565b6000613548826000613371565b61355457506000919050565b600160008360600151605c81111561330f5761330f6142fc565b6000546001600160a01b031633146119aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161348c565b6060816135ec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613616578061360081614ae6565b915061360f9050600a83614b17565b91506135f0565b6000816001600160401b0381111561363057613630613fa6565b6040519080825280601f01601f19166020018201604052801561365a576020820181803683370190505b5090505b84156110da5761366f600183614bff565b915061367c600a86614b7e565b613687906030614c32565b60f81b81838151811061369c5761369c614aba565b60200101906001600160f81b031916908160001a9053506136be600a86614b17565b945061365e565b606082600060015b600183516136db9190614bff565b8210156137225760006136ef878785613e71565b90508060001914156137015750613722565b8161370b81614ae6565b925061371a9050816001614c32565b9250506136cd565b806001600160401b0381111561373a5761373a613fa6565b60405190808252806020026020018201604052801561376d57816020015b60608152602001906001900390816137585790505b50935060009150600090505b600183516137879190614bff565b8210156138af57600061379b878785613e71565b90508060001914156137ab575082515b60006137b78483614bff565b6001600160401b038111156137ce576137ce613fa6565b6040519080825280601f01601f1916602001820160405280156137f8576020820181803683370190505b509050806000855b8481101561386f5787818151811061381a5761381a614aba565b01602001516001600160f81b031916838361383481614ae6565b94508151811061384657613846614aba565b60200101906001600160f81b031916908160001a9053508061386781614ae6565b915050613800565b5061387b846001614c32565b955081888661388981614ae6565b97508151811061389b5761389b614aba565b602002602001018190525050505050613779565b50505092915050565b825160609084906138c98585614de9565b11156138d7576138d7614e2a565b6000846001600160401b038111156138f1576138f1613fa6565b6040519080825280601f01601f19166020018201604052801561391b576020820181803683370190505b509050806000855b61392d8888614de9565b81101561399b5784818151811061394657613946614aba565b01602001516001600160f81b031916838361396081614ae6565b94508151811061397257613972614aba565b60200101906001600160f81b031916908160001a9053508061399381614ae6565b915050613923565b5090979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600082605c811115613a0e57613a0e6142fc565b1415613a1957600080fd5b60006007600084605c811115613a3157613a316142fc565b605c811115613a4257613a426142fc565b81526020019081526020016000208054613a5b90614dae565b80601f0160208091040260200160405190810160405280929190818152602001828054613a8790614dae565b8015613ad45780601f10613aa957610100808354040283529160200191613ad4565b820191906000526020600020905b815481529060010190602001808311613ab757829003601f168201915b50505050509050606060006005600086605c811115613af557613af56142fc565b605c811115613b0657613b066142fc565b8152602081019190915260400160009081205460ff16915081600c811115613b3057613b306142fc565b1415613b5957604051806040016040528060038152602001620a6caf60eb1b8152509150613e45565b600181600c811115613b6d57613b6d6142fc565b1415613b9757604051806040016040528060048152602001632430b4b960e11b8152509150613e45565b600281600c811115613bab57613bab6142fc565b1415613bd557604051806040016040528060048152602001634579657360e01b8152509150613e45565b600381600c811115613be957613be96142fc565b1415613c1457604051806040016040528060058152602001641099585c9960da1b8152509150613e45565b600481600c811115613c2857613c286142fc565b1415613c5257604051806040016040528060048152602001634561727360e01b8152509150613e45565b600581600c811115613c6657613c666142fc565b1415613c9057604051806040016040528060048152602001634c69707360e01b8152509150613e45565b600681600c811115613ca457613ca46142fc565b1415613ccf576040518060400160405280600581526020016409adeeae8d60db1b8152509150613e45565b600781600c811115613ce357613ce36142fc565b1415613d0d57604051806040016040528060048152602001634661636560e01b8152509150613e45565b600881600c811115613d2157613d216142fc565b1415613d4e576040518060400160405280600781526020016622b6b7ba34b7b760c91b8152509150613e45565b600981600c811115613d6257613d626142fc565b1415613d8c57604051806040016040528060048152602001634e65636b60e01b8152509150613e45565b600a81600c811115613da057613da06142fc565b1415613dca57604051806040016040528060048152602001634e6f736560e01b8152509150613e45565b600b81600c811115613dde57613dde6142fc565b1415613e0a5760405180604001604052806006815260200165436865656b7360d01b8152509150613e45565b600c81600c811115613e1e57613e1e6142fc565b1415613e4557604051806040016040528060058152602001640a8cacae8d60db1b81525091505b8183604051602001613e58929190614e40565b6040516020818303038152906040529350505050919050565b815160009084908490600114613e8957613e89614e2a565b835b8251811015613eff5781600081518110613ea757613ea7614aba565b602001015160f81c60f81b6001600160f81b031916838281518110613ece57613ece614aba565b01602001516001600160f81b0319161415613eed579250610f5e915050565b80613ef781614ae6565b915050613e8b565b506000199695505050505050565b828054613f1990614dae565b90600052602060002090601f016020900481019282613f3b5760008555613f81565b82601f10613f5457805160ff1916838001178555613f81565b82800160010185558215613f81579182015b82811115613f81578251825591602001919060010190613f66565b50613f8d929150613f91565b5090565b5b80821115613f8d5760008155600101613f92565b634e487b7160e01b600052604160045260246000fd5b6040516101e081016001600160401b0381118282101715613fdf57613fdf613fa6565b60405290565b604051601f8201601f191681016001600160401b038111828210171561400d5761400d613fa6565b604052919050565b60006001600160401b0382111561402e5761402e613fa6565b5060051b60200190565b600082601f83011261404957600080fd5b8135602061405e61405983614015565b613fe5565b82815260059290921b8401810191818101908684111561407d57600080fd5b8286015b848110156140a857803560ff8116811461409b5760008081fd5b8352918301918301614081565b509695505050505050565b600060208083850312156140c657600080fd5b82356001600160401b03808211156140dd57600080fd5b818501915085601f8301126140f157600080fd5b81356140ff61405982614015565b81815260059190911b8301840190848101908883111561411e57600080fd5b8585015b838110156141565780358581111561413a5760008081fd5b6141488b89838a0101614038565b845250918601918601614122565b5098975050505050505050565b8035605d811061417257600080fd5b919050565b6000806040838503121561418a57600080fd5b61419383614163565b91506141a160208401614163565b90509250929050565b803561ffff8116811461417257600080fd5b60006101e082840312156141cf57600080fd5b6141d7613fbc565b90506141e2826141aa565b81526141f0602083016141aa565b602082015261420160408301614163565b604082015261421260608301614163565b606082015261422360808301614163565b608082015261423460a08301614163565b60a082015261424560c08301614163565b60c082015261425660e08301614163565b60e0820152610100614269818401614163565b9082015261012061427b838201614163565b9082015261014061428d838201614163565b9082015261016061429f838201614163565b908201526101806142b1838201614163565b908201526101a06142c3838201614163565b908201526101c06142d5838201614163565b9082015292915050565b60006101e082840312156142f257600080fd5b610f5e83836141bc565b634e487b7160e01b600052602160045260246000fd5b6020810160068310614326576143266142fc565b91905290565b60006001600160401b0382111561434557614345613fa6565b50601f01601f191660200190565b600082601f83011261436457600080fd5b81356143726140598261432c565b81815284602083860101111561438757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600061022084860312156143ba57600080fd5b6143c485856141bc565b92506101e084013591506102008401356001600160401b038111156143e857600080fd5b6143f486828701614353565b9150509250925092565b6002811061349e5761349e6142fc565b60208101614326836143fe565b600082601f83011261442c57600080fd5b8135602061443c61405983614015565b82815260059290921b8401810191818101908684111561445b57600080fd5b8286015b848110156140a85761447081614163565b835291830191830161445f565b6000806040838503121561449057600080fd5b82356001600160401b03808211156144a757600080fd5b6144b38683870161441b565b935060208501359150808211156144c957600080fd5b506144d68582860161441b565b9150509250929050565b600080604083850312156144f357600080fd5b6144fc836141aa565b91506141a1602084016141aa565b605d811061451a5761451a6142fc565b9052565b815161ffff1681526101e081016020830151614540602084018261ffff169052565b506040830151614553604084018261450a565b506060830151614566606084018261450a565b506080830151614579608084018261450a565b5060a083015161458c60a084018261450a565b5060c083015161459f60c084018261450a565b5060e08301516145b260e084018261450a565b50610100808401516145c68285018261450a565b5050610120808401516145db8285018261450a565b5050610140808401516145f08285018261450a565b5050610160808401516146058285018261450a565b50506101808084015161461a8285018261450a565b50506101a08084015161462f8285018261450a565b50506101c0808401516146448285018261450a565b505092915050565b60006020828403121561465e57600080fd5b610f5e82614163565b60208101600d8310614326576143266142fc565b6000806000610220848603121561469157600080fd5b61469b85856141bc565b92506101e08401356001600160401b03808211156146b857600080fd5b818601915086601f8301126146cc57600080fd5b813560206146dc61405983614015565b82815260059290921b8401810191818101908a8411156146fb57600080fd5b948201945b8386101561471957853582529482019490820190614700565b965050505061020086013591508082111561473357600080fd5b506143f486828701614353565b60005b8381101561475b578181015183820152602001614743565b8381111561310e5750506000910152565b602081526000825180602084015261478b816040850160208701614740565b601f01601f19169190910160400192915050565b6020810160048310614326576143266142fc565b600080604083850312156147c657600080fd5b82356001600160401b03808211156147dd57600080fd5b818501915085601f8301126147f157600080fd5b8135602061480161405983614015565b82815260059290921b8401810191818101908984111561482057600080fd5b8286015b848110156148585780358681111561483c5760008081fd5b61484a8c86838b0101614353565b845250918301918301614824565b50965050860135925050808211156144c957600080fd5b80356004811061417257600080fd5b60008060006060848603121561489357600080fd5b83356001600160401b03808211156148aa57600080fd5b6148b68783880161441b565b94506020915081860135818111156148cd57600080fd5b6148d98882890161441b565b9450506040860135818111156148ee57600080fd5b86019050601f8101871361490157600080fd5b803561490f61405982614015565b81815260059190911b8201830190838101908983111561492e57600080fd5b928401925b82841015614953576149448461486f565b82529284019290840190614933565b80955050505050509250925092565b60008060006060848603121561497757600080fd5b83356001600160401b038082111561498e57600080fd5b61499a8783880161441b565b945060208601359150808211156149b057600080fd5b6149bc8783880161441b565b935060408601359150808211156149d257600080fd5b506143f486828701614038565b6000602082840312156149f157600080fd5b81356001600160401b03811115614a0757600080fd5b6110da84828501614353565b6020810161186b828461450a565b600080600060608486031215614a3657600080fd5b614a3f84614163565b9250614a4d60208501614163565b9150614a5b6040850161486f565b90509250925092565b6000806102008385031215614a7857600080fd5b614a8284846141bc565b91506141a16101e0840161486f565b600060208284031215614aa357600080fd5b81356001600160a01b0381168114610f5e57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614afa57614afa614ad0565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082614b2657614b26614b01565b500490565b60008451614b3d818460208901614740565b601d60f91b9083019081528451614b5b816001840160208901614740565b8451910190614b71816001840160208801614740565b0160010195945050505050565b600082614b8d57614b8d614b01565b500690565b600060208284031215614ba457600080fd5b81516001600160401b03811115614bba57600080fd5b8201601f81018413614bcb57600080fd5b8051614bd96140598261432c565b818152856020838501011115614bee57600080fd5b610ef2826020830160208601614740565b600082821015614c1157614c11614ad0565b500390565b60008251614c28818460208701614740565b9190910192915050565b60008219821115614c4557614c45614ad0565b500190565b600060ff821660ff811415614c6157614c61614ad0565b60010192915050565b60008351614c7c818460208801614740565b835190830190614c90818360208801614740565b600b60fa1b9101908152600101949350505050565b60008351614cb7818460208801614740565b600160fd1b9083019081528351614cd5816001840160208801614740565b01600101949350505050565b6902130b1b5bbb0b93239960b51b815260008251614d0681600a850160208701614740565b91909101600a0192915050565b7f7b2274726169745f74797065223a2246617368696f6e20486174222c20227661815265363ab2911d1160d11b602082015260008251614d5a816026850160208701614740565b61227d60f01b6026939091019283015250602801919050565b60008351614d85818460208801614740565b835190830190614d99818360208801614740565b605d60f81b9101908152600101949350505050565b600181811c90821680614dc257607f821691505b60208210811415614de357634e487b7160e01b600052602260045260246000fd5b50919050565b600080821280156001600160ff1b0384900385131615614e0b57614e0b614ad0565b600160ff1b8390038412811615614e2457614e24614ad0565b50500190565b634e487b7160e01b600052600160045260246000fd5b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090614e6b81600f850160208801614740565b6b111610113b30b63ab2911d1160a11b600f918401918201528351614e9781601b840160208801614740565b61227d60f01b601b9290910191820152601d0194935050505056fea26469706673582212208e1dea22200df2baa6baa0b73fbdfd6613a1f7bf134669b232c8b9135ade3fdb64736f6c634300080c00330000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80638da5cb5b1161011a578063d16c48d8116100ad578063f1c4439f1161007c578063f1c4439f14610540578063f29542671461056e578063f2fde38b14610581578063fc9faca514610594578063ff213f89146105a757600080fd5b8063d16c48d8146104ab578063dc6e449e146104e6578063e1a944a6146104f9578063ecd560161461052d57600080fd5b8063c1597dab116100e9578063c1597dab1461045f578063c63da44d14610472578063c7fa47ce14610485578063cf7ac36e1461049857600080fd5b80638da5cb5b146103e3578063a1f70561146103fe578063b963da011461042c578063c14adbce1461044c57600080fd5b8063683375c4116101925780638664d6fd116101615780638664d6fd1461038a5780638b7b2afa1461039d5780638bc61064146103b05780638bcbf89a146103c357600080fd5b8063683375c4146102ff5780636f065ea51461032f578063715018a61461035d57806372ff70491461036557600080fd5b80635586b160116101ce5780635586b1601461029957806355ac3d88146102b957806357bc535b146102cc5780636424a214146102ec57600080fd5b806314c5f1e214610200578063234cbd65146102155780633f4af2d11461025857806340a0020514610278575b600080fd5b61021361020e3660046140b3565b6105ba565b005b610243610223366004614177565b600360209081526000928352604080842090915290825290205460ff1681565b60405190151581526020015b60405180910390f35b61026b6102663660046142df565b6106d6565b60405161024f9190614312565b61028b6102863660046143a4565b610efb565b60405190815260200161024f565b6102ac6102a73660046142df565b610f65565b60405161024f919061440e565b6102136102c736600461447d565b61120b565b6102df6102da3660046144e0565b6112f0565b60405161024f919061451e565b6102436102fa3660046142df565b611871565b61032261030d36600461464c565b60056020526000908152604090205460ff1681565b60405161024f9190614667565b61024361033d366004614177565b600260209081526000928352604080842090915290825290205460ff1681565b610213611998565b61037861037336600461467b565b6119ac565b60405160ff909116815260200161024f565b6103786103983660046142df565b611a8a565b6102ac6103ab3660046142df565b611cce565b6102436103be3660046142df565b611f64565b6103d66103d13660046144e0565b6120d1565b60405161024f919061476c565b6000546040516001600160a01b03909116815260200161024f565b61037861040c366004614177565b600460209081526000928352604080842090915290825290205460ff1681565b61043f61043a3660046142df565b612733565b60405161024f919061479f565b61021361045a3660046147b3565b612d8f565b61021361046d36600461447d565b612e7d565b6102436104803660046142df565b612f5c565b61021361049336600461487e565b612fdb565b6102136104a6366004614962565b613114565b6104d96104b93660046149df565b805160208183018101805160068252928201919093012091525460ff1681565b60405161024f9190614a13565b6102136104f436600461447d565b613213565b610243610507366004614a21565b600860209081526000938452604080852082529284528284209052825290205460ff1681565b61037861053b3660046142df565b6132f3565b61024361054e366004614177565b600160209081526000928352604080842090915290825290205460ff1681565b61024361057c366004614a64565b613371565b61021361058f366004614a91565b613423565b6103d66105a236600461464c565b6134a1565b6102436105b53660046142df565b61353b565b6105c261356e565b60005b81518110156106d25760008282815181106105e2576105e2614aba565b60200260200101516000815181106105fc576105fc614aba565b602002602001015160ff16605c811115610618576106186142fc565b9050600083838151811061062e5761062e614aba565b602002602001015160018151811061064857610648614aba565b602002602001015160ff16600c811115610664576106646142fc565b9050806005600084605c81111561067d5761067d6142fc565b605c81111561068e5761068e6142fc565b81526020810191909152604001600020805460ff1916600183600c8111156106b8576106b86142fc565b0217905550505080806106ca90614ae6565b9150506105c5565b5050565b6000806106e283612733565b60408051600680825260e08201909252919250600091906020820160c080368337019050509050600082600381111561071d5761071d6142fc565b14156107fa5763861c46808160008151811061073b5761073b614aba565b6020908102919091010152639502f9008160018151811061075e5761075e614aba565b602090810291909101015263773594008160028151811061078157610781614aba565b6020908102919091010152639502f900816003815181106107a4576107a4614aba565b602090810291909101015263773594008160045b815181106107c8576107c8614aba565b602090810291909101015260008160055b815181106107e9576107e9614aba565b602002602001018181525050610a63565b600182600381111561080e5761080e6142fc565b14156108ca5764012a05f2008160008151811061082d5761082d614aba565b602090810291909101015260008160018151811061084d5761084d614aba565b602090810291909101015260008160028151811061086d5761086d614aba565b602090810291909101015260008160038151811061088d5761088d614aba565b602090810291909101015264012a05f200816004815181106108b1576108b1614aba565b602090810291909101015264012a05f2008160056107d9565b60028260038111156108de576108de6142fc565b141561097857640165a0bc00816000815181106108fd576108fd614aba565b602090810291909101015263773594008160018151811061092057610920614aba565b602090810291909101015260008160028151811061094057610940614aba565b602090810291909101015260008160038151811061096057610960614aba565b602090810291909101015263ee6b28008160046107b8565b600382600381111561098c5761098c6142fc565b1415610a635763861c4680816000815181106109aa576109aa614aba565b6020908102919091010152639502f900816001815181106109cd576109cd614aba565b60209081029190910101526377359400816002815181106109f0576109f0614aba565b6020908102919091010152639502f90081600381518110610a1357610a13614aba565b6020908102919091010152637735940081600481518110610a3657610a36614aba565b6020908102919091010152600081600581518110610a5657610a56614aba565b6020026020010181815250505b60298460600151605c811115610a7b57610a7b6142fc565b1415610b2b576000818181518110610a9557610a95614aba565b6020908102919091010152600081600181518110610ab557610ab5614aba565b6020908102919091010152633b9aca0081600281518110610ad857610ad8614aba565b602090810291909101015263b2d05e0081600381518110610afb57610afb614aba565b602090810291909101015263b2d05e0081600481518110610b1e57610b1e614aba565b6020026020010181815250505b60528460800151605c811115610b4357610b436142fc565b1480610b645750605b8460600151605c811115610b6257610b626142fc565b145b15610b8b57600081600381518110610b7e57610b7e614aba565b6020026020010181815250505b60188460600151605c811115610ba357610ba36142fc565b148015610bc157506001826003811115610bbf57610bbf6142fc565b145b15610bf357600a81600081518110610bdb57610bdb614aba565b60200260200101818151610bef9190614b17565b9052505b6003826003811115610c0757610c076142fc565b1415610cec57605a8460600151605c811115610c2557610c256142fc565b1480610c46575060268460600151605c811115610c4457610c446142fc565b145b80610c86575060288460600151605c811115610c6457610c646142fc565b148015610c865750601e8460400151605c811115610c8457610c846142fc565b145b15610cac576000818181518110610c9f57610c9f614aba565b6020026020010181815250505b60598460600151605c811115610cc457610cc46142fc565b1415610cec57600081600481518110610cdf57610cdf614aba565b6020026020010181815250505b6002826003811115610d0057610d006142fc565b1480610d1d57506001826003811115610d1b57610d1b6142fc565b145b15610db157610d2b84611871565b80610d4b575060228460600151605c811115610d4957610d496142fc565b145b80610d6b5750605a8460600151605c811115610d6957610d696142fc565b145b80610d8b575060268460600151605c811115610d8957610d896142fc565b145b15610db1576000818181518110610da457610da4614aba565b6020026020010181815250505b601e8460400151605c811115610dc957610dc96142fc565b14158015610e0b575060578460800151605c811115610dea57610dea6142fc565b1480610e0b575060068460800151605c811115610e0957610e096142fc565b145b15610e31576000818181518110610e2457610e24614aba565b6020026020010181815250505b60178460600151605c811115610e4957610e496142fc565b148015610e865750601e8460400151605c811115610e6957610e696142fc565b1480610e8657506003826003811115610e8457610e846142fc565b145b15610ead57600081600281518110610ea057610ea0614aba565b6020026020010181815250505b6000610edb8583604051806040016040528060098152602001683430ba2fb1b7b637b960b91b8152506119ac565b90508060ff166005811115610ef257610ef26142fc565b95945050505050565b60208301518351600091908290610f159061ffff166135c8565b610f228361ffff166135c8565b85604051602001610f3593929190614b2b565b60408051601f1981840301815291905280516020909101209050610f598582614b7e565b925050505b9392505050565b600080610f7183612733565b90506000816003811115610f8757610f876142fc565b14610f955750600092915050565b60408051600280825260608201835260009260208301908036833701905050905064012a05f20081600081518110610fcf57610fcf614aba565b602090810291909101015264012a05f20081600181518110610ff357610ff3614aba565b602090810291909101015260268460600151605c811115611016576110166142fc565b1415611026575060019392505050565b61102f8461353b565b61103d575060009392505050565b601e8460400151605c811115611055576110556142fc565b14158015611097575060578460800151605c811115611076576110766142fc565b1480611097575060068460800151605c811115611095576110956142fc565b145b80156110ae57506110a784611a8a565b60ff166001145b156110e25760068460800151605c8111156110cb576110cb6142fc565b146110d75760016110da565b60005b949350505050565b601e8460400151605c8111156110fa576110fa6142fc565b1480611111575061110a846132f3565b60ff166001145b801561113357506010846101000151605c811115611131576111316142fc565b145b1561116557600a8160008151811061114d5761114d614aba565b602002602001018181516111619190614b17565b9052505b60298460600151605c81111561117d5761117d6142fc565b148061119e575060048460600151605c81111561119c5761119c6142fc565b145b806111b457506111ad846132f3565b60ff166002145b156111c3575060009392505050565b60006111f485836040518060400160405280600c81526020016b3430ba2fb837b9b4ba34b7b760a11b8152506119ac565b90508060ff166001811115610ef257610ef26142fc565b61121361356e565b60005b82518110156112eb57600083828151811061123357611233614aba565b60200260200101519050600083838151811061125157611251614aba565b6020026020010151905060016003600084605c811115611273576112736142fc565b605c811115611284576112846142fc565b8152602001908152602001600020600083605c8111156112a6576112a66142fc565b605c8111156112b7576112b76142fc565b81526020810191909152604001600020805460ff1916911515919091179055508190506112e381614ae6565b915050611216565b505050565b611368604080516101e0810182526000808252602082018190529091820190815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905290565b604080516101e08101825261ffff808616825284166020820152600091810182815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000905280516040516376dfe29760e01b815261ffff90911660048201529091506000907f0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc6001600160a01b0316906376dfe29790602401600060405180830381865afa15801561144f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526114779190810190614b92565b905060006114a7604051806040016040528060018152602001600b60fa1b815250836136c590919063ffffffff16565b905060005b81518110156118645760008282815181106114c9576114c9614aba565b6020026020010151905060606001831015611522576040805180820190915260018152600160fd1b60208201526115019083906136c5565b60008151811061151357611513614aba565b6020026020010151905061153f565b61153c600183516115339190614bff565b839060016138b8565b90505b60006006826040516115519190614c16565b9081526040519081900360200190205460ff169050600060058183605c81111561157d5761157d6142fc565b605c81111561158e5761158e6142fc565b8152602081019190915260400160009081205460ff16915081600c8111156115b8576115b86142fc565b14156115ef576040880182605c8111156115d4576115d46142fc565b9081605c8111156115e7576115e76142fc565b90525061184d565b600181600c811115611603576116036142fc565b141561161f576060880182605c8111156115d4576115d46142fc565b600281600c811115611633576116336142fc565b141561164f576080880182605c8111156115d4576115d46142fc565b600381600c811115611663576116636142fc565b141561167f5760a0880182605c8111156115d4576115d46142fc565b600481600c811115611693576116936142fc565b14156116af5760c0880182605c8111156115d4576115d46142fc565b600581600c8111156116c3576116c36142fc565b14156116df5760e0880182605c8111156115d4576115d46142fc565b600681600c8111156116f3576116f36142fc565b141561171057610100880182605c8111156115d4576115d46142fc565b600781600c811115611724576117246142fc565b141561174157610120880182605c8111156115d4576115d46142fc565b600881600c811115611755576117556142fc565b141561177257610140880182605c8111156115d4576115d46142fc565b600981600c811115611786576117866142fc565b14156117a357610160880182605c8111156115d4576115d46142fc565b600a81600c8111156117b7576117b76142fc565b14156117d457610180880182605c8111156115d4576115d46142fc565b600b81600c8111156117e8576117e86142fc565b1415611805576101a0880182605c8111156115d4576115d46142fc565b600c81600c811115611819576118196142fc565b141561184d576101c0880182605c811115611836576118366142fc565b9081605c811115611849576118496142fc565b9052505b50505050808061185c90614ae6565b9150506114ac565b5091925050505b92915050565b6000601e8260400151605c81111561188b5761188b6142fc565b1480156118ad575060458260800151605c8111156118ab576118ab6142fc565b145b156118ba57506001919050565b60378260800151605c8111156118d2576118d26142fc565b14806118f35750602a8260800151605c8111156118f1576118f16142fc565b145b806119135750601c8260800151605c811115611911576119116142fc565b145b806119335750601b8260800151605c811115611931576119316142fc565b145b80611953575060118260800151605c811115611951576119516142fc565b145b80611973575060068260800151605c811115611971576119716142fc565b145b8061186b575060578260800151605c811115611991576119916142fc565b1492915050565b6119a061356e565b6119aa60006139a8565b565b81516000908190815b818110156119f6578581815181106119cf576119cf614aba565b6020026020010151836119e29190614c32565b9250806119ee81614ae6565b9150506119b5565b506000611a04878487610efb565b905060005b828160ff161015611a7f57868160ff1681518110611a2957611a29614aba565b6020026020010151821015611a43579350610f5e92505050565b868160ff1681518110611a5857611a58614aba565b602002602001015182611a6b9190614bff565b915080611a7781614c4a565b915050611a09565b505050509392505050565b600080611a9683612733565b90506003816003811115611aac57611aac6142fc565b1480611ac957506001816003811115611ac757611ac76142fc565b145b80611ae557506002816003811115611ae357611ae36142fc565b145b15611af35750600192915050565b60038360600151605c811115611b0b57611b0b6142fc565b1415611b8857601e8360400151605c811115611b2957611b296142fc565b1415611b385750600192915050565b60068360800151605c811115611b5057611b506142fc565b1480611b71575060578360800151605c811115611b6f57611b6f6142fc565b145b15611b7f5750600292915050565b50600192915050565b6000611b93846132f3565b9050601e8460400151605c811115611bad57611bad6142fc565b14611c0d5760148460600151605c811115611bca57611bca6142fc565b1480611bec575060295b8460600151605c811115611bea57611bea6142fc565b145b15611bfb575060019392505050565b60008160ff1611610f5e5760026110da565b6000826003811115611c2157611c216142fc565b148015611c62575060188460600151605c811115611c4157611c416142fc565b1480611c625750603a8460600151605c811115611c6057611c606142fc565b145b80611bec5750603e8460600151605c811115611c8057611c806142fc565b1480611ca15750604d8460600151605c811115611c9f57611c9f6142fc565b145b80611cc15750604e8460600151605c811115611cbf57611cbf6142fc565b145b80611bec5750604f611bd4565b600080611cda83612733565b9050601e8360400151605c811115611cf457611cf46142fc565b14611d025750600092915050565b6000816003811115611d1657611d166142fc565b148015611d38575060178360600151605c811115611d3657611d366142fc565b145b15611d465750600092915050565b6001816003811115611d5a57611d5a6142fc565b148015611d7c5750605a8360600151605c811115611d7a57611d7a6142fc565b145b15611d8a5750600092915050565b6001816003811115611d9e57611d9e6142fc565b1480611dbb57506000816003811115611db957611db96142fc565b145b15611e075760088360600151605c811115611dd857611dd86142fc565b1480611df9575060098360600151605c811115611df757611df76142fc565b145b15611e075750600092915050565b6002816003811115611e1b57611e1b6142fc565b1480611e3857506001816003811115611e3657611e366142fc565b145b80611e5457506000816003811115611e5257611e526142fc565b145b15611e805760228360600151605c811115611e7157611e716142fc565b1415611e805750600092915050565b6002816003811115611e9457611e946142fc565b1480611eb157506001816003811115611eaf57611eaf6142fc565b145b15611efd5760268360600151605c811115611ece57611ece6142fc565b1480611eef575060598360600151605c811115611eed57611eed6142fc565b145b15611efd5750600092915050565b604e8360600151605c811115611f1557611f156142fc565b1480611f365750604d8360600151605c811115611f3457611f346142fc565b145b80611f565750604f8360600151605c811115611f5457611f546142fc565b145b15611b7f5750600092915050565b600080611f7083612733565b9050611f7b83612f5c565b15611f895750600192915050565b60048360600151605c811115611fa157611fa16142fc565b148015611fbf57506000816003811115611fbd57611fbd6142fc565b145b15611fcd5750600192915050565b600060458460800151605c811115611fe757611fe76142fc565b1480612008575060118460800151605c811115612006576120066142fc565b145b806120285750602a8460800151605c811115612026576120266142fc565b145b80612048575060528460800151605c811115612046576120466142fc565b145b806120685750601c8460800151605c811115612066576120666142fc565b145b806120885750601b8460800151605c811115612086576120866142fc565b145b905060538460600151605c8111156120a2576120a26142fc565b1480156120c257508015806120c257506120bb84611a8a565b60ff166002145b156110d7575060019392505050565b606060006120df84846112f0565b6040805180820190915260018152605b60f81b60208201529091506000908161210784612733565b90506000612114856106d6565b9050600061212186610f65565b90506000604051806101a001604052808860400151605c811115612147576121476142fc565b605c811115612158576121586142fc565b815260200161216689611f64565b6121705787612176565b88606001515b605c811115612187576121876142fc565b605c811115612198576121986142fc565b81526020018860800151605c8111156121b3576121b36142fc565b605c8111156121c4576121c46142fc565b81526020018860a00151605c8111156121df576121df6142fc565b605c8111156121f0576121f06142fc565b81526020018860c00151605c81111561220b5761220b6142fc565b605c81111561221c5761221c6142fc565b81526020018860e00151605c811115612237576122376142fc565b605c811115612248576122486142fc565b8152602001886101000151605c811115612264576122646142fc565b605c811115612275576122756142fc565b8152602001886101200151605c811115612291576122916142fc565b605c8111156122a2576122a26142fc565b8152602001886101400151605c8111156122be576122be6142fc565b605c8111156122cf576122cf6142fc565b8152602001886101600151605c8111156122eb576122eb6142fc565b605c8111156122fc576122fc6142fc565b8152602001886101800151605c811115612318576123186142fc565b605c811115612329576123296142fc565b8152602001886101a00151605c811115612345576123456142fc565b605c811115612356576123566142fc565b8152602001886101c00151605c811115612372576123726142fc565b605c811115612383576123836142fc565b905290506060600084600581111561239d5761239d6142fc565b14156123c55750604080518082019091526005815264426c61636b60d81b60208201526124e8565b60018460058111156123d9576123d96142fc565b141561240057506040805180820190915260048152634772657960e01b60208201526124e8565b6002846005811115612414576124146142fc565b141561243a575060408051808201909152600381526214995960ea1b60208201526124e8565b600384600581111561244e5761244e6142fc565b14156124765750604080518082019091526005815264576869746560d81b60208201526124e8565b600484600581111561248a5761248a6142fc565b14156124b057506040805180820190915260038152622a30b760e91b60208201526124e8565b60058460058111156124c4576124c46142fc565b14156124e85750604080518082019091526005815264213937bbb760d91b60208201525b606060008660038111156124fe576124fe6142fc565b141561252d575060408051808201909152600c81526b04261736562616c6c204361760a41b60208201526125e7565b6001866003811115612541576125416142fc565b141561256e575060408051808201909152600a815269109d58dad95d0812185d60b21b60208201526125e7565b6002866003811115612582576125826142fc565b14156125af575060408051808201909152600a81526910dbddd89bde4812185d60b21b60208201526125e7565b60038660038111156125c3576125c36142fc565b14156125e757506040805180820190915260058152642b34b9b7b960d91b60208201525b60005b600d8110156126755760008482600d811061260757612607614aba565b6020020151905089605c811115612620576126206142fc565b81605c811115612632576126326142fc565b146126645788612641826139f8565b604051602001612652929190614c6a565b60405160208183030381529060405298505b5061266e81614ae6565b90506125ea565b506000828260405160200161268b929190614ca5565b60408051601f19818403018152919052905060018560018111156126b1576126b16142fc565b14156126da57806040516020016126c89190614ce1565b60405160208183030381529060405290505b6000816040516020016126ed9190614d13565b60405160208183030381529060405290508881604051602001612711929190614d73565b6040516020818303038152906040529b50505050505050505050505092915050565b60408051600480825260a082019092526000918291906020820160808036833701905050905060005b600481101561279957639502f90082828151811061277c5761277c614aba565b60209081029190910101528061279181614ae6565b91505061275c565b50600260008460600151605c8111156127b4576127b46142fc565b605c8111156127c5576127c56142fc565b815260200190815260200160002060008460400151605c8111156127eb576127eb6142fc565b605c8111156127fc576127fc6142fc565b815260208101919091526040016000205460ff1661283957631dcd65008160038151811061282c5761282c614aba565b6020026020010181815250505b60168360600151605c811115612851576128516142fc565b14156128605750600292915050565b600c8360600151605c811115612878576128786142fc565b1480612899575060048360600151605c811115612897576128976142fc565b145b806128d05750601e8360400151605c8111156128b7576128b76142fc565b141580156128d057506128c9836132f3565b60ff166002145b156128de5750600092915050565b601e8360400151605c8111156128f6576128f66142fc565b148061290d5750612906836132f3565b60ff166001145b801561292f57506010836101000151605c81111561292d5761292d6142fc565b145b80156129625750612941836001613371565b806129625750612952836000613371565b801561296257506129628361353b565b156129f95760058160028151811061297c5761297c614aba565b602002602001018181516129909190614b17565b9052506005816003815181106129a8576129a8614aba565b602002602001018181516129bc9190614b17565b9052506129c88361353b565b6129f9576005816000815181106129e1576129e1614aba565b602002602001018181516129f59190614b17565b9052505b6037836020015161ffff16108015612a175750612a17836000613371565b8015612a395750601e8360400151605c811115612a3657612a366142fc565b14155b8015612a79575060578360800151605c811115612a5857612a586142fc565b1480612a79575060068360800151605c811115612a7757612a776142fc565b145b8015612a915750612a89836132f3565b60ff16600114155b15612a9f5750600092915050565b604b836020015161ffff16108015612acd5750601e8360400151605c811115612aca57612aca6142fc565b14155b8015612b0d575060578360800151605c811115612aec57612aec6142fc565b1480612b0d575060068360800151605c811115612b0b57612b0b6142fc565b145b8015612b305750612b1f836002613371565b80612b305750612b30836001613371565b15612b76576000818181518110612b4957612b49614aba565b6020908102919091010152600081600381518110612b6957612b69614aba565b6020026020010181815250505b612b7f83612f5c565b158015612bb45750612b92836002613371565b80612ba35750612ba3836000613371565b80612bb45750612bb4836001613371565b15612bdb57600081600381518110612bce57612bce614aba565b6020026020010181815250505b601e8360400151605c811115612bf357612bf36142fc565b14158015612c16575060148360600151605c811115612c1457612c146142fc565b145b8015612c56575060578360800151605c811115612c3557612c356142fc565b1480612c56575060068360800151605c811115612c5457612c546142fc565b145b15612c7d57600081600381518110612c7057612c70614aba565b6020026020010181815250505b60588360800151605c811115612c9557612c956142fc565b148015612cca5750612ca8836002613371565b80612cb95750612cb9836000613371565b80612cca5750612cca836001613371565b15612cf157600081600381518110612ce457612ce4614aba565b6020026020010181815250505b60005b6004811015612d4a57612d138482600381111561057c5761057c6142fc565b612d38576000828281518110612d2b57612d2b614aba565b6020026020010181815250505b80612d4281614ae6565b915050612cf4565b506000612d788483604051806040016040528060088152602001676861745f7479706560c01b8152506119ac565b90508060ff1660038111156110da576110da6142fc565b612d9761356e565b60005b82518110156112eb576000838281518110612db757612db7614aba565b602002602001015190506000838381518110612dd557612dd5614aba565b6020026020010151905080600683604051612df09190614c16565b908152604051908190036020019020805460ff1916600183605c811115612e1957612e196142fc565b0217905550816007600083605c811115612e3557612e356142fc565b605c811115612e4657612e466142fc565b81526020019081526020016000209080519060200190612e67929190613f0d565b5050508080612e7590614ae6565b915050612d9a565b612e8561356e565b60005b82518110156112eb576000838281518110612ea557612ea5614aba565b602002602001015190506000838381518110612ec357612ec3614aba565b60200260200101519050600180600084605c811115612ee457612ee46142fc565b605c811115612ef557612ef56142fc565b8152602001908152602001600020600083605c811115612f1757612f176142fc565b605c811115612f2857612f286142fc565b81526020810191909152604001600020805460ff191691151591909117905550819050612f5481614ae6565b915050612e88565b6000600360008360600151605c811115612f7857612f786142fc565b605c811115612f8957612f896142fc565b815260200190815260200160002060008360400151605c811115612faf57612faf6142fc565b605c811115612fc057612fc06142fc565b815260208101919091526040016000205460ff161592915050565b612fe361356e565b60005b835181101561310e57600084828151811061300357613003614aba565b60200260200101519050600084838151811061302157613021614aba565b60200260200101519050600084848151811061303f5761303f614aba565b6020026020010151905060016008600085605c811115613061576130616142fc565b605c811115613072576130726142fc565b8152602001908152602001600020600084605c811115613094576130946142fc565b605c8111156130a5576130a56142fc565b815260200190815260200160002060008360038111156130c7576130c76142fc565b60038111156130d8576130d86142fc565b81526020810191909152604001600020805460ff191691151591909117905550829150613106905081614ae6565b915050612fe6565b50505050565b61311c61356e565b60005b835181101561310e57600084828151811061313c5761313c614aba565b60200260200101519050600084838151811061315a5761315a614aba565b6020026020010151905083838151811061317657613176614aba565b60200260200101516004600084605c811115613194576131946142fc565b605c8111156131a5576131a56142fc565b8152602001908152602001600020600083605c8111156131c7576131c76142fc565b605c8111156131d8576131d86142fc565b815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050808061320b90614ae6565b91505061311f565b61321b61356e565b60005b82518110156112eb57600083828151811061323b5761323b614aba565b60200260200101519050600083838151811061325957613259614aba565b6020026020010151905060016002600084605c81111561327b5761327b6142fc565b605c81111561328c5761328c6142fc565b8152602001908152602001600020600083605c8111156132ae576132ae6142fc565b605c8111156132bf576132bf6142fc565b81526020810191909152604001600020805460ff1916911515919091179055508190506132eb81614ae6565b91505061321e565b6000600460008360600151605c81111561330f5761330f6142fc565b605c811115613320576133206142fc565b815260200190815260200160002060008360400151605c811115613346576133466142fc565b605c811115613357576133576142fc565b815260208101919091526040016000205460ff1692915050565b6000600860008460600151605c81111561338d5761338d6142fc565b605c81111561339e5761339e6142fc565b815260200190815260200160002060008460400151605c8111156133c4576133c46142fc565b605c8111156133d5576133d56142fc565b815260200190815260200160002060008360038111156133f7576133f76142fc565b6003811115613408576134086142fc565b815260208101919091526040016000205460ff169392505050565b61342b61356e565b6001600160a01b0381166134955760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b61349e816139a8565b50565b600760205260009081526040902080546134ba90614dae565b80601f01602080910402602001604051908101604052809291908181526020018280546134e690614dae565b80156135335780601f1061350857610100808354040283529160200191613533565b820191906000526020600020905b81548152906001019060200180831161351657829003601f168201915b505050505081565b6000613548826000613371565b61355457506000919050565b600160008360600151605c81111561330f5761330f6142fc565b6000546001600160a01b031633146119aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161348c565b6060816135ec5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115613616578061360081614ae6565b915061360f9050600a83614b17565b91506135f0565b6000816001600160401b0381111561363057613630613fa6565b6040519080825280601f01601f19166020018201604052801561365a576020820181803683370190505b5090505b84156110da5761366f600183614bff565b915061367c600a86614b7e565b613687906030614c32565b60f81b81838151811061369c5761369c614aba565b60200101906001600160f81b031916908160001a9053506136be600a86614b17565b945061365e565b606082600060015b600183516136db9190614bff565b8210156137225760006136ef878785613e71565b90508060001914156137015750613722565b8161370b81614ae6565b925061371a9050816001614c32565b9250506136cd565b806001600160401b0381111561373a5761373a613fa6565b60405190808252806020026020018201604052801561376d57816020015b60608152602001906001900390816137585790505b50935060009150600090505b600183516137879190614bff565b8210156138af57600061379b878785613e71565b90508060001914156137ab575082515b60006137b78483614bff565b6001600160401b038111156137ce576137ce613fa6565b6040519080825280601f01601f1916602001820160405280156137f8576020820181803683370190505b509050806000855b8481101561386f5787818151811061381a5761381a614aba565b01602001516001600160f81b031916838361383481614ae6565b94508151811061384657613846614aba565b60200101906001600160f81b031916908160001a9053508061386781614ae6565b915050613800565b5061387b846001614c32565b955081888661388981614ae6565b97508151811061389b5761389b614aba565b602002602001018190525050505050613779565b50505092915050565b825160609084906138c98585614de9565b11156138d7576138d7614e2a565b6000846001600160401b038111156138f1576138f1613fa6565b6040519080825280601f01601f19166020018201604052801561391b576020820181803683370190505b509050806000855b61392d8888614de9565b81101561399b5784818151811061394657613946614aba565b01602001516001600160f81b031916838361396081614ae6565b94508151811061397257613972614aba565b60200101906001600160f81b031916908160001a9053508061399381614ae6565b915050613923565b5090979650505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600082605c811115613a0e57613a0e6142fc565b1415613a1957600080fd5b60006007600084605c811115613a3157613a316142fc565b605c811115613a4257613a426142fc565b81526020019081526020016000208054613a5b90614dae565b80601f0160208091040260200160405190810160405280929190818152602001828054613a8790614dae565b8015613ad45780601f10613aa957610100808354040283529160200191613ad4565b820191906000526020600020905b815481529060010190602001808311613ab757829003601f168201915b50505050509050606060006005600086605c811115613af557613af56142fc565b605c811115613b0657613b066142fc565b8152602081019190915260400160009081205460ff16915081600c811115613b3057613b306142fc565b1415613b5957604051806040016040528060038152602001620a6caf60eb1b8152509150613e45565b600181600c811115613b6d57613b6d6142fc565b1415613b9757604051806040016040528060048152602001632430b4b960e11b8152509150613e45565b600281600c811115613bab57613bab6142fc565b1415613bd557604051806040016040528060048152602001634579657360e01b8152509150613e45565b600381600c811115613be957613be96142fc565b1415613c1457604051806040016040528060058152602001641099585c9960da1b8152509150613e45565b600481600c811115613c2857613c286142fc565b1415613c5257604051806040016040528060048152602001634561727360e01b8152509150613e45565b600581600c811115613c6657613c666142fc565b1415613c9057604051806040016040528060048152602001634c69707360e01b8152509150613e45565b600681600c811115613ca457613ca46142fc565b1415613ccf576040518060400160405280600581526020016409adeeae8d60db1b8152509150613e45565b600781600c811115613ce357613ce36142fc565b1415613d0d57604051806040016040528060048152602001634661636560e01b8152509150613e45565b600881600c811115613d2157613d216142fc565b1415613d4e576040518060400160405280600781526020016622b6b7ba34b7b760c91b8152509150613e45565b600981600c811115613d6257613d626142fc565b1415613d8c57604051806040016040528060048152602001634e65636b60e01b8152509150613e45565b600a81600c811115613da057613da06142fc565b1415613dca57604051806040016040528060048152602001634e6f736560e01b8152509150613e45565b600b81600c811115613dde57613dde6142fc565b1415613e0a5760405180604001604052806006815260200165436865656b7360d01b8152509150613e45565b600c81600c811115613e1e57613e1e6142fc565b1415613e4557604051806040016040528060058152602001640a8cacae8d60db1b81525091505b8183604051602001613e58929190614e40565b6040516020818303038152906040529350505050919050565b815160009084908490600114613e8957613e89614e2a565b835b8251811015613eff5781600081518110613ea757613ea7614aba565b602001015160f81c60f81b6001600160f81b031916838281518110613ece57613ece614aba565b01602001516001600160f81b0319161415613eed579250610f5e915050565b80613ef781614ae6565b915050613e8b565b506000199695505050505050565b828054613f1990614dae565b90600052602060002090601f016020900481019282613f3b5760008555613f81565b82601f10613f5457805160ff1916838001178555613f81565b82800160010185558215613f81579182015b82811115613f81578251825591602001919060010190613f66565b50613f8d929150613f91565b5090565b5b80821115613f8d5760008155600101613f92565b634e487b7160e01b600052604160045260246000fd5b6040516101e081016001600160401b0381118282101715613fdf57613fdf613fa6565b60405290565b604051601f8201601f191681016001600160401b038111828210171561400d5761400d613fa6565b604052919050565b60006001600160401b0382111561402e5761402e613fa6565b5060051b60200190565b600082601f83011261404957600080fd5b8135602061405e61405983614015565b613fe5565b82815260059290921b8401810191818101908684111561407d57600080fd5b8286015b848110156140a857803560ff8116811461409b5760008081fd5b8352918301918301614081565b509695505050505050565b600060208083850312156140c657600080fd5b82356001600160401b03808211156140dd57600080fd5b818501915085601f8301126140f157600080fd5b81356140ff61405982614015565b81815260059190911b8301840190848101908883111561411e57600080fd5b8585015b838110156141565780358581111561413a5760008081fd5b6141488b89838a0101614038565b845250918601918601614122565b5098975050505050505050565b8035605d811061417257600080fd5b919050565b6000806040838503121561418a57600080fd5b61419383614163565b91506141a160208401614163565b90509250929050565b803561ffff8116811461417257600080fd5b60006101e082840312156141cf57600080fd5b6141d7613fbc565b90506141e2826141aa565b81526141f0602083016141aa565b602082015261420160408301614163565b604082015261421260608301614163565b606082015261422360808301614163565b608082015261423460a08301614163565b60a082015261424560c08301614163565b60c082015261425660e08301614163565b60e0820152610100614269818401614163565b9082015261012061427b838201614163565b9082015261014061428d838201614163565b9082015261016061429f838201614163565b908201526101806142b1838201614163565b908201526101a06142c3838201614163565b908201526101c06142d5838201614163565b9082015292915050565b60006101e082840312156142f257600080fd5b610f5e83836141bc565b634e487b7160e01b600052602160045260246000fd5b6020810160068310614326576143266142fc565b91905290565b60006001600160401b0382111561434557614345613fa6565b50601f01601f191660200190565b600082601f83011261436457600080fd5b81356143726140598261432c565b81815284602083860101111561438757600080fd5b816020850160208301376000918101602001919091529392505050565b600080600061022084860312156143ba57600080fd5b6143c485856141bc565b92506101e084013591506102008401356001600160401b038111156143e857600080fd5b6143f486828701614353565b9150509250925092565b6002811061349e5761349e6142fc565b60208101614326836143fe565b600082601f83011261442c57600080fd5b8135602061443c61405983614015565b82815260059290921b8401810191818101908684111561445b57600080fd5b8286015b848110156140a85761447081614163565b835291830191830161445f565b6000806040838503121561449057600080fd5b82356001600160401b03808211156144a757600080fd5b6144b38683870161441b565b935060208501359150808211156144c957600080fd5b506144d68582860161441b565b9150509250929050565b600080604083850312156144f357600080fd5b6144fc836141aa565b91506141a1602084016141aa565b605d811061451a5761451a6142fc565b9052565b815161ffff1681526101e081016020830151614540602084018261ffff169052565b506040830151614553604084018261450a565b506060830151614566606084018261450a565b506080830151614579608084018261450a565b5060a083015161458c60a084018261450a565b5060c083015161459f60c084018261450a565b5060e08301516145b260e084018261450a565b50610100808401516145c68285018261450a565b5050610120808401516145db8285018261450a565b5050610140808401516145f08285018261450a565b5050610160808401516146058285018261450a565b50506101808084015161461a8285018261450a565b50506101a08084015161462f8285018261450a565b50506101c0808401516146448285018261450a565b505092915050565b60006020828403121561465e57600080fd5b610f5e82614163565b60208101600d8310614326576143266142fc565b6000806000610220848603121561469157600080fd5b61469b85856141bc565b92506101e08401356001600160401b03808211156146b857600080fd5b818601915086601f8301126146cc57600080fd5b813560206146dc61405983614015565b82815260059290921b8401810191818101908a8411156146fb57600080fd5b948201945b8386101561471957853582529482019490820190614700565b965050505061020086013591508082111561473357600080fd5b506143f486828701614353565b60005b8381101561475b578181015183820152602001614743565b8381111561310e5750506000910152565b602081526000825180602084015261478b816040850160208701614740565b601f01601f19169190910160400192915050565b6020810160048310614326576143266142fc565b600080604083850312156147c657600080fd5b82356001600160401b03808211156147dd57600080fd5b818501915085601f8301126147f157600080fd5b8135602061480161405983614015565b82815260059290921b8401810191818101908984111561482057600080fd5b8286015b848110156148585780358681111561483c5760008081fd5b61484a8c86838b0101614353565b845250918301918301614824565b50965050860135925050808211156144c957600080fd5b80356004811061417257600080fd5b60008060006060848603121561489357600080fd5b83356001600160401b03808211156148aa57600080fd5b6148b68783880161441b565b94506020915081860135818111156148cd57600080fd5b6148d98882890161441b565b9450506040860135818111156148ee57600080fd5b86019050601f8101871361490157600080fd5b803561490f61405982614015565b81815260059190911b8201830190838101908983111561492e57600080fd5b928401925b82841015614953576149448461486f565b82529284019290840190614933565b80955050505050509250925092565b60008060006060848603121561497757600080fd5b83356001600160401b038082111561498e57600080fd5b61499a8783880161441b565b945060208601359150808211156149b057600080fd5b6149bc8783880161441b565b935060408601359150808211156149d257600080fd5b506143f486828701614038565b6000602082840312156149f157600080fd5b81356001600160401b03811115614a0757600080fd5b6110da84828501614353565b6020810161186b828461450a565b600080600060608486031215614a3657600080fd5b614a3f84614163565b9250614a4d60208501614163565b9150614a5b6040850161486f565b90509250925092565b6000806102008385031215614a7857600080fd5b614a8284846141bc565b91506141a16101e0840161486f565b600060208284031215614aa357600080fd5b81356001600160a01b0381168114610f5e57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600019821415614afa57614afa614ad0565b5060010190565b634e487b7160e01b600052601260045260246000fd5b600082614b2657614b26614b01565b500490565b60008451614b3d818460208901614740565b601d60f91b9083019081528451614b5b816001840160208901614740565b8451910190614b71816001840160208801614740565b0160010195945050505050565b600082614b8d57614b8d614b01565b500690565b600060208284031215614ba457600080fd5b81516001600160401b03811115614bba57600080fd5b8201601f81018413614bcb57600080fd5b8051614bd96140598261432c565b818152856020838501011115614bee57600080fd5b610ef2826020830160208601614740565b600082821015614c1157614c11614ad0565b500390565b60008251614c28818460208701614740565b9190910192915050565b60008219821115614c4557614c45614ad0565b500190565b600060ff821660ff811415614c6157614c61614ad0565b60010192915050565b60008351614c7c818460208801614740565b835190830190614c90818360208801614740565b600b60fa1b9101908152600101949350505050565b60008351614cb7818460208801614740565b600160fd1b9083019081528351614cd5816001840160208801614740565b01600101949350505050565b6902130b1b5bbb0b93239960b51b815260008251614d0681600a850160208701614740565b91909101600a0192915050565b7f7b2274726169745f74797065223a2246617368696f6e20486174222c20227661815265363ab2911d1160d11b602082015260008251614d5a816026850160208701614740565b61227d60f01b6026939091019283015250602801919050565b60008351614d85818460208801614740565b835190830190614d99818360208801614740565b605d60f81b9101908152600101949350505050565b600181811c90821680614dc257607f821691505b60208210811415614de357634e487b7160e01b600052602260045260246000fd5b50919050565b600080821280156001600160ff1b0384900385131615614e0b57614e0b614ad0565b600160ff1b8390038412811615614e2457614e24614ad0565b50500190565b634e487b7160e01b600052600160045260246000fd5b6e3d913a3930b4ba2fba3cb832911d1160891b81528251600090614e6b81600f850160208801614740565b6b111610113b30b63ab2911d1160a11b600f918401918201528351614e9781601b840160208801614740565b61227d60f01b601b9290910191820152601d0194935050505056fea26469706673582212208e1dea22200df2baa6baa0b73fbdfd6613a1f7bf134669b232c8b9135ade3fdb64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc
-----Decoded View---------------
Arg [0] : punkDataContractAddress (address): 0x0FC4340DEFc4Ba506356292fD7f8893d08Dd57DC
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000fc4340defc4ba506356292fd7f8893d08dd57dc
Deployed Bytecode Sourcemap
18289:29304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45841:424;;;;;;:::i;:::-;;:::i;:::-;;34767:99;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3565:14:1;;3558:22;3540:41;;3528:2;3513:18;34767:99:0;;;;;;;;23390:3913;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;33263:361::-;;;;;;:::i;:::-;;:::i;:::-;;;7267:25:1;;;7255:2;7240:18;33263:361:0;7121:177:1;27315:1620:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34879:366::-;;;;;;:::i;:::-;;:::i;37300:2962::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36092:673::-;;;;;;:::i;:::-;;:::i;45746:82::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;34310:88::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2774:103;;;:::i;33636:662::-;;;;;;:::i;:::-;;:::i;:::-;;;13755:4:1;13743:17;;;13725:36;;13713:2;13698:18;33636:662:0;13583:184:1;28947:1694:0;;;;;;:::i;:::-;;:::i;30653:1895::-;;;;;;:::i;:::-;;:::i;44750:984::-;;;;;;:::i;:::-;;:::i;40274:2562::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2126:87::-;2172:7;2199:6;2126:87;;-1:-1:-1;;;;;2199:6:0;;;14811:51:1;;14799:2;14784:18;2126:87:0;14665:203:1;35417:101:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;20183:3195;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;46433:435::-;;;;;;:::i;:::-;;:::i;32664:346::-;;;;;;:::i;:::-;;:::i;35257:148::-;;;;;;:::i;:::-;;:::i;47177:413::-;;;;;;:::i;:::-;;:::i;35531:385::-;;;;;;:::i;:::-;;:::i;46277:68::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;34411:344::-;;;;;;:::i;:::-;;:::i;46880:118::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35928:152;;;;;;:::i;:::-;;:::i;32560:91::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;47011:154;;;;;;:::i;:::-;;:::i;3032:201::-;;;;;;:::i;:::-;;:::i;46352:68::-;;;;;;:::i;:::-;;:::i;33022:229::-;;;;;;:::i;:::-;;:::i;45841:424::-;2012:13;:11;:13::i;:::-;45952:6:::1;45947:311;45964:18;:25;45960:1;:29;45947:311;;;46011:26;46059:18;46078:1;46059:21;;;;;;;;:::i;:::-;;;;;;;46081:1;46059:24;;;;;;;;:::i;:::-;;;;;;;46040:44;;;;;;;;;;:::i;:::-;46011:73;;46099:26;46146:18;46165:1;46146:21;;;;;;;;:::i;:::-;;;;;;;46168:1;46146:24;;;;;;;;:::i;:::-;;;;;;;46128:43;;;;;;;;;;:::i;:::-;46099:72;;46238:8;46200:26;:35;46227:7;46200:35;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;46200:35:0;:46;;-1:-1:-1;;46200:46:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;45996:262;;45991:3;;;;;:::i;:::-;;;;45947:311;;;;45841:424:::0;:::o;23390:3913::-;23451:15;23479;23497:17;23509:4;23497:11;:17::i;:::-;23565:13;;;23576:1;23565:13;;;;;;;;;23479:35;;-1:-1:-1;23535:27:0;;23565:13;;;;;;;;;;;-1:-1:-1;;23535:43:0;-1:-1:-1;23614:16:0;23603:7;:27;;;;;;;;:::i;:::-;;23599:1519;;;23685:6;23647:13;23666:14;23647:35;;;;;;;;:::i;:::-;;;;;;;;;;:44;23743:4;23706:13;23725;23706:34;;;;;;;;:::i;:::-;;;;;;;;;;:41;23798:4;23762:13;23781:12;23762:33;;;;;;;;:::i;:::-;;;;;;;;;;:40;23855:4;23817:13;23836:14;23817:35;;;;;;;;:::i;:::-;;;;;;;;;;:42;23910:4;23874:13;23893:12;23888:18;23874:33;;;;;;;;:::i;:::-;;;;;;;;;;:40;23967:1;23929:13;23948:14;23943:20;23929:35;;;;;;;;:::i;:::-;;;;;;:39;;;;;23599:1519;;;24001:14;23990:7;:25;;;;;;;;:::i;:::-;;23986:1132;;;24070:4;24032:13;24051:14;24032:35;;;;;;;;:::i;:::-;;;;;;;;;;:42;24126:1;24089:13;24108;24089:34;;;;;;;;:::i;:::-;;;;;;;;;;:38;24178:1;24142:13;24161:12;24142:33;;;;;;;;:::i;:::-;;;;;;;;;;:37;24232:1;24194:13;24213:14;24194:35;;;;;;;;:::i;:::-;;;;;;;;;;:39;24284:4;24248:13;24267:12;24248:33;;;;;;;;:::i;:::-;;;;;;;;;;:40;24341:4;24303:13;24322:14;24317:20;;23986:1132;24378:14;24367:7;:25;;;;;;;;:::i;:::-;;24363:755;;;24447:4;24409:13;24428:14;24409:35;;;;;;;;:::i;:::-;;;;;;;;;;:42;24503:4;24466:13;24485;24466:34;;;;;;;;:::i;:::-;;;;;;;;;;:41;24558:1;24522:13;24541:12;24522:33;;;;;;;;:::i;:::-;;;;;;;;;;:37;24612:1;24574:13;24593:14;24574:35;;;;;;;;:::i;:::-;;;;;;;;;;:39;24664:4;24628:13;24647:12;24642:18;;24363:755;24755:13;24744:7;:24;;;;;;;;:::i;:::-;;24740:378;;;24823:6;24785:13;24804:14;24785:35;;;;;;;;:::i;:::-;;;;;;;;;;:44;24881:4;24844:13;24863;24844:34;;;;;;;;:::i;:::-;;;;;;;;;;:41;24936:4;24900:13;24919:12;24900:33;;;;;;;;:::i;:::-;;;;;;;;;;:40;24993:4;24955:13;24974:14;24955:35;;;;;;;;:::i;:::-;;;;;;;;;;:42;25048:4;25012:13;25031:12;25012:33;;;;;;;;:::i;:::-;;;;;;;;;;:40;25105:1;25067:13;25086:14;25067:35;;;;;;;;:::i;:::-;;;;;;:39;;;;;24740:378;25155:25;25142:4;:9;;;:38;;;;;;;;:::i;:::-;;25138:330;;;25235:1;25197:13;25235:1;25197:35;;;;;;;;:::i;:::-;;;;;;;;;;:39;25288:1;25251:13;25270;25251:34;;;;;;;;:::i;:::-;;;;;;;;;;:38;25340:4;25304:13;25323:12;25304:33;;;;;;;;:::i;:::-;;;;;;;;;;:40;25397:4;25359:13;25378:14;25359:35;;;;;;;;:::i;:::-;;;;;;;;;;:42;25452:4;25416:13;25435:12;25416:33;;;;;;;;:::i;:::-;;;;;;:40;;;;;25138:330;25505:34;25492:4;:9;;;:47;;;;;;;;:::i;:::-;;:98;;;-1:-1:-1;25556:34:0;25543:4;:9;;;:47;;;;;;;;:::i;:::-;;25492:98;25488:170;;;25645:1;25607:13;25626:14;25607:35;;;;;;;;:::i;:::-;;;;;;:39;;;;;25488:170;25695:28;25682:4;:9;;;:41;;;;;;;;:::i;:::-;;:70;;;;-1:-1:-1;25738:14:0;25727:7;:25;;;;;;;;:::i;:::-;;25682:70;25678:144;;;25808:2;25769:13;25788:14;25769:35;;;;;;;;:::i;:::-;;;;;;:41;;;;;;;:::i;:::-;;;-1:-1:-1;25678:144:0;25857:13;25846:7;:24;;;;;;;;:::i;:::-;;25842:478;;;25904:28;25891:4;:9;;;:41;;;;;;;;:::i;:::-;;:88;;;-1:-1:-1;25949:30:0;25936:4;:9;;;:43;;;;;;;;:::i;:::-;;25891:88;:193;;;-1:-1:-1;26014:27:0;26001:4;:9;;;:40;;;;;;;;:::i;:::-;;:81;;;;-1:-1:-1;26057:25:0;26045:4;:8;;;:37;;;;;;;;:::i;:::-;;26001:81;25887:273;;;26143:1;26105:13;26143:1;26105:35;;;;;;;;:::i;:::-;;;;;;:39;;;;;25887:273;26205:30;26192:4;:9;;;:43;;;;;;;;:::i;:::-;;26188:121;;;26292:1;26256:13;26275:12;26256:33;;;;;;;;:::i;:::-;;;;;;:37;;;;;26188:121;26355:14;26344:7;:25;;;;;;;;:::i;:::-;;:54;;;-1:-1:-1;26384:14:0;26373:7;:25;;;;;;;;:::i;:::-;;26344:54;26340:410;;;26437:22;26454:4;26437:16;:22::i;:::-;:86;;;-1:-1:-1;26493:30:0;26480:4;:9;;;:43;;;;;;;;:::i;:::-;;26437:86;:148;;;-1:-1:-1;26557:28:0;26544:4;:9;;;:41;;;;;;;;:::i;:::-;;26437:148;:212;;;-1:-1:-1;26619:30:0;26606:4;:9;;;:43;;;;;;;;:::i;:::-;;26437:212;26415:324;;;26722:1;26684:13;26722:1;26684:35;;;;;;;;:::i;:::-;;;;;;:39;;;;;26415:324;26786:25;26774:4;:8;;;:37;;;;;;;;:::i;:::-;;;:123;;;;-1:-1:-1;26829:21:0;26816:4;:9;;;:34;;;;;;;;:::i;:::-;;:80;;;-1:-1:-1;26867:29:0;26854:4;:9;;;:42;;;;;;;;:::i;:::-;;26816:80;26770:195;;;26952:1;26914:13;26952:1;26914:35;;;;;;;;:::i;:::-;;;;;;:39;;;;;26770:195;27002:29;26989:4;:9;;;:42;;;;;;;;:::i;:::-;;:113;;;;-1:-1:-1;27048:25:0;27036:4;:8;;;:37;;;;;;;;:::i;:::-;;:65;;;-1:-1:-1;27088:13:0;27077:7;:24;;;;;;;;:::i;:::-;;27036:65;26985:183;;;27155:1;27119:13;27138:12;27119:33;;;;;;;;:::i;:::-;;;;;;:37;;;;;26985:183;27188:17;27208:48;27223:4;27229:13;27208:48;;;;;;;;;;;;;-1:-1:-1;;;27208:48:0;;;:14;:48::i;:::-;27188:68;;27283:11;27274:21;;;;;;;;;;:::i;:::-;27267:28;23390:3913;-1:-1:-1;;;;;23390:3913:0:o;33263:361::-;33402:9;;;;33491:7;;33371:4;;33402:9;33371:4;;33491:18;;:16;;;:18::i;:::-;33516:15;:4;:13;;;:15::i;:::-;33533:12;33474:72;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;33474:72:0;;;;;;;;;33464:83;;33474:72;33464:83;;;;;-1:-1:-1;33591:24:0;33603:12;33464:83;33591:24;:::i;:::-;33579:37;;;;33263:361;;;;;;:::o;27315:1620::-;27379:18;27410:15;27428:17;27440:4;27428:11;:17::i;:::-;27410:35;-1:-1:-1;27481:16:0;27470:7;:27;;;;;;;;:::i;:::-;;27466:86;;-1:-1:-1;27521:19:0;;27315:1620;-1:-1:-1;;27315:1620:0:o;27466:86::-;27602:13;;;27613:1;27602:13;;;;;;;;27572:27;;27602:13;;;;;;;;;;-1:-1:-1;;27572:43:0;-1:-1:-1;27679:4:0;27572:43;27655:19;27636:40;;;;;;;;:::i;:::-;;;;;;;;;;:47;27737:4;27694:13;27713:19;27694:40;;;;;;;;:::i;:::-;;;;;;;;;;:47;27779:30;27766:4;:9;;;:43;;;;;;;;:::i;:::-;;27762:102;;;-1:-1:-1;27833:19:0;;27315:1620;-1:-1:-1;;;27315:1620:0:o;27762:102::-;27889:16;27900:4;27889:10;:16::i;:::-;27884:76;;-1:-1:-1;27929:19:0;;27315:1620;-1:-1:-1;;;27315:1620:0:o;27884:76::-;28010:25;27998:4;:8;;;:37;;;;;;;;:::i;:::-;;;:136;;;;-1:-1:-1;28066:21:0;28053:4;:9;;;:34;;;;;;;;:::i;:::-;;:80;;;-1:-1:-1;28104:29:0;28091:4;:9;;;:42;;;;;;;;:::i;:::-;;28053:80;27998:178;;;;;28151:20;28166:4;28151:14;:20::i;:::-;:25;;28175:1;28151:25;27998:178;27980:330;;;28224:29;28211:4;:9;;;:42;;;;;;;;:::i;:::-;;:86;;28278:19;28211:86;;;28256:19;28211:86;28203:95;27315:1620;-1:-1:-1;;;;27315:1620:0:o;27980:330::-;28347:25;28335:4;:8;;;:37;;;;;;;;:::i;:::-;;:71;;;;28376:25;28396:4;28376:19;:25::i;:::-;:30;;28405:1;28376:30;28335:71;28334:132;;;;-1:-1:-1;28438:28:0;28424:4;:10;;;:42;;;;;;;;:::i;:::-;;28334:132;28330:221;;;28537:2;28493:13;28512:19;28493:40;;;;;;;;:::i;:::-;;;;;;:46;;;;;;;:::i;:::-;;;-1:-1:-1;28330:221:0;28602:25;28589:4;:9;;;:38;;;;;;;;:::i;:::-;;:93;;;-1:-1:-1;28657:25:0;28644:4;:9;;;:38;;;;;;;;:::i;:::-;;28589:93;:140;;;;28699:25;28719:4;28699:19;:25::i;:::-;:30;;28728:1;28699:30;28589:140;28571:223;;;-1:-1:-1;28763:19:0;;27315:1620;-1:-1:-1;;;27315:1620:0:o;28571:223::-;28814:17;28834:51;28849:4;28855:13;28834:51;;;;;;;;;;;;;-1:-1:-1;;;28834:51:0;;;:14;:51::i;:::-;28814:71;;28915:11;28903:24;;;;;;;;;;:::i;34879:366::-;2012:13;:11;:13::i;:::-;35022:6:::1;35017:221;35038:5;:12;35034:1;:16;35017:221;;;35072:23;35098:5;35104:1;35098:8;;;;;;;;:::i;:::-;;;;;;;35072:34;;35121:22;35146:5;35152:1;35146:8;;;;;;;;:::i;:::-;;;;;;;35121:33;;35222:4;35183:25;:31;35209:4;35183:31;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;35215:3;35183:36;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35183:36:0;:43;;-1:-1:-1;;35183:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;35052:3:0;;-1:-1:-1;35052:3:0::1;::::0;::::1;:::i;:::-;;;;35017:221;;;;34879:366:::0;;:::o;37300:2962::-;37377:11;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37377:11:0;37420:650;;;;;;;;;;;;;;;;;;;;37401:16;;37420:650;;37401:16;37420:650;;;;37543:23;37420:650;;;;37587:23;37420:650;;;;37632:23;37420:650;;;;37676:23;37420:650;;;;37720:23;37420:650;;;;37765:23;37420:650;;;;37809:23;37420:650;;;;37856:23;37420:650;;;;37900:23;37420:650;;;;37944:23;37420:650;;;;37990:23;37420:650;;;;38035:23;37420:650;;38150:7;;38118:40;;-1:-1:-1;;;38118:40:0;;22431:6:1;22419:19;;;38118:40:0;;;22401:38:1;38150:7:0;;-1:-1:-1;38091:24:0;;38118:16;-1:-1:-1;;;;;38118:31:0;;;;22374:18:1;;38118:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38118:40:0;;;;;;;;;;;;:::i;:::-;38091:67;;38171:30;38204:21;;;;;;;;;;;;;;-1:-1:-1;;;38204:21:0;;;:10;:16;;:21;;;;:::i;:::-;38171:54;;38251:6;38246:1977;38267:14;:21;38263:1;:25;38246:1977;;;38310:32;38345:14;38360:1;38345:17;;;;;;;;:::i;:::-;;;;;;;38310:52;;38377:30;38444:1;38440;:5;38436:232;;;38485:29;;;;;;;;;;;;-1:-1:-1;;;38485:29:0;;;;;;:18;;:24;:29::i;:::-;38515:1;38485:32;;;;;;;;:::i;:::-;;;;;;;38466:51;;38436:232;;;38577:75;38646:1;38617:18;38611:32;:36;;;;:::i;:::-;38577:18;;38650:1;38577:29;:75::i;:::-;38558:94;;38436:232;38696:28;38727:23;38751:16;38727:41;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;38727:41:0;38812:26;38727:41;;38812:37;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;38812:37:0;;;;;;;-1:-1:-1;38882:8:0;:33;;;;;;;;:::i;:::-;;38878:1334;;;38936:8;;;38947:9;38936:20;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;38878:1334:0;;;38994:22;38982:8;:34;;;;;;;;:::i;:::-;;38978:1234;;;39037:9;;;39049;39037:21;;;;;;;;:::i;38978:1234::-;39096:22;39084:8;:34;;;;;;;;:::i;:::-;;39080:1132;;;39139:9;;;39151;39139:21;;;;;;;;:::i;39080:1132::-;39198:23;39186:8;:35;;;;;;;;:::i;:::-;;39182:1030;;;39242:10;;;39255:9;39242:22;;;;;;;;:::i;39182:1030::-;39302:22;39290:8;:34;;;;;;;;:::i;:::-;;39286:926;;;39345:9;;;39357;39345:21;;;;;;;;:::i;39286:926::-;39404:22;39392:8;:34;;;;;;;;:::i;:::-;;39388:824;;;39447:9;;;39459;39447:21;;;;;;;;:::i;39388:824::-;39506:23;39494:8;:35;;;;;;;;:::i;:::-;;39490:722;;;39550:10;;;39563:9;39550:22;;;;;;;;:::i;39490:722::-;39610:22;39598:8;:34;;;;;;;;:::i;:::-;;39594:618;;;39653:9;;;39665;39653:21;;;;;;;;:::i;39594:618::-;39712:25;39700:8;:37;;;;;;;;:::i;:::-;;39696:516;;;39758:12;;;39773:9;39758:24;;;;;;;;:::i;39696:516::-;39820:22;39808:8;:34;;;;;;;;:::i;:::-;;39804:408;;;39863:9;;;39875;39863:21;;;;;;;;:::i;39804:408::-;39922:22;39910:8;:34;;;;;;;;:::i;:::-;;39906:306;;;39965:9;;;39977;39965:21;;;;;;;;:::i;39906:306::-;40024:24;40012:8;:36;;;;;;;;:::i;:::-;;40008:204;;;40069:11;;;40083:9;40069:23;;;;;;;;:::i;40008:204::-;40130:23;40118:8;:35;;;;;;;;:::i;:::-;;40114:98;;;40174:10;;;40187:9;40174:22;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;-1:-1:-1;40114:98:0;38295:1928;;;;38290:3;;;;;:::i;:::-;;;;38246:1977;;;-1:-1:-1;40250:4:0;;-1:-1:-1;;;37300:2962:0;;;;;:::o;36092:673::-;36157:4;36190:25;36178:4;:8;;;:37;;;;;;;;:::i;:::-;;:87;;;;-1:-1:-1;36232:33:0;36219:4;:9;;;:46;;;;;;;;:::i;:::-;;36178:87;36174:131;;;-1:-1:-1;36289:4:0;;36092:673;-1:-1:-1;36092:673:0:o;36174:131::-;36360:31;36347:4;:9;;;:44;;;;;;;;:::i;:::-;;:111;;;-1:-1:-1;36421:37:0;36408:4;:9;;;:50;;;;;;;;:::i;:::-;;36347:111;:169;;;-1:-1:-1;36488:28:0;36475:4;:9;;;:41;;;;;;;;:::i;:::-;;36347:169;:226;;;-1:-1:-1;36546:27:0;36533:4;:9;;;:40;;;;;;;;:::i;:::-;;36347:226;:289;;;-1:-1:-1;36603:33:0;36590:4;:9;;;:46;;;;;;;;:::i;:::-;;36347:289;:348;;;-1:-1:-1;36666:29:0;36653:4;:9;;;:42;;;;;;;;:::i;:::-;;36347:348;:399;;;-1:-1:-1;36725:21:0;36712:4;:9;;;:34;;;;;;;;:::i;:::-;;36325:432;36092:673;-1:-1:-1;;36092:673:0:o;2774:103::-;2012:13;:11;:13::i;:::-;2839:30:::1;2866:1;2839:18;:30::i;:::-;2774:103::o:0;33636:662::-;33820:20;;33756:5;;;;;33853:93;33870:10;33866:1;:14;33853:93;;;33918:13;33932:1;33918:16;;;;;;;;:::i;:::-;;;;;;;33902:32;;;;;:::i;:::-;;-1:-1:-1;33882:3:0;;;;:::i;:::-;;;;33853:93;;;;33966:25;33994:46;34007:4;34013:12;34027;33994;:46::i;:::-;33966:74;;34066:7;34061:230;34079:10;34075:1;:14;;;34061:230;;;34138:13;34152:1;34138:16;;;;;;;;;;:::i;:::-;;;;;;;34115:20;:39;34111:169;;;34182:1;-1:-1:-1;34175:8:0;;-1:-1:-1;;;34175:8:0;34111:169;34248:13;34262:1;34248:16;;;;;;;;;;:::i;:::-;;;;;;;34224:40;;;;;:::i;:::-;;;34091:3;;;;:::i;:::-;;;;34061:230;;;;33763:535;;;33636:662;;;;;:::o;28947:1694::-;29010:9;29032:18;29053:17;29065:4;29053:11;:17::i;:::-;29032:38;-1:-1:-1;29123:13:0;29109:10;:27;;;;;;;;:::i;:::-;;:72;;;-1:-1:-1;29167:14:0;29153:10;:28;;;;;;;;:::i;:::-;;29109:72;:117;;;-1:-1:-1;29212:14:0;29198:10;:28;;;;;;;;:::i;:::-;;29109:117;29091:182;;;-1:-1:-1;29260:1:0;;28947:1694;-1:-1:-1;;28947:1694:0:o;29091:182::-;29310:26;29297:4;:9;;;:39;;;;;;;;:::i;:::-;;29293:391;;;29369:25;29357:4;:8;;;:37;;;;;;;;:::i;:::-;;29353:320;;;-1:-1:-1;29422:1:0;;28947:1694;-1:-1:-1;;28947:1694:0:o;29353:320::-;29481:29;29468:4;:9;;;:42;;;;;;;;:::i;:::-;;:80;;;-1:-1:-1;29527:21:0;29514:4;:9;;;:34;;;;;;;;:::i;:::-;;29468:80;29464:194;;;-1:-1:-1;29580:1:0;;28947:1694;-1:-1:-1;;28947:1694:0:o;29464:194::-;-1:-1:-1;29637:1:0;;28947:1694;-1:-1:-1;;28947:1694:0:o;29464:194::-;29704:17;29724:25;29744:4;29724:19;:25::i;:::-;29704:45;-1:-1:-1;29786:25:0;29774:4;:8;;;:37;;;;;;;;:::i;:::-;;29770:340;;29863:35;29850:4;:9;;;:48;;;;;;;;:::i;:::-;;:107;;;-1:-1:-1;29932:25:0;29919:38;:4;:9;;;:38;;;;;;;;:::i;:::-;;29850:107;29828:271;;;-1:-1:-1;29999:1:0;;28947:1694;-1:-1:-1;;;28947:1694:0:o;29828:271::-;30063:1;30049:11;:15;;;:33;;30081:1;30049:33;;29828:271;30163:16;30149:10;:30;;;;;;;;:::i;:::-;;:137;;;;-1:-1:-1;30210:28:0;30197:4;:9;;;:41;;;;;;;;:::i;:::-;;:88;;;-1:-1:-1;30255:30:0;30242:4;:9;;;:43;;;;;;;;:::i;:::-;;30197:88;30148:376;;;-1:-1:-1;30318:32:0;30305:4;:9;;;:45;;;;;;;;:::i;:::-;;:94;;;-1:-1:-1;30367:32:0;30354:4;:9;;;:45;;;;;;;;:::i;:::-;;30305:94;:164;;;-1:-1:-1;30430:39:0;30417:4;:9;;;:52;;;;;;;;:::i;:::-;;30305:164;:218;;;-1:-1:-1;30486:37:0;30473:50;;30653:1895;30713:14;30740:18;30761:17;30773:4;30761:11;:17::i;:::-;30740:38;-1:-1:-1;30807:25:0;30795:4;:8;;;:37;;;;;;;;:::i;:::-;;30791:92;;-1:-1:-1;30856:15:0;;30653:1895;-1:-1:-1;;30653:1895:0:o;30791:92::-;30921:16;30907:10;:30;;;;;;;;:::i;:::-;;:76;;;;-1:-1:-1;30954:29:0;30941:4;:9;;;:42;;;;;;;;:::i;:::-;;30907:76;30903:131;;;-1:-1:-1;31007:15:0;;30653:1895;-1:-1:-1;;30653:1895:0:o;30903:131::-;31072:14;31058:10;:28;;;;;;;;:::i;:::-;;:73;;;;-1:-1:-1;31103:28:0;31090:4;:9;;;:41;;;;;;;;:::i;:::-;;31058:73;31054:128;;;-1:-1:-1;31155:15:0;;30653:1895;-1:-1:-1;;30653:1895:0:o;31054:128::-;31234:14;31220:10;:28;;;;;;;;:::i;:::-;;:75;;;-1:-1:-1;31279:16:0;31265:10;:30;;;;;;;;:::i;:::-;;31220:75;31202:333;;;31357:29;31344:4;:9;;;:42;;;;;;;;:::i;:::-;;:107;;;-1:-1:-1;31420:31:0;31407:4;:9;;;:44;;;;;;;;:::i;:::-;;31344:107;31322:202;;;-1:-1:-1;31493:15:0;;30653:1895;-1:-1:-1;;30653:1895:0:o;31322:202::-;31587:14;31573:10;:28;;;;;;;;:::i;:::-;;:73;;;-1:-1:-1;31632:14:0;31618:10;:28;;;;;;;;:::i;:::-;;31573:73;:120;;;-1:-1:-1;31677:16:0;31663:10;:30;;;;;;;;:::i;:::-;;31573:120;31555:314;;;31755:30;31742:4;:9;;;:43;;;;;;;;:::i;:::-;;31720:138;;;-1:-1:-1;31827:15:0;;30653:1895;-1:-1:-1;;30653:1895:0:o;31720:138::-;31921:14;31907:10;:28;;;;;;;;:::i;:::-;;:73;;;-1:-1:-1;31966:14:0;31952:10;:28;;;;;;;;:::i;:::-;;31907:73;31889:331;;;32042:30;32029:4;:9;;;:43;;;;;;;;:::i;:::-;;:107;;;-1:-1:-1;32106:30:0;32093:4;:9;;;:43;;;;;;;;:::i;:::-;;32029:107;32007:202;;;-1:-1:-1;32178:15:0;;30653:1895;-1:-1:-1;;30653:1895:0:o;32007:202::-;32271:39;32258:4;:9;;;:52;;;;;;;;:::i;:::-;;:114;;;-1:-1:-1;32340:32:0;32327:4;:9;;;:45;;;;;;;;:::i;:::-;;32258:114;:181;;;-1:-1:-1;32402:37:0;32389:4;:9;;;:50;;;;;;;;:::i;:::-;;32258:181;32240:260;;;-1:-1:-1;32473:15:0;;30653:1895;-1:-1:-1;;30653:1895:0:o;44750:984::-;44810:4;44827:11;44841:17;44853:4;44841:11;:17::i;:::-;44827:31;;44875:26;44896:4;44875:20;:26::i;:::-;44871:48;;;-1:-1:-1;44912:4:0;;44750:984;-1:-1:-1;;44750:984:0:o;44871:48::-;44956:25;44943:4;:9;;;:38;;;;;;;;:::i;:::-;;:65;;;;-1:-1:-1;44992:16:0;44985:3;:23;;;;;;;;:::i;:::-;;44943:65;44939:109;;;-1:-1:-1;45032:4:0;;44750:984;-1:-1:-1;;44750:984:0:o;44939:109::-;45068:17;45101:33;45088:4;:9;;;:46;;;;;;;;:::i;:::-;;:125;;;-1:-1:-1;45180:33:0;45167:4;:9;;;:46;;;;;;;;:::i;:::-;;45088:125;:208;;;-1:-1:-1;45259:37:0;45246:4;:9;;;:50;;;;;;;;:::i;:::-;;45088:208;:288;;;-1:-1:-1;45342:34:0;45329:4;:9;;;:47;;;;;;;;:::i;:::-;;45088:288;:362;;;-1:-1:-1;45422:28:0;45409:4;:9;;;:41;;;;;;;;:::i;:::-;;45088:362;:435;;;-1:-1:-1;45496:27:0;45483:4;:9;;;:40;;;;;;;;:::i;:::-;;45088:435;45068:455;-1:-1:-1;45582:24:0;45569:4;:9;;;:37;;;;;;;;:::i;:::-;;:85;;;;;45612:12;45611:13;:42;;;;45628:20;45643:4;45628:14;:20::i;:::-;:25;;45652:1;45628:25;45611:42;45565:129;;;-1:-1:-1;45678:4:0;;44750:984;-1:-1:-1;;;44750:984:0:o;40274:2562::-;40357:18;40388:16;40407:32;40422:6;40430:8;40407:14;:32::i;:::-;40520:25;;;;;;;;;;;;-1:-1:-1;;;40520:25:0;;;;40388:51;;-1:-1:-1;40460:23:0;;;40580:17;40388:51;40580:11;:17::i;:::-;40566:31;;40608:17;40628:18;40641:4;40628:12;:18::i;:::-;40608:38;;40657:23;40683:21;40699:4;40683:15;:21::i;:::-;40657:47;;40725:39;:401;;;;;;;;40782:4;:8;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;40806:17;40818:4;40806:11;:17::i;:::-;:36;;40838:4;40806:36;;;40826:4;:9;;;40806:36;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;40858:4;:9;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;40882:4;:10;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;40907:4;:9;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;40931:4;:9;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;40955:4;:10;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;40980:4;:9;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;41004:4;:12;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;41031:4;:9;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;41055:4;:9;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;41079:4;:11;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;41105:4;:10;;;40725:401;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;-1:-1:-1;41147:26:0;41210:14;41198:8;:26;;;;;;;;:::i;:::-;;41194:512;;;-1:-1:-1;41241:23:0;;;;;;;;;;;;-1:-1:-1;;;41241:23:0;;;;41194:512;;;41298:13;41286:8;:25;;;;;;;;:::i;:::-;;41282:424;;;-1:-1:-1;41328:22:0;;;;;;;;;;;;-1:-1:-1;;;41328:22:0;;;;41282:424;;;41384:12;41372:8;:24;;;;;;;;:::i;:::-;;41368:338;;;-1:-1:-1;41413:21:0;;;;;;;;;;;;-1:-1:-1;;;41413:21:0;;;;41368:338;;;41468:14;41456:8;:26;;;;;;;;:::i;:::-;;41452:254;;;-1:-1:-1;41499:23:0;;;;;;;;;;;;-1:-1:-1;;;41499:23:0;;;;41452:254;;;41556:12;41544:8;:24;;;;;;;;:::i;:::-;;41540:166;;;-1:-1:-1;41585:21:0;;;;;;;;;;;;-1:-1:-1;;;41585:21:0;;;;41540:166;;;41640:14;41628:8;:26;;;;;;;;:::i;:::-;;41624:82;;;-1:-1:-1;41671:23:0;;;;;;;;;;;;-1:-1:-1;;;41671:23:0;;;;41624:82;41726:25;41783:16;41776:3;:23;;;;;;;;:::i;:::-;;41772:340;;;-1:-1:-1;41816:29:0;;;;;;;;;;;;-1:-1:-1;;;41816:29:0;;;;41772:340;;;41874:14;41867:3;:21;;;;;;;;:::i;:::-;;41863:249;;;-1:-1:-1;41905:27:0;;;;;;;;;;;;-1:-1:-1;;;41905:27:0;;;;41863:249;;;41961:14;41954:3;:21;;;;;;;;:::i;:::-;;41950:162;;;-1:-1:-1;41992:27:0;;;;;;;;;;;;-1:-1:-1;;;41992:27:0;;;;41950:162;;;42048:13;42041:3;:20;;;;;;;;:::i;:::-;;42037:75;;;-1:-1:-1;42078:22:0;;;;;;;;;;;;-1:-1:-1;;;42078:22:0;;;;42037:75;42137:6;42132:250;42153:2;42149:1;:6;42132:250;;;42177:26;42206:9;42216:1;42206:12;;;;;;;:::i;:::-;;;;;42177:41;;42262:4;42251:15;;;;;;;;:::i;:::-;:7;:15;;;;;;;;:::i;:::-;;42247:124;;42313:6;42321:28;42341:7;42321:19;:28::i;:::-;42296:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42287:68;;42247:124;-1:-1:-1;42157:3:0;;;:::i;:::-;;;42132:250;;;;42402:20;42442:13;42462:12;42425:50;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;42425:50:0;;;;;;;;;;-1:-1:-1;42515:19:0;42500:11;:34;;;;;;;;:::i;:::-;;42496:116;;;42592:7;42561:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;42551:49;;42496:116;42632:21;42729:7;42656:97;;;;;;;;:::i;:::-;;;;;;;;;;;;;42632:121;;42805:6;42813:8;42788:39;;;;;;;;;:::i;:::-;;;;;;;;;;;;;42774:54;;;;;;;;;;;;;40274:2562;;;;:::o;20183:3195::-;20300:13;;;20311:1;20300:13;;;;;;;;;20243:14;;;;20300:13;;;;;;;;;;;-1:-1:-1;20300:13:0;20270:43;;20339:6;20334:75;20351:1;20347;:5;20334:75;;;20393:4;20374:13;20388:1;20374:16;;;;;;;;:::i;:::-;;;;;;;;;;:23;20354:3;;;;:::i;:::-;;;;20334:75;;;;20434:14;:25;20449:4;:9;;;20434:25;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;20460:4;:8;;;20434:35;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;20434:35:0;;;;20429:110;;20524:3;20487:13;20506;20487:34;;;;;;;;:::i;:::-;;;;;;:40;;;;;20429:110;20576:29;20563:4;:9;;;:42;;;;;;;;:::i;:::-;;20559:96;;;-1:-1:-1;20629:14:0;;20183:3195;-1:-1:-1;;20183:3195:0:o;20559:96::-;20682:22;20669:4;:9;;;:35;;;;;;;;:::i;:::-;;:90;;;-1:-1:-1;20734:25:0;20721:4;:9;;;:38;;;;;;;;:::i;:::-;;20669:90;:180;;;-1:-1:-1;20789:25:0;20777:4;:8;;;:37;;;;;;;;:::i;:::-;;;:71;;;;;20818:25;20838:4;20818:19;:25::i;:::-;:30;;20847:1;20818:30;20777:71;20665:246;;;-1:-1:-1;20883:16:0;;20183:3195;-1:-1:-1;;20183:3195:0:o;20665:246::-;20948:25;20936:4;:8;;;:37;;;;;;;;:::i;:::-;;:71;;;;20977:25;20997:4;20977:19;:25::i;:::-;:30;;21006:1;20977:30;20936:71;20935:132;;;;-1:-1:-1;21039:28:0;21025:4;:10;;;:42;;;;;;;;:::i;:::-;;20935:132;:256;;;;;21085:32;21096:4;21102:14;21085:10;:32::i;:::-;:105;;;;21135:34;21146:4;21152:16;21135:10;:34::i;:::-;:54;;;;;21173:16;21184:4;21173:10;:16::i;:::-;20931:521;;;21257:1;21218:13;21237:14;21218:35;;;;;;;;:::i;:::-;;;;;;:40;;;;;;;:::i;:::-;;;-1:-1:-1;21311:1:0;21273:13;21292;21273:34;;;;;;;;:::i;:::-;;;;;;:39;;;;;;;:::i;:::-;;;-1:-1:-1;21346:16:0;21357:4;21346:10;:16::i;:::-;21341:100;;21424:1;21383:13;21402:16;21383:37;;;;;;;;:::i;:::-;;;;;;:42;;;;;;;:::i;:::-;;;-1:-1:-1;21341:100:0;21488:2;21476:4;:9;;;:14;;;:52;;;;;21494:34;21505:4;21511:16;21494:10;:34::i;:::-;21476:106;;;;-1:-1:-1;21557:25:0;21545:4;:8;;;:37;;;;;;;;:::i;:::-;;;21476:106;:205;;;;-1:-1:-1;21613:21:0;21600:4;:9;;;:34;;;;;;;;:::i;:::-;;:80;;;-1:-1:-1;21651:29:0;21638:4;:9;;;:42;;;;;;;;:::i;:::-;;21600:80;21476:252;;;;;21698:25;21718:4;21698:19;:25::i;:::-;:30;;21727:1;21698:30;;21476:252;21472:318;;;-1:-1:-1;21762:16:0;;20183:3195;-1:-1:-1;;20183:3195:0:o;21472:318::-;21826:2;21814:4;:9;;;:14;;;:67;;;;-1:-1:-1;21856:25:0;21844:4;:8;;;:37;;;;;;;;:::i;:::-;;;21814:67;:165;;;;-1:-1:-1;21911:21:0;21898:4;:9;;;:34;;;;;;;;:::i;:::-;;:80;;;-1:-1:-1;21949:29:0;21936:4;:9;;;:42;;;;;;;;:::i;:::-;;21898:80;21814:251;;;;;21996:32;22007:4;22013:14;21996:10;:32::i;:::-;:68;;;;22032:32;22043:4;22049:14;22032:10;:32::i;:::-;21810:388;;;22132:1;22092:13;22132:1;22092:37;;;;;;;;:::i;:::-;;;;;;;;;;:41;22185:1;22148:13;22167;22148:34;;;;;;;;:::i;:::-;;;;;;:38;;;;;21810:388;22223:26;22244:4;22223:20;:26::i;:::-;22222:27;:181;;;;;22268:32;22279:4;22285:14;22268:10;:32::i;:::-;:84;;;;22318:34;22329:4;22335:16;22318:10;:34::i;:::-;22268:134;;;;22370:32;22381:4;22387:14;22370:10;:32::i;:::-;22218:262;;;22467:1;22430:13;22449;22430:34;;;;;;;;:::i;:::-;;;;;;:38;;;;;22218:262;22516:25;22504:4;:8;;;:37;;;;;;;;:::i;:::-;;;:102;;;;-1:-1:-1;22571:35:0;22558:4;:9;;;:48;;;;;;;;:::i;:::-;;22504:102;:201;;;;-1:-1:-1;22637:21:0;22624:4;:9;;;:34;;;;;;;;:::i;:::-;;:80;;;-1:-1:-1;22675:29:0;22662:4;:9;;;:42;;;;;;;;:::i;:::-;;22624:80;22500:282;;;22769:1;22732:13;22751;22732:34;;;;;;;;:::i;:::-;;;;;;:38;;;;;22500:282;22819:34;22806:4;:9;;;:47;;;;;;;;:::i;:::-;;:201;;;;;22872:32;22883:4;22889:14;22872:10;:32::i;:::-;:84;;;;22922:34;22933:4;22939:16;22922:10;:34::i;:::-;22872:134;;;;22974:32;22985:4;22991:14;22974:10;:32::i;:::-;22802:282;;;23071:1;23034:13;23053;23034:34;;;;;;;;:::i;:::-;;;;;;:38;;;;;22802:282;23109:6;23104:141;23121:1;23117;:5;23104:141;;;23149:28;23160:4;23174:1;23166:10;;;;;;;;:::i;23149:28::-;23144:90;;23217:1;23198:13;23212:1;23198:16;;;;;;;;:::i;:::-;;;;;;:20;;;;;23144:90;23124:3;;;;:::i;:::-;;;;23104:141;;;;23265:17;23285:47;23300:4;23306:13;23285:47;;;;;;;;;;;;;-1:-1:-1;;;23285:47:0;;;:14;:47::i;:::-;23265:67;;23358:11;23350:20;;;;;;;;;;:::i;46433:435::-;2012:13;:11;:13::i;:::-;46569:6:::1;46564:297;46581:8;:15;46577:1;:19;46564:297;;;46618:24;46645:8;46654:1;46645:11;;;;;;;;:::i;:::-;;;;;;;46618:38;;46671:27;46701:9;46711:1;46701:12;;;;;;;;:::i;:::-;;;;;;;46671:42;;46780:8;46742:23;46766:10;46742:35;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:46;;-1:-1:-1;;46742:46:0::1;::::0;;::::1;::::0;::::1;;;;;;:::i;:::-;;;;;;46839:10;46803:23;:33;46827:8;46803:33;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;;;;;;;;;;;;:::i;:::-;;46603:258;;46598:3;;;;;:::i;:::-;;;;46564:297;;32664:346:::0;2012:13;:11;:13::i;:::-;32799:6:::1;32794:209;32811:5;:12;32807:1;:16;32794:209;;;32845:23;32871:5;32877:1;32871:8;;;;;;;;:::i;:::-;;;;;;;32845:34;;32894:22;32919:5;32925:1;32919:8;;;;;;;;:::i;:::-;;;;;;;32894:33;;32987:4;32956:17:::0;:23:::1;32974:4;32956:23;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:28;32980:3;32956:28;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;32956:28:0;:35;;-1:-1:-1;;32956:35:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;32825:3:0;;-1:-1:-1;32825:3:0::1;::::0;::::1;:::i;:::-;;;;32794:209;;35257:148:::0;35326:4;35351:25;:36;35377:4;:9;;;35351:36;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:46;35388:4;:8;;;35351:46;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;35351:46:0;;;;35350:47;;35257:148;-1:-1:-1;;35257:148:0:o;47177:413::-;2012:13;:11;:13::i;:::-;47331:6:::1;47326:257;47343:5;:12;47339:1;:16;47326:257;;;47377:23;47403:5;47409:1;47403:8;;;;;;;;:::i;:::-;;;;;;;47377:34;;47426:22;47451:5;47457:1;47451:8;;;;;;;;:::i;:::-;;;;;;;47426:33;;47474:11;47488:4;47493:1;47488:7;;;;;;;;:::i;:::-;;;;;;;47474:21;;47567:4;47524:24;:30;47549:4;47524:30;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:35;47555:3;47524:35;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:40;47560:3;47524:40;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;47524:40:0;:47;;-1:-1:-1;;47524:47:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;47357:3:0;;-1:-1:-1;47357:3:0::1;::::0;-1:-1:-1;47357:3:0;::::1;:::i;:::-;;;;47326:257;;;;47177:413:::0;;;:::o;35531:385::-;2012:13;:11;:13::i;:::-;35689:6:::1;35684:225;35705:5;:12;35701:1;:16;35684:225;;;35739:23;35765:5;35771:1;35765:8;;;;;;;;:::i;:::-;;;;;;;35739:34;;35788:22;35813:5;35819:1;35813:8;;;;;;;;:::i;:::-;;;;;;;35788:33;;35890:4;35895:1;35890:7;;;;;;;;:::i;:::-;;;;;;;35850:26;:32;35877:4;35850:32;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:37;35883:3;35850:37;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;35724:185;;35719:3;;;;;:::i;:::-;;;;35684:225;;34411:344:::0;2012:13;:11;:13::i;:::-;34543:6:::1;34538:210;34559:5;:12;34555:1;:16;34538:210;;;34593:23;34619:5;34625:1;34619:8;;;;;;;;:::i;:::-;;;;;;;34593:34;;34642:22;34667:5;34673:1;34667:8;;;;;;;;:::i;:::-;;;;;;;34642:33;;34732:4;34704:14;:20;34719:4;34704:20;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;34725:3;34704:25;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;34704:25:0;:32;;-1:-1:-1;;34704:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;34573:3:0;;-1:-1:-1;34573:3:0::1;::::0;::::1;:::i;:::-;;;;34538:210;;35928:152:::0;35996:9;36025:26;:37;36052:4;:9;;;36025:37;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:47;36063:4;:8;;;36025:47;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;36025:47:0;;;;;35928:152;-1:-1:-1;;35928:152:0:o;47011:154::-;47083:4;47107:24;:35;47132:4;:9;;;47107:35;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:45;47143:4;:8;;;47107:45;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:50;47153:3;47107:50;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;47107:50:0;;;;;47011:154;-1:-1:-1;;;47011:154:0:o;3032:201::-;2012:13;:11;:13::i;:::-;-1:-1:-1;;;;;3121:22:0;::::1;3113:73;;;::::0;-1:-1:-1;;;3113:73:0;;27039:2:1;3113:73:0::1;::::0;::::1;27021:21:1::0;27078:2;27058:18;;;27051:30;27117:34;27097:18;;;27090:62;-1:-1:-1;;;27168:18:1;;;27161:36;27214:19;;3113:73:0::1;;;;;;;;;3197:28;3216:8;3197:18;:28::i;:::-;3032:201:::0;:::o;46352:68::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33022:229::-;33081:4;33103:34;33114:4;33120:16;33103:10;:34::i;:::-;33098:80;;-1:-1:-1;33161:5:0;;33022:229;-1:-1:-1;33022:229:0:o;33098:80::-;33205:17;:28;33223:4;:9;;;33205:28;;;;;;;;:::i;2291:132::-;2172:7;2199:6;-1:-1:-1;;;;;2199:6:0;758:10;2355:23;2347:68;;;;-1:-1:-1;;;2347:68:0;;27831:2:1;2347:68:0;;;27813:21:1;;;27850:18;;;27843:30;27909:34;27889:18;;;27882:62;27961:18;;2347:68:0;27629:356:1;4020:723:0;4076:13;4297:10;4293:53;;-1:-1:-1;;4324:10:0;;;;;;;;;;;;-1:-1:-1;;;4324:10:0;;;;;4020:723::o;4293:53::-;4371:5;4356:12;4412:78;4419:9;;4412:78;;4445:8;;;;:::i;:::-;;-1:-1:-1;4468:10:0;;-1:-1:-1;4476:2:0;4468:10;;:::i;:::-;;;4412:78;;;4500:19;4532:6;-1:-1:-1;;;;;4522:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4522:17:0;;4500:39;;4550:154;4557:10;;4550:154;;4584:11;4594:1;4584:11;;:::i;:::-;;-1:-1:-1;4653:10:0;4661:2;4653:5;:10;:::i;:::-;4640:24;;:2;:24;:::i;:::-;4627:39;;4610:6;4617;4610:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4610:56:0;;;;;;;;-1:-1:-1;4681:11:0;4690:2;4681:11;;:::i;:::-;;;4550:154;;12061:1267;12169:24;12238:5;12206:23;12304:1;12316:280;12353:1;12333:10;:17;:21;;;;:::i;:::-;12323:7;:31;12316:280;;;12371:10;12384:32;12393:5;12400:6;12408:7;12384:8;:32::i;:::-;12371:45;;12435:6;-1:-1:-1;;12435:12:0;12431:154;;;12466:5;;;12431:154;12510:14;;;;:::i;:::-;;-1:-1:-1;12553:16:0;;-1:-1:-1;12558:6:0;12568:1;12553:16;:::i;:::-;12543:26;;12356:240;12316:280;;;12632:12;-1:-1:-1;;;;;12619:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12608:37;;12668:1;12658:11;;12695:1;12680:16;;12707:588;12744:1;12724:10;:17;:21;;;;:::i;:::-;12714:7;:31;12707:588;;;12764:10;12777:32;12786:5;12793:6;12801:7;12777:8;:32::i;:::-;12764:45;;12828:6;-1:-1:-1;;12828:13:0;12824:85;;;-1:-1:-1;12875:17:0;;12824:85;12925:18;12957:22;12972:7;12962:6;12957:22;:::i;:::-;-1:-1:-1;;;;;12946:34:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12946:34:0;-1:-1:-1;12925:55:0;-1:-1:-1;12925:55:0;12995:22;13087:7;13073:111;13105:6;13096:1;:16;13073:111;;;13155:10;13166:1;13155:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;13155:13:0;13138:9;13148:3;;;;:::i;:::-;;;13138:14;;;;;;;;:::i;:::-;;;;:30;-1:-1:-1;;;;;13138:30:0;;;;;;;;-1:-1:-1;13114:3:0;;;;:::i;:::-;;;;13073:111;;;-1:-1:-1;13208:16:0;13213:6;13223:1;13208:16;:::i;:::-;13198:26;-1:-1:-1;13273:9:0;13239:8;13248:14;;;;:::i;:::-;;;13239:24;;;;;;;;:::i;:::-;;;;;;:44;;;;12747:548;;;;12707:588;;;13305:15;;;12061:1267;;;;:::o;11501:550::-;11729:17;;11618:13;;11676:5;;11707:17;11717:7;11707;:17;:::i;:::-;11702:44;;11695:52;;;;:::i;:::-;11760:18;11797:7;-1:-1:-1;;;;;11781:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11781:25:0;-1:-1:-1;11760:46:0;-1:-1:-1;11760:46:0;11817:22;11906:7;11887:120;11925:17;11935:7;11925;:17;:::i;:::-;11916:1;:27;11887:120;;;11982:10;11993:1;11982:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;11982:13:0;11965:9;11975:3;;;;:::i;:::-;;;11965:14;;;;;;;;:::i;:::-;;;;:30;-1:-1:-1;;;;;11965:30:0;;;;;;;;-1:-1:-1;11945:3:0;;;;:::i;:::-;;;;11887:120;;;-1:-1:-1;12033:9:0;;11501:550;-1:-1:-1;;;;;;;11501:550:0:o;3393:191::-;3467:16;3486:6;;-1:-1:-1;;;;;3503:17:0;;;-1:-1:-1;;;;;;3503:17:0;;;;;;3536:40;;3486:6;;;;;;;3536:40;;3467:16;3536:40;3456:128;3393:191;:::o;42848:1890::-;42930:18;42982:23;42969:9;:36;;;;;;;;:::i;:::-;;;42961:45;;;;;;43027:31;43061:23;:34;43085:9;43061:34;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;43027:68;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43106:35;43162:26;43191;:37;43218:9;43191:37;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;43191:37:0;;;;;;;-1:-1:-1;43253:8:0;:33;;;;;;;;:::i;:::-;;43249:1347;;;43303:29;;;;;;;;;;;;;-1:-1:-1;;;43303:29:0;;;;;43249:1347;;;43366:22;43354:8;:34;;;;;;;;:::i;:::-;;43350:1246;;;43405:30;;;;;;;;;;;;;-1:-1:-1;;;43405:30:0;;;;;43350:1246;;;43469:22;43457:8;:34;;;;;;;;:::i;:::-;;43453:1143;;;43508:30;;;;;;;;;;;;;-1:-1:-1;;;43508:30:0;;;;;43453:1143;;;43572:23;43560:8;:35;;;;;;;;:::i;:::-;;43556:1040;;;43612:31;;;;;;;;;;;;;-1:-1:-1;;;43612:31:0;;;;;43556:1040;;;43677:22;43665:8;:34;;;;;;;;:::i;:::-;;43661:935;;;43716:30;;;;;;;;;;;;;-1:-1:-1;;;43716:30:0;;;;;43661:935;;;43780:22;43768:8;:34;;;;;;;;:::i;:::-;;43764:832;;;43819:30;;;;;;;;;;;;;-1:-1:-1;;;43819:30:0;;;;;43764:832;;;43883:23;43871:8;:35;;;;;;;;:::i;:::-;;43867:729;;;43923:31;;;;;;;;;;;;;-1:-1:-1;;;43923:31:0;;;;;43867:729;;;43988:22;43976:8;:34;;;;;;;;:::i;:::-;;43972:624;;;44027:30;;;;;;;;;;;;;-1:-1:-1;;;44027:30:0;;;;;43972:624;;;44091:25;44079:8;:37;;;;;;;;:::i;:::-;;44075:521;;;44133:33;;;;;;;;;;;;;-1:-1:-1;;;44133:33:0;;;;;44075:521;;;44200:22;44188:8;:34;;;;;;;;:::i;:::-;;44184:412;;;44239:30;;;;;;;;;;;;;-1:-1:-1;;;44239:30:0;;;;;44184:412;;;44303:22;44291:8;:34;;;;;;;;:::i;:::-;;44287:309;;;44342:30;;;;;;;;;;;;;-1:-1:-1;;;44342:30:0;;;;;44287:309;;;44406:24;44394:8;:36;;;;;;;;:::i;:::-;;44390:206;;;44447:32;;;;;;;;;;;;;-1:-1:-1;;;44447:32:0;;;;;44390:206;;;44513:23;44501:8;:35;;;;;;;;:::i;:::-;;44497:99;;;44553:31;;;;;;;;;;;;;-1:-1:-1;;;44553:31:0;;;;;44497:99;44666:21;44705:17;44630:99;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44616:114;;;;;42848:1890;;;:::o;9255:478::-;9505:18;;9380:3;;9428:5;;9478:6;;9527:1;9505:23;9498:31;;;;:::i;:::-;9556:7;9542:162;9569:10;:17;9565:1;:21;9542:162;;;9629:11;9641:1;9629:14;;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;9612:31:0;;:10;9623:1;9612:13;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;9612:13:0;:31;9608:85;;;9675:1;-1:-1:-1;9664:13:0;;-1:-1:-1;;9664:13:0;9608:85;9588:3;;;;:::i;:::-;;;;9542:162;;;-1:-1:-1;;;9723:2:0;9255:478;-1:-1:-1;;;;;;9255:478:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:127:1;75:10;70:3;66:20;63:1;56:31;106:4;103:1;96:15;130:4;127:1;120:15;146:255;218:2;212:9;260:6;248:19;;-1:-1:-1;;;;;282:34:1;;318:22;;;279:62;276:88;;;344:18;;:::i;:::-;380:2;373:22;146:255;:::o;406:275::-;477:2;471:9;542:2;523:13;;-1:-1:-1;;519:27:1;507:40;;-1:-1:-1;;;;;562:34:1;;598:22;;;559:62;556:88;;;624:18;;:::i;:::-;660:2;653:22;406:275;;-1:-1:-1;406:275:1:o;686:191::-;754:4;-1:-1:-1;;;;;779:6:1;776:30;773:56;;;809:18;;:::i;:::-;-1:-1:-1;854:1:1;850:14;866:4;846:25;;686:191::o;882:837::-;934:5;987:3;980:4;972:6;968:17;964:27;954:55;;1005:1;1002;995:12;954:55;1041:6;1028:20;1067:4;1091:68;1107:51;1155:2;1107:51;:::i;:::-;1091:68;:::i;:::-;1193:15;;;1279:1;1275:10;;;;1263:23;;1259:32;;;1224:12;;;;1303:15;;;1300:35;;;1331:1;1328;1321:12;1300:35;1367:2;1359:6;1355:15;1379:311;1395:6;1390:3;1387:15;1379:311;;;1475:3;1462:17;1523:4;1516:5;1512:16;1505:5;1502:27;1492:125;;1571:1;1600:2;1596;1589:14;1492:125;1630:18;;1668:12;;;;1412;;1379:311;;;-1:-1:-1;1708:5:1;882:837;-1:-1:-1;;;;;;882:837:1:o;1724:1163::-;1831:6;1862:2;1905;1893:9;1884:7;1880:23;1876:32;1873:52;;;1921:1;1918;1911:12;1873:52;1961:9;1948:23;-1:-1:-1;;;;;2031:2:1;2023:6;2020:14;2017:34;;;2047:1;2044;2037:12;2017:34;2085:6;2074:9;2070:22;2060:32;;2130:7;2123:4;2119:2;2115:13;2111:27;2101:55;;2152:1;2149;2142:12;2101:55;2188:2;2175:16;2211:68;2227:51;2275:2;2227:51;:::i;2211:68::-;2313:15;;;2395:1;2391:10;;;;2383:19;;2379:28;;;2344:12;;;;2419:19;;;2416:39;;;2451:1;2448;2441:12;2416:39;2483:2;2479;2475:11;2495:362;2511:6;2506:3;2503:15;2495:362;;;2597:3;2584:17;2633:2;2620:11;2617:19;2614:109;;;2677:1;2706:2;2702;2695:14;2614:109;2748:66;2806:7;2801:2;2787:11;2783:2;2779:20;2775:29;2748:66;:::i;:::-;2736:79;;-1:-1:-1;2835:12:1;;;;2528;;2495:362;;;-1:-1:-1;2876:5:1;1724:1163;-1:-1:-1;;;;;;;;1724:1163:1:o;2892:160::-;2976:20;;3025:2;3015:13;;3005:41;;3042:1;3039;3032:12;3005:41;2892:160;;;:::o;3057:338::-;3171:6;3179;3232:2;3220:9;3211:7;3207:23;3203:32;3200:52;;;3248:1;3245;3238:12;3200:52;3271:45;3306:9;3271:45;:::i;:::-;3261:55;;3335:54;3385:2;3374:9;3370:18;3335:54;:::i;:::-;3325:64;;3057:338;;;;;:::o;3592:159::-;3659:20;;3719:6;3708:18;;3698:29;;3688:57;;3741:1;3738;3731:12;3756:1584;3807:5;3855:6;3843:9;3838:3;3834:19;3830:32;3827:52;;;3875:1;3872;3865:12;3827:52;3897:22;;:::i;:::-;3888:31;;3942:28;3960:9;3942:28;:::i;:::-;3935:5;3928:43;4003:37;4036:2;4025:9;4021:18;4003:37;:::i;:::-;3998:2;3991:5;3987:14;3980:61;4073:54;4123:2;4112:9;4108:18;4073:54;:::i;:::-;4068:2;4061:5;4057:14;4050:78;4160:54;4210:2;4199:9;4195:18;4160:54;:::i;:::-;4155:2;4148:5;4144:14;4137:78;4248:55;4298:3;4287:9;4283:19;4248:55;:::i;:::-;4242:3;4235:5;4231:15;4224:80;4337:55;4387:3;4376:9;4372:19;4337:55;:::i;:::-;4331:3;4324:5;4320:15;4313:80;4426:55;4476:3;4465:9;4461:19;4426:55;:::i;:::-;4420:3;4413:5;4409:15;4402:80;4515:55;4565:3;4554:9;4550:19;4515:55;:::i;:::-;4509:3;4502:5;4498:15;4491:80;4590:3;4625:54;4675:2;4664:9;4660:18;4625:54;:::i;:::-;4609:14;;;4602:78;4699:3;4734:54;4769:18;;;4734:54;:::i;:::-;4718:14;;;4711:78;4808:3;4843:54;4878:18;;;4843:54;:::i;:::-;4827:14;;;4820:78;4917:3;4952:54;4987:18;;;4952:54;:::i;:::-;4936:14;;;4929:78;5026:3;5061:54;5096:18;;;5061:54;:::i;:::-;5045:14;;;5038:78;5135:3;5170:54;5205:18;;;5170:54;:::i;:::-;5154:14;;;5147:78;5244:3;5279:54;5314:18;;;5279:54;:::i;:::-;5263:14;;;5256:78;5267:5;3756:1584;-1:-1:-1;;3756:1584:1:o;5345:222::-;5426:6;5479:3;5467:9;5458:7;5454:23;5450:33;5447:53;;;5496:1;5493;5486:12;5447:53;5519:42;5553:7;5542:9;5519:42;:::i;5572:127::-;5633:10;5628:3;5624:20;5621:1;5614:31;5664:4;5661:1;5654:15;5688:4;5685:1;5678:15;5704:244;5849:2;5834:18;;5882:1;5871:13;;5861:47;;5888:18;;:::i;:::-;5917:25;;;5704:244;:::o;5953:187::-;6002:4;-1:-1:-1;;;;;6027:6:1;6024:30;6021:56;;;6057:18;;:::i;:::-;-1:-1:-1;6123:2:1;6102:15;-1:-1:-1;;6098:29:1;6129:4;6094:40;;5953:187::o;6145:464::-;6188:5;6241:3;6234:4;6226:6;6222:17;6218:27;6208:55;;6259:1;6256;6249:12;6208:55;6295:6;6282:20;6326:49;6342:32;6371:2;6342:32;:::i;6326:49::-;6400:2;6391:7;6384:19;6446:3;6439:4;6434:2;6426:6;6422:15;6418:26;6415:35;6412:55;;;6463:1;6460;6453:12;6412:55;6528:2;6521:4;6513:6;6509:17;6502:4;6493:7;6489:18;6476:55;6576:1;6551:16;;;6569:4;6547:27;6540:38;;;;6555:7;6145:464;-1:-1:-1;;;6145:464:1:o;6614:502::-;6723:6;6731;6739;6792:3;6780:9;6771:7;6767:23;6763:33;6760:53;;;6809:1;6806;6799:12;6760:53;6832:42;6866:7;6855:9;6832:42;:::i;:::-;6822:52;;6921:3;6910:9;6906:19;6893:33;6883:43;;6977:3;6966:9;6962:19;6949:33;-1:-1:-1;;;;;6997:6:1;6994:30;6991:50;;;7037:1;7034;7027:12;6991:50;7060;7102:7;7093:6;7082:9;7078:22;7060:50;:::i;:::-;7050:60;;;6614:502;;;;;:::o;7303:116::-;7387:1;7380:5;7377:12;7367:46;;7393:18;;:::i;7424:241::-;7572:2;7557:18;;7584:41;7618:6;7584:41;:::i;7670:708::-;7740:5;7793:3;7786:4;7778:6;7774:17;7770:27;7760:55;;7811:1;7808;7801:12;7760:55;7847:6;7834:20;7873:4;7897:68;7913:51;7961:2;7913:51;:::i;7897:68::-;7999:15;;;8085:1;8081:10;;;;8069:23;;8065:32;;;8030:12;;;;8109:15;;;8106:35;;;8137:1;8134;8127:12;8106:35;8173:2;8165:6;8161:15;8185:164;8201:6;8196:3;8193:15;8185:164;;;8267:39;8302:3;8267:39;:::i;:::-;8255:52;;8327:12;;;;8218;;8185:164;;8383:673;8547:6;8555;8608:2;8596:9;8587:7;8583:23;8579:32;8576:52;;;8624:1;8621;8614:12;8576:52;8664:9;8651:23;-1:-1:-1;;;;;8734:2:1;8726:6;8723:14;8720:34;;;8750:1;8747;8740:12;8720:34;8773:77;8842:7;8833:6;8822:9;8818:22;8773:77;:::i;:::-;8763:87;;8903:2;8892:9;8888:18;8875:32;8859:48;;8932:2;8922:8;8919:16;8916:36;;;8948:1;8945;8938:12;8916:36;;8971:79;9042:7;9031:8;9020:9;9016:24;8971:79;:::i;:::-;8961:89;;;8383:673;;;;;:::o;9061:256::-;9127:6;9135;9188:2;9176:9;9167:7;9163:23;9159:32;9156:52;;;9204:1;9201;9194:12;9156:52;9227:28;9245:9;9227:28;:::i;:::-;9217:38;;9274:37;9307:2;9296:9;9292:18;9274:37;:::i;9417:150::-;9507:2;9500:5;9497:13;9487:47;;9514:18;;:::i;:::-;9543;;9417:150::o;9572:2278::-;9781:13;;9398:6;9387:18;9375:31;;9750:3;9735:19;;9853:4;9845:6;9841:17;9835:24;9868:53;9915:4;9904:9;9900:20;9886:12;9398:6;9387:18;9375:31;;9322:90;9868:53;;9970:4;9962:6;9958:17;9952:24;9985:72;10051:4;10040:9;10036:20;10020:14;9985:72;:::i;:::-;;10106:4;10098:6;10094:17;10088:24;10121:72;10187:4;10176:9;10172:20;10156:14;10121:72;:::i;:::-;;10242:4;10234:6;10230:17;10224:24;10257:72;10323:4;10312:9;10308:20;10292:14;10257:72;:::i;:::-;;10378:4;10370:6;10366:17;10360:24;10393:72;10459:4;10448:9;10444:20;10428:14;10393:72;:::i;:::-;;10514:4;10506:6;10502:17;10496:24;10529:72;10595:4;10584:9;10580:20;10564:14;10529:72;:::i;:::-;;10650:4;10642:6;10638:17;10632:24;10665:72;10731:4;10720:9;10716:20;10700:14;10665:72;:::i;:::-;;10756:6;10811:2;10803:6;10799:15;10793:22;10824:70;10890:2;10879:9;10875:18;10859:14;10824:70;:::i;:::-;;;10913:6;10968:2;10960:6;10956:15;10950:22;10981:70;11047:2;11036:9;11032:18;11016:14;10981:70;:::i;:::-;;;11070:6;11125:2;11117:6;11113:15;11107:22;11138:70;11204:2;11193:9;11189:18;11173:14;11138:70;:::i;:::-;;;11227:6;11283:2;11275:6;11271:15;11265:22;11296:71;11363:2;11352:9;11348:18;11331:15;11296:71;:::i;:::-;;;11386:6;11442:2;11434:6;11430:15;11424:22;11455:71;11522:2;11511:9;11507:18;11490:15;11455:71;:::i;:::-;;;11545:6;11601:2;11593:6;11589:15;11583:22;11614:71;11681:2;11670:9;11666:18;11649:15;11614:71;:::i;:::-;;;11704:6;11760:2;11752:6;11748:15;11742:22;11773:71;11840:2;11829:9;11825:18;11808:15;11773:71;:::i;:::-;;;9572:2278;;;;:::o;11855:225::-;11937:6;11990:2;11978:9;11969:7;11965:23;11961:32;11958:52;;;12006:1;12003;11996:12;11958:52;12029:45;12064:9;12029:45;:::i;12085:254::-;12239:2;12224:18;;12272:2;12261:14;;12251:48;;12279:18;;:::i;12344:1234::-;12478:6;12486;12494;12547:3;12535:9;12526:7;12522:23;12518:33;12515:53;;;12564:1;12561;12554:12;12515:53;12587:42;12621:7;12610:9;12587:42;:::i;:::-;12577:52;;12680:3;12669:9;12665:19;12652:33;-1:-1:-1;;;;;12745:2:1;12737:6;12734:14;12731:34;;;12761:1;12758;12751:12;12731:34;12799:6;12788:9;12784:22;12774:32;;12844:7;12837:4;12833:2;12829:13;12825:27;12815:55;;12866:1;12863;12856:12;12815:55;12902:2;12889:16;12924:4;12948:68;12964:51;13012:2;12964:51;:::i;12948:68::-;13050:15;;;13132:1;13128:10;;;;13120:19;;13116:28;;;13081:12;;;;13156:19;;;13153:39;;;13188:1;13185;13178:12;13153:39;13212:11;;;;13232:142;13248:6;13243:3;13240:15;13232:142;;;13314:17;;13302:30;;13265:12;;;;13352;;;;13232:142;;;13393:5;-1:-1:-1;;;;13451:3:1;13436:19;;13423:33;;-1:-1:-1;13468:16:1;;;13465:36;;;13497:1;13494;13487:12;13465:36;;13520:52;13564:7;13553:8;13542:9;13538:24;13520:52;:::i;14014:258::-;14086:1;14096:113;14110:6;14107:1;14104:13;14096:113;;;14186:11;;;14180:18;14167:11;;;14160:39;14132:2;14125:10;14096:113;;;14227:6;14224:1;14221:13;14218:48;;;-1:-1:-1;;14262:1:1;14244:16;;14237:27;14014:258::o;14277:383::-;14426:2;14415:9;14408:21;14389:4;14458:6;14452:13;14501:6;14496:2;14485:9;14481:18;14474:34;14517:66;14576:6;14571:2;14560:9;14556:18;14551:2;14543:6;14539:15;14517:66;:::i;:::-;14644:2;14623:15;-1:-1:-1;;14619:29:1;14604:45;;;;14651:2;14600:54;;14277:383;-1:-1:-1;;14277:383:1:o;14873:243::-;15017:2;15002:18;;15050:1;15039:13;;15029:47;;15056:18;;:::i;15121:1408::-;15272:6;15280;15333:2;15321:9;15312:7;15308:23;15304:32;15301:52;;;15349:1;15346;15339:12;15301:52;15389:9;15376:23;-1:-1:-1;;;;;15459:2:1;15451:6;15448:14;15445:34;;;15475:1;15472;15465:12;15445:34;15513:6;15502:9;15498:22;15488:32;;15558:7;15551:4;15547:2;15543:13;15539:27;15529:55;;15580:1;15577;15570:12;15529:55;15616:2;15603:16;15638:4;15662:68;15678:51;15726:2;15678:51;:::i;15662:68::-;15764:15;;;15846:1;15842:10;;;;15834:19;;15830:28;;;15795:12;;;;15870:19;;;15867:39;;;15902:1;15899;15892:12;15867:39;15934:2;15930;15926:11;15946:353;15962:6;15957:3;15954:15;15946:353;;;16048:3;16035:17;16084:2;16071:11;16068:19;16065:109;;;16128:1;16157:2;16153;16146:14;16065:109;16199:57;16248:7;16243:2;16229:11;16225:2;16221:20;16217:29;16199:57;:::i;:::-;16187:70;;-1:-1:-1;16277:12:1;;;;15979;;15946:353;;;-1:-1:-1;16318:5:1;-1:-1:-1;;16361:18:1;;16348:32;;-1:-1:-1;;16392:16:1;;;16389:36;;;16421:1;16418;16411:12;16534:148;16607:20;;16656:1;16646:12;;16636:40;;16672:1;16669;16662:12;16687:1473;16897:6;16905;16913;16966:2;16954:9;16945:7;16941:23;16937:32;16934:52;;;16982:1;16979;16972:12;16934:52;17022:9;17009:23;-1:-1:-1;;;;;17092:2:1;17084:6;17081:14;17078:34;;;17108:1;17105;17098:12;17078:34;17131:77;17200:7;17191:6;17180:9;17176:22;17131:77;:::i;:::-;17121:87;;17227:2;17217:12;;17282:2;17271:9;17267:18;17254:32;17311:2;17301:8;17298:16;17295:36;;;17327:1;17324;17317:12;17295:36;17350:79;17421:7;17410:8;17399:9;17395:24;17350:79;:::i;:::-;17340:89;;;17482:2;17471:9;17467:18;17454:32;17511:2;17501:8;17498:16;17495:36;;;17527:1;17524;17517:12;17495:36;17550:24;;;-1:-1:-1;17605:4:1;17597:13;;17593:27;-1:-1:-1;17583:55:1;;17634:1;17631;17624:12;17583:55;17670:2;17657:16;17693:68;17709:51;17757:2;17709:51;:::i;17693:68::-;17795:15;;;17877:1;17873:10;;;;17865:19;;17861:28;;;17826:12;;;;17901:19;;;17898:39;;;17933:1;17930;17923:12;17898:39;17957:11;;;;17977:153;17993:6;17988:3;17985:15;17977:153;;;18059:28;18083:3;18059:28;:::i;:::-;18047:41;;18010:12;;;;18108;;;;17977:153;;;18149:5;18139:15;;;;;;;16687:1473;;;;;:::o;18165:895::-;18361:6;18369;18377;18430:2;18418:9;18409:7;18405:23;18401:32;18398:52;;;18446:1;18443;18436:12;18398:52;18486:9;18473:23;-1:-1:-1;;;;;18556:2:1;18548:6;18545:14;18542:34;;;18572:1;18569;18562:12;18542:34;18595:77;18664:7;18655:6;18644:9;18640:22;18595:77;:::i;:::-;18585:87;;18725:2;18714:9;18710:18;18697:32;18681:48;;18754:2;18744:8;18741:16;18738:36;;;18770:1;18767;18760:12;18738:36;18793:79;18864:7;18853:8;18842:9;18838:24;18793:79;:::i;:::-;18783:89;;18925:2;18914:9;18910:18;18897:32;18881:48;;18954:2;18944:8;18941:16;18938:36;;;18970:1;18967;18960:12;18938:36;;18993:61;19046:7;19035:8;19024:9;19020:24;18993:61;:::i;19065:322::-;19134:6;19187:2;19175:9;19166:7;19162:23;19158:32;19155:52;;;19203:1;19200;19193:12;19155:52;19243:9;19230:23;-1:-1:-1;;;;;19268:6:1;19265:30;19262:50;;;19308:1;19305;19298:12;19262:50;19331;19373:7;19364:6;19353:9;19349:22;19331:50;:::i;19392:226::-;19547:2;19532:18;;19559:53;19536:9;19594:6;19559:53;:::i;19623:429::-;19758:6;19766;19774;19827:2;19815:9;19806:7;19802:23;19798:32;19795:52;;;19843:1;19840;19833:12;19795:52;19866:45;19901:9;19866:45;:::i;:::-;19856:55;;19930:54;19980:2;19969:9;19965:18;19930:54;:::i;:::-;19920:64;;20003:43;20042:2;20031:9;20027:18;20003:43;:::i;:::-;19993:53;;19623:429;;;;;:::o;20057:314::-;20159:6;20167;20220:3;20208:9;20199:7;20195:23;20191:33;20188:53;;;20237:1;20234;20227:12;20188:53;20260:42;20294:7;20283:9;20260:42;:::i;:::-;20250:52;;20321:44;20360:3;20349:9;20345:19;20321:44;:::i;20376:286::-;20435:6;20488:2;20476:9;20467:7;20463:23;20459:32;20456:52;;;20504:1;20501;20494:12;20456:52;20530:23;;-1:-1:-1;;;;;20582:31:1;;20572:42;;20562:70;;20628:1;20625;20618:12;20667:127;20728:10;20723:3;20719:20;20716:1;20709:31;20759:4;20756:1;20749:15;20783:4;20780:1;20773:15;20799:127;20860:10;20855:3;20851:20;20848:1;20841:31;20891:4;20888:1;20881:15;20915:4;20912:1;20905:15;20931:135;20970:3;-1:-1:-1;;20991:17:1;;20988:43;;;21011:18;;:::i;:::-;-1:-1:-1;21058:1:1;21047:13;;20931:135::o;21071:127::-;21132:10;21127:3;21123:20;21120:1;21113:31;21163:4;21160:1;21153:15;21187:4;21184:1;21177:15;21203:120;21243:1;21269;21259:35;;21274:18;;:::i;:::-;-1:-1:-1;21308:9:1;;21203:120::o;21328:807::-;21656:3;21694:6;21688:13;21710:53;21756:6;21751:3;21744:4;21736:6;21732:17;21710:53;:::i;:::-;-1:-1:-1;;;21785:16:1;;;21810:18;;;21853:13;;21875:65;21853:13;21927:1;21916:13;;21909:4;21897:17;;21875:65;:::i;:::-;22004:13;;21959:20;;;22026:62;22004:13;22075:1;22067:10;;22060:4;22048:17;;22026:62;:::i;:::-;22108:17;22127:1;22104:25;;21328:807;-1:-1:-1;;;;;21328:807:1:o;22140:112::-;22172:1;22198;22188:35;;22203:18;;:::i;:::-;-1:-1:-1;22237:9:1;;22140:112::o;22450:636::-;22530:6;22583:2;22571:9;22562:7;22558:23;22554:32;22551:52;;;22599:1;22596;22589:12;22551:52;22632:9;22626:16;-1:-1:-1;;;;;22657:6:1;22654:30;22651:50;;;22697:1;22694;22687:12;22651:50;22720:22;;22773:4;22765:13;;22761:27;-1:-1:-1;22751:55:1;;22802:1;22799;22792:12;22751:55;22831:2;22825:9;22856:49;22872:32;22901:2;22872:32;:::i;22856:49::-;22928:2;22921:5;22914:17;22968:7;22963:2;22958;22954;22950:11;22946:20;22943:33;22940:53;;;22989:1;22986;22979:12;22940:53;23002:54;23053:2;23048;23041:5;23037:14;23032:2;23028;23024:11;23002:54;:::i;23091:125::-;23131:4;23159:1;23156;23153:8;23150:34;;;23164:18;;:::i;:::-;-1:-1:-1;23201:9:1;;23091:125::o;23221:276::-;23352:3;23390:6;23384:13;23406:53;23452:6;23447:3;23440:4;23432:6;23428:17;23406:53;:::i;:::-;23475:16;;;;;23221:276;-1:-1:-1;;23221:276:1:o;23502:128::-;23542:3;23573:1;23569:6;23566:1;23563:13;23560:39;;;23579:18;;:::i;:::-;-1:-1:-1;23615:9:1;;23502:128::o;23635:175::-;23672:3;23716:4;23709:5;23705:16;23745:4;23736:7;23733:17;23730:43;;;23753:18;;:::i;:::-;23802:1;23789:15;;23635:175;-1:-1:-1;;23635:175:1:o;23815:631::-;24093:3;24131:6;24125:13;24147:53;24193:6;24188:3;24181:4;24173:6;24169:17;24147:53;:::i;:::-;24263:13;;24222:16;;;;24285:57;24263:13;24222:16;24319:4;24307:17;;24285:57;:::i;:::-;-1:-1:-1;;;24364:20:1;;24393:18;;;24438:1;24427:13;;23815:631;-1:-1:-1;;;;23815:631:1:o;24451:610::-;24727:3;24765:6;24759:13;24781:53;24827:6;24822:3;24815:4;24807:6;24803:17;24781:53;:::i;:::-;-1:-1:-1;;;24856:16:1;;;24881:18;;;24924:13;;24946:65;24924:13;24998:1;24987:13;;24980:4;24968:17;;24946:65;:::i;:::-;25031:20;25053:1;25027:28;;24451:610;-1:-1:-1;;;;24451:610:1:o;25066:427::-;-1:-1:-1;;;25321:3:1;25314:25;25296:3;25368:6;25362:13;25384:62;25439:6;25434:2;25429:3;25425:12;25418:4;25410:6;25406:17;25384:62;:::i;:::-;25466:16;;;;25484:2;25462:25;;25066:427;-1:-1:-1;;25066:427:1:o;25498:700::-;25859:66;25854:3;25847:79;25965:14;25960:3;25956:24;25951:2;25946:3;25942:12;25935:46;25829:3;26010:6;26004:13;26026:60;26079:6;26074:2;26069:3;26065:12;26060:2;26052:6;26048:15;26026:60;:::i;:::-;-1:-1:-1;;;26145:2:1;26105:16;;;;26137:11;;;26130:35;-1:-1:-1;26189:2:1;26181:11;;25498:700;-1:-1:-1;25498:700:1:o;26203:629::-;26479:3;26517:6;26511:13;26533:53;26579:6;26574:3;26567:4;26559:6;26555:17;26533:53;:::i;:::-;26649:13;;26608:16;;;;26671:57;26649:13;26608:16;26705:4;26693:17;;26671:57;:::i;:::-;-1:-1:-1;;;26750:20:1;;26779:18;;;26824:1;26813:13;;26203:629;-1:-1:-1;;;;26203:629:1:o;27244:380::-;27323:1;27319:12;;;;27366;;;27387:61;;27441:4;27433:6;27429:17;27419:27;;27387:61;27494:2;27486:6;27483:14;27463:18;27460:38;27457:161;;;27540:10;27535:3;27531:20;27528:1;27521:31;27575:4;27572:1;27565:15;27603:4;27600:1;27593:15;27457:161;;27244:380;;;:::o;27990:265::-;28029:3;28057:9;;;28082:10;;-1:-1:-1;;;;;28101:27:1;;;28094:35;;28078:52;28075:78;;;28133:18;;:::i;:::-;-1:-1:-1;;;28180:19:1;;;28173:27;;28165:36;;28162:62;;;28204:18;;:::i;:::-;-1:-1:-1;;28240:9:1;;27990:265::o;28260:127::-;28321:10;28316:3;28312:20;28309:1;28302:31;28352:4;28349:1;28342:15;28376:4;28373:1;28366:15;28392:986;-1:-1:-1;;;28892:55:1;;28970:13;;28874:3;;28992:62;28970:13;29042:2;29033:12;;29026:4;29014:17;;28992:62;:::i;:::-;-1:-1:-1;;;29113:2:1;29073:16;;;29105:11;;;29098:57;29180:13;;29202:63;29180:13;29251:2;29243:11;;29236:4;29224:17;;29202:63;:::i;:::-;-1:-1:-1;;;29325:2:1;29284:17;;;;29317:11;;;29310:35;29369:2;29361:11;;28392:986;-1:-1:-1;;;;28392:986:1:o
Swarm Source
ipfs://8e1dea22200df2baa6baa0b73fbdfd6613a1f7bf134669b232c8b9135ade3fdb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.