ERC-1155
Overview
Max Total Supply
20,687
Holders
1,938
Market
Volume (24H)
0 ETH
Min Price (24H)
$0.00 @ 0.000000 ETH
Max Price (24H)
$0.00 @ 0.000000 ETH
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Transponders
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0 // ©2023 Ponderware Ltd pragma solidity ^0.8.17; import "../lib/TokenizedContract.sol"; import "solmate/src/tokens/ERC1155.sol"; import "@openzeppelin/contracts/utils/Create2.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; struct Signal { uint8 status; uint8 style; uint40 startBlock; address sender; bytes[37] message; } interface IDelegationRegistry { function checkDelegateForContract(address delegate, address vault, address contract_) external view returns(bool); function checkDelegateForToken(address delegate, address vault, address contract_, uint256 tokenId) external view returns (bool); } interface ICustomAttributes { function getCustomAttributes () external view returns (bytes memory); } interface ITransponderMetadata { function broadcastMetadata (bool signalling, uint peer, uint modelId, uint startBlock, string memory content, string memory handle) external view returns (string memory); function propagandaMetadata (uint modelId) external view returns (string memory); function signalMetadata(uint peer, Signal memory local, Signal memory peer1, Signal memory peer2) external view returns (string memory); function adjustTypeface (address _typefaceAddress, uint256 weight, string memory style) external; function uploadModels (uint48 count, bytes memory data) external; function uploadPropaganda (string[] calldata messages, string[] calldata handles) external; function updatePropaganda (uint[] calldata ids, string[] calldata messages, string[] calldata handles) external; function setB64EncodeURI (bool active) external; } /* * @title Transponders * @author Ponderware Ltd * @dev Tokenized Chain-Complete ERC1155 Contract */ contract Transponders is ERC1155, TokenizedContract, ICustomAttributes { event Broadcast (string message, string handle); ITransponderMetadata Metadata; constructor (uint256 tokenId) TokenizedContract(tokenId) { addRole(owner(), Role.Uploader); addRole(owner(), Role.Beneficiary); addRole(owner(), Role.Transmitter); addRole(owner(), Role.Censor); addRole(owner(), Role.Jammer); addRole(owner(), Role.Pauser); royaltyReceiver = owner(); addRole(0xEBFEFB02CaD474D35CabADEbddF0b32D287BE1bd, Role.CodeLawless); addRole(0x3a14b1Cc1210a87AE4B6bf635FBA898628F06357, Role.LowLevelRedactedDrone); } bool internal initialized = false; function initialize (bytes calldata metadata) public onlySuper { require(!initialized, "Initialized"); initialized = true; Metadata = ITransponderMetadata(Create2.deploy(0, 0, abi.encodePacked(metadata, abi.encode(address(this), CodexAddress)))); } IDelegationRegistry constant dc = IDelegationRegistry(0x00000000000076A84feF008CDAbe6409d2FE638B); bool public delegationEnabled = true; uint private constant TRANSPONDER_TYPES = 5; uint private constant CHROMA_COUNT = 5; Signal[] Signals; bool public jammed = true; function jam (bool value) public onlyBy(Role.Jammer) { jammed = value; } function signalExists (uint256 signalId) public view returns (bool) { return (signalId >= TRANSPONDER_TYPES && signalId - TRANSPONDER_TYPES < Signals.length); } bool internal breached = false; function breachTheNetwork (string calldata breachMessage, address[] calldata lawless, uint8[] calldata transponderTypes, uint8[] calldata chromas, bytes[37][] calldata messages) public onlyBy(Role.CodeLawless) { require (breached == false, "we're already in"); breached = true; jammed = false; broadcastDuration = 300; broadcastInterval = 0; broadcast(breachMessage, "code.lawless"); for (uint i = 0; i < lawless.length; i++) { uint signalId = TRANSPONDER_TYPES + Signals.length; _mint(lawless[i], signalId, 1, ""); Signals.push(Signal(0, (chromas[i] << 4) + uint8(transponderTypes[i]), uint40(block.number), lawless[i], messages[i])); } } modifier validSignal (uint signalId) { require (signalExists(signalId), "signal not detected"); _; } function totalSignals () public view returns (uint) { return Signals.length; } function getSignal (uint256 peer) public view validSignal(peer + TRANSPONDER_TYPES) returns (uint8, uint8, uint40, address, bool, string memory) { Signal storage s = Signals[peer]; bytes[37] storage m = s.message; uint length = 0; for (; length < 37; length++) { if(uint8(bytes1(m[length])) == 0) break; } bytes memory message = new bytes(length); for (uint i = 0; i < length; i++) { message[i] = bytes1(m[i]); } return(s.style & 15, s.style >> 4, s.startBlock, s.sender, (s.status & 1) == 1, string(message)); } function validMessage (bytes[37] memory message) public pure returns (bool) { for (uint i = 0; i < 37; i++) { uint b = uint8(bytes1(message[i])); if ((b >= 97 && b <= 122) || // a-z (b == 32) || // " " (b >= 45 && b <= 57) || // - . / 0-9 (b == 39) || // ' (b == 63) || // ? (b == 33)) continue; // ! if (b == 0) break; return false; } return true; } modifier validSignalParameters (bytes[37] memory message, uint8 chroma) { require(validMessage(message), "unrecoverable uncorrectable error"); require(chroma < CHROMA_COUNT, "incompatible power source"); _; } modifier onlyAuthorized (address lawless, uint256 id) { require (lawless == msg.sender || isApprovedForAll[lawless][msg.sender] || (delegationEnabled && (dc.checkDelegateForContract(msg.sender, lawless, address(this)) || dc.checkDelegateForToken(msg.sender, lawless, address(this), id))), "unauthorized access detected"); _; } function signal (address lawless, uint256 transponderType, uint8 chroma, bytes[37] memory message) public validSignalParameters(message, chroma) onlyAuthorized(lawless, transponderType) returns (uint256 signalId) { require(transponderType < TRANSPONDER_TYPES, "incompatible transponder"); require(!jammed, "jammed"); require(balanceOf[lawless][transponderType] > 0, "you'll need to rummage for that"); signalId = TRANSPONDER_TYPES + Signals.length; _burn(lawless, transponderType, 1); _mint(lawless, signalId, 1, ""); Signals.push(Signal(0, (chroma << 4) + uint8(transponderType), uint40(block.number), lawless, message)); } uint public priceOfIndecisionAndRequiredMaterials = 0.1 ether; function reevaluate (address lawless, uint signalId, uint8 chroma, bytes[37] memory message) public validSignal(signalId) validSignalParameters(message, chroma) onlyAuthorized(lawless, signalId) payable { require(msg.value >= priceOfIndecisionAndRequiredMaterials, "parts aren't free"); require(balanceOf[lawless][signalId] == 1, "hack thwarted"); Signal storage s = Signals[signalId - TRANSPONDER_TYPES]; s.message = message; s.sender = lawless; s.status = 0; s.style = (chroma << 4) + (s.style & 15); } function setPriceOfIndecisionAndRequiredMaterials (uint price) public onlyBy(Role.Fixer) { priceOfIndecisionAndRequiredMaterials = price; } function setB64EncodeURI (bool value) public onlyBy(Role.Fixer) { Metadata.setB64EncodeURI(value); } function redact (uint signalId, bytes[37] memory redactedMessage) public validSignal(signalId) onlyBy(Role.Censor) { Signal storage s = Signals[signalId - TRANSPONDER_TYPES]; s.status |= 1; s.message = redactedMessage; } string public broadcastMessage; string public broadcastHandle; uint internal broadcastBlock = 0; uint internal broadcastDuration = 25; uint internal broadcastInterval = 350; function broadcasting () public view returns (bool) { if (bytes(broadcastMessage).length == 0) return false; if (broadcastInterval == 0) { return (block.number - broadcastBlock) < broadcastDuration; } else { return ((block.number - broadcastBlock) % broadcastInterval) < broadcastDuration; } } function broadcast (string memory message, string memory handle) public onlyBy(Role.CodeLawless) { broadcastMessage = message; broadcastBlock = block.number; broadcastHandle = handle; emit Broadcast(message, handle); } function adjustBroadcastParameters (uint duration, uint interval) public onlyBy(Role.CodeLawless) { require(interval == 0 || (duration <= (interval / 2) && duration < 7200), "power requirements exceeded"); broadcastDuration = duration; broadcastInterval = interval; } uint public peerConnectionDuration = 75; function adjustPeerConnectionDuration (uint duration) public onlyBy(Role.CodeLawless) { require(duration > 0 && duration < 250, "out of range"); peerConnectionDuration = duration; } uint constant PRIME = 81918643972203779099; function scan (uint salt, uint signalId) internal view returns (Signal storage) { uint b = block.number - (block.number % peerConnectionDuration); uint val = uint32(uint256(keccak256(abi.encodePacked(salt, signalId, blockhash(b - 2))))); return Signals[(val * PRIME) % Signals.length]; } function uri (uint256 id) public view override returns (string memory) { require(id < TRANSPONDER_TYPES || (id - TRANSPONDER_TYPES) < Signals.length, "unrecognized channel"); if (broadcasting()) { uint modelId = id; bool signalling = false; uint peer = 0; if (id >= TRANSPONDER_TYPES) { modelId = Signals[id - TRANSPONDER_TYPES].style & 15; signalling = true; peer = id - TRANSPONDER_TYPES; } return Metadata.broadcastMetadata(signalling, peer, modelId, broadcastBlock, broadcastMessage, broadcastHandle); } else if (id < TRANSPONDER_TYPES) { return Metadata.propagandaMetadata(id); } else { return Metadata.signalMetadata(id - TRANSPONDER_TYPES, Signals[id - TRANSPONDER_TYPES], scan(1, id), scan(2, id)); } } function withdraw () public override onlyBy(Role.Beneficiary) { _withdraw(msg.sender); } /* Salvage & Transfer */ function salvage (address lawless, uint256 transponderType, uint256 amount) public onlyBy(Role.Minter) { _mint(lawless, transponderType, amount, ""); } function salvageABunch (address lawless, uint256[] memory transponderTypes, uint256[] memory amounts) public onlyBy(Role.Minter) { _batchMint(lawless, transponderTypes, amounts, ""); } function safeTransferFrom (address from, address to, uint256 id, uint256 amount, bytes calldata data) public override whenNotPaused { super.safeTransferFrom(from, to, id, amount, data); } function safeBatchTransferFrom (address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data) public override whenNotPaused { super.safeBatchTransferFrom(from, to, ids, amounts, data); } /* Content */ function uploadPropaganda (string[] calldata messages, string[] calldata handles) public onlyBy(Role.LowLevelRedactedDrone) { Metadata.uploadPropaganda(messages, handles); } function updatePropaganda (uint[] calldata ids, string[] calldata messages, string[] calldata handles) public onlyBy(Role.LowLevelRedactedDrone) { Metadata.updatePropaganda(ids, messages, handles); } function uploadModels (uint48 count, bytes memory data) public onlyBy(Role.Uploader) { Metadata.uploadModels(count, data); } function adjustTypeface (address _typefaceAddress, uint256 weight, string memory style) public onlyBy(Role.Maintainer) { Metadata.adjustTypeface(_typefaceAddress, weight, style); } /* Mint */ bool public mintOpen = false; address internal minter; function openMint (address m) public onlyBy(Role.Ponderware) { require(!roleLocked(Role.Minter), "it's over"); addRole(m, Role.Minter); minter = m; mintOpen = true; } function closeMint () public onlyBy(Role.Ponderware) { removeRole(minter, Role.Minter); lockRole(Role.Minter); mintOpen = false; } function smashFlask () public onlyBy(Role.Ponderware) { delegationEnabled = false; } function getCustomAttributes () external view returns (bytes memory) { return ICodex(CodexAddress).encodeStringAttribute("peers", Strings.toString(totalSignals())); } /* Royalty Bullshit */ function supportsInterface(bytes4 interfaceId) public view override returns (bool) { return interfaceId == 0x2A55205A // ERC165 Interface ID for ERC2981 || interfaceId == type(ICustomAttributes).interfaceId || super.supportsInterface(interfaceId); } address internal royaltyReceiver; uint internal royaltyFraction = 0; function royaltyInfo(uint256 /*tokenId*/, uint256 salePrice) public view returns (address, uint256) { uint256 royaltyAmount = (salePrice * royaltyFraction) / 10000; return (royaltyReceiver, royaltyAmount); } function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlySuper { require(feeNumerator <= 10000, "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); royaltyReceiver = receiver; royaltyFraction = feeNumerator; } /* Helper for Balances */ function balanceOfOwnerBatch(address owner, uint256[] calldata ids) public view returns (uint256[] memory balances) { balances = new uint256[](ids.length); unchecked { for (uint256 i = 0; i < ids.length; ++i) { balances[i] = balanceOf[owner][ids[i]]; } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Create2.sol) pragma solidity ^0.8.0; /** * @dev Helper to make usage of the `CREATE2` EVM opcode easier and safer. * `CREATE2` can be used to compute in advance the address where a smart * contract will be deployed, which allows for interesting new mechanisms known * as 'counterfactual interactions'. * * See the https://eips.ethereum.org/EIPS/eip-1014#motivation[EIP] for more * information. */ library Create2 { /** * @dev Deploys a contract using `CREATE2`. The address where the contract * will be deployed can be known in advance via {computeAddress}. * * The bytecode for a contract can be obtained from Solidity with * `type(contractName).creationCode`. * * Requirements: * * - `bytecode` must not be empty. * - `salt` must have not been used for `bytecode` already. * - the factory must have a balance of at least `amount`. * - if `amount` is non-zero, `bytecode` must have a `payable` constructor. */ function deploy( uint256 amount, bytes32 salt, bytes memory bytecode ) internal returns (address addr) { require(address(this).balance >= amount, "Create2: insufficient balance"); require(bytecode.length != 0, "Create2: bytecode length is zero"); /// @solidity memory-safe-assembly assembly { addr := create2(amount, add(bytecode, 0x20), mload(bytecode), salt) } require(addr != address(0), "Create2: Failed on deploy"); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy}. Any change in the * `bytecodeHash` or `salt` will result in a new destination address. */ function computeAddress(bytes32 salt, bytes32 bytecodeHash) internal view returns (address) { return computeAddress(salt, bytecodeHash, address(this)); } /** * @dev Returns the address where a contract will be stored if deployed via {deploy} from a contract located at * `deployer`. If `deployer` is this contract's address, returns the same value as {computeAddress}. */ function computeAddress( bytes32 salt, bytes32 bytecodeHash, address deployer ) internal pure returns (address addr) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) // Get free memory pointer // | | ↓ ptr ... ↓ ptr + 0x0B (start) ... ↓ ptr + 0x20 ... ↓ ptr + 0x40 ... | // |-------------------|---------------------------------------------------------------------------| // | bytecodeHash | CCCCCCCCCCCCC...CC | // | salt | BBBBBBBBBBBBB...BB | // | deployer | 000000...0000AAAAAAAAAAAAAAAAAAA...AA | // | 0xFF | FF | // |-------------------|---------------------------------------------------------------------------| // | memory | 000000...00FFAAAAAAAAAAAAAAAAAAA...AABBBBBBBBBBBBB...BBCCCCCCCCCCCCC...CC | // | keccak(start, 85) | ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ | mstore(add(ptr, 0x40), bytecodeHash) mstore(add(ptr, 0x20), salt) mstore(ptr, deployer) // Right-aligned with 12 preceding garbage bytes let start := add(ptr, 0x0b) // The hashed data starts at the final garbage byte which we will set to 0xff mstore8(start, 0xff) addr := keccak256(start, 85) } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _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) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: AGPL-3.0 // ©2023 Ponderware Ltd pragma solidity ^0.8.17; interface IERC20 { function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); } interface IERC721_Transfer { function safeTransferFrom(address from, address to, uint256 tokenId) external; } contract Rescuable { function _withdraw(address to) internal { payable(to).transfer(address(this).balance); } /** * @dev Rescue ERC20 assets sent directly to this contract. */ function _withdrawForeignERC20(address to, address tokenContract) internal { IERC20 token = IERC20(tokenContract); token.transfer(to, token.balanceOf(address(this))); } /** * @dev Rescue ERC721 assets sent directly to this contract. */ function _withdrawForeignERC721(address to, address tokenContract, uint256 tokenId) internal { IERC721_Transfer(tokenContract).safeTransferFrom(address(this), to, tokenId); } }
// SPDX-License-Identifier: AGPL-3.0 // ©2023 Ponderware Ltd pragma solidity ^0.8.17; enum Role { Super, // 0 Admin, // 1 Manager, // 2 Editor, // 3 Minter, // 4 Burner, // 5 Beneficiary,// 6 Logger, // 7 Uploader, // 8 Support, // 9 Maintainer, // 10 Censor, // 11 Fixer, // 12 Transmitter,// 13 Shill, // 14 LowLevelRedactedDrone, // 15 CodeLawless,// 16 Jammer, // 17 Ponderware, // 18 Ranger, // 19 Rogue, // 20 Pauser // 21 }
// SPDX-License-Identifier: AGPL-3.0 // ©2022 Ponderware Ltd pragma solidity ^0.8.17; import "./Rescuable.sol"; import "./Roles.sol"; interface ICodex { function ownerOf(uint256 tokenId) external view returns (address); function safeTokenTransferOwnership(uint256 tokenId, address newOwner) external; function encodeStringAttribute (string memory key, string memory value) external pure returns (bytes memory); function encodeNumericAttribute (string memory key, uint256 value) external pure returns (bytes memory); function ENSReverseRegistrar () external view returns (address); } interface IReverseRegistrar { function claim(address owner) external returns (bytes32); } /* * @title Tokenized Contract * @author Ponderware Ltd * @dev designed to work with the Codex */ contract TokenizedContract is Rescuable { address public CodexAddress; uint256 public immutable tokenId; constructor (uint256 _tokenId) { CodexAddress = msg.sender; tokenId = _tokenId; } function resolverClaim (address newOwner) public onlyCodex { IReverseRegistrar(ICodex(CodexAddress).ENSReverseRegistrar()).claim(newOwner); } function owner() public view virtual returns (address) { return ICodex(CodexAddress).ownerOf(tokenId); } function transferOwnership (address newOwner) public virtual onlyOwner { ICodex(CodexAddress).safeTokenTransferOwnership(tokenId, newOwner); } modifier onlyOwner () { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } mapping(address => bytes32) private UserRoles; mapping(uint8 => bool) private RoleLocks; modifier onlyCodex () { require(msg.sender == CodexAddress, "not codex"); _; } modifier onlySuper () { require(msg.sender == owner() || hasRole(msg.sender, Role.Super) || msg.sender == CodexAddress, "Unauthorized"); _; } event RoleUpdated (address indexed user, uint8 indexed role, bool enabled); event RoleLocked (uint8 indexed role); function _addRole (address user, Role role) private { require (role != Role.Ponderware, "you cannot simply become ponderware"); require (!RoleLocks[uint8(role)], "locked"); UserRoles[user] |= bytes32(1 << uint8(role)); emit RoleUpdated(user, uint8(role), true); } function addRole (address user, Role role) public onlySuper { _addRole(user, role); } function addRoles (address[] memory users, Role[] memory roles) public onlySuper { for (uint i = 0; i < roles.length; i++){ _addRole(users[i], roles[i]); } } function _removeRole (address user, Role role) private { require (!RoleLocks[uint8(role)], "locked"); UserRoles[user] &= ~bytes32(1 << uint8(role)); emit RoleUpdated(user, uint8(role), false); } function removeRole (address user, Role role) public onlySuper { _removeRole(user, role); } function removeRoles (address[] memory users, Role[] memory roles) public onlySuper { for (uint i = 0; i < roles.length; i++){ _removeRole(users[i], roles[i]); } } function _lockRole (Role role) private { if (!RoleLocks[uint8(role)]) { RoleLocks[uint8(role)] = true; emit RoleLocked(uint8(role)); } } function lockRole (Role role) public onlySuper { _lockRole(role); } function lockRoles (Role[] memory roles) public onlySuper { for (uint i = 0; i < roles.length; i++){ _lockRole(roles[i]); } } function roleLocked (Role role) public view returns (bool) { return RoleLocks[uint8(role)]; } function hasRole (address user, Role role) public view returns (bool) { return (uint256(UserRoles[user] >> uint8(role)) & 1 == 1 || (role == Role.Ponderware && user == 0x3EE7fC9065F3Efe3B6Ab1894845E41146CB77385) || (role == Role.Super && user == owner())); } modifier onlyBy (Role role) { require (hasRole(msg.sender, role), "user lacks role"); _; } /* *** Roles Example *** function foo () internal onlyBy(Role.Editor) returns (uint256) { return (block.number); } */ // Pause event Paused(address account); event Unpaused(address account); bool public paused = true; function pause () public onlyBy(Role.Pauser) whenNotPaused { paused = true; emit Paused(msg.sender); } function unpause () public onlyBy(Role.Pauser) whenPaused { paused = false; emit Unpaused(msg.sender); } modifier whenPaused() { require(paused == true, "Not Paused"); _; } modifier whenNotPaused() { require(paused == false, "Paused"); _; } // Rescuers function withdraw() public virtual onlyOwner { _withdraw(owner()); } function withdrawForeignERC20(address tokenContract) public virtual onlyOwner { _withdrawForeignERC20(owner(), tokenContract); } function withdrawForeignERC721(address tokenContract, uint256 _tokenId) public virtual onlyOwner { _withdrawForeignERC721(owner(), tokenContract, _tokenId); } }
// SPDX-License-Identifier: AGPL-3.0-only pragma solidity >=0.8.0; /// @notice Minimalist and gas efficient standard ERC1155 implementation. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) abstract contract ERC1155 { /*////////////////////////////////////////////////////////////// EVENTS //////////////////////////////////////////////////////////////*/ event TransferSingle( address indexed operator, address indexed from, address indexed to, uint256 id, uint256 amount ); event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] amounts ); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); event URI(string value, uint256 indexed id); /*////////////////////////////////////////////////////////////// ERC1155 STORAGE //////////////////////////////////////////////////////////////*/ mapping(address => mapping(uint256 => uint256)) public balanceOf; mapping(address => mapping(address => bool)) public isApprovedForAll; /*////////////////////////////////////////////////////////////// METADATA LOGIC //////////////////////////////////////////////////////////////*/ function uri(uint256 id) public view virtual returns (string memory); /*////////////////////////////////////////////////////////////// ERC1155 LOGIC //////////////////////////////////////////////////////////////*/ function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) public virtual { require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); balanceOf[from][id] -= amount; balanceOf[to][id] += amount; emit TransferSingle(msg.sender, from, to, id, amount); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) public virtual { require(ids.length == amounts.length, "LENGTH_MISMATCH"); require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED"); // Storing these outside the loop saves ~15 gas per iteration. uint256 id; uint256 amount; for (uint256 i = 0; i < ids.length; ) { id = ids[i]; amount = amounts[i]; balanceOf[from][id] -= amount; balanceOf[to][id] += amount; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, from, to, ids, amounts); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) public view virtual returns (uint256[] memory balances) { require(owners.length == ids.length, "LENGTH_MISMATCH"); balances = new uint256[](owners.length); // Unchecked because the only math done is incrementing // the array index counter which cannot possibly overflow. unchecked { for (uint256 i = 0; i < owners.length; ++i) { balances[i] = balanceOf[owners[i]][ids[i]]; } } } /*////////////////////////////////////////////////////////////// ERC165 LOGIC //////////////////////////////////////////////////////////////*/ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165 interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155 interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI } /*////////////////////////////////////////////////////////////// INTERNAL MINT/BURN LOGIC //////////////////////////////////////////////////////////////*/ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { balanceOf[to][id] += amount; emit TransferSingle(msg.sender, address(0), to, id, amount); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) == ERC1155TokenReceiver.onERC1155Received.selector, "UNSAFE_RECIPIENT" ); } function _batchMint( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { uint256 idsLength = ids.length; // Saves MLOADs. require(idsLength == amounts.length, "LENGTH_MISMATCH"); for (uint256 i = 0; i < idsLength; ) { balanceOf[to][ids[i]] += amounts[i]; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, address(0), to, ids, amounts); require( to.code.length == 0 ? to != address(0) : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) == ERC1155TokenReceiver.onERC1155BatchReceived.selector, "UNSAFE_RECIPIENT" ); } function _batchBurn( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { uint256 idsLength = ids.length; // Saves MLOADs. require(idsLength == amounts.length, "LENGTH_MISMATCH"); for (uint256 i = 0; i < idsLength; ) { balanceOf[from][ids[i]] -= amounts[i]; // An array can't have a total length // larger than the max uint256 value. unchecked { ++i; } } emit TransferBatch(msg.sender, from, address(0), ids, amounts); } function _burn( address from, uint256 id, uint256 amount ) internal virtual { balanceOf[from][id] -= amount; emit TransferSingle(msg.sender, from, address(0), id, amount); } } /// @notice A generic interface for a contract which properly accepts ERC1155 tokens. /// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC1155.sol) abstract contract ERC1155TokenReceiver { function onERC1155Received( address, address, uint256, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC1155TokenReceiver.onERC1155Received.selector; } function onERC1155BatchReceived( address, address, uint256[] calldata, uint256[] calldata, bytes calldata ) external virtual returns (bytes4) { return ERC1155TokenReceiver.onERC1155BatchReceived.selector; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"message","type":"string"},{"indexed":false,"internalType":"string","name":"handle","type":"string"}],"name":"Broadcast","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"role","type":"uint8"}],"name":"RoleLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint8","name":"role","type":"uint8"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"RoleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"CodexAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"addRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"addRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"interval","type":"uint256"}],"name":"adjustBroadcastParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"adjustPeerConnectionDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_typefaceAddress","type":"address"},{"internalType":"uint256","name":"weight","type":"uint256"},{"internalType":"string","name":"style","type":"string"}],"name":"adjustTypeface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfOwnerBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"breachMessage","type":"string"},{"internalType":"address[]","name":"lawless","type":"address[]"},{"internalType":"uint8[]","name":"transponderTypes","type":"uint8[]"},{"internalType":"uint8[]","name":"chromas","type":"uint8[]"},{"internalType":"bytes[37][]","name":"messages","type":"bytes[37][]"}],"name":"breachTheNetwork","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"message","type":"string"},{"internalType":"string","name":"handle","type":"string"}],"name":"broadcast","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"broadcastHandle","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"broadcastMessage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"broadcasting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCustomAttributes","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"peer","type":"uint256"}],"name":"getSignal","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint40","name":"","type":"uint40"},{"internalType":"address","name":"","type":"address"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"metadata","type":"bytes"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"jam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"jammed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"lockRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"lockRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"m","type":"address"}],"name":"openMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"peerConnectionDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceOfIndecisionAndRequiredMaterials","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"signalId","type":"uint256"},{"internalType":"bytes[37]","name":"redactedMessage","type":"bytes[37]"}],"name":"redact","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256","name":"signalId","type":"uint256"},{"internalType":"uint8","name":"chroma","type":"uint8"},{"internalType":"bytes[37]","name":"message","type":"bytes[37]"}],"name":"reevaluate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"removeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"enum Role[]","name":"roles","type":"uint8[]"}],"name":"removeRoles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"resolverClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Role","name":"role","type":"uint8"}],"name":"roleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256","name":"transponderType","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"salvage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256[]","name":"transponderTypes","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"salvageABunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setB64EncodeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setPriceOfIndecisionAndRequiredMaterials","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"lawless","type":"address"},{"internalType":"uint256","name":"transponderType","type":"uint256"},{"internalType":"uint8","name":"chroma","type":"uint8"},{"internalType":"bytes[37]","name":"message","type":"bytes[37]"}],"name":"signal","outputs":[{"internalType":"uint256","name":"signalId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"signalId","type":"uint256"}],"name":"signalExists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"smashFlask","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSignals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"string[]","name":"messages","type":"string[]"},{"internalType":"string[]","name":"handles","type":"string[]"}],"name":"updatePropaganda","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint48","name":"count","type":"uint48"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"uploadModels","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"messages","type":"string[]"},{"internalType":"string[]","name":"handles","type":"string[]"}],"name":"uploadPropaganda","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes[37]","name":"message","type":"bytes[37]"}],"name":"validMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"}],"name":"withdrawForeignERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"withdrawForeignERC721","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526005805460ff61ffff60a81b0119167601000000000000000000000000000000000000000000011790556007805461ffff1916600117905567016345785d8a00006008556000600b8190556019600c5561015e600d55604b600e55600f805460ff191690556011553480156200007957600080fd5b50604051620060dd380380620060dd8339810160408190526200009c916200050b565b600280546001600160a01b031916331790556080819052620000c9620000c1620001aa565b600862000224565b620000df620000d7620001aa565b600662000224565b620000f5620000ed620001aa565b600d62000224565b6200010b62000103620001aa565b600b62000224565b6200012162000119620001aa565b601162000224565b620001376200012f620001aa565b601562000224565b62000141620001aa565b601080546001600160a01b0319166001600160a01b0392909216919091178155620001829073ebfefb02cad474d35cabadebddf0b32d287be1bd9062000224565b620001a3733a14b1cc1210a87ae4b6bf635fba898628f06357600f62000224565b5062000566565b6002546080516040516331a9108f60e11b815260048101919091526000916001600160a01b031690636352211e90602401602060405180830381865afa158015620001f9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200021f919062000525565b905090565b6200022e620001aa565b6001600160a01b0316336001600160a01b0316148062000256575062000256336000620002bd565b806200026c57506002546001600160a01b031633145b620002ad5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064015b60405180910390fd5b620002b982826200038e565b5050565b6000816015811115620002d457620002d462000550565b6001600160a01b038416600090815260036020526040902054600160ff929092161c81161480620003415750601282601581111562000317576200031762000550565b148015620003415750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b8062000387575060008260158111156200035f576200035f62000550565b14801562000387575062000372620001aa565b6001600160a01b0316836001600160a01b0316145b9392505050565b6012816015811115620003a557620003a562000550565b03620004005760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b6064820152608401620002a4565b6004600082601581111562000419576200041962000550565b60ff90811682526020820192909252604001600020541615620004685760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401620002a4565b8060158111156200047d576200047d62000550565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b9091179055806015811115620004bd57620004bd62000550565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6001604051620004ff911515815260200190565b60405180910390a35050565b6000602082840312156200051e57600080fd5b5051919050565b6000602082840312156200053857600080fd5b81516001600160a01b03811681146200038757600080fd5b634e487b7160e01b600052602160045260246000fd5b608051615b4d620005906000396000818161055a0152818161233201526131c70152615b4d6000f3fe6080604052600436106103b75760003560e01c806357412efa116101f2578063af7460f71161010d578063e985e9c5116100a0578063f2fde38b1161006f578063f2fde38b14610b48578063f8ca7b2814610b68578063f9d4b07114610b88578063fc22f32e14610ba857600080fd5b8063e985e9c514610ab7578063e9d0348714610af2578063f09f3f3114610b08578063f242432a14610b2857600080fd5b8063d6ea448a116100dc578063d6ea448a14610a44578063d800d4fc14610a57578063d84a522314610a77578063e04388c414610a9757600080fd5b8063af7460f7146109cf578063b12c0299146109e4578063b74866fb14610a04578063cc16210214610a2457600080fd5b8063845b2a951161018557806394e83b9b1161015457806394e83b9b1461094f57806395a8c58d1461096f578063a22cb4651461098f578063a55de951146109af57600080fd5b8063845b2a95146108cd57806386a3555d146108e25780638ca0c1bd146109025780638da5cb5b1461092257600080fd5b806365990b9a116101c157806365990b9a146108515780637087448314610866578063828e58e2146108865780638456cb59146108b857600080fd5b806357412efa146107e25780635c471995146108025780635c975abb1461082257806364f101f01461083c57600080fd5b806325d64f11116102e25780633f4ba83a116102755780634e1273f4116102445780634e1273f41461076157806354b8c60114610781578063550bb2f1146107a25780635693ff3c146107c257600080fd5b80633f4ba83a146106df578063439fab91146106f457806344deb6f3146107145780634def354b1461073457600080fd5b80633685aa17116102b15780633685aa171461066a578063384f81301461068a5780633c4bec2a146106aa5780633ccfd60b146106ca57600080fd5b806325d64f11146105cb5780632a55205a146105eb5780632eb2c2d61461062a57806334fae5571461064a57600080fd5b80630fb1373f1161035a57806317d70f7c1161032957806317d70f7c146105485780631ab18dfd1461057c5780631b95da2c1461059157806324bbd049146105b157600080fd5b80630fb1373f146104dd578063107365bc146104f35780631377bb7b14610513578063168c5c4f1461053357600080fd5b806308d24e231161039657806308d24e23146104565780630c8f1e92146104705780630ce06b68146104905780630e89341c146104b057600080fd5b8062fdd58e146103bc57806301ffc9a71461040457806304634d8d14610434575b600080fd5b3480156103c857600080fd5b506103f16103d73660046143ac565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b34801561041057600080fd5b5061042461041f3660046143ee565b610bbd565b60405190151581526020016103fb565b34801561044057600080fd5b5061045461044f36600461440b565b610c03565b005b34801561046257600080fd5b506007546104249060ff1681565b34801561047c57600080fd5b5061045461048b36600461445e565b610d5d565b34801561049c57600080fd5b506104546104ab3660046143ac565b610d99565b3480156104bc57600080fd5b506104d06104cb36600461447b565b610dde565b6040516103fb91906144e4565b3480156104e957600080fd5b506103f160085481565b3480156104ff57600080fd5b5061045461050e36600461447b565b611037565b34801561051f57600080fd5b5061045461052e3660046145cb565b6110b0565b34801561053f57600080fd5b506104d06110f9565b34801561055457600080fd5b506103f17f000000000000000000000000000000000000000000000000000000000000000081565b34801561058857600080fd5b506006546103f1565b34801561059d57600080fd5b506104546105ac36600461447b565b611187565b3480156105bd57600080fd5b50600f546104249060ff1681565b3480156105d757600080fd5b506104546105e63660046146c5565b6111b5565b3480156105f757600080fd5b5061060b6106063660046147b5565b6114c0565b604080516001600160a01b0390931683526020830191909152016103fb565b34801561063657600080fd5b506104546106453660046147d7565b6114f9565b34801561065657600080fd5b50610454610665366004614895565b611536565b34801561067657600080fd5b506104546106853660046149cb565b611661565b34801561069657600080fd5b506104546106a5366004614a11565b61170b565b3480156106b657600080fd5b506104246106c5366004614ab9565b6117ac565b3480156106d657600080fd5b506104546117e1565b3480156106eb57600080fd5b50610454611815565b34801561070057600080fd5b5061045461070f366004614ad4565b6118c2565b34801561072057600080fd5b5061045461072f366004614b15565b611a04565b34801561074057600080fd5b5061075461074f366004614b4a565b611a6c565b6040516103fb9190614bd9565b34801561076d57600080fd5b5061075461077c366004614bec565b611b2b565b34801561078d57600080fd5b5060055461042490600160b01b900460ff1681565b3480156107ae57600080fd5b506104546107bd366004614cb9565b611c3d565b3480156107ce57600080fd5b506104546107dd366004614895565b611cdb565b3480156107ee57600080fd5b506104546107fd3660046147b5565b611d83565b34801561080e57600080fd5b5061045461081d366004614895565b611e26565b34801561082e57600080fd5b506005546104249060ff1681565b34801561084857600080fd5b50610454611e66565b34801561085d57600080fd5b506104d0611ec1565b34801561087257600080fd5b50610424610881366004614cf5565b611f4c565b34801561089257600080fd5b506108a66108a136600461447b565b612014565b6040516103fb96959493929190614d29565b3480156108c457600080fd5b506104546121ad565b3480156108d957600080fd5b506104d0612235565b3480156108ee57600080fd5b506104546108fd366004614bec565b612242565b34801561090e57600080fd5b5061045461091d366004614d7f565b6122dd565b34801561092e57600080fd5b50610937612320565b6040516001600160a01b0390911681526020016103fb565b34801561095b57600080fd5b5061045461096a36600461445e565b6123ad565b34801561097b57600080fd5b5061042461098a366004614b15565b612434565b34801561099b57600080fd5b506104546109aa366004614db4565b6124f6565b3480156109bb57600080fd5b506104246109ca36600461447b565b612563565b3480156109db57600080fd5b50610454612586565b3480156109f057600080fd5b506104546109ff366004614de2565b6125be565b348015610a1057600080fd5b50610454610a1f366004614b15565b612653565b348015610a3057600080fd5b50610454610a3f366004614ab9565b6126bb565b610454610a52366004614e43565b612722565b348015610a6357600080fd5b506103f1610a72366004614e43565b612abe565b348015610a8357600080fd5b50610454610a92366004614eac565b612f52565b348015610aa357600080fd5b50610454610ab2366004614eac565b61300f565b348015610ac357600080fd5b50610424610ad2366004614f63565b600160209081526000928352604080842090915290825290205460ff1681565b348015610afe57600080fd5b506103f1600e5481565b348015610b1457600080fd5b50610454610b23366004614f91565b6130c7565b348015610b3457600080fd5b50610454610b43366004614fdf565b613155565b348015610b5457600080fd5b50610454610b63366004614895565b613186565b348015610b7457600080fd5b50610454610b83366004615048565b61323d565b348015610b9457600080fd5b50600254610937906001600160a01b031681565b348015610bb457600080fd5b506104246132c1565b600063152a902d60e11b6001600160e01b031983161480610bee57506001600160e01b031982166332cc85cd60e11b145b80610bfd5750610bfd8261331c565b92915050565b610c0b612320565b6001600160a01b0316336001600160a01b03161480610c305750610c30336000612434565b80610c4557506002546001600160a01b031633145b610c6a5760405162461bcd60e51b8152600401610c61906150a1565b60405180910390fd5b612710816001600160601b03161115610cd85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c61565b6001600160a01b038216610d2e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c61565b601080546001600160a01b0319166001600160a01b0393909316929092179091556001600160601b0316601155565b6011610d693382612434565b610d855760405162461bcd60e51b8152600401610c61906150c7565b506007805460ff1916911515919091179055565b33610da2612320565b6001600160a01b031614610dc85760405162461bcd60e51b8152600401610c61906150f0565b610dda610dd3612320565b838361336a565b5050565b60606005821080610dfa5750600654610df860058461513b565b105b610e3d5760405162461bcd60e51b81526020600482015260146024820152731d5b9c9958dbd9db9a5e99590818da185b9b995b60621b6044820152606401610c61565b610e456132c1565b15610f30578160008060058310610ea0576006610e6360058761513b565b81548110610e7357610e7361514e565b60009182526020909120602690910201546101009004600f16925060019150610e9d60058661513b565b90505b600554600b54604051633a126a7960e11b81526101009092046001600160a01b031691637424d4f291610ee29186918691899190600990600a9060040161521b565b600060405180830381865afa158015610eff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f279190810190615297565b95945050505050565b6005821015610faf57600554604051631c069d6760e01b8152600481018490526101009091046001600160a01b031690631c069d67906024015b600060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bfd9190810190615297565b6005805461010090046001600160a01b03169063495ec49390610fd2908561513b565b6006610fdf60058761513b565b81548110610fef57610fef61514e565b90600052602060002090602602016110086001876133a5565b6110136002886133a5565b6040518563ffffffff1660e01b8152600401610f6a9493929190615371565b919050565b60106110433382612434565b61105f5760405162461bcd60e51b8152600401610c61906150c7565b60008211801561106f575060fa82105b6110aa5760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610c61565b50600e55565b60046110bc3382612434565b6110d85760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613458565b50505050565b6009805461110690615164565b80601f016020809104026020016040519081016040528092919081815260200182805461113290615164565b801561117f5780601f106111545761010080835404028352916020019161117f565b820191906000526020600020905b81548152906001019060200180831161116257829003601f168201915b505050505081565b600c6111933382612434565b6111af5760405162461bcd60e51b8152600401610c61906150c7565b50600855565b60106111c13382612434565b6111dd5760405162461bcd60e51b8152600401610c61906150c7565b600754610100900460ff16156112285760405162461bcd60e51b815260206004820152601060248201526f3bb293b9329030b63932b0b23c9034b760811b6044820152606401610c61565b6007805461ffff191661010017905561012c600c556000600d55604080516020601f8d018190048102820181019092528b81526112a3918d908d90819084018382808284376000920191909152505060408051808201909152600c81526b636f64652e6c61776c65737360a01b6020820152915061323d9050565b60005b888110156114b2576006546000906112bf9060056153bb565b90506113038b8b848181106112d6576112d661514e565b90506020020160208101906112eb9190614895565b82600160405180602001604052806000815250613625565b60066040518060a00160405280600060ff1681526020018b8b8681811061132c5761132c61514e565b905060200201602081019061134191906153ce565b60048b8b888181106113555761135561514e565b905060200201602081019061136a91906153ce565b60ff16901b61137991906153e9565b60ff1681526020014364ffffffffff1681526020018d8d868181106113a0576113a061514e565b90506020020160208101906113b59190614895565b6001600160a01b031681526020018787868181106113d5576113d561514e565b90506020028101906113e79190615402565b6113f090615423565b905281546001818101845560009384526020938490208351602690930201805494840151604085015160608601516001600160a01b0316600160381b02670100000000000000600160d81b031964ffffffffff90921662010000029190911662010000600160d81b031960ff9384166101000261ffff19909916939096169290921796909617939093169290921793909317815560808201519192909161149b9183019060256142e7565b5050505080806114aa9061542f565b9150506112a6565b505050505050505050505050565b6000806000612710601154856114d69190615448565b6114e09190615475565b6010546001600160a01b031693509150505b9250929050565b60055460ff161561151c5760405162461bcd60e51b8152600401610c6190615489565b61152c8888888888888888613767565b5050505050505050565b6002546001600160a01b0316331461157c5760405162461bcd60e51b81526020600482015260096024820152680dcdee840c6dec8caf60bb1b6044820152606401610c61565b600260009054906101000a90046001600160a01b03166001600160a01b031663a79b81736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f391906154a9565b604051630f41a04d60e11b81526001600160a01b0383811660048301529190911690631e83409a906024016020604051808303816000875af115801561163d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dda91906154c6565b8161166b81612563565b6116875760405162461bcd60e51b8152600401610c61906154df565b600b6116933382612434565b6116af5760405162461bcd60e51b8152600401610c61906150c7565b600060066116be60058761513b565b815481106116ce576116ce61514e565b60009182526020909120602690910201805460ff19811660ff90911617600190811782559091506117039082018560256142e7565b505050505050565b600f6117173382612434565b6117335760405162461bcd60e51b8152600401610c61906150c7565b600554604051630384f81360e41b81526101009091046001600160a01b03169063384f813090611771908a908a908a908a908a908a906004016155f8565b600060405180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b5050505050505050505050565b6000600460008360158111156117c4576117c4615634565b60ff90811682526020820192909252604001600020541692915050565b60066117ed3382612434565b6118095760405162461bcd60e51b8152600401610c61906150c7565b611812336139e8565b50565b60156118213382612434565b61183d5760405162461bcd60e51b8152600401610c61906150c7565b60055460ff1615156001146118815760405162461bcd60e51b815260206004820152600a602482015269139bdd0814185d5cd95960b21b6044820152606401610c61565b6005805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a150565b6118ca612320565b6001600160a01b0316336001600160a01b031614806118ef57506118ef336000612434565b8061190457506002546001600160a01b031633145b6119205760405162461bcd60e51b8152600401610c61906150a1565b600554600160a81b900460ff16156119685760405162461bcd60e51b815260206004820152600b60248201526a125b9a5d1a585b1a5e995960aa1b6044820152606401610c61565b6005805460ff60a81b1916600160a81b179055600254604080513060208201526001600160a01b03909216908201526119da9060009081908590859060600160408051601f19818403018152908290526119c693929160200161564a565b604051602081830303815290604052613a1d565b600560016101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b611a0c612320565b6001600160a01b0316336001600160a01b03161480611a315750611a31336000612434565b80611a4657506002546001600160a01b031633145b611a625760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613b21565b6060816001600160401b03811115611a8657611a866144f7565b604051908082528060200260200182016040528015611aaf578160200160208202803683370190505b50905060005b82811015611b23576001600160a01b038516600090815260208190526040812090858584818110611ae857611ae861514e565b90506020020135815260200190815260200160002054828281518110611b1057611b1061514e565b6020908102919091010152600101611ab5565b509392505050565b6060838214611b4c5760405162461bcd60e51b8152600401610c6190615671565b836001600160401b03811115611b6457611b646144f7565b604051908082528060200260200182016040528015611b8d578160200160208202803683370190505b50905060005b84811015611c3457600080878784818110611bb057611bb061514e565b9050602002016020810190611bc59190614895565b6001600160a01b03166001600160a01b031681526020019081526020016000206000858584818110611bf957611bf961514e565b90506020020135815260200190815260200160002054828281518110611c2157611c2161514e565b6020908102919091010152600101611b93565b50949350505050565b611c45612320565b6001600160a01b0316336001600160a01b03161480611c6a5750611c6a336000612434565b80611c7f57506002546001600160a01b031633145b611c9b5760405162461bcd60e51b8152600401610c61906150a1565b60005b8151811015610dda57611cc9828281518110611cbc57611cbc61514e565b6020026020010151613c81565b80611cd38161542f565b915050611c9e565b6012611ce73382612434565b611d035760405162461bcd60e51b8152600401610c61906150c7565b611d0d60046117ac565b15611d465760405162461bcd60e51b815260206004820152600960248201526834ba13b99037bb32b960b91b6044820152606401610c61565b611d51826004611a04565b50600f805460ff196001600160a01b0390931661010002929092166001600160a81b0319909216919091176001179055565b6010611d8f3382612434565b611dab5760405162461bcd60e51b8152600401610c61906150c7565b811580611dce5750611dbe600283615475565b8311158015611dce5750611c2083105b611e1a5760405162461bcd60e51b815260206004820152601b60248201527f706f77657220726571756972656d656e747320657863656564656400000000006044820152606401610c61565b50600c91909155600d55565b33611e2f612320565b6001600160a01b031614611e555760405162461bcd60e51b8152600401610c61906150f0565b611812611e60612320565b82613d30565b6012611e723382612434565b611e8e5760405162461bcd60e51b8152600401610c61906150c7565b600f54611eaa9061010090046001600160a01b03166004612653565b611eb460046126bb565b50600f805460ff19169055565b6002546060906001600160a01b031663c669e9c9611ee6611ee160065490565b613e13565b6040518263ffffffff1660e01b8152600401611f02919061569a565b600060405180830381865afa158015611f1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f479190810190615297565b905090565b6000805b602581101561200b576000838260258110611f6d57611f6d61514e565b6020020151611f7b906156c9565b60f81c905060618110801590611f925750607a8111155b80611f9d5750806020145b80611fb55750602d8110158015611fb5575060398111155b80611fc05750806027145b80611fcb575080603f145b80611fd65750806021145b15611fe15750611ff9565b80600003611fef575061200b565b5060009392505050565b806120038161542f565b915050611f50565b50600192915050565b60008080808060606120276005886153bb565b61203081612563565b61204c5760405162461bcd60e51b8152600401610c61906154df565b6000600689815481106120615761206161514e565b600091825260208220602690910201915060018201905b60258110156120b7578181602581106120935761209361514e565b0161209d90615700565b60f81c156120b757806120af8161542f565b915050612078565b6000816001600160401b038111156120d1576120d16144f7565b6040519080825280601f01601f1916602001820160405280156120fb576020820181803683370190505b50905060005b828110156121605783816025811061211b5761211b61514e565b0161212590615700565b8282815181106121375761213761514e565b60200101906001600160f81b031916908160001a905350806121588161542f565b915050612101565b509254600f61010082048181169c5060041c16995064ffffffffff6201000082041698506001600160a01b03600160381b8204169750600190811614955091935050505091939550919395565b60156121b93382612434565b6121d55760405162461bcd60e51b8152600401610c61906150c7565b60055460ff16156121f85760405162461bcd60e51b8152600401610c6190615489565b6005805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016118b7565b600a805461110690615164565b600f61224e3382612434565b61226a5760405162461bcd60e51b8152600401610c61906150c7565b6005546040516386a3555d60e01b81526101009091046001600160a01b0316906386a3555d906122a490889088908890889060040161574e565b600060405180830381600087803b1580156122be57600080fd5b505af11580156122d2573d6000803e3d6000fd5b505050505050505050565b60046122e93382612434565b6123055760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613625565b6002546040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000060048201526000916001600160a01b031690636352211e90602401602060405180830381865afa158015612389573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4791906154a9565b600c6123b93382612434565b6123d55760405162461bcd60e51b8152600401610c61906150c7565b6005546040516394e83b9b60e01b815283151560048201526101009091046001600160a01b0316906394e83b9b90602401600060405180830381600087803b15801561242057600080fd5b505af1158015611703573d6000803e3d6000fd5b600081601581111561244857612448615634565b6001600160a01b038416600090815260036020526040902054600160ff929092161c811614806124b05750601282601581111561248757612487615634565b1480156124b05750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b806124ef575060008260158111156124ca576124ca615634565b1480156124ef57506124da612320565b6001600160a01b0316836001600160a01b0316145b9392505050565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b600060058210158015610bfd575060065461257f60058461513b565b1092915050565b60126125923382612434565b6125ae5760405162461bcd60e51b8152600401610c61906150c7565b506005805460ff60b01b19169055565b60086125ca3382612434565b6125e65760405162461bcd60e51b8152600401610c61906150c7565b60055460405163b12c029960e01b81526101009091046001600160a01b03169063b12c02999061261c9086908690600401615775565b600060405180830381600087803b15801561263657600080fd5b505af115801561264a573d6000803e3d6000fd5b50505050505050565b61265b612320565b6001600160a01b0316336001600160a01b031614806126805750612680336000612434565b8061269557506002546001600160a01b031633145b6126b15760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613ea5565b6126c3612320565b6001600160a01b0316336001600160a01b031614806126e857506126e8336000612434565b806126fd57506002546001600160a01b031633145b6127195760405162461bcd60e51b8152600401610c61906150a1565b61181281613c81565b8261272c81612563565b6127485760405162461bcd60e51b8152600401610c61906154df565b818361275382611f4c565b61276f5760405162461bcd60e51b8152600401610c6190615796565b60058160ff16106127be5760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b0382163314806127fa57506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b806129255750600554600160b01b900460ff168015612925575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289691906157d7565b806129255750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612901573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292591906157d7565b6129715760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b6008543410156129b75760405162461bcd60e51b81526020600482015260116024820152707061727473206172656e2774206672656560781b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054600114612a185760405162461bcd60e51b815260206004820152600d60248201526c1a1858dac81d1a1dd85c9d1959609a1b6044820152606401610c61565b60006006612a2760058b61513b565b81548110612a3757612a3761514e565b600091825260209091206026909102019050612a58600182018860256142e7565b50805466ffffffffffff01600160d81b031916600160381b6001600160a01b038c160260ff191617808255612a9d906101009004600f1660048a901b610ff0166153e9565b815460ff919091166101000261ff0019909116179055505050505050505050565b60008183612acb82611f4c565b612ae75760405162461bcd60e51b8152600401610c6190615796565b60058160ff1610612b365760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b038216331480612b7257506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b80612c9d5750600554600160b01b900460ff168015612c9d575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0e91906157d7565b80612c9d5750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9d91906157d7565b612ce95760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b60058810612d395760405162461bcd60e51b815260206004820152601860248201527f696e636f6d70617469626c65207472616e73706f6e64657200000000000000006044820152606401610c61565b60075460ff1615612d755760405162461bcd60e51b81526020600482015260066024820152651a985b5b595960d21b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054612de35760405162461bcd60e51b815260206004820152601f60248201527f796f75276c6c206e65656420746f2072756d6d61676520666f722074686174006044820152606401610c61565b600654612df19060056153bb565b9450612dff89896001613f99565b612e1b8986600160405180602001604052806000815250613625565b6040805160a081019091526000815260069060208101612e438b610ff060048d901b166153e9565b60ff1681526020014364ffffffffff1681526020018b6001600160a01b0316815260200188815250908060018154018082558091505060019003906000526020600020906026020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548164ffffffffff021916908364ffffffffff16021790555060608201518160000160076101000a8154816001600160a01b0302191690836001600160a01b03160217905550608082015181600101906025612f439291906142e7565b50505050505050949350505050565b612f5a612320565b6001600160a01b0316336001600160a01b03161480612f7f5750612f7f336000612434565b80612f9457506002546001600160a01b031633145b612fb05760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a57612ff8838281518110612fd157612fd161514e565b6020026020010151838381518110612feb57612feb61514e565b6020026020010151613ea5565b806130028161542f565b915050612fb3565b505050565b613017612320565b6001600160a01b0316336001600160a01b0316148061303c575061303c336000612434565b8061305157506002546001600160a01b031633145b61306d5760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a576130b583828151811061308e5761308e61514e565b60200260200101518383815181106130a8576130a861514e565b6020026020010151613b21565b806130bf8161542f565b915050613070565b600a6130d33382612434565b6130ef5760405162461bcd60e51b8152600401610c61906150c7565b60055460405163f09f3f3160e01b81526101009091046001600160a01b03169063f09f3f3190613127908790879087906004016157f4565b600060405180830381600087803b15801561314157600080fd5b505af115801561152c573d6000803e3d6000fd5b60055460ff16156131785760405162461bcd60e51b8152600401610c6190615489565b61170386868686868661401d565b3361318f612320565b6001600160a01b0316146131b55760405162461bcd60e51b8152600401610c61906150f0565b6002546040516350a1a66560e01b81527f000000000000000000000000000000000000000000000000000000000000000060048201526001600160a01b038381166024830152909116906350a1a66590604401600060405180830381600087803b15801561322257600080fd5b505af1158015613236573d6000803e3d6000fd5b5050505050565b60106132493382612434565b6132655760405162461bcd60e51b8152600401610c61906150c7565b60096132718482615861565b5043600b55600a6132828382615861565b507f297aa6cf51bb39507374bfcb61edead3172fc87755dea183d848c3a23c70496783836040516132b4929190615920565b60405180910390a1505050565b6000600980546132d090615164565b90506000036132df5750600090565b600d546000036132ff57600c54600b546132f9904361513b565b10905090565b600c54600d54600b54613312904361513b565b6132f99190615945565b60006301ffc9a760e01b6001600160e01b03198316148061334d5750636cdb3d1360e11b6001600160e01b03198316145b80610bfd5750506001600160e01b0319166303a24d0760e21b1490565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018390528316906342842e0e9060640161261c565b600080600e54436133b69190615945565b6133c0904361513b565b9050600084846133d160028561513b565b60408051602081019490945283019190915240606082015260800160408051601f1981840301815291905280516020909101206006805463ffffffff909216925090613426680470d97cab4ce6941b84615448565b6134309190615945565b815481106134405761344061514e565b90600052602060002090602602019250505092915050565b82518251811461347a5760405162461bcd60e51b8152600401610c6190615671565b60005b81811015613509578381815181106134975761349761514e565b6020026020010151600080886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106134d7576134d761514e565b6020026020010151815260200190815260200160002060008282546134fc91906153bb565b909155505060010161347d565b50846001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161355a929190615959565b60405180910390a46001600160a01b0385163b156135fc5760405163bc197c8160e01b808252906001600160a01b0387169063bc197c81906135a99033906000908a908a908a9060040161597e565b6020604051808303816000875af11580156135c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ec91906159d0565b6001600160e01b03191614613609565b6001600160a01b03851615155b6132365760405162461bcd60e51b8152600401610c61906159ed565b6001600160a01b038416600090815260208181526040808320868452909152812080548492906136569084906153bb565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b1561373e5760405163f23a6e6160e01b808252906001600160a01b0386169063f23a6e61906136eb903390600090899089908990600401615a17565b6020604051808303816000875af115801561370a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372e91906159d0565b6001600160e01b0319161461374b565b6001600160a01b03841615155b6110f35760405162461bcd60e51b8152600401610c61906159ed565b8483146137865760405162461bcd60e51b8152600401610c6190615671565b336001600160a01b03891614806137c057506001600160a01b038816600090815260016020908152604080832033845290915290205460ff165b6137fd5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b60008060005b878110156138b85788888281811061381d5761381d61514e565b9050602002013592508686828181106138385761383861514e565b6001600160a01b038e166000908152602081815260408083208984528252822080549390910294909401359550859392509061387590849061513b565b90915550506001600160a01b038a16600090815260208181526040808320868452909152812080548492906138ab9084906153bb565b9091555050600101613803565b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b60405161390c9493929190615a51565b60405180910390a46001600160a01b0389163b156139b35760405163bc197c8160e01b808252906001600160a01b038b169063bc197c81906139609033908f908e908e908e908e908e908e90600401615a78565b6020604051808303816000875af115801561397f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a391906159d0565b6001600160e01b031916146139c0565b6001600160a01b03891615155b6139dc5760405162461bcd60e51b8152600401610c61906159ed565b50505050505050505050565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610dda573d6000803e3d6000fd5b600083471015613a6f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610c61565b8151600003613ac05760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610c61565b8282516020840186f590506001600160a01b0381166124ef5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610c61565b6012816015811115613b3557613b35615634565b03613b8e5760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b6064820152608401610c61565b60046000826015811115613ba457613ba4615634565b60ff90811682526020820192909252604001600020541615613bf15760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613c0357613c03615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b9091179055806015811115613c4057613c40615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6001604051612557911515815260200190565b60046000826015811115613c9757613c97615634565b60ff90811682526020820192909252604001600020541661181257600160046000836015811115613cca57613cca615634565b60ff1681526020810191909152604001600020805460ff1916911515919091179055806015811115613cfe57613cfe615634565b60ff167f2a4c011a3eb263cc32455711057131757df48518d49547f77ab832d8681a53ff60405160405180910390a250565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015613d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da491906154c6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613def573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f391906157d7565b60606000613e208361420f565b60010190506000816001600160401b03811115613e3f57613e3f6144f7565b6040519080825280601f01601f191660200182016040528015613e69576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613e7357509392505050565b60046000826015811115613ebb57613ebb615634565b60ff90811682526020820192909252604001600020541615613f085760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613f1a57613f1a615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b199091169055806015811115613f5857613f58615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6000604051612557911515815260200190565b6001600160a01b03831660009081526020818152604080832085845290915281208054839290613fca90849061513b565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b336001600160a01b038716148061405757506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b6140945760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b6001600160a01b038616600090815260208181526040808320878452909152812080548592906140c590849061513b565b90915550506001600160a01b038516600090815260208181526040808320878452909152812080548592906140fb9084906153bb565b909155505060408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0385163b156141e65760405163f23a6e6160e01b808252906001600160a01b0387169063f23a6e61906141939033908b908a908a908a908a90600401615adc565b6020604051808303816000875af11580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d691906159d0565b6001600160e01b031916146141f3565b6001600160a01b03851615155b6117035760405162461bcd60e51b8152600401610c61906159ed565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061424e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061427a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061429857662386f26fc10000830492506010015b6305f5e10083106142b0576305f5e100830492506008015b61271083106142c457612710830492506004015b606483106142d6576064830492506002015b600a8310610bfd5760010192915050565b8260258101928215614320579160200282015b8281111561432057825182906143109082615861565b50916020019190600101906142fa565b5061432c929150614330565b5090565b8082111561432c576000614344828261434d565b50600101614330565b50805461435990615164565b6000825580601f10614369575050565b601f01602090049060005260206000209081019061181291905b8082111561432c5760008155600101614383565b6001600160a01b038116811461181257600080fd5b600080604083850312156143bf57600080fd5b82356143ca81614397565b946020939093013593505050565b6001600160e01b03198116811461181257600080fd5b60006020828403121561440057600080fd5b81356124ef816143d8565b6000806040838503121561441e57600080fd5b823561442981614397565b915060208301356001600160601b038116811461444557600080fd5b809150509250929050565b801515811461181257600080fd5b60006020828403121561447057600080fd5b81356124ef81614450565b60006020828403121561448d57600080fd5b5035919050565b60005b838110156144af578181015183820152602001614497565b50506000910152565b600081518084526144d0816020860160208601614494565b601f01601f19169290920160200192915050565b6020815260006124ef60208301846144b8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614535576145356144f7565b604052919050565b60006001600160401b03821115614556576145566144f7565b5060051b60200190565b600082601f83011261457157600080fd5b813560206145866145818361453d565b61450d565b82815260059290921b840181019181810190868411156145a557600080fd5b8286015b848110156145c057803583529183019183016145a9565b509695505050505050565b6000806000606084860312156145e057600080fd5b83356145eb81614397565b925060208401356001600160401b038082111561460757600080fd5b61461387838801614560565b9350604086013591508082111561462957600080fd5b5061463686828701614560565b9150509250925092565b60008083601f84011261465257600080fd5b5081356001600160401b0381111561466957600080fd5b6020830191508360208285010111156114f257600080fd5b60008083601f84011261469357600080fd5b5081356001600160401b038111156146aa57600080fd5b6020830191508360208260051b85010111156114f257600080fd5b60008060008060008060008060008060a08b8d0312156146e457600080fd5b8a356001600160401b03808211156146fb57600080fd5b6147078e838f01614640565b909c509a5060208d013591508082111561472057600080fd5b61472c8e838f01614681565b909a50985060408d013591508082111561474557600080fd5b6147518e838f01614681565b909850965060608d013591508082111561476a57600080fd5b6147768e838f01614681565b909650945060808d013591508082111561478f57600080fd5b5061479c8d828e01614681565b915080935050809150509295989b9194979a5092959850565b600080604083850312156147c857600080fd5b50508035926020909101359150565b60008060008060008060008060a0898b0312156147f357600080fd5b88356147fe81614397565b9750602089013561480e81614397565b965060408901356001600160401b038082111561482a57600080fd5b6148368c838d01614681565b909850965060608b013591508082111561484f57600080fd5b61485b8c838d01614681565b909650945060808b013591508082111561487457600080fd5b506148818b828c01614640565b999c989b5096995094979396929594505050565b6000602082840312156148a757600080fd5b81356124ef81614397565b60006001600160401b038211156148cb576148cb6144f7565b50601f01601f191660200190565b600082601f8301126148ea57600080fd5b81356148f8614581826148b2565b81815284602083860101111561490d57600080fd5b816020850160208301376000918101602001919091529392505050565b60006040516104a08082016001600160401b038382108183111715614951576149516144f7565b8160405283945082860192508683111561496a57600080fd5b8591505b828210156149a6578135818111156149865760008081fd5b614992888289016148d9565b85525060208401935060208201915061496e565b5050505092915050565b600082601f8301126149c157600080fd5b6124ef838361492a565b600080604083850312156149de57600080fd5b8235915060208301356001600160401b038111156149fb57600080fd5b614a07858286016149b0565b9150509250929050565b60008060008060008060608789031215614a2a57600080fd5b86356001600160401b0380821115614a4157600080fd5b614a4d8a838b01614681565b90985096506020890135915080821115614a6657600080fd5b614a728a838b01614681565b90965094506040890135915080821115614a8b57600080fd5b50614a9889828a01614681565b979a9699509497509295939492505050565b80356016811061103257600080fd5b600060208284031215614acb57600080fd5b6124ef82614aaa565b60008060208385031215614ae757600080fd5b82356001600160401b03811115614afd57600080fd5b614b0985828601614640565b90969095509350505050565b60008060408385031215614b2857600080fd5b8235614b3381614397565b9150614b4160208401614aaa565b90509250929050565b600080600060408486031215614b5f57600080fd5b8335614b6a81614397565b925060208401356001600160401b03811115614b8557600080fd5b614b9186828701614681565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614bce57815187529582019590820190600101614bb2565b509495945050505050565b6020815260006124ef6020830184614b9e565b60008060008060408587031215614c0257600080fd5b84356001600160401b0380821115614c1957600080fd5b614c2588838901614681565b90965094506020870135915080821115614c3e57600080fd5b50614c4b87828801614681565b95989497509550505050565b600082601f830112614c6857600080fd5b81356020614c786145818361453d565b82815260059290921b84018101918181019086841115614c9757600080fd5b8286015b848110156145c057614cac81614aaa565b8352918301918301614c9b565b600060208284031215614ccb57600080fd5b81356001600160401b03811115614ce157600080fd5b614ced84828501614c57565b949350505050565b600060208284031215614d0757600080fd5b81356001600160401b03811115614d1d57600080fd5b614ced848285016149b0565b60ff87811682528616602082015264ffffffffff851660408201526001600160a01b0384166060820152821515608082015260c060a08201819052600090614d73908301846144b8565b98975050505050505050565b600080600060608486031215614d9457600080fd5b8335614d9f81614397565b95602085013595506040909401359392505050565b60008060408385031215614dc757600080fd5b8235614dd281614397565b9150602083013561444581614450565b60008060408385031215614df557600080fd5b823565ffffffffffff81168114614e0b57600080fd5b915060208301356001600160401b03811115614e2657600080fd5b614a07858286016148d9565b803560ff8116811461103257600080fd5b60008060008060808587031215614e5957600080fd5b8435614e6481614397565b935060208501359250614e7960408601614e32565b915060608501356001600160401b03811115614e9457600080fd5b614ea0878288016149b0565b91505092959194509250565b60008060408385031215614ebf57600080fd5b82356001600160401b0380821115614ed657600080fd5b818501915085601f830112614eea57600080fd5b81356020614efa6145818361453d565b82815260059290921b84018101918181019089841115614f1957600080fd5b948201945b83861015614f40578535614f3181614397565b82529482019490820190614f1e565b96505086013592505080821115614f5657600080fd5b50614a0785828601614c57565b60008060408385031215614f7657600080fd5b8235614f8181614397565b9150602083013561444581614397565b600080600060608486031215614fa657600080fd5b8335614fb181614397565b92506020840135915060408401356001600160401b03811115614fd357600080fd5b614636868287016148d9565b60008060008060008060a08789031215614ff857600080fd5b863561500381614397565b9550602087013561501381614397565b9450604087013593506060870135925060808701356001600160401b0381111561503c57600080fd5b614a9889828a01614640565b6000806040838503121561505b57600080fd5b82356001600160401b038082111561507257600080fd5b61507e868387016148d9565b9350602085013591508082111561509457600080fd5b50614a07858286016148d9565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600f908201526e75736572206c61636b7320726f6c6560881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bfd57610bfd615125565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061517857607f821691505b60208210810361519857634e487b7160e01b600052602260045260246000fd5b50919050565b600081546151ab81615164565b8085526020600183811680156151c857600181146151e257615210565b60ff1985168884015283151560051b880183019550615210565b866000528260002060005b858110156152085781548a82018601529083019084016151ed565b890184019650505b505050505092915050565b861515815285602082015284604082015283606082015260c06080820152600061524860c083018561519e565b82810360a084015261525a818561519e565b9998505050505050505050565b6000615275614581846148b2565b905082815283838301111561528957600080fd5b6124ef836020830184614494565b6000602082840312156152a957600080fd5b81516001600160401b038111156152bf57600080fd5b8201601f810184136152d057600080fd5b614ced84825160208401615267565b600060a08301825460ff81168552602060ff8260081c168187015264ffffffffff8260101c16604087015260018060a01b038260381c1660608701526001915060a06080870152828390506105408701935082860160005b602581101561536457888603609f19018352615353868361519e565b955091830191908401908401615337565b5093979650505050505050565b84815260806020820152600061538a60808301866152df565b828103604084015261539c81866152df565b905082810360608401526153b081856152df565b979650505050505050565b80820180821115610bfd57610bfd615125565b6000602082840312156153e057600080fd5b6124ef82614e32565b60ff8181168382160190811115610bfd57610bfd615125565b6000823561049e1983360301811261541957600080fd5b9190910192915050565b6000610bfd368361492a565b60006001820161544157615441615125565b5060010190565b8082028115828204841417610bfd57610bfd615125565b634e487b7160e01b600052601260045260246000fd5b6000826154845761548461545f565b500490565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156154bb57600080fd5b81516124ef81614397565b6000602082840312156154d857600080fd5b5051919050565b6020808252601390820152721cda59db985b081b9bdd0819195d1958dd1959606a1b604082015260600190565b81835260006001600160fb1b0383111561552557600080fd5b8260051b80836020870137939093016020019392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156155eb5782840389528135601e198836030181126155a257600080fd5b870185810190356001600160401b038111156155bd57600080fd5b8036038213156155cc57600080fd5b6155d786828461553e565b9a87019a9550505090840190600101615581565b5091979650505050505050565b60608152600061560c60608301888a61550c565b828103602084015261561f818789615567565b9050828103604084015261525a818587615567565b634e487b7160e01b600052602160045260246000fd5b828482376000838201600081528351615667818360208801614494565b0195945050505050565b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b604081526005604082015264706565727360d81b60608201526080602082015260006124ef60808301846144b8565b805160208201516001600160f81b031980821692919060018310156156f85780818460010360031b1b83161693505b505050919050565b600061570c8254615164565b82601f8211156157225783600052602060002090505b546001600160f81b0319808216935060018310156156f85760019290920360031b82901b161692915050565b604081526000615762604083018688615567565b82810360208401526153b0818587615567565b65ffffffffffff83168152604060208201526000614ced60408301846144b8565b60208082526021908201527f756e7265636f76657261626c6520756e636f727265637461626c65206572726f6040820152603960f91b606082015260800190565b6000602082840312156157e957600080fd5b81516124ef81614450565b60018060a01b0384168152826020820152606060408201526000610f2760608301846144b8565b601f82111561300a57600081815260208120601f850160051c810160208610156158425750805b601f850160051c820191505b818110156117035782815560010161584e565b81516001600160401b0381111561587a5761587a6144f7565b61588e816158888454615164565b8461581b565b602080601f8311600181146158c357600084156158ab5750858301515b600019600386901b1c1916600185901b178555611703565b600085815260208120601f198616915b828110156158f2578886015182559484019460019091019084016158d3565b50858210156159105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061593360408301856144b8565b8281036020840152610f2781856144b8565b6000826159545761595461545f565b500690565b60408152600061596c6040830185614b9e565b8281036020840152610f278185614b9e565b6001600160a01b0386811682528516602082015260a0604082018190526000906159aa90830186614b9e565b82810360608401526159bc8186614b9e565b90508281036080840152614d7381856144b8565b6000602082840312156159e257600080fd5b81516124ef816143d8565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906153b0908301846144b8565b604081526000615a6560408301868861550c565b82810360208401526153b081858761550c565b6001600160a01b0389811682528816602082015260a060408201819052600090615aa5908301888a61550c565b8281036060840152615ab881878961550c565b90508281036080840152615acd81858761553e565b9b9a5050505050505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090614d73908301848661553e56fea2646970667358221220a1510b0e2b6728f50bba153ba8f1bcf1e86f5a038f4073c2db9d6e4bf6261ec764736f6c634300081100330000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x6080604052600436106103b75760003560e01c806357412efa116101f2578063af7460f71161010d578063e985e9c5116100a0578063f2fde38b1161006f578063f2fde38b14610b48578063f8ca7b2814610b68578063f9d4b07114610b88578063fc22f32e14610ba857600080fd5b8063e985e9c514610ab7578063e9d0348714610af2578063f09f3f3114610b08578063f242432a14610b2857600080fd5b8063d6ea448a116100dc578063d6ea448a14610a44578063d800d4fc14610a57578063d84a522314610a77578063e04388c414610a9757600080fd5b8063af7460f7146109cf578063b12c0299146109e4578063b74866fb14610a04578063cc16210214610a2457600080fd5b8063845b2a951161018557806394e83b9b1161015457806394e83b9b1461094f57806395a8c58d1461096f578063a22cb4651461098f578063a55de951146109af57600080fd5b8063845b2a95146108cd57806386a3555d146108e25780638ca0c1bd146109025780638da5cb5b1461092257600080fd5b806365990b9a116101c157806365990b9a146108515780637087448314610866578063828e58e2146108865780638456cb59146108b857600080fd5b806357412efa146107e25780635c471995146108025780635c975abb1461082257806364f101f01461083c57600080fd5b806325d64f11116102e25780633f4ba83a116102755780634e1273f4116102445780634e1273f41461076157806354b8c60114610781578063550bb2f1146107a25780635693ff3c146107c257600080fd5b80633f4ba83a146106df578063439fab91146106f457806344deb6f3146107145780634def354b1461073457600080fd5b80633685aa17116102b15780633685aa171461066a578063384f81301461068a5780633c4bec2a146106aa5780633ccfd60b146106ca57600080fd5b806325d64f11146105cb5780632a55205a146105eb5780632eb2c2d61461062a57806334fae5571461064a57600080fd5b80630fb1373f1161035a57806317d70f7c1161032957806317d70f7c146105485780631ab18dfd1461057c5780631b95da2c1461059157806324bbd049146105b157600080fd5b80630fb1373f146104dd578063107365bc146104f35780631377bb7b14610513578063168c5c4f1461053357600080fd5b806308d24e231161039657806308d24e23146104565780630c8f1e92146104705780630ce06b68146104905780630e89341c146104b057600080fd5b8062fdd58e146103bc57806301ffc9a71461040457806304634d8d14610434575b600080fd5b3480156103c857600080fd5b506103f16103d73660046143ac565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b34801561041057600080fd5b5061042461041f3660046143ee565b610bbd565b60405190151581526020016103fb565b34801561044057600080fd5b5061045461044f36600461440b565b610c03565b005b34801561046257600080fd5b506007546104249060ff1681565b34801561047c57600080fd5b5061045461048b36600461445e565b610d5d565b34801561049c57600080fd5b506104546104ab3660046143ac565b610d99565b3480156104bc57600080fd5b506104d06104cb36600461447b565b610dde565b6040516103fb91906144e4565b3480156104e957600080fd5b506103f160085481565b3480156104ff57600080fd5b5061045461050e36600461447b565b611037565b34801561051f57600080fd5b5061045461052e3660046145cb565b6110b0565b34801561053f57600080fd5b506104d06110f9565b34801561055457600080fd5b506103f17f000000000000000000000000000000000000000000000000000000000000000181565b34801561058857600080fd5b506006546103f1565b34801561059d57600080fd5b506104546105ac36600461447b565b611187565b3480156105bd57600080fd5b50600f546104249060ff1681565b3480156105d757600080fd5b506104546105e63660046146c5565b6111b5565b3480156105f757600080fd5b5061060b6106063660046147b5565b6114c0565b604080516001600160a01b0390931683526020830191909152016103fb565b34801561063657600080fd5b506104546106453660046147d7565b6114f9565b34801561065657600080fd5b50610454610665366004614895565b611536565b34801561067657600080fd5b506104546106853660046149cb565b611661565b34801561069657600080fd5b506104546106a5366004614a11565b61170b565b3480156106b657600080fd5b506104246106c5366004614ab9565b6117ac565b3480156106d657600080fd5b506104546117e1565b3480156106eb57600080fd5b50610454611815565b34801561070057600080fd5b5061045461070f366004614ad4565b6118c2565b34801561072057600080fd5b5061045461072f366004614b15565b611a04565b34801561074057600080fd5b5061075461074f366004614b4a565b611a6c565b6040516103fb9190614bd9565b34801561076d57600080fd5b5061075461077c366004614bec565b611b2b565b34801561078d57600080fd5b5060055461042490600160b01b900460ff1681565b3480156107ae57600080fd5b506104546107bd366004614cb9565b611c3d565b3480156107ce57600080fd5b506104546107dd366004614895565b611cdb565b3480156107ee57600080fd5b506104546107fd3660046147b5565b611d83565b34801561080e57600080fd5b5061045461081d366004614895565b611e26565b34801561082e57600080fd5b506005546104249060ff1681565b34801561084857600080fd5b50610454611e66565b34801561085d57600080fd5b506104d0611ec1565b34801561087257600080fd5b50610424610881366004614cf5565b611f4c565b34801561089257600080fd5b506108a66108a136600461447b565b612014565b6040516103fb96959493929190614d29565b3480156108c457600080fd5b506104546121ad565b3480156108d957600080fd5b506104d0612235565b3480156108ee57600080fd5b506104546108fd366004614bec565b612242565b34801561090e57600080fd5b5061045461091d366004614d7f565b6122dd565b34801561092e57600080fd5b50610937612320565b6040516001600160a01b0390911681526020016103fb565b34801561095b57600080fd5b5061045461096a36600461445e565b6123ad565b34801561097b57600080fd5b5061042461098a366004614b15565b612434565b34801561099b57600080fd5b506104546109aa366004614db4565b6124f6565b3480156109bb57600080fd5b506104246109ca36600461447b565b612563565b3480156109db57600080fd5b50610454612586565b3480156109f057600080fd5b506104546109ff366004614de2565b6125be565b348015610a1057600080fd5b50610454610a1f366004614b15565b612653565b348015610a3057600080fd5b50610454610a3f366004614ab9565b6126bb565b610454610a52366004614e43565b612722565b348015610a6357600080fd5b506103f1610a72366004614e43565b612abe565b348015610a8357600080fd5b50610454610a92366004614eac565b612f52565b348015610aa357600080fd5b50610454610ab2366004614eac565b61300f565b348015610ac357600080fd5b50610424610ad2366004614f63565b600160209081526000928352604080842090915290825290205460ff1681565b348015610afe57600080fd5b506103f1600e5481565b348015610b1457600080fd5b50610454610b23366004614f91565b6130c7565b348015610b3457600080fd5b50610454610b43366004614fdf565b613155565b348015610b5457600080fd5b50610454610b63366004614895565b613186565b348015610b7457600080fd5b50610454610b83366004615048565b61323d565b348015610b9457600080fd5b50600254610937906001600160a01b031681565b348015610bb457600080fd5b506104246132c1565b600063152a902d60e11b6001600160e01b031983161480610bee57506001600160e01b031982166332cc85cd60e11b145b80610bfd5750610bfd8261331c565b92915050565b610c0b612320565b6001600160a01b0316336001600160a01b03161480610c305750610c30336000612434565b80610c4557506002546001600160a01b031633145b610c6a5760405162461bcd60e51b8152600401610c61906150a1565b60405180910390fd5b612710816001600160601b03161115610cd85760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b6064820152608401610c61565b6001600160a01b038216610d2e5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610c61565b601080546001600160a01b0319166001600160a01b0393909316929092179091556001600160601b0316601155565b6011610d693382612434565b610d855760405162461bcd60e51b8152600401610c61906150c7565b506007805460ff1916911515919091179055565b33610da2612320565b6001600160a01b031614610dc85760405162461bcd60e51b8152600401610c61906150f0565b610dda610dd3612320565b838361336a565b5050565b60606005821080610dfa5750600654610df860058461513b565b105b610e3d5760405162461bcd60e51b81526020600482015260146024820152731d5b9c9958dbd9db9a5e99590818da185b9b995b60621b6044820152606401610c61565b610e456132c1565b15610f30578160008060058310610ea0576006610e6360058761513b565b81548110610e7357610e7361514e565b60009182526020909120602690910201546101009004600f16925060019150610e9d60058661513b565b90505b600554600b54604051633a126a7960e11b81526101009092046001600160a01b031691637424d4f291610ee29186918691899190600990600a9060040161521b565b600060405180830381865afa158015610eff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f279190810190615297565b95945050505050565b6005821015610faf57600554604051631c069d6760e01b8152600481018490526101009091046001600160a01b031690631c069d67906024015b600060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610bfd9190810190615297565b6005805461010090046001600160a01b03169063495ec49390610fd2908561513b565b6006610fdf60058761513b565b81548110610fef57610fef61514e565b90600052602060002090602602016110086001876133a5565b6110136002886133a5565b6040518563ffffffff1660e01b8152600401610f6a9493929190615371565b919050565b60106110433382612434565b61105f5760405162461bcd60e51b8152600401610c61906150c7565b60008211801561106f575060fa82105b6110aa5760405162461bcd60e51b815260206004820152600c60248201526b6f7574206f662072616e676560a01b6044820152606401610c61565b50600e55565b60046110bc3382612434565b6110d85760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613458565b50505050565b6009805461110690615164565b80601f016020809104026020016040519081016040528092919081815260200182805461113290615164565b801561117f5780601f106111545761010080835404028352916020019161117f565b820191906000526020600020905b81548152906001019060200180831161116257829003601f168201915b505050505081565b600c6111933382612434565b6111af5760405162461bcd60e51b8152600401610c61906150c7565b50600855565b60106111c13382612434565b6111dd5760405162461bcd60e51b8152600401610c61906150c7565b600754610100900460ff16156112285760405162461bcd60e51b815260206004820152601060248201526f3bb293b9329030b63932b0b23c9034b760811b6044820152606401610c61565b6007805461ffff191661010017905561012c600c556000600d55604080516020601f8d018190048102820181019092528b81526112a3918d908d90819084018382808284376000920191909152505060408051808201909152600c81526b636f64652e6c61776c65737360a01b6020820152915061323d9050565b60005b888110156114b2576006546000906112bf9060056153bb565b90506113038b8b848181106112d6576112d661514e565b90506020020160208101906112eb9190614895565b82600160405180602001604052806000815250613625565b60066040518060a00160405280600060ff1681526020018b8b8681811061132c5761132c61514e565b905060200201602081019061134191906153ce565b60048b8b888181106113555761135561514e565b905060200201602081019061136a91906153ce565b60ff16901b61137991906153e9565b60ff1681526020014364ffffffffff1681526020018d8d868181106113a0576113a061514e565b90506020020160208101906113b59190614895565b6001600160a01b031681526020018787868181106113d5576113d561514e565b90506020028101906113e79190615402565b6113f090615423565b905281546001818101845560009384526020938490208351602690930201805494840151604085015160608601516001600160a01b0316600160381b02670100000000000000600160d81b031964ffffffffff90921662010000029190911662010000600160d81b031960ff9384166101000261ffff19909916939096169290921796909617939093169290921793909317815560808201519192909161149b9183019060256142e7565b5050505080806114aa9061542f565b9150506112a6565b505050505050505050505050565b6000806000612710601154856114d69190615448565b6114e09190615475565b6010546001600160a01b031693509150505b9250929050565b60055460ff161561151c5760405162461bcd60e51b8152600401610c6190615489565b61152c8888888888888888613767565b5050505050505050565b6002546001600160a01b0316331461157c5760405162461bcd60e51b81526020600482015260096024820152680dcdee840c6dec8caf60bb1b6044820152606401610c61565b600260009054906101000a90046001600160a01b03166001600160a01b031663a79b81736040518163ffffffff1660e01b8152600401602060405180830381865afa1580156115cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115f391906154a9565b604051630f41a04d60e11b81526001600160a01b0383811660048301529190911690631e83409a906024016020604051808303816000875af115801561163d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dda91906154c6565b8161166b81612563565b6116875760405162461bcd60e51b8152600401610c61906154df565b600b6116933382612434565b6116af5760405162461bcd60e51b8152600401610c61906150c7565b600060066116be60058761513b565b815481106116ce576116ce61514e565b60009182526020909120602690910201805460ff19811660ff90911617600190811782559091506117039082018560256142e7565b505050505050565b600f6117173382612434565b6117335760405162461bcd60e51b8152600401610c61906150c7565b600554604051630384f81360e41b81526101009091046001600160a01b03169063384f813090611771908a908a908a908a908a908a906004016155f8565b600060405180830381600087803b15801561178b57600080fd5b505af115801561179f573d6000803e3d6000fd5b5050505050505050505050565b6000600460008360158111156117c4576117c4615634565b60ff90811682526020820192909252604001600020541692915050565b60066117ed3382612434565b6118095760405162461bcd60e51b8152600401610c61906150c7565b611812336139e8565b50565b60156118213382612434565b61183d5760405162461bcd60e51b8152600401610c61906150c7565b60055460ff1615156001146118815760405162461bcd60e51b815260206004820152600a602482015269139bdd0814185d5cd95960b21b6044820152606401610c61565b6005805460ff191690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a150565b6118ca612320565b6001600160a01b0316336001600160a01b031614806118ef57506118ef336000612434565b8061190457506002546001600160a01b031633145b6119205760405162461bcd60e51b8152600401610c61906150a1565b600554600160a81b900460ff16156119685760405162461bcd60e51b815260206004820152600b60248201526a125b9a5d1a585b1a5e995960aa1b6044820152606401610c61565b6005805460ff60a81b1916600160a81b179055600254604080513060208201526001600160a01b03909216908201526119da9060009081908590859060600160408051601f19818403018152908290526119c693929160200161564a565b604051602081830303815290604052613a1d565b600560016101000a8154816001600160a01b0302191690836001600160a01b031602179055505050565b611a0c612320565b6001600160a01b0316336001600160a01b03161480611a315750611a31336000612434565b80611a4657506002546001600160a01b031633145b611a625760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613b21565b6060816001600160401b03811115611a8657611a866144f7565b604051908082528060200260200182016040528015611aaf578160200160208202803683370190505b50905060005b82811015611b23576001600160a01b038516600090815260208190526040812090858584818110611ae857611ae861514e565b90506020020135815260200190815260200160002054828281518110611b1057611b1061514e565b6020908102919091010152600101611ab5565b509392505050565b6060838214611b4c5760405162461bcd60e51b8152600401610c6190615671565b836001600160401b03811115611b6457611b646144f7565b604051908082528060200260200182016040528015611b8d578160200160208202803683370190505b50905060005b84811015611c3457600080878784818110611bb057611bb061514e565b9050602002016020810190611bc59190614895565b6001600160a01b03166001600160a01b031681526020019081526020016000206000858584818110611bf957611bf961514e565b90506020020135815260200190815260200160002054828281518110611c2157611c2161514e565b6020908102919091010152600101611b93565b50949350505050565b611c45612320565b6001600160a01b0316336001600160a01b03161480611c6a5750611c6a336000612434565b80611c7f57506002546001600160a01b031633145b611c9b5760405162461bcd60e51b8152600401610c61906150a1565b60005b8151811015610dda57611cc9828281518110611cbc57611cbc61514e565b6020026020010151613c81565b80611cd38161542f565b915050611c9e565b6012611ce73382612434565b611d035760405162461bcd60e51b8152600401610c61906150c7565b611d0d60046117ac565b15611d465760405162461bcd60e51b815260206004820152600960248201526834ba13b99037bb32b960b91b6044820152606401610c61565b611d51826004611a04565b50600f805460ff196001600160a01b0390931661010002929092166001600160a81b0319909216919091176001179055565b6010611d8f3382612434565b611dab5760405162461bcd60e51b8152600401610c61906150c7565b811580611dce5750611dbe600283615475565b8311158015611dce5750611c2083105b611e1a5760405162461bcd60e51b815260206004820152601b60248201527f706f77657220726571756972656d656e747320657863656564656400000000006044820152606401610c61565b50600c91909155600d55565b33611e2f612320565b6001600160a01b031614611e555760405162461bcd60e51b8152600401610c61906150f0565b611812611e60612320565b82613d30565b6012611e723382612434565b611e8e5760405162461bcd60e51b8152600401610c61906150c7565b600f54611eaa9061010090046001600160a01b03166004612653565b611eb460046126bb565b50600f805460ff19169055565b6002546060906001600160a01b031663c669e9c9611ee6611ee160065490565b613e13565b6040518263ffffffff1660e01b8152600401611f02919061569a565b600060405180830381865afa158015611f1f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f479190810190615297565b905090565b6000805b602581101561200b576000838260258110611f6d57611f6d61514e565b6020020151611f7b906156c9565b60f81c905060618110801590611f925750607a8111155b80611f9d5750806020145b80611fb55750602d8110158015611fb5575060398111155b80611fc05750806027145b80611fcb575080603f145b80611fd65750806021145b15611fe15750611ff9565b80600003611fef575061200b565b5060009392505050565b806120038161542f565b915050611f50565b50600192915050565b60008080808060606120276005886153bb565b61203081612563565b61204c5760405162461bcd60e51b8152600401610c61906154df565b6000600689815481106120615761206161514e565b600091825260208220602690910201915060018201905b60258110156120b7578181602581106120935761209361514e565b0161209d90615700565b60f81c156120b757806120af8161542f565b915050612078565b6000816001600160401b038111156120d1576120d16144f7565b6040519080825280601f01601f1916602001820160405280156120fb576020820181803683370190505b50905060005b828110156121605783816025811061211b5761211b61514e565b0161212590615700565b8282815181106121375761213761514e565b60200101906001600160f81b031916908160001a905350806121588161542f565b915050612101565b509254600f61010082048181169c5060041c16995064ffffffffff6201000082041698506001600160a01b03600160381b8204169750600190811614955091935050505091939550919395565b60156121b93382612434565b6121d55760405162461bcd60e51b8152600401610c61906150c7565b60055460ff16156121f85760405162461bcd60e51b8152600401610c6190615489565b6005805460ff191660011790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016118b7565b600a805461110690615164565b600f61224e3382612434565b61226a5760405162461bcd60e51b8152600401610c61906150c7565b6005546040516386a3555d60e01b81526101009091046001600160a01b0316906386a3555d906122a490889088908890889060040161574e565b600060405180830381600087803b1580156122be57600080fd5b505af11580156122d2573d6000803e3d6000fd5b505050505050505050565b60046122e93382612434565b6123055760405162461bcd60e51b8152600401610c61906150c7565b6110f384848460405180602001604052806000815250613625565b6002546040516331a9108f60e11b81527f000000000000000000000000000000000000000000000000000000000000000160048201526000916001600160a01b031690636352211e90602401602060405180830381865afa158015612389573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f4791906154a9565b600c6123b93382612434565b6123d55760405162461bcd60e51b8152600401610c61906150c7565b6005546040516394e83b9b60e01b815283151560048201526101009091046001600160a01b0316906394e83b9b90602401600060405180830381600087803b15801561242057600080fd5b505af1158015611703573d6000803e3d6000fd5b600081601581111561244857612448615634565b6001600160a01b038416600090815260036020526040902054600160ff929092161c811614806124b05750601282601581111561248757612487615634565b1480156124b05750733ee7fc9065f3efe3b6ab1894845e41146cb773856001600160a01b038416145b806124ef575060008260158111156124ca576124ca615634565b1480156124ef57506124da612320565b6001600160a01b0316836001600160a01b0316145b9392505050565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3191015b60405180910390a35050565b600060058210158015610bfd575060065461257f60058461513b565b1092915050565b60126125923382612434565b6125ae5760405162461bcd60e51b8152600401610c61906150c7565b506005805460ff60b01b19169055565b60086125ca3382612434565b6125e65760405162461bcd60e51b8152600401610c61906150c7565b60055460405163b12c029960e01b81526101009091046001600160a01b03169063b12c02999061261c9086908690600401615775565b600060405180830381600087803b15801561263657600080fd5b505af115801561264a573d6000803e3d6000fd5b50505050505050565b61265b612320565b6001600160a01b0316336001600160a01b031614806126805750612680336000612434565b8061269557506002546001600160a01b031633145b6126b15760405162461bcd60e51b8152600401610c61906150a1565b610dda8282613ea5565b6126c3612320565b6001600160a01b0316336001600160a01b031614806126e857506126e8336000612434565b806126fd57506002546001600160a01b031633145b6127195760405162461bcd60e51b8152600401610c61906150a1565b61181281613c81565b8261272c81612563565b6127485760405162461bcd60e51b8152600401610c61906154df565b818361275382611f4c565b61276f5760405162461bcd60e51b8152600401610c6190615796565b60058160ff16106127be5760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b0382163314806127fa57506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b806129255750600554600160b01b900460ff168015612925575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612872573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061289691906157d7565b806129255750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612901573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061292591906157d7565b6129715760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b6008543410156129b75760405162461bcd60e51b81526020600482015260116024820152707061727473206172656e2774206672656560781b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054600114612a185760405162461bcd60e51b815260206004820152600d60248201526c1a1858dac81d1a1dd85c9d1959609a1b6044820152606401610c61565b60006006612a2760058b61513b565b81548110612a3757612a3761514e565b600091825260209091206026909102019050612a58600182018860256142e7565b50805466ffffffffffff01600160d81b031916600160381b6001600160a01b038c160260ff191617808255612a9d906101009004600f1660048a901b610ff0166153e9565b815460ff919091166101000261ff0019909116179055505050505050505050565b60008183612acb82611f4c565b612ae75760405162461bcd60e51b8152600401610c6190615796565b60058160ff1610612b365760405162461bcd60e51b8152602060048201526019602482015278696e636f6d70617469626c6520706f77657220736f7572636560381b6044820152606401610c61565b86866001600160a01b038216331480612b7257506001600160a01b038216600090815260016020908152604080832033845290915290205460ff165b80612c9d5750600554600160b01b900460ff168015612c9d575060405163090c9a2d60e41b81523360048201526001600160a01b03831660248201523060448201526d76a84fef008cdabe6409d2fe638b906390c9a2d090606401602060405180830381865afa158015612bea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0e91906157d7565b80612c9d5750604051631574d39f60e31b81523360048201526001600160a01b0383166024820152306044820152606481018290526d76a84fef008cdabe6409d2fe638b9063aba69cf890608401602060405180830381865afa158015612c79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c9d91906157d7565b612ce95760405162461bcd60e51b815260206004820152601c60248201527f756e617574686f72697a656420616363657373206465746563746564000000006044820152606401610c61565b60058810612d395760405162461bcd60e51b815260206004820152601860248201527f696e636f6d70617469626c65207472616e73706f6e64657200000000000000006044820152606401610c61565b60075460ff1615612d755760405162461bcd60e51b81526020600482015260066024820152651a985b5b595960d21b6044820152606401610c61565b6001600160a01b0389166000908152602081815260408083208b8452909152902054612de35760405162461bcd60e51b815260206004820152601f60248201527f796f75276c6c206e65656420746f2072756d6d61676520666f722074686174006044820152606401610c61565b600654612df19060056153bb565b9450612dff89896001613f99565b612e1b8986600160405180602001604052806000815250613625565b6040805160a081019091526000815260069060208101612e438b610ff060048d901b166153e9565b60ff1681526020014364ffffffffff1681526020018b6001600160a01b0316815260200188815250908060018154018082558091505060019003906000526020600020906026020160009091909190915060008201518160000160006101000a81548160ff021916908360ff16021790555060208201518160000160016101000a81548160ff021916908360ff16021790555060408201518160000160026101000a81548164ffffffffff021916908364ffffffffff16021790555060608201518160000160076101000a8154816001600160a01b0302191690836001600160a01b03160217905550608082015181600101906025612f439291906142e7565b50505050505050949350505050565b612f5a612320565b6001600160a01b0316336001600160a01b03161480612f7f5750612f7f336000612434565b80612f9457506002546001600160a01b031633145b612fb05760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a57612ff8838281518110612fd157612fd161514e565b6020026020010151838381518110612feb57612feb61514e565b6020026020010151613ea5565b806130028161542f565b915050612fb3565b505050565b613017612320565b6001600160a01b0316336001600160a01b0316148061303c575061303c336000612434565b8061305157506002546001600160a01b031633145b61306d5760405162461bcd60e51b8152600401610c61906150a1565b60005b815181101561300a576130b583828151811061308e5761308e61514e565b60200260200101518383815181106130a8576130a861514e565b6020026020010151613b21565b806130bf8161542f565b915050613070565b600a6130d33382612434565b6130ef5760405162461bcd60e51b8152600401610c61906150c7565b60055460405163f09f3f3160e01b81526101009091046001600160a01b03169063f09f3f3190613127908790879087906004016157f4565b600060405180830381600087803b15801561314157600080fd5b505af115801561152c573d6000803e3d6000fd5b60055460ff16156131785760405162461bcd60e51b8152600401610c6190615489565b61170386868686868661401d565b3361318f612320565b6001600160a01b0316146131b55760405162461bcd60e51b8152600401610c61906150f0565b6002546040516350a1a66560e01b81527f000000000000000000000000000000000000000000000000000000000000000160048201526001600160a01b038381166024830152909116906350a1a66590604401600060405180830381600087803b15801561322257600080fd5b505af1158015613236573d6000803e3d6000fd5b5050505050565b60106132493382612434565b6132655760405162461bcd60e51b8152600401610c61906150c7565b60096132718482615861565b5043600b55600a6132828382615861565b507f297aa6cf51bb39507374bfcb61edead3172fc87755dea183d848c3a23c70496783836040516132b4929190615920565b60405180910390a1505050565b6000600980546132d090615164565b90506000036132df5750600090565b600d546000036132ff57600c54600b546132f9904361513b565b10905090565b600c54600d54600b54613312904361513b565b6132f99190615945565b60006301ffc9a760e01b6001600160e01b03198316148061334d5750636cdb3d1360e11b6001600160e01b03198316145b80610bfd5750506001600160e01b0319166303a24d0760e21b1490565b604051632142170760e11b81523060048201526001600160a01b038481166024830152604482018390528316906342842e0e9060640161261c565b600080600e54436133b69190615945565b6133c0904361513b565b9050600084846133d160028561513b565b60408051602081019490945283019190915240606082015260800160408051601f1981840301815291905280516020909101206006805463ffffffff909216925090613426680470d97cab4ce6941b84615448565b6134309190615945565b815481106134405761344061514e565b90600052602060002090602602019250505092915050565b82518251811461347a5760405162461bcd60e51b8152600401610c6190615671565b60005b81811015613509578381815181106134975761349761514e565b6020026020010151600080886001600160a01b03166001600160a01b0316815260200190815260200160002060008784815181106134d7576134d761514e565b6020026020010151815260200190815260200160002060008282546134fc91906153bb565b909155505060010161347d565b50846001600160a01b031660006001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161355a929190615959565b60405180910390a46001600160a01b0385163b156135fc5760405163bc197c8160e01b808252906001600160a01b0387169063bc197c81906135a99033906000908a908a908a9060040161597e565b6020604051808303816000875af11580156135c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135ec91906159d0565b6001600160e01b03191614613609565b6001600160a01b03851615155b6132365760405162461bcd60e51b8152600401610c61906159ed565b6001600160a01b038416600090815260208181526040808320868452909152812080548492906136569084906153bb565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b1561373e5760405163f23a6e6160e01b808252906001600160a01b0386169063f23a6e61906136eb903390600090899089908990600401615a17565b6020604051808303816000875af115801561370a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061372e91906159d0565b6001600160e01b0319161461374b565b6001600160a01b03841615155b6110f35760405162461bcd60e51b8152600401610c61906159ed565b8483146137865760405162461bcd60e51b8152600401610c6190615671565b336001600160a01b03891614806137c057506001600160a01b038816600090815260016020908152604080832033845290915290205460ff165b6137fd5760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b60008060005b878110156138b85788888281811061381d5761381d61514e565b9050602002013592508686828181106138385761383861514e565b6001600160a01b038e166000908152602081815260408083208984528252822080549390910294909401359550859392509061387590849061513b565b90915550506001600160a01b038a16600090815260208181526040808320868452909152812080548492906138ab9084906153bb565b9091555050600101613803565b50886001600160a01b03168a6001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b8b8b60405161390c9493929190615a51565b60405180910390a46001600160a01b0389163b156139b35760405163bc197c8160e01b808252906001600160a01b038b169063bc197c81906139609033908f908e908e908e908e908e908e90600401615a78565b6020604051808303816000875af115801561397f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139a391906159d0565b6001600160e01b031916146139c0565b6001600160a01b03891615155b6139dc5760405162461bcd60e51b8152600401610c61906159ed565b50505050505050505050565b6040516001600160a01b038216904780156108fc02916000818181858888f19350505050158015610dda573d6000803e3d6000fd5b600083471015613a6f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e63650000006044820152606401610c61565b8151600003613ac05760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f6044820152606401610c61565b8282516020840186f590506001600160a01b0381166124ef5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f79000000000000006044820152606401610c61565b6012816015811115613b3557613b35615634565b03613b8e5760405162461bcd60e51b815260206004820152602360248201527f796f752063616e6e6f742073696d706c79206265636f6d6520706f6e6465727760448201526261726560e81b6064820152608401610c61565b60046000826015811115613ba457613ba4615634565b60ff90811682526020820192909252604001600020541615613bf15760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613c0357613c03615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b9091179055806015811115613c4057613c40615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6001604051612557911515815260200190565b60046000826015811115613c9757613c97615634565b60ff90811682526020820192909252604001600020541661181257600160046000836015811115613cca57613cca615634565b60ff1681526020810191909152604001600020805460ff1916911515919091179055806015811115613cfe57613cfe615634565b60ff167f2a4c011a3eb263cc32455711057131757df48518d49547f77ab832d8681a53ff60405160405180910390a250565b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90859083906370a0823190602401602060405180830381865afa158015613d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613da491906154c6565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015613def573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f391906157d7565b60606000613e208361420f565b60010190506000816001600160401b03811115613e3f57613e3f6144f7565b6040519080825280601f01601f191660200182016040528015613e69576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a8504945084613e7357509392505050565b60046000826015811115613ebb57613ebb615634565b60ff90811682526020820192909252604001600020541615613f085760405162461bcd60e51b81526020600482015260066024820152651b1bd8dad95960d21b6044820152606401610c61565b806015811115613f1a57613f1a615634565b6001600160a01b03831660009081526003602052604090208054600160ff939093169290921b199091169055806015811115613f5857613f58615634565b60ff16826001600160a01b03167f25cef78a4b665fcf0923e3f0e15c3449d405e0fa46d991b78246e8aaf19571ab6000604051612557911515815260200190565b6001600160a01b03831660009081526020818152604080832085845290915281208054839290613fca90849061513b565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b336001600160a01b038716148061405757506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b6140945760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b6044820152606401610c61565b6001600160a01b038616600090815260208181526040808320878452909152812080548592906140c590849061513b565b90915550506001600160a01b038516600090815260208181526040808320878452909152812080548592906140fb9084906153bb565b909155505060408051858152602081018590526001600160a01b03808816929089169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0385163b156141e65760405163f23a6e6160e01b808252906001600160a01b0387169063f23a6e61906141939033908b908a908a908a908a90600401615adc565b6020604051808303816000875af11580156141b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906141d691906159d0565b6001600160e01b031916146141f3565b6001600160a01b03851615155b6117035760405162461bcd60e51b8152600401610c61906159ed565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061424e5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef8100000000831061427a576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061429857662386f26fc10000830492506010015b6305f5e10083106142b0576305f5e100830492506008015b61271083106142c457612710830492506004015b606483106142d6576064830492506002015b600a8310610bfd5760010192915050565b8260258101928215614320579160200282015b8281111561432057825182906143109082615861565b50916020019190600101906142fa565b5061432c929150614330565b5090565b8082111561432c576000614344828261434d565b50600101614330565b50805461435990615164565b6000825580601f10614369575050565b601f01602090049060005260206000209081019061181291905b8082111561432c5760008155600101614383565b6001600160a01b038116811461181257600080fd5b600080604083850312156143bf57600080fd5b82356143ca81614397565b946020939093013593505050565b6001600160e01b03198116811461181257600080fd5b60006020828403121561440057600080fd5b81356124ef816143d8565b6000806040838503121561441e57600080fd5b823561442981614397565b915060208301356001600160601b038116811461444557600080fd5b809150509250929050565b801515811461181257600080fd5b60006020828403121561447057600080fd5b81356124ef81614450565b60006020828403121561448d57600080fd5b5035919050565b60005b838110156144af578181015183820152602001614497565b50506000910152565b600081518084526144d0816020860160208601614494565b601f01601f19169290920160200192915050565b6020815260006124ef60208301846144b8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614535576145356144f7565b604052919050565b60006001600160401b03821115614556576145566144f7565b5060051b60200190565b600082601f83011261457157600080fd5b813560206145866145818361453d565b61450d565b82815260059290921b840181019181810190868411156145a557600080fd5b8286015b848110156145c057803583529183019183016145a9565b509695505050505050565b6000806000606084860312156145e057600080fd5b83356145eb81614397565b925060208401356001600160401b038082111561460757600080fd5b61461387838801614560565b9350604086013591508082111561462957600080fd5b5061463686828701614560565b9150509250925092565b60008083601f84011261465257600080fd5b5081356001600160401b0381111561466957600080fd5b6020830191508360208285010111156114f257600080fd5b60008083601f84011261469357600080fd5b5081356001600160401b038111156146aa57600080fd5b6020830191508360208260051b85010111156114f257600080fd5b60008060008060008060008060008060a08b8d0312156146e457600080fd5b8a356001600160401b03808211156146fb57600080fd5b6147078e838f01614640565b909c509a5060208d013591508082111561472057600080fd5b61472c8e838f01614681565b909a50985060408d013591508082111561474557600080fd5b6147518e838f01614681565b909850965060608d013591508082111561476a57600080fd5b6147768e838f01614681565b909650945060808d013591508082111561478f57600080fd5b5061479c8d828e01614681565b915080935050809150509295989b9194979a5092959850565b600080604083850312156147c857600080fd5b50508035926020909101359150565b60008060008060008060008060a0898b0312156147f357600080fd5b88356147fe81614397565b9750602089013561480e81614397565b965060408901356001600160401b038082111561482a57600080fd5b6148368c838d01614681565b909850965060608b013591508082111561484f57600080fd5b61485b8c838d01614681565b909650945060808b013591508082111561487457600080fd5b506148818b828c01614640565b999c989b5096995094979396929594505050565b6000602082840312156148a757600080fd5b81356124ef81614397565b60006001600160401b038211156148cb576148cb6144f7565b50601f01601f191660200190565b600082601f8301126148ea57600080fd5b81356148f8614581826148b2565b81815284602083860101111561490d57600080fd5b816020850160208301376000918101602001919091529392505050565b60006040516104a08082016001600160401b038382108183111715614951576149516144f7565b8160405283945082860192508683111561496a57600080fd5b8591505b828210156149a6578135818111156149865760008081fd5b614992888289016148d9565b85525060208401935060208201915061496e565b5050505092915050565b600082601f8301126149c157600080fd5b6124ef838361492a565b600080604083850312156149de57600080fd5b8235915060208301356001600160401b038111156149fb57600080fd5b614a07858286016149b0565b9150509250929050565b60008060008060008060608789031215614a2a57600080fd5b86356001600160401b0380821115614a4157600080fd5b614a4d8a838b01614681565b90985096506020890135915080821115614a6657600080fd5b614a728a838b01614681565b90965094506040890135915080821115614a8b57600080fd5b50614a9889828a01614681565b979a9699509497509295939492505050565b80356016811061103257600080fd5b600060208284031215614acb57600080fd5b6124ef82614aaa565b60008060208385031215614ae757600080fd5b82356001600160401b03811115614afd57600080fd5b614b0985828601614640565b90969095509350505050565b60008060408385031215614b2857600080fd5b8235614b3381614397565b9150614b4160208401614aaa565b90509250929050565b600080600060408486031215614b5f57600080fd5b8335614b6a81614397565b925060208401356001600160401b03811115614b8557600080fd5b614b9186828701614681565b9497909650939450505050565b600081518084526020808501945080840160005b83811015614bce57815187529582019590820190600101614bb2565b509495945050505050565b6020815260006124ef6020830184614b9e565b60008060008060408587031215614c0257600080fd5b84356001600160401b0380821115614c1957600080fd5b614c2588838901614681565b90965094506020870135915080821115614c3e57600080fd5b50614c4b87828801614681565b95989497509550505050565b600082601f830112614c6857600080fd5b81356020614c786145818361453d565b82815260059290921b84018101918181019086841115614c9757600080fd5b8286015b848110156145c057614cac81614aaa565b8352918301918301614c9b565b600060208284031215614ccb57600080fd5b81356001600160401b03811115614ce157600080fd5b614ced84828501614c57565b949350505050565b600060208284031215614d0757600080fd5b81356001600160401b03811115614d1d57600080fd5b614ced848285016149b0565b60ff87811682528616602082015264ffffffffff851660408201526001600160a01b0384166060820152821515608082015260c060a08201819052600090614d73908301846144b8565b98975050505050505050565b600080600060608486031215614d9457600080fd5b8335614d9f81614397565b95602085013595506040909401359392505050565b60008060408385031215614dc757600080fd5b8235614dd281614397565b9150602083013561444581614450565b60008060408385031215614df557600080fd5b823565ffffffffffff81168114614e0b57600080fd5b915060208301356001600160401b03811115614e2657600080fd5b614a07858286016148d9565b803560ff8116811461103257600080fd5b60008060008060808587031215614e5957600080fd5b8435614e6481614397565b935060208501359250614e7960408601614e32565b915060608501356001600160401b03811115614e9457600080fd5b614ea0878288016149b0565b91505092959194509250565b60008060408385031215614ebf57600080fd5b82356001600160401b0380821115614ed657600080fd5b818501915085601f830112614eea57600080fd5b81356020614efa6145818361453d565b82815260059290921b84018101918181019089841115614f1957600080fd5b948201945b83861015614f40578535614f3181614397565b82529482019490820190614f1e565b96505086013592505080821115614f5657600080fd5b50614a0785828601614c57565b60008060408385031215614f7657600080fd5b8235614f8181614397565b9150602083013561444581614397565b600080600060608486031215614fa657600080fd5b8335614fb181614397565b92506020840135915060408401356001600160401b03811115614fd357600080fd5b614636868287016148d9565b60008060008060008060a08789031215614ff857600080fd5b863561500381614397565b9550602087013561501381614397565b9450604087013593506060870135925060808701356001600160401b0381111561503c57600080fd5b614a9889828a01614640565b6000806040838503121561505b57600080fd5b82356001600160401b038082111561507257600080fd5b61507e868387016148d9565b9350602085013591508082111561509457600080fd5b50614a07858286016148d9565b6020808252600c908201526b155b985d5d1a1bdc9a5e995960a21b604082015260600190565b6020808252600f908201526e75736572206c61636b7320726f6c6560881b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b81810381811115610bfd57610bfd615125565b634e487b7160e01b600052603260045260246000fd5b600181811c9082168061517857607f821691505b60208210810361519857634e487b7160e01b600052602260045260246000fd5b50919050565b600081546151ab81615164565b8085526020600183811680156151c857600181146151e257615210565b60ff1985168884015283151560051b880183019550615210565b866000528260002060005b858110156152085781548a82018601529083019084016151ed565b890184019650505b505050505092915050565b861515815285602082015284604082015283606082015260c06080820152600061524860c083018561519e565b82810360a084015261525a818561519e565b9998505050505050505050565b6000615275614581846148b2565b905082815283838301111561528957600080fd5b6124ef836020830184614494565b6000602082840312156152a957600080fd5b81516001600160401b038111156152bf57600080fd5b8201601f810184136152d057600080fd5b614ced84825160208401615267565b600060a08301825460ff81168552602060ff8260081c168187015264ffffffffff8260101c16604087015260018060a01b038260381c1660608701526001915060a06080870152828390506105408701935082860160005b602581101561536457888603609f19018352615353868361519e565b955091830191908401908401615337565b5093979650505050505050565b84815260806020820152600061538a60808301866152df565b828103604084015261539c81866152df565b905082810360608401526153b081856152df565b979650505050505050565b80820180821115610bfd57610bfd615125565b6000602082840312156153e057600080fd5b6124ef82614e32565b60ff8181168382160190811115610bfd57610bfd615125565b6000823561049e1983360301811261541957600080fd5b9190910192915050565b6000610bfd368361492a565b60006001820161544157615441615125565b5060010190565b8082028115828204841417610bfd57610bfd615125565b634e487b7160e01b600052601260045260246000fd5b6000826154845761548461545f565b500490565b60208082526006908201526514185d5cd95960d21b604082015260600190565b6000602082840312156154bb57600080fd5b81516124ef81614397565b6000602082840312156154d857600080fd5b5051919050565b6020808252601390820152721cda59db985b081b9bdd0819195d1958dd1959606a1b604082015260600190565b81835260006001600160fb1b0383111561552557600080fd5b8260051b80836020870137939093016020019392505050565b81835281816020850137506000828201602090810191909152601f909101601f19169091010190565b81835260006020808501808196508560051b810191508460005b878110156155eb5782840389528135601e198836030181126155a257600080fd5b870185810190356001600160401b038111156155bd57600080fd5b8036038213156155cc57600080fd5b6155d786828461553e565b9a87019a9550505090840190600101615581565b5091979650505050505050565b60608152600061560c60608301888a61550c565b828103602084015261561f818789615567565b9050828103604084015261525a818587615567565b634e487b7160e01b600052602160045260246000fd5b828482376000838201600081528351615667818360208801614494565b0195945050505050565b6020808252600f908201526e0988a9c8ea890be9a92a69a82a8869608b1b604082015260600190565b604081526005604082015264706565727360d81b60608201526080602082015260006124ef60808301846144b8565b805160208201516001600160f81b031980821692919060018310156156f85780818460010360031b1b83161693505b505050919050565b600061570c8254615164565b82601f8211156157225783600052602060002090505b546001600160f81b0319808216935060018310156156f85760019290920360031b82901b161692915050565b604081526000615762604083018688615567565b82810360208401526153b0818587615567565b65ffffffffffff83168152604060208201526000614ced60408301846144b8565b60208082526021908201527f756e7265636f76657261626c6520756e636f727265637461626c65206572726f6040820152603960f91b606082015260800190565b6000602082840312156157e957600080fd5b81516124ef81614450565b60018060a01b0384168152826020820152606060408201526000610f2760608301846144b8565b601f82111561300a57600081815260208120601f850160051c810160208610156158425750805b601f850160051c820191505b818110156117035782815560010161584e565b81516001600160401b0381111561587a5761587a6144f7565b61588e816158888454615164565b8461581b565b602080601f8311600181146158c357600084156158ab5750858301515b600019600386901b1c1916600185901b178555611703565b600085815260208120601f198616915b828110156158f2578886015182559484019460019091019084016158d3565b50858210156159105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60408152600061593360408301856144b8565b8281036020840152610f2781856144b8565b6000826159545761595461545f565b500690565b60408152600061596c6040830185614b9e565b8281036020840152610f278185614b9e565b6001600160a01b0386811682528516602082015260a0604082018190526000906159aa90830186614b9e565b82810360608401526159bc8186614b9e565b90508281036080840152614d7381856144b8565b6000602082840312156159e257600080fd5b81516124ef816143d8565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906153b0908301846144b8565b604081526000615a6560408301868861550c565b82810360208401526153b081858761550c565b6001600160a01b0389811682528816602082015260a060408201819052600090615aa5908301888a61550c565b8281036060840152615ab881878961550c565b90508281036080840152615acd81858761553e565b9b9a5050505050505050505050565b6001600160a01b03878116825286166020820152604081018590526060810184905260a060808201819052600090614d73908301848661553e56fea2646970667358221220a1510b0e2b6728f50bba153ba8f1bcf1e86f5a038f4073c2db9d6e4bf6261ec764736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : tokenId (uint256): 1
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000001
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.