ERC-721
Overview
Max Total Supply
11,007 WPSBT
Holders
11,007
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 WPSBTLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
RelationWPower
Compiler Version
v0.8.12+commit.f00d7308
Optimization Enabled:
Yes with 1 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "../../core/SemanticSBTCore.sol"; import "../../core/SemanticBaseStruct.sol"; contract RelationWPower is Ownable, Initializable,SemanticSBCore { using Strings for uint256; using Strings for address; struct Signature { uint8 _v; bytes32 _r; bytes32 _s; } bytes32 constant MINT_ROLE = 0x0000000000000000000000000000000000000000000000000000000000000001; mapping(address => bool) public whiteList; address[] _whiteLists; uint256 constant _pIndex = 1; uint256 constant _oIndex = 1; mapping(address => bool) public _ownedSBT; function whiteListRange(uint256 offset, uint256 limit) public view returns (address[] memory whiteList_){ if (offset > _whiteLists.length) { return new address[](0); } uint256 end = (offset + limit) > _whiteLists.length ? _whiteLists.length : offset + limit; limit = (offset + limit) > _whiteLists.length ? (_whiteLists.length - offset) : limit; whiteList_ = new address[](limit); for (uint256 i = offset; i < end; i++) { whiteList_[i - offset] = _whiteLists[i]; } } function isClaimed(address account)public view returns(bool){ return _ownedSBT[account]; } function addWhiteList(address[] memory addressList) external onlyMinter { for (uint256 i = 0; i < addressList.length; i++) { if (!whiteList[addressList[i]]) { whiteList[addressList[i]] = true; _whiteLists.push(addressList[i]); } } } function mint() external { require(whiteList[msg.sender], "Relation : permission denied"); require(!_ownedSBT[msg.sender], "Relation : already minted"); SubjectPO[] memory subjectPO = new SubjectPO[](1); subjectPO[0] = SubjectPO(_pIndex, _oIndex); _mint(msg.sender, 0, new IntPO[](0), new StringPO[](0), new AddressPO[](0), subjectPO, new BlankNodePO[](0)); _ownedSBT[msg.sender] = true; } function claim(Signature memory signature, uint256 expireTime) external{ require(!_ownedSBT[msg.sender], "You have successfully claimed it"); require(expireTime > block.timestamp, "Signature data expired"); string memory originalData = string.concat( address(this).toHexString(), msg.sender.toHexString(), expireTime.toString()); address signer = _verifyMessage( keccak256(abi.encodePacked(originalData)), signature._v, signature._r, signature._s ); require(minters(signer), "SignData exception. Plz join Relation official Discord to open a ticket for support >> https://discord.gg/qmG4AHK6U5"); SubjectPO[] memory subjectPO = new SubjectPO[](1); subjectPO[0] = SubjectPO(_pIndex, _oIndex); _mint(msg.sender, 0, new IntPO[](0), new StringPO[](0), new AddressPO[](0), subjectPO, new BlankNodePO[](0)); _ownedSBT[msg.sender] = true; } /** * @dev See {IERC165-supportsInterface}. * ISemanticSBT 0xfbafb698 * ISemanticSBTMetadata 0x58e23bac */ function supportsInterface(bytes4 interfaceId) public view virtual override(SemanticSBCore) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(ISemanticSBT).interfaceId || interfaceId == type(ISemanticSBTMetadata).interfaceId || super.supportsInterface(interfaceId); } function _verifyMessage( bytes32 _hashedMessage, uint8 _v, bytes32 _r, bytes32 _s ) internal pure returns (address) { bytes memory prefix = "\x19Ethereum Signed Message:\n32"; bytes32 prefixedHashMessage = keccak256( abi.encodePacked(prefix, _hashedMessage) ); address signer = ecrecover(prefixedHashMessage, _v, _r, _s); return signer; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/introspection/ERC165.sol"; import "@openzeppelin/contracts/proxy/utils/Initializable.sol"; import "@openzeppelin/contracts/access/AccessControl.sol"; import "../interfaces/ISemanticSBTMetadata.sol"; import "../interfaces/ISemanticSBT.sol"; import "./SemanticBaseStruct.sol"; /** * @dev Implement ISemanticSBT interface */ contract SemanticSBCore is Ownable, Initializable, ERC165, IERC721Enumerable, ISemanticSBT, ISemanticSBTMetadata { using Address for address; using Strings for uint256; using Strings for uint160; using Strings for address; /* ============ State Variables ============ */ // Token name string private _name; // Token symbol string private _symbol; // Total number of tokens burned uint256 private _burnCount; // Array of all tokens SPO[] private _tokens; // Mapping from owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // The operator of mint,burn and add subject mapping(address => bool) private _minters; // Default not allow transfer bool private _transferable; // Array of all subject Subject[] private _subjects; // Mapping from subject to subject index mapping(uint256 => mapping(string => uint256)) private _subjectIndex; // Base token URI string private _baseURI; // Schema URI string public schemaURI; // Mapping from class name to class index mapping(string => uint256) private _classIndex; // Array of all class name string[] private _classNames; // Mapping from predicate name to predicate index mapping(string => uint256) private _predicateIndex; // Array of all Predicate Predicate[] private _predicates; // Array of all object value with string type string[] _stringO; // Array of all object value with BlankNodeO type BlankNodeO[] _blankNodeO; /* ============ Constant Variable ============ */ string constant TURTLE_LINE_SUFFIX = " ;"; string constant TURTLE_END_SUFFIX = " . "; string constant SOUL_CLASS_NAME = "Soul"; string constant ENTITY_PREFIX = ":"; string constant PROPERTY_PREFIX = "p:"; string constant CONCATENATION_CHARACTER = "_"; string constant BLANK_NODE_START_CHARACTER = "["; string constant BLANK_NODE_END_CHARACTER = "]"; string constant BLANK_SPACE = " "; /* ============ Events ============ */ // Add new minter event EventMinterAdded(address indexed newMinter); // Remove old minter event EventMinterRemoved(address indexed oldMinter); /* ============ Modifiers ============ */ /** * Only minter. */ modifier onlyMinter() { require(_minters[msg.sender], "SemanticSBT: must be minter"); _; } /** * Only allow transfer. */ modifier onlyTransferable() { require(_transferable, "SemanticSBT: must transferable"); _; } /** * @dev Initializes the contract */ constructor() { // Initialize zero index value SPO memory _spo = SPO(0, 0, new uint256[](0), new uint256[](0)); Subject memory _subject = Subject("", 0); _tokens.push(_spo); _subjects.push(_subject); _classNames.push(""); _predicates.push(Predicate("", FieldType.INT)); } function initialize( address minter, string memory name_, string memory symbol_, string memory baseURI_, string memory schemaURI_, string[] memory classes_, Predicate[] memory predicates_ ) public initializer onlyOwner { require(keccak256(abi.encode(schemaURI_)) != keccak256(abi.encode("")), "SemanticSBT: schema URI cannot be empty"); require(predicates_.length > 0, "SemanticSBT: predicate can not be empty"); _minters[minter] = true; _name = name_; _symbol = symbol_; _baseURI = baseURI_; schemaURI = schemaURI_; _addClass(classes_); _addPredicate(predicates_); emit EventMinterAdded(minter); } /** * @dev See {IERC165-supportsInterface}. * ISemanticSBT 0xfbafb698 * ISemanticSBTMetadata 0x58e23bac * ISemanticSBTOperator 0x9cd23707 */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || interfaceId == type(ISemanticSBT).interfaceId || interfaceId == type(ISemanticSBTMetadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Is this address a minters. */ function minters(address account) public view returns (bool) { return _minters[account]; } /** * @dev See {ISemanticSBTOperator-transferable}. * Is this contract allow nft transfer. */ function transferable() public view returns (bool) { return _transferable; } /** * @dev Returns the base URI for nft. */ function baseURI() public view returns (string memory) { return _baseURI; } /** * @dev Get class index */ function classIndex(string memory className_) public view returns (uint256 classIndex_) { classIndex_ = _classIndex[className_]; } /** * @dev Get class name */ function className(uint256 cIndex) public view returns (string memory name_) { require(cIndex > 0 && cIndex < _classNames.length, "SemanticSBT: class not exist"); name_ = _classNames[cIndex]; } /** * @dev Get predicate index */ function predicateIndex(string memory predicateName_) public view returns (uint256 predicateIndex_) { predicateIndex_ = _predicateIndex[predicateName_]; } /** * @dev Get predicate */ function predicate(uint256 pIndex) public view returns (string memory name_, FieldType fieldType) { require(pIndex > 0 && pIndex < _predicates.length, "SemanticSBT: predicate not exist"); Predicate memory predicate_ = _predicates[pIndex]; name_ = predicate_.name; fieldType = predicate_.fieldType; } /** * @dev Get subject index */ function subjectIndex(string memory subjectValue, string memory className_) public view returns (uint256){ uint256 sIndex = _subjectIndex[_classIndex[className_]][subjectValue]; require(sIndex > 0, "SemanticSBT: does not exist"); return sIndex; } /** * @dev Get subject */ function subject(uint256 index) public view returns (string memory subjectValue, string memory className_){ require(index > 0 && index < _subjects.length, "SemanticSBT: does not exist"); subjectValue = _subjects[index].value; className_ = _classNames[_subjects[index].cIndex]; } /** * @dev Get token rdf */ function rdfOf(uint256 tokenId) public view override returns (string memory) { require(_exists(tokenId), "SemanticSBT: SemanticSBT does not exist"); return _buildRDF(_tokens[tokenId]); } /** * @dev Get number of minted */ function getMinted() public view returns (uint256) { return _tokens.length - 1; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view override returns (uint256) { return getMinted() - _burnCount; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. * This is implementation is O(n) and should not be * called by other contracts. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { uint256 currentIndex = 0; for (uint256 i = 1; i < _tokens.length; i++) { if (address(_tokens[i].owner) == owner) { if (currentIndex == index) { return i; } currentIndex += 1; } } revert("ERC721Enumerable: owner index out of bounds"); } /** * @dev See {IERC721Enumerable-tokenByIndex}. * This is implementation is O(n) and should not be * called by other contracts. */ function tokenByIndex(uint256 index) public view returns (uint256) { uint256 currentIndex = 0; for (uint256 i = 1; i < _tokens.length; i++) { if (_tokens[i].owner != 0) { if (currentIndex == index) { return i; } currentIndex += 1; } } revert("ERC721Enumerable: token index out of bounds"); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721: owner query for nonexistent token" ); return address(_tokens[tokenId].owner); } /** * @dev See {ISemanticSBT-isOwnerOf}. */ function isOwnerOf(address account, uint256 id) public view returns (bool) { address owner = ownerOf(id); return owner == account; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); return bytes(_baseURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenId.toString(), ".json")) : ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public onlyTransferable override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public onlyTransferable override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public onlyTransferable override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view returns (bool) { return tokenId > 0 && tokenId <= getMinted() && _tokens[tokenId].owner != 0x0; } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev add class * @param classList the class array */ function _addClass(string[] memory classList) internal { for (uint256 i = 0; i < classList.length; i++) { string memory className_ = classList[i]; require( keccak256(abi.encode(className_)) != keccak256(abi.encode("")), "SemanticSBT: Class cannot be empty" ); require(_classIndex[className_] == 0, "SemanticSBT: already added"); _classNames.push(className_); _classIndex[className_] = _classNames.length - 1; } } /** * @dev add predicate * @param predicates the predicate array */ function _addPredicate(Predicate[] memory predicates) internal { for (uint256 i = 0; i < predicates.length; i++) { Predicate memory predicate_ = predicates[i]; require( keccak256(abi.encode(predicate_.name)) != keccak256(abi.encode("")), "SemanticSBT: predicate cannot be empty" ); require(_predicateIndex[predicate_.name] == 0, "SemanticSBT: already added"); _predicates.push(predicate_); _predicateIndex[predicate_.name] = _predicates.length - 1; } } function _addIntPO(uint256[] storage pIndex, uint256[] storage oIndex, IntPO[] memory intPOList) internal { for (uint256 i = 0; i < intPOList.length; i++) { IntPO memory intPO = intPOList[i]; _checkPredicate(intPO.pIndex, FieldType.INT); pIndex.push(intPO.pIndex); oIndex.push(intPO.o); } } function _addStringPO(uint256[] storage pIndex, uint256[] storage oIndex, StringPO[] memory stringPOList) internal { for (uint256 i = 0; i < stringPOList.length; i++) { StringPO memory stringPO = stringPOList[i]; _checkPredicate(stringPO.pIndex, FieldType.STRING); uint256 _oIndex = _stringO.length; _stringO.push(stringPO.o); pIndex.push(stringPO.pIndex); oIndex.push(_oIndex); } } function _addAddressPO(uint256[] storage pIndex, uint256[] storage oIndex, AddressPO[] memory addressPOList) internal { for (uint256 i = 0; i < addressPOList.length; i++) { AddressPO memory addressPO = addressPOList[i]; _checkPredicate(addressPO.pIndex, FieldType.ADDRESS); pIndex.push(addressPO.pIndex); oIndex.push(uint160(addressPO.o)); } } function _addSubjectPO(uint256[] storage pIndex, uint256[] storage oIndex, SubjectPO[] memory subjectPOList) internal { for (uint256 i = 0; i < subjectPOList.length; i++) { SubjectPO memory subjectPO = subjectPOList[i]; _checkPredicate(subjectPO.pIndex, FieldType.SUBJECT); require(subjectPO.oIndex > 0 && subjectPO.oIndex < _subjects.length, "SemanticSBT: subject not exist"); pIndex.push(subjectPO.pIndex); oIndex.push(subjectPO.oIndex); } } function _addBlankNodePO(uint256[] storage pIndex, uint256[] storage oIndex, BlankNodePO[] memory blankNodePOList) internal { for (uint256 i = 0; i < blankNodePOList.length; i++) { BlankNodePO memory blankNodePO = blankNodePOList[i]; require(blankNodePO.pIndex < _predicates.length, "SemanticSBT: predicate not exist"); uint256 _blankNodeOIndex = _blankNodeO.length; _blankNodeO.push(BlankNodeO(new uint256[](0), new uint256[](0))); uint256[] storage blankNodePIndex = _blankNodeO[_blankNodeOIndex].pIndex; uint256[] storage blankNodeOIndex = _blankNodeO[_blankNodeOIndex].oIndex; _addIntPO(blankNodePIndex, blankNodeOIndex, blankNodePO.intO); _addStringPO(blankNodePIndex, blankNodeOIndex, blankNodePO.stringO); _addAddressPO(blankNodePIndex, blankNodeOIndex, blankNodePO.addressO); _addSubjectPO(blankNodePIndex, blankNodeOIndex, blankNodePO.subjectO); pIndex.push(blankNodePO.pIndex); oIndex.push(_blankNodeOIndex); } } function _buildRDF(SPO memory spo) internal view returns (string memory _rdf){ _rdf = _buildS(spo); for (uint256 i = 0; i < spo.pIndex.length; i++) { Predicate memory p = _predicates[spo.pIndex[i]]; if (FieldType.INT == p.fieldType) { _rdf = string.concat(_rdf, _buildIntRDF(spo.pIndex[i], spo.oIndex[i])); } else if (FieldType.STRING == p.fieldType) { _rdf = string.concat(_rdf, _buildStringRDF(spo.pIndex[i], spo.oIndex[i])); } else if (FieldType.ADDRESS == p.fieldType) { _rdf = string.concat(_rdf, _buildAddressRDF(spo.pIndex[i], spo.oIndex[i])); } else if (FieldType.SUBJECT == p.fieldType) { _rdf = string.concat(_rdf, _buildSubjectRDF(spo.pIndex[i], spo.oIndex[i])); } else if (FieldType.BLANKNODE == p.fieldType) { _rdf = string.concat(_rdf, _buildBlankNodeRDF(spo.pIndex[i], spo.oIndex[i])); } string memory suffix = i == spo.pIndex.length - 1 ? "." : ";"; _rdf = string.concat(_rdf, suffix); } } function _buildS(SPO memory spo) internal view returns (string memory){ string memory _className = spo.sIndex == 0 ? SOUL_CLASS_NAME : _classNames[spo.sIndex]; string memory subjectValue = spo.sIndex == 0 ? address(spo.owner).toHexString() : _subjects[spo.sIndex].value; return string.concat(ENTITY_PREFIX, _className, CONCATENATION_CHARACTER, subjectValue, BLANK_SPACE); } function _buildIntRDF(uint256 pIndex, uint256 oIndex) internal view returns (string memory){ Predicate memory predicate_ = _predicates[pIndex]; string memory p = string.concat(PROPERTY_PREFIX, predicate_.name); string memory o = oIndex.toString(); return string.concat(p, BLANK_SPACE, o); } function _buildStringRDF(uint256 pIndex, uint256 oIndex) internal view returns (string memory){ Predicate memory predicate_ = _predicates[pIndex]; string memory p = string.concat(PROPERTY_PREFIX, predicate_.name); string memory o = string.concat('"', _stringO[oIndex], '"'); return string.concat(p, BLANK_SPACE, o); } function _buildAddressRDF(uint256 pIndex, uint256 oIndex) internal view returns (string memory){ Predicate memory predicate_ = _predicates[pIndex]; string memory p = string.concat(PROPERTY_PREFIX, predicate_.name); string memory o = string.concat(ENTITY_PREFIX, SOUL_CLASS_NAME, CONCATENATION_CHARACTER, address(uint160(oIndex)).toHexString()); return string.concat(p, BLANK_SPACE, o); } function _buildSubjectRDF(uint256 pIndex, uint256 oIndex) internal view returns (string memory){ Predicate memory predicate_ = _predicates[pIndex]; string memory _className = _classNames[_subjects[oIndex].cIndex]; string memory p = string.concat(PROPERTY_PREFIX, predicate_.name); string memory o = string.concat(ENTITY_PREFIX, _className, CONCATENATION_CHARACTER, _subjects[oIndex].value); return string.concat(p, BLANK_SPACE, o); } function _buildBlankNodeRDF(uint256 pIndex, uint256 oIndex) internal view returns (string memory){ Predicate memory predicate_ = _predicates[pIndex]; string memory p = string.concat(PROPERTY_PREFIX, predicate_.name); uint256[] memory blankPList = _blankNodeO[oIndex].pIndex; uint256[] memory blankOList = _blankNodeO[oIndex].oIndex; string memory _rdf = ""; for (uint256 i = 0; i < blankPList.length; i++) { Predicate memory _p = _predicates[blankPList[i]]; if (FieldType.INT == _p.fieldType) { _rdf = string.concat(_rdf, _buildIntRDF(blankPList[i], blankOList[i])); } else if (FieldType.STRING == _p.fieldType) { _rdf = string.concat(_rdf, _buildStringRDF(blankPList[i], blankOList[i])); } else if (FieldType.ADDRESS == _p.fieldType) { _rdf = string.concat(_rdf, _buildAddressRDF(blankPList[i], blankOList[i])); } else if (FieldType.SUBJECT == _p.fieldType) { _rdf = string.concat(_rdf, _buildSubjectRDF(blankPList[i], blankOList[i])); } if (i < blankPList.length - 1) { _rdf = string.concat(_rdf, TURTLE_LINE_SUFFIX); } } return string.concat(p, BLANK_SPACE, BLANK_NODE_START_CHARACTER, _rdf, BLANK_NODE_END_CHARACTER); } function _checkPredicate(uint256 pIndex, FieldType fieldType) internal view { require(pIndex > 0 && pIndex < _predicates.length, "SemanticSBT: predicate not exist"); require(_predicates[pIndex].fieldType == fieldType, "SemanticSBT: predicate type error"); } function _mint(address account, uint256 sIndex, IntPO[] memory intPOList, StringPO[] memory stringPOList, AddressPO[] memory addressPOList, SubjectPO[] memory subjectPOList, BlankNodePO[] memory blankNodePOList) internal returns (uint256) { require(account != address(0), "SemanticSBT: mint to the zero address"); require(sIndex < _subjects.length, "SemanticSBT: param error"); uint256 tokenId = _tokens.length; _tokens.push(SPO(uint160(account), sIndex, new uint256[](0), new uint256[](0))); uint256[] storage pIndex = _tokens[tokenId].pIndex; uint256[] storage oIndex = _tokens[tokenId].oIndex; _addIntPO(pIndex, oIndex, intPOList); _addStringPO(pIndex, oIndex, stringPOList); _addAddressPO(pIndex, oIndex, addressPOList); _addSubjectPO(pIndex, oIndex, subjectPOList); _addBlankNodePO(pIndex, oIndex, blankNodePOList); require(pIndex.length > 0, "SemanticSBT: param error"); _balances[account] += 1; require( _checkOnERC721Received(address(0), account, tokenId, ""), "SemanticSBT: transfer to non ERC721Receiver implementer" ); emit Transfer(address(0), account, tokenId); emit CreateSBT(msg.sender, account, tokenId, _buildRDF(_tokens[tokenId])); return tokenId; } /* ============ External Functions ============ */ function addSubject(string memory value, string memory className_) external onlyMinter returns (uint256 sIndex) { uint256 cIndex = _classIndex[className_]; require(cIndex > 0, "SemanticSBT: param error"); require(_subjectIndex[cIndex][value] == 0, "SemanticSBT: already added"); sIndex = _subjects.length; _subjectIndex[cIndex][value] = sIndex; _subjects.push(Subject(value, cIndex)); } function mint(address account, uint256 sIndex, IntPO[] memory intPOList, StringPO[] memory stringPOList, AddressPO[] memory addressPOList, SubjectPO[] memory subjectPOList, BlankNodePO[] memory blankNodePOList) external onlyMinter returns (uint256) { return _mint(account, sIndex, intPOList, stringPOList, addressPOList, subjectPOList, blankNodePOList); } function burn(address account, uint256 id) external onlyMinter { require( _isApprovedOrOwner(_msgSender(), id), "SemanticSBT: caller is not approved or owner" ); require(isOwnerOf(account, id), "SemanticSBT: not owner"); string memory _rdf = _buildRDF(_tokens[id]); // Clear approvals _approve(address(0), id); _burnCount++; _balances[account] -= 1; _tokens[id].owner = 0; emit Transfer(account, address(0), id); emit RemoveSBT(msg.sender, account, id, _rdf); } function burnBatch(address account, uint256[] calldata ids) external onlyMinter { _burnCount += ids.length; _balances[account] -= ids.length; for (uint256 i = 0; i < ids.length; i++) { uint256 tokenId = ids[i]; require( _isApprovedOrOwner(_msgSender(), tokenId), "SemanticSBT: caller is not approved or owner" ); require(isOwnerOf(account, tokenId), "SemanticSBT: not owner"); string memory _rdf = _buildRDF(_tokens[tokenId]); // Clear approvals _approve(address(0), tokenId); _tokens[tokenId].owner = 0; emit Transfer(account, address(0), tokenId); emit RemoveSBT(msg.sender, account, tokenId, _rdf); } } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( isOwnerOf(from, tokenId), "ERC721: transfer of token that is not own" ); require(to != address(0), "ERC721: transfer to the zero address"); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _tokens[tokenId].owner = uint160(to); emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } return true; } /* ============ Util Functions ============ */ /** * @dev Sets a new baseURI for all token types. */ function setURI(string calldata newURI) external onlyOwner { _baseURI = newURI; } /** * @dev Sets a new transferable for all token types. */ function setTransferable(bool transferable_) external onlyOwner { _transferable = transferable_; } /** * @dev Sets a new name for all token types. */ function setName(string calldata newName) external onlyOwner { _name = newName; } /** * @dev Sets a new symbol for all token types. */ function setSymbol(string calldata newSymbol) external onlyOwner { _symbol = newSymbol; } /** * @dev Add a new minter. */ function addMinter(address minter) external onlyOwner { require(minter != address(0), "SemanticSBT: minter must not be null address"); require(!_minters[minter], "SemanticSBT: minter already added"); _minters[minter] = true; emit EventMinterAdded(minter); } /** * @dev Remove a old minter. */ function removeMinter(address minter) external onlyOwner { require(_minters[minter], "SemanticSBT: minter does not exist"); delete _minters[minter]; emit EventMinterRemoved(minter); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; enum FieldType { INT, STRING, ADDRESS, SUBJECT, BLANKNODE } struct IntPO { uint256 pIndex; uint256 o; } struct StringPO { uint256 pIndex; string o; } struct AddressPO { uint256 pIndex; address o; } struct SubjectPO { uint256 pIndex; uint256 oIndex; } struct BlankNodePO { uint256 pIndex; IntPO[] intO; StringPO[] stringO; AddressPO[] addressO; SubjectPO[] subjectO; } struct BlankNodeO { uint256[] pIndex; uint256[] oIndex; } struct SPO { uint160 owner; uint256 sIndex; uint256[] pIndex; uint256[] oIndex; } struct Class { uint256 index; string name; } struct Predicate { string name; FieldType fieldType; } struct Subject { string value; uint256 cIndex; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; import "../../utils/Address.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!Address.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; interface ISemanticSBTMetadata is IERC721Metadata { /** * @dev Returns the Uniform Resource Identifier [URI](https://www.ietf.org/rfc/rfc3986.txt) for semantic metadata */ function schemaURI() external view returns (string memory); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/IERC721.sol"; /** * @dev Required interface of an ISemanticData compliant contract. */ interface ISemanticSBT is IERC721 { event CreateSBT( address indexed operator, address indexed owner, uint256 indexed tokenId, string rdf ); event RemoveSBT( address indexed operator, address indexed owner, uint256 indexed tokenId, string rdf ); /** * @dev returns formatted rdf data * @param tokenId The token Id */ function rdfOf(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
{ "optimizer": { "enabled": true, "runs": 1 }, "viaIR": true, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"rdf","type":"string"}],"name":"CreateSBT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newMinter","type":"address"}],"name":"EventMinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldMinter","type":"address"}],"name":"EventMinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"rdf","type":"string"}],"name":"RemoveSBT","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_ownedSBT","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"value","type":"string"},{"internalType":"string","name":"className_","type":"string"}],"name":"addSubject","outputs":[{"internalType":"uint256","name":"sIndex","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addressList","type":"address[]"}],"name":"addWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"internalType":"struct RelationWPower.Signature","name":"signature","type":"tuple"},{"internalType":"uint256","name":"expireTime","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"className_","type":"string"}],"name":"classIndex","outputs":[{"internalType":"uint256","name":"classIndex_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cIndex","type":"uint256"}],"name":"className","outputs":[{"internalType":"string","name":"name_","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"schemaURI_","type":"string"},{"internalType":"string[]","name":"classes_","type":"string[]"},{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"enum FieldType","name":"fieldType","type":"uint8"}],"internalType":"struct Predicate[]","name":"predicates_","type":"tuple[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"sIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"uint256","name":"o","type":"uint256"}],"internalType":"struct IntPO[]","name":"intPOList","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"string","name":"o","type":"string"}],"internalType":"struct StringPO[]","name":"stringPOList","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"address","name":"o","type":"address"}],"internalType":"struct AddressPO[]","name":"addressPOList","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"uint256","name":"oIndex","type":"uint256"}],"internalType":"struct SubjectPO[]","name":"subjectPOList","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"uint256","name":"o","type":"uint256"}],"internalType":"struct IntPO[]","name":"intO","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"string","name":"o","type":"string"}],"internalType":"struct StringPO[]","name":"stringO","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"address","name":"o","type":"address"}],"internalType":"struct AddressPO[]","name":"addressO","type":"tuple[]"},{"components":[{"internalType":"uint256","name":"pIndex","type":"uint256"},{"internalType":"uint256","name":"oIndex","type":"uint256"}],"internalType":"struct SubjectPO[]","name":"subjectO","type":"tuple[]"}],"internalType":"struct BlankNodePO[]","name":"blankNodePOList","type":"tuple[]"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pIndex","type":"uint256"}],"name":"predicate","outputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"enum FieldType","name":"fieldType","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"predicateName_","type":"string"}],"name":"predicateIndex","outputs":[{"internalType":"uint256","name":"predicateIndex_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rdfOf","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"schemaURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newSymbol","type":"string"}],"name":"setSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"transferable_","type":"bool"}],"name":"setTransferable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"subject","outputs":[{"internalType":"string","name":"subjectValue","type":"string"},{"internalType":"string","name":"className_","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"subjectValue","type":"string"},{"internalType":"string","name":"className_","type":"string"}],"name":"subjectIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"offset","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"whiteListRange","outputs":[{"internalType":"address[]","name":"whiteList_","type":"address[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60808060405234620000f45760008054336001600160a01b0319821681178355620000e49390916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908490a3620000b86200006362000160565b6200006d62000160565b6200007762000111565b9184835284602084015260408301526060820152620000b26200009962000140565b91620000a46200019d565b8352846020840152620002a4565b620004c5565b620000c262000608565b620000cc62000140565b90620000d76200019d565b8252602082015262000703565b604051615d609081620008618239f35b50600080fd5b50634e487b7160e01b600052604160045260246000fd5b60405190608082016001600160401b038111838210176200013157604052565b6200013b620000fa565b604052565b60408051919082016001600160401b038111838210176200013157604052565b6040516020810191906000906001600160401b038411818510176200018d575b8360405281815292369037565b62000197620000fa565b62000180565b60405190602082016001600160401b03811183821017620001c2575b60405260008252565b620001cc620000fa565b620001b9565b50634e487b7160e01b600052603260045260246000fd5b50634e487b7160e01b600052600060045260246000fd5b8181106200020c575050565b6000815560010162000200565b81519168010000000000000000831162000294575b815483835580841062000273575b50602080910191600052806000206000925b8484106200025d575050505050565b600183828293518555019201930192906200024e565b6200028d9083600052846020600020918201910162000200565b386200023c565b6200029e620000fa565b6200022e565b600454906801000000000000000080831015620003ca575b60019081840180600455841015620003ba575b60046000908152835160029590951b7f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b0319166001600160a01b039690961695909517855560208085015184870155600286018160408701518051958611620003aa575b82548684558087106200038d575b5091845282842091015b8484106200037957505050505050906003606062000377930151910162000219565b565b805182559285019290850190820162000355565b838652828620620003a391810190880162000200565b386200034b565b620003b4620000fa565b6200033d565b620003c4620001d2565b620002cf565b620003d4620000fa565b620002bc565b600a54811015620003fb575b600a60005260206000209060011b0190600090565b62000405620001d2565b620003e6565b6011548110156200042c575b601160005260206000209060011b0190600090565b62000436620001d2565b62000417565b90600182811c9216801562000470575b60208310146200045857565b5050634e487b7160e01b600052602260045260246000fd5b91607f16916200044c565b9190601f81116200048b57505050565b62000377926000526020600020906020601f840160051c83019310620004ba575b601f0160051c019062000200565b9091508190620004ac565b600a5468010000000000000000811015620005f8575b620004ee600191828101600a55620003da565b929092620005e8575b805180519091906001600160401b038111620005d8575b62000526816200051f87546200043c565b876200047b565b806020938490601f831160011462000568576000926200055c575b5050600019600383901b1c191690841b1784555b0151910155565b01519050388062000541565b90869350601f198316916200058289600052602060002090565b9260005b88828210620005c15750508411620005a7575b505050811b01845562000555565b015160001960f88460031b161c1916905538808062000599565b8385015186558a9790950194938401930162000586565b620005e2620000fa565b6200050e565b620005f2620001e9565b620004f7565b62000602620000fa565b620004db565b6000600f54680100000000000000008110156200069f575b6001810180600f558110156200068f575b600f82527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201805462000664906200043c565b601f811162000671575055565b818352602083206200068c91601f0160051c81019062000200565b55565b62000699620001d2565b62000631565b620006a9620000fa565b62000620565b60051115620006ba57565b50634e487b7160e01b600052602160045260246000fd5b906005811015620006ea5760ff80198354169116179055565b505050634e487b7160e01b600052602160045260246000fd5b906011546801000000000000000081101562000850575b6200072d6001918281016011556200040b565b91909162000840575b83518051946001600160401b03861162000830575b62000763866200075c86546200043c565b866200047b565b6020918290601f8811600114620007bb57968091620003779798600092620007af575b5050600019600383901b1c191690841b1784555b015191620007a883620006af565b01620006d1565b01519050388062000786565b90601f19881691620007d287600052602060002090565b9260005b8181106200081a5750918693918a620003779a9b941062000800575b505050811b0184556200079a565b015160001960f88460031b161c19169055388080620007f2565b82840151855593870193928601928601620007d6565b6200083a620000fa565b6200074b565b6200084a620001e9565b62000736565b6200085a620000fa565b6200071a56fe6040608081526004361015610015575b50600080fd5b600090813560e01c806301ffc9a71461082957806302fe53051461081157806306fdde03146107f5578063081812fc146107d9578063095ea7b3146107c15780631249c58b146107aa578063152407ae1461078e57806318160ddd1461077257806323b872dd1461075a5780632f745c591461073d5780633092afd514610726578063372c12b1146106f157806342842e0e146106d957806347d0efe9146105875780634f6ccce7146106bd5780635036d1a8146106a057806352e89bbd1461067d57806358e23bac146106615780635e1045ec1461064a5780636352211e146106235780636c0360eb1461060757806370a08231146105eb578063715018a6146105d4578063761b3ec5146105bc5780638cc08025146105875780638da5cb5b1461055f57806392ff0d31146105345780639377268d1461051857806395d89b41146104fc578063983b2d56146104e55780639cd23707146104ce5780639dc29fac146104b6578063a22cb4651461049e578063a6c1653d14610481578063a9ff13a614610458578063ac72200d1461042d578063b2dc5dc314610415578063b84c8246146103fd578063b88d4fde146103e2578063c47f0027146103ca578063c5b8f772146103ad578063c87b56dd14610391578063d49116f514610373578063d4b0c4031461034a578063deeec3441461032e578063e985e9c5146102fe578063f2fde38b146102e4578063f46eccc41461029e578063f5c57a8f146102765763fbafb69814610248575061000f565b346102725761026e915061026361025e36610963565b61320b565b905191829182610952565b0390f35b5080fd5b50346102725761026e915061029361028d36611886565b90611b7b565b90519182918261189c565b50346102725761026e91506102d36102b536610ba7565b6001600160a01b031660009081526008602052604090205460ff1690565b905191829182901515815260200190565b5034610272576102fb6102f636610ba7565b611977565b51f35b50346102725761026e91506102d361032761032261031b36611853565b9190610bca565b610c32565b5460ff1690565b50346102725761026e915061026361034536610963565b612e4d565b50346102725761026e915061036661036136610963565b612fef565b9290915192839283611814565b5034610272576102fb6103853661173c565b9594909493919361256b565b50346102725761026e91506102636103a836610963565b613653565b50346102725761026e91506102d36103c4366109b4565b9061354d565b5034610272576102fb6103dc36610888565b90615856565b5034610272576102fb6103f436611595565b92919091613ac2565b5034610272576102fb61040f36610888565b9061592d565b5034610272576102fb61042736611534565b916152e7565b50346102725761026e9150610441366108ea565b61044961328a565b90519081529081906020820190565b50346102725761026e915061047461046f36610963565b6130c2565b929091519283928361150f565b50346102725761026e915061044961049836610c49565b90613096565b5034610272576102fb6104b0366114de565b906138a6565b5034610272576102fb6104c8366109b4565b9061515c565b5034610272576102fb6104e0366114c2565b61583c565b5034610272576102fb6104f736610ba7565b615a07565b50346102725761026e9150610510366108ea565b61026361122a565b50346102725761026e915061044961052f36610b46565b612ee2565b50346102725761026e9150610548366108ea565b60ff60095416905191829182901515815260200190565b50346102725761026e91610572366108ea565b5490519182916001600160a01b031682610975565b50346102725761026e91506102d361059e36610ba7565b6001600160a01b031660009081526016602052604090205460ff1690565b5034610272576102fb6105ce3661145e565b9061211a565b5034610272576105e3366108ea565b6102fb6118e0565b50346102725761026e915061044961060236610ba7565b613455565b50346102725761026e915061061b366108ea565b6102636111a3565b50346102725761026e915061063f61063a36610963565b6134cf565b905191829182610975565b5034610272576102fb61065c366113d8565b611c9f565b50346102725761026e9150610675366108ea565b6102636112b1565b50346102725761026e915061044961069436610ffb565b959490949391936150d3565b50346102725761026e91506104496106b736610c49565b9061500b565b50346102725761026e91506104496106d436610963565b613388565b5034610272576102fb6106eb36610b70565b91613a32565b50346102725761026e91506102d361070836610ba7565b6001600160a01b031660009081526014602052604090205460ff1690565b5034610272576102fb61073836610ba7565b615b03565b50346102725761026e9150610449610754366109b4565b906132b3565b5034610272576102fb61076c36610b70565b916139a0565b50346102725761026e9150610786366108ea565b61044961329c565b50346102725761026e91506104496107a536610b46565b612e40565b5034610272576107b9366108ea565b6102fb611e87565b5034610272576102fb6107d3366109b4565b90613714565b50346102725761026e915061063f6107f036610963565b613821565b50346102725761026e9150610809366108ea565b61026361110b565b5034610272576102fb61082336610888565b90615762565b5050346108575750607f196108526108486108433661086d565b6123b8565b151560805260a090565b016080f35b80fd5b6001600160e01b03198116141561000f57565b602090600319011261000f576004356108858161085a565b90565b9060206003198301126108e3576001600160401b0391600435908382116108da57806023830112156108da5781600401359384116108da57602484830101116108d2576024019190565b505050600080fd5b50505050600080fd5b5050600080fd5b600090600319011261000f57565b918091926000905b828210610918575011610911575050565b6000910152565b91508060209183015181860152018291610900565b90602091610946815180928185528580860191016108f8565b601f01601f1916010190565b90602061088592818152019061092d565b602090600319011261000f5760043590565b6001600160a01b03909116815260200190565b600435906001600160a01b0382168214156108e357565b35906001600160a01b0382168214156108e357565b604090600319011261000f576004356001600160a01b0381168114156108e3579060243590565b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610a0d57604052565b610a156109db565b604052565b602081019081106001600160401b03821117610a0d57604052565b606081019081106001600160401b03821117610a0d57604052565b601f909101601f19168101906001600160401b03821190821017610a0d57604052565b6040519060a082016001600160401b03811183821017610a0d57604052565b60405190610a9f826109f2565b565b60405190608082016001600160401b03811183821017610a0d57604052565b6020906001600160401b038111610add575b601f01601f19160190565b610ae56109db565b610ad2565b929192610af682610ac0565b91610b046040519384610a50565b829481845281830111610b21578281602093846000960137010152565b5050505050600080fd5b9080601f830112156108d25781602061088593359101610aea565b60206003198201126108e357600435906001600160401b0382116108d25761088591600401610b2b565b606090600319011261000f576001600160a01b03906004358281168114156108d257916024359081168114156108d2579060443590565b602090600319011261000f576004356001600160a01b0381168114156108e35790565b6001600160a01b0316600090815260076020526040902090565b6001600160a01b0316600090815260166020526040902090565b6001600160a01b0316600090815260086020526040902090565b6001600160a01b0316600090815260056020526040902090565b9060018060a01b0316600052602052604060002090565b9060406003198301126108e3576001600160401b036004358181116108da5783610c7591600401610b2b565b926024359182116108da5761088591600401610b2b565b6020906001600160401b038111610ca5575b60051b0190565b610cad6109db565b610c9e565b81601f820112156108d257803590610cc982610c8c565b92604092610cd984519586610a50565b808552602091828087019260061b85010193818511610d34578301915b848310610d065750505050505090565b8583830312610d34578386918251610d1d816109f2565b853581528286013583820152815201920191610cf6565b5050505050505050600080fd5b81601f820112156108d257803590610d5882610c8c565b92604092610d6884519586610a50565b808552602093848087019260051b85010193838511610d3457858101925b858410610d97575050505050505090565b6001600160401b038435818111610e055783019184601f198489030112610e05578451610dc3816109f2565b89840135815285840135928311610df457610de5888b80969581960101610b2b565b83820152815201930192610d86565b505050505050505050505050600080fd5b5050505050505050505050600080fd5b81601f820112156108d257803590610e2c82610c8c565b92604092610e3c84519586610a50565b808552602091828087019260061b85010193818511610d34578301915b848310610e695750505050505090565b8583830312610d34578386918251610e80816109f2565b85358152610e8f83870161099f565b83820152815201920191610e59565b9080601f830112156108d2578135610eb581610c8c565b92604091610ec583519586610a50565b808552602093848087019260051b84010193818511610d3457858401925b858410610ef4575050505050505090565b6001600160401b038435818111610e055786019160a080601f198588030112610df457610f1f610a73565b908a850135825285850135848111610fe857878c610f3f92880101610cb2565b8b83015260609081860135858111610fd457888d610f5f92890101610d41565b8784015260809182870135868111610fbf57898e610f7f928a0101610e15565b90840152850135938411610fad57610f9e878c80979681970101610cb2565b90820152815201930192610ee3565b50505050505050505050505050600080fd5b50505050505050505050505050505050600080fd5b505050505050505050505050505050600080fd5b5050505050505050505050505050600080fd5b9060e06003198301126108e357611010610988565b91602435916001600160401b036044358181116110ad578361103491600401610cb2565b926064358281116110a1578161104c91600401610d41565b92608435838111610d34578261106491600401610e15565b9260a435818111611093578361107c91600401610cb2565b9260c4359182116110935761088591600401610e9e565b505050505050505050600080fd5b50505050505050600080fd5b505050505050600080fd5b50634e487b7160e01b600052600060045260246000fd5b90600182811c92168015611101575b60208310146110e957565b5050634e487b7160e01b600052602260045260246000fd5b91607f16916110de565b604051906000826001918254611120816110cf565b808452908481169081156111865750600114611144575b50610a9f92500383610a50565b9280915060005260209081600020936000915b81831061116e575050610a9f935082010138611137565b85548884018501529485019487945091830191611157565b94505050505060ff19166020830152610a9f826040810138611137565b60405190600082600c54916111b7836110cf565b80835260019380851690811561118657506001146111dc5750610a9f92500383610a50565b600c6000908152600080516020615bdd83398151915294602093509091905b818310611212575050610a9f935082010138611137565b855488840185015294850194879450918301916111fb565b604051906000826002549161123e836110cf565b80835260019380851690811561118657506001146112635750610a9f92500383610a50565b60026000908152600080516020615bbd83398151915294602093509091905b818310611299575050610a9f935082010138611137565b85548884018501529485019487945091830191611282565b60405190600082600d54916112c5836110cf565b80835260019380851690811561118657506001146112ea5750610a9f92500383610a50565b600d6000908152600080516020615bfd83398151915294602093509091905b818310611320575050610a9f935082010138611137565b85548884018501529485019487945091830191611309565b906040519182600082549261134c846110cf565b9081845260019485811690816000146113b95750600114611376575b5050610a9f92500383610a50565b9093915060005260209081600020936000915b8183106113a1575050610a9f93508201013880611368565b85548884018501529485019487945091830191611389565b9550505050505060ff19166020830152610a9f82604081013880611368565b6020806003198301126108d257600435916001600160401b0383116108da57806023840112156108da57826004013561141081610c8c565b9361141e6040519586610a50565b81855260248486019260051b8201019283116110ad57602401905b828210611447575050505090565b8380916114538461099f565b815201910190611439565b60031901608081126108e35760601361000f57604051606081016001600160401b038111828210176114b5575b60405260043560ff81168114156108d2578152602435602082015260443560408201529060643590565b6114bd6109db565b61148b565b602090600319011261000f576004358015158114156108e35790565b604090600319011261000f576004356001600160a01b0381168114156108e357906024358015158114156108d25790565b90916115266108859360408452604084019061092d565b91602081840391015261092d565b60406003198201126108e3576004356001600160a01b0381168114156108d257916001600160401b039160243590838211610b215780602383011215610b21578160040135938411610b215760248460051b830101116108da576024019190565b9060806003198301126108e3576001600160a01b03916004358381168114156108da57926024359081168114156108da579160443591606435906001600160401b0382116110ad57806023830112156110ad5781602461088593600401359101610aea565b9080601f830112156108d25781359061161282610c8c565b926116206040519485610a50565b828452602092838086019160051b830101928084116110a157848301915b84831061164e5750505050505090565b82356001600160401b03811161109357869161166f84848094890101610b2b565b81520192019161163e565b9080601f830112156108d25781359161169283610c8c565b9260406116a181519586610a50565b8185526020938486019185600594851b8601019482861161109357868101935b8685106116d357505050505050505090565b6001600160401b03908535828111610df45783019184601f198488030112610df457845192611701846109f2565b8a810135918211610fad5761171b878c8894840101610b2b565b845201359087821015610df457828a939284809401528152019401936116c1565b60e06003198201126108e357611750610988565b916001600160401b039160243590838211610b2157611773816004938401610b2b565b936044358181116110a1578261178a918501610b2b565b93606435828111610d3457836117a1918601610b2b565b9360843583811161109357846117b8918301610b2b565b9360a4358481116117e457816117cf9184016115fa565b9360c4359081116117e457610885920161167a565b50505050505050505050600080fd5b600511156117fd57565b50634e487b7160e01b600052602160045260246000fd5b9291906118299060408552604085019061092d565b9260058210156118395760200152565b50505050634e487b7160e01b600052602160045260246000fd5b604090600319011261000f576001600160a01b03906004358281168114156108d257916024359081168114156108d25790565b604090600319011261000f576004359060243590565b6020908160408183019282815285518094520193019160005b8281106118c3575050505090565b83516001600160a01b0316855293810193928101926001016118b5565b6118e861191d565b600080546001600160a01b0319811682556040516001600160a01b0390911690600080516020615c7d833981519152908390a3565b6000546001600160a01b031633141561193257565b50606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61197f61191d565b6001600160a01b039081169081156119be57600080546001600160a01b0319811684178255604051921691600080516020615c7d8339815191529190a3565b505060405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260849150fd5b80546001600160a01b0319166001600160a01b03909216919091179055565b60405190611a4182610a1a565b6000808352366020840137565b90611a5882610c8c565b611a656040519182610a50565b8281528092611a76601f1991610c8c565b0190602036910137565b50634e487b7160e01b600052601160045260246000fd5b6001906001198111611aa7570190565b611aaf611a80565b0190565b81198111611aa7570190565b60018110611acf575b6000190190565b611ad7611a80565b611ac8565b818110611ae7570390565b611aef611a80565b0390565b6001906000198114611aa7570190565b50634e487b7160e01b600052603260045260246000fd5b601554811015611b36575b601560005260206000200190600090565b611b3e611b03565b611b25565b602090805115611b51570190565b611aaf611b03565b6020918151811015611b6e575b60051b010190565b611b76611b03565b611b66565b9190601554808411611c48578381611bc092611b978584611ab3565b1115611c385780935b81611bab8285611ab3565b1115611c305750818110611c23575b03611a4e565b92805b828110611bcf57505050565b80611c19611bf7611be2611c1e94611b1a565b905460039190911b1c6001600160a01b031690565b611c0a611c048685611adc565b89611b59565b6001600160a01b039091169052565b611af3565b611bc3565b611c2b611a80565b611bba565b915050611a4e565b611c428483611ab3565b93611ba0565b50509050610885611a34565b15611c5b57565b5060405162461bcd60e51b815260206004820152601b60248201527a29b2b6b0b73a34b1a9a12a1d1036bab9ba1031329036b4b73a32b960291b6044820152606490fd5b90600033815260206008815260ff906040611cbe838286205416611c54565b835b8651811015611d4657611cfd906001600160a01b0380611ce0838b611b59565b5116875260149081865286858920541615611d02575b5050611af3565b611cc0565b611d0c838b611b59565b511687528452611d1d838720611d4f565b611d3f611d3a611d2d838b611b59565b516001600160a01b031690565b611d5c565b3880611cf6565b50505050509050565b805460ff19166001179055565b601554600160401b811015611dcf575b6001810180601555811015611dc2575b60156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b03909216919091179055565b611dca611b03565b611d7c565b611dd76109db565b611d6c565b15611de357565b5060405162461bcd60e51b815260206004820152601960248201527814995b185d1a5bdb880e88185b1c9958591e481b5a5b9d1959603a1b6044820152606490fd5b604090815191611e34836109f2565b600183528291600091825b602080821015611e6b57825160209291611e58826109f2565b8682528681830152828901015201611e3f565b50505091925050565b604051611e8081610a1a565b6000815290565b33600052601460205260ff6040600020541615611f2657611eb9611eb4611eb061032733610be4565b1590565b611ddc565b611f14611ec4611e25565b611ecc610a92565b6001815260016020820152611ee082611b43565b52611eea81611b43565b50611ef3611e74565b90611efc611e74565b611f04611e74565b90611f0d611e74565b9333614991565b50610a9f611f2133610be4565b611d4f565b5060405162461bcd60e51b815260206004820152601c60248201527b14995b185d1a5bdb880e881c195c9b5a5cdcda5bdb8819195b9a595960221b6044820152606490fd5b15611f7257565b50606460405162461bcd60e51b815260206004820152602060248201527f596f752068617665207375636365737366756c6c7920636c61696d65642069746044820152fd5b15611fbe57565b5060405162461bcd60e51b815260206004820152601660248201527514da59db985d1d5c994819185d1848195e1c1a5c995960521b6044820152606490fd5b90611aaf602092828151948592016108f8565b610a9f919392936040519485918351612031816020968780880191016108f8565b8301612045825180938780850191016108f8565b01612058825180938680850191016108f8565b01038085520183610a50565b1561206b57565b5060405162461bcd60e51b815260206004820152607460248201527f5369676e4461746120657863657074696f6e2e20506c7a206a6f696e2052656c60448201527f6174696f6e206f6666696369616c20446973636f726420746f206f70656e206160648201527f207469636b657420666f7220737570706f7274203e3e2068747470733a2f2f646084820152736973636f72642e67672f716d473441484b36553560601b60a482015260c490fd5b6102b56121ae9161216c611eb99461213f61213a611eb061032733610be4565b611f6b565b61214a428211611fb7565b612153306122bf565b90612166612160336122bf565b916121f6565b91612010565b60405161218f81612181602082018095611ffd565b03601f198101835282610a50565b5190209061219e815160ff1690565b604060208301519201519261249c565b612064565b604051906121c082610a1a565b60008252565b602190805160011015611b51570190565b9060209180518210156121e957010190565b6121f1611b03565b010190565b80156122a157806000908282935b61228d575061221283610ac0565b926122206040519485610a50565b80845281601f1961223083610ac0565b013660208701375b6122425750505090565b61224b90611abf565b90600a90603082820680198211612280575b0160f81b6001600160f81b031916841a61227784876121d7565b53049081612238565b612288611a80565b61225d565b92612299600a91611af3565b930480612204565b506040516122ae816109f2565b60018152600360fc1b602082015290565b604051906001600160a01b03166122d582610a35565b602a8252604036602084013760306122ec83611b43565b5360786122f8836121c6565b536029905b600182116123105761088591501561236c565b80600f61234c92166010811015612352575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a61234284866121d7565b5360041c9161235f565b906122fd565b61235a611b03565b612322565b8015611acf576000190190565b1561237357565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b6001600160e01b0319166380ac58cd60e01b811490811590828261247e575b831561246d575b831561245c575b83156123f2575b50505090565b92509061244b575b811561243a575b8115612429575b8115612418575b503880806123ec565b6301ffc9a760e01b1490503861240f565b6316388eeb60e21b81149150612408565b631f75f6d360e31b81149150612401565b635b5e139f60e01b811491506123fa565b6316388eeb60e21b821493506123e5565b631f75f6d360e31b821493506123de565b635b5e139f60e01b821493506123d7565b506040513d6000823e3d90fd5b9290916040516124ab816109f2565b601c948582526020957b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b87840152604051926000905b8883831061255657505092600096949260ff92608097951161254b575b603c820152603c815261250f81610a35565b8781519101209360405194855216868401526040830152606082015282805260015afa1561253e575b60005190565b61254661248f565b612538565b87603c8301526124fd565b909181818401015182828801015201906124e0565b9492909593916000549660ff8860a81c161580988199612695575b8115612672575b501561260e576000805460ff60a01b1916600160a01b1790556125b496886125f6576126a7565b6125ba57565b6000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b6000805460ff60a81b1916600160a81b1790556126a7565b505050505050505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081612684575b503861258d565b60a01c60ff1660011490503861267d565b9050600160ff8260a01c161090612586565b95939491946126b461191d565b6040516020810160208152816126cd604082018561092d565b03916126e1601f1993848101835282610a50565b519020906040516127136020820192826127078560409060208152600060208201520190565b03908101835282610a50565b5190201461278557612757612761946127526127669861274d61275c96612748611f218e6127438e5115156127e1565b610bfe565b612982565b612a63565b612b46565b612c29565b613d39565b613eaf565b60018060a01b0316600080516020615c5d8339815191526000604051a2565b5050505050505050608460405162461bcd60e51b815260206004820152602760248201527f53656d616e7469635342543a20736368656d61205552492063616e6e6f7420626044820152666520656d70747960c81b6064820152fd5b156127e857565b5060405162461bcd60e51b815260206004820152602760248201527f53656d616e7469635342543a207072656469636174652063616e206e6f7420626044820152666520656d70747960c81b6064820152608490fd5b818110612849575050565b6000815560010161283e565b90601f8211612862575050565b610a9f91600c6000526020600020906020601f840160051c83019310612890575b601f0160051c019061283e565b9091508190612883565b90601f82116128a7575050565b610a9f9160016000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b90601f82116128e1575050565b610a9f9160026000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b90601f821161291b575050565b610a9f91600d6000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b9190601f811161295757505050565b610a9f926000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b80519091906001600160401b038111612a56575b6001906129ac816129a784546110cf565b61289a565b602080601f83116001146129e75750819293946000926129dc575b5050600019600383901b1c191690821b179055565b0151905038806129c7565b6001600052601f19831695909190600080516020615cbd833981519152926000905b888210612a3f5750508385969710612a26575b505050811b019055565b015160001960f88460031b161c19169055388080612a1c565b808785968294968601518155019501930190612a09565b612a5e6109db565b612996565b80519091906001600160401b038111612b39575b612a8b81612a866002546110cf565b6128d4565b602080601f8311600114612ac75750819293600092612abc575b50508160011b916000199060031b1c191617600255565b015190503880612aa5565b6002600052601f19831694909190600080516020615bbd833981519152926000905b878210612b21575050836001959610612b08575b505050811b01600255565b015160001960f88460031b161c19169055388080612afd565b80600185968294968601518155019501930190612ae9565b612b416109db565b612a77565b80519091906001600160401b038111612c1c575b612b6e81612b69600c546110cf565b612855565b602080601f8311600114612baa5750819293600092612b9f575b50508160011b916000199060031b1c191617600c55565b015190503880612b88565b600c600052601f19831694909190600080516020615bdd833981519152926000905b878210612c04575050836001959610612beb575b505050811b01600c55565b015160001960f88460031b161c19169055388080612be0565b80600185968294968601518155019501930190612bcc565b612c246109db565b612b5a565b80519091906001600160401b038111612cff575b612c5181612c4c600d546110cf565b61290e565b602080601f8311600114612c8d5750819293600092612c82575b50508160011b916000199060031b1c191617600d55565b015190503880612c6b565b600d600052601f19831694909190600080516020615bfd833981519152926000905b878210612ce7575050836001959610612cce575b505050811b01600d55565b015160001960f88460031b161c19169055388080612cc3565b80600185968294968601518155019501930190612caf565b612d076109db565b612c3d565b81519192916001600160401b038111612dc1575b612d3481612d2e84546110cf565b84612948565b602080601f8311600114612d70575081929394600092612d65575b50508160011b916000199060031b1c1916179055565b015190503880612d4f565b90601f19831695612d8685600052602060002090565b926000905b888210612da957505083600195969710612a2657505050811b019055565b80600185968294968601518155019501930190612d8b565b612dc96109db565b612d20565b6020612de79181604051938285809451938492016108f8565b8101600e81520301902090565b6020612e0d9181604051938285809451938492016108f8565b8101601081520301902090565b602090612e349282604051948386809551938492016108f8565b82019081520301902090565b612e4990612dce565b5490565b80151580612ed7575b15612e915761088590600f54811015612e84575b600f600052600080516020615cfd83398151915201611338565b612e8c611b03565b612e6a565b505060405162461bcd60e51b815260206004820152601c60248201527b14d95b585b9d1a58d4d0950e8818db185cdcc81b9bdd08195e1a5cdd60221b6044820152606490fd5b50600f548110612e56565b612e4990612df4565b15612ef257565b50606460405162461bcd60e51b815260206004820152602060248201527f53656d616e7469635342543a20707265646963617465206e6f742065786973746044820152fd5b601154811015612f57575b601160005260206000209060011b0190600090565b612f5f611b03565b612f42565b600a54811015612f84575b600a60005260206000209060011b0190600090565b612f8c611b03565b612f6f565b601354811015612fb1575b601360005260206000209060011b0190600090565b612fb9611b03565b612f9c565b90604051612fcb816109f2565b60ff60018294612fda81611338565b84520154169060058210156118395760200152565b61300d6130139180151580613040575b61300890612eeb565b612f37565b50612fbe565b906020825192015160058110156130275790565b505050634e487b7160e01b600052602160045260246000fd5b506011548110612fff565b1561305257565b5060405162461bcd60e51b815260206004820152601b60248201527a14d95b585b9d1a58d4d0950e88191bd95cc81b9bdd08195e1a5cdd602a1b6044820152606490fd5b6130a26130b692612dce565b54600052600b602052604060002090612e1a565b5461088581151561304b565b908115158061311c575b6130d59061304b565b61088560016130f56130ef6130e986612f64565b50611338565b94612f64565b500154600f54811015612e8457600f600052600080516020615cfd83398151915201611338565b50600a5482106130cc565b600454811015613147575b600460005260206000209060021b0190600090565b61314f611b03565b613132565b9060405191828154918282526020928383019160005283600020936000905b82821061318957505050610a9f92500383610a50565b855484526001958601958895509381019390910190613173565b604051909190608081016001600160401b038111828210176131fe575b60405260606131f96003839560018060a01b038154168552600181015460208601526131ee60028201613154565b604086015201613154565b910152565b6132066109db565b6131c0565b61321481613b2a565b156132335761322e61322861088592613127565b506131a3565b613f93565b505060405162461bcd60e51b815260206004820152602760248201527f53656d616e7469635342543a2053656d616e74696353425420646f6573206e6f6044820152661d08195e1a5cdd60ca1b6064820152608490fd5b60045460018110611acf576000190190565b6132a461328a565b60035490818110611ae7570390565b9060006001918293600454945b8581106133265750505050505050608460405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152fd5b61332f81613127565b50546001600160a01b03838116911614613352575b61334d90611af3565b6132c0565b9282811461337f578461334d916001198111613372575b01939050613344565b61337a611a80565b613369565b50505091505090565b60006001908192600454935b8481106133f957505050505050608460405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a20746f6b656e20696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152fd5b61340281613127565b50546001600160a01b0316613420575b61341b90611af3565b613394565b9181811461344d578361341b916001198111613440575b01929050613412565b613448611a80565b613437565b505091505090565b6001600160a01b0316801561347557600052600560205260406000205490565b505060405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608490fd5b6134d881613b2a565b156134f4576134e690613127565b50546001600160a01b031690565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608490fd5b90613557906134cf565b6001600160a01b0390811691161490565b600c5460009291613578826110cf565b916001908181169081156135c9575060011461359357505050565b9091929350600c60005260209081600020906000915b8583106135b857505050500190565b8054858401529183019181016135a9565b60ff191683525050019150565b6000929181546135e5816110cf565b9260019180831690811561363e5750600114613602575b50505050565b90919293945060005260209081600020906000915b85831061362d57505050500190388080806135fc565b805485840152918301918101613617565b60ff19168452505050019150388080806135fc565b61365c81613b2a565b156136b55761366c600c546110cf565b156136ac5761088561368061369b926121f6565b61218160405193849261369560208501613568565b90611ffd565b64173539b7b760d91b815260050190565b506108856121b3565b505060405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b9061371e816134cf565b6001600160a01b0381811690841681146137ce5733149081156137b4575b501561374b57610a9f9161558d565b505060405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260849150fd5b60ff91506137c6906103223391610bca565b54163861373c565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b61382a81613b2a565b1561384a576000908152600660205260409020546001600160a01b031690565b505060405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b6001600160a01b038116919033831461390f576138d0903360005260076020526040600020610c32565b9015159060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152fd5b1561395a57565b5060405162461bcd60e51b815260206004820152601e60248201527f53656d616e7469635342543a206d757374207472616e7366657261626c6500006044820152606490fd5b90610a9f92916139b460ff60095416613953565b6139c66139c18433613b6a565b6139cb565b615462565b156139d257565b5060405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608490fd5b9091613a909260ff6009541692613a4884613953565b60405193613a7390602086016001600160401b03811187821017613ab5575b60405260008652613953565b613a806139c18433613b6a565b613a8b838383615462565b615727565b15613a9757565b5060405162461bcd60e51b815280613ab160048201613ad7565b0390fd5b613abd6109db565b613a67565b90613a90939291613a7360ff60095416613953565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b8015159081613b57575b81613b3d575090565b613b479150613127565b50546001600160a01b0316151590565b9050613b6161328a565b81111590613b34565b6001600160a01b0380613b7c846134cf565b169080831690828214948515613bbb575b5050508215613b9b57505090565b60ff925090613bb69160005260076020526040600020610c32565b541690565b613bc89192939550613821565b161491388080613b8d565b15613bda57565b5060405162461bcd60e51b815260206004820152602260248201527f53656d616e7469635342543a20436c6173732063616e6e6f7420626520656d70604482015261747960f01b6064820152608490fd5b15613c3257565b5060405162461bcd60e51b815260206004820152601a60248201527914d95b585b9d1a58d4d0950e88185b1c9958591e48185919195960321b6044820152606490fd5b600f54610a9f9190600160401b811015613cc1575b6001810180600f55811015613cb4575b600f600052600080516020615cfd83398151915201612d0c565b613cbc611b03565b613c9a565b613cc96109db565b613c8a565b601254610a9f9190600160401b811015613d2c575b6001810180601255811015613d1f575b60126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401612d0c565b613d27611b03565b613cf3565b613d346109db565b613ce3565b9060005b8251811015613de85780613d54613de39285611b59565b51613dad604080516020613da381830183613d6f8883610952565b0393613d83601f1995868101835282610a50565b519020935191820192826127078560409060208152600060208201520190565b5190201415613bd3565b613dc0613db982612dce565b5415613c2b565b613dc981613c75565b613ddd613dd7600f54611abf565b91612dce565b55611af3565b613d3d565b509050565b15613df457565b5060405162461bcd60e51b815260206004820152602660248201527f53656d616e7469635342543a207072656469636174652063616e6e6f7420626560448201526520656d70747960d01b6064820152608490fd5b60206001613e6a6011548260401b811015613ea2575b828101601155612f37565b613e95575b613e7a845182612d0c565b0191015160058110156130275760ff80198354169116179055565b613e9d6110b8565b613e6f565b613eaa6109db565b613e5f565b9060005b8251811015613de85780613eca613f1f9285611b59565b51613ef48151604090815190613eea60209183613d6f8482019283610952565b5190201415613ded565b613f01613db98251612df4565b613f0a81613e49565b613ddd613f18601154611abf565b9151612df4565b613eb3565b6020610a9f919392936040519481613f4587935180928680870191016108f8565b8201612058825180938680850191016108f8565b60405190613f66826109f2565b60018252603b60f81b6020830152565b60405190613f83826109f2565b60018252601760f91b6020830152565b613f9c8161425d565b91600080935b60408401805180518710156141825791614035916020613fd161300d613fcb8b61403b98611b59565b51612f37565b018051613fdd816117f3565b613fe6816117f3565b61404957509061401d614026916140176140018b8651611b59565b516140108c60608d0151611b59565b5190614316565b90613f24565b915b5151611abf565b87141561404157614017613f76565b94611af3565b93613fa2565b614017613f59565b8051614054816117f3565b61405d816117f3565b600114156140985750906140926140269161401761407c8b8651611b59565b5161408b8c60608d0151611b59565b519061434b565b9161401f565b80516140a3816117f3565b6140ac816117f3565b600214156140e1575090614092614026916140176140cb8b8651611b59565b516140da8c60608d0151611b59565b51906143c0565b80516140ec816117f3565b6140f5816117f3565b6003141561412a575090614092614026916140176141148b8651611b59565b516141238c60608d0151611b59565b519061442e565b51614134816117f3565b61413d816117f3565b60041461414e575b6140269061401f565b9061417a614026916140176141648b8651611b59565b516141738c60608d0151611b59565b5190614556565b919050614145565b50509350509050565b60405190614198826109f2565b600482526314dbdd5b60e21b6020830152565b604051906141b8826109f2565b60018252601d60f91b6020830152565b604051906141d5826109f2565b60018252605f60f81b6020830152565b604051906141f2826109f2565b60018252600160fd1b6020830152565b919493610a9f9360405196879385516142238160209889808a0191016108f8565b8501614237825180938980850191016108f8565b0161424a825180938880850191016108f8565b01612045825180938780850191016108f8565b6020810180516108859290600090806142c957505061427a61418b565b915b5190816142b7575161429791506001600160a01b03166122bf565b61429f6141ab565b916142a86141c8565b906142b16141e5565b93614202565b506130e96142c491612f64565b614297565b60206142e592600f548310156142eb575b600f81522001611338565b9161427c565b6142f3611b03565b6142da565b60405190614305826109f2565b6002825261381d60f11b6020830152565b9061433c61216061432c61300d61088595612f37565b6143346142f8565b905190613f24565b906143456141e5565b90612010565b9061435e61432c61300d61088594612f37565b906012548110156143b3575b6012600052602060002001906143ab60016040518094614399601160f91b9182602085015260218401906135d6565b90815203601e19810185520183610a50565b6143456141e5565b6143bb611b03565b61436a565b906143d361432c61300d61088594612f37565b6143ab6143de6141ab565b6143e661418b565b6144006143f16141c8565b956001600160a01b03166122bf565b604051958692845161441a816020978880890191016108f8565b840161424a825180938880850191016108f8565b9061443e61300d61088593612f37565b906143ab600161444d83612f64565b500154600f548110156144f1575b600f6000526144e361447f6144766020938460002001611338565b956143346142f8565b936144886141ab565b9261449a6144946141c8565b92612f64565b509160405197856144b48a9751809286808b0191016108f8565b86016144c8825180938680850191016108f8565b016144db825180938580850191016108f8565b0101906135d6565b03601f198101845283610a50565b6144f9611b03565b61445b565b6040519061450b826109f2565b6002825261203b60f01b6020830152565b60405190614529826109f2565b60018252605b60f81b6020830152565b60405190614546826109f2565b60018252605d60f81b6020830152565b9061456961432c61300d61459294612f37565b9061458561457f61457983612f91565b50613154565b91612f91565b5060019384809201613154565b9161459b6121b3565b926000925b6145c6575b50505061088592506145b56141e5565b6145bd61451c565b906142b1614539565b909192825184101561470e57859060206145e661300d613fcb8888611b59565b0180516145f2816117f3565b6145fb816117f3565b614658575061461c906140176146118787611b59565b516140108887611b59565b935b6146288451611abf565b8110614640575b61463890611af3565b9291906145a0565b93614650614638916140176144fe565b94905061462f565b8051614663816117f3565b61466c816117f3565b8314156146965750614690906140176146858787611b59565b5161408b8887611b59565b9361461e565b80516146a1816117f3565b6146aa816117f3565b600214156146cf5750614690906140176146c48787611b59565b516140da8887611b59565b949094516146dc816117f3565b6146e5816117f3565b6003146146f15761461e565b93614690906140176147038787611b59565b516141238887611b59565b926145a5565b1561471b57565b5060405162461bcd60e51b815260206004820152602560248201527f53656d616e7469635342543a206d696e7420746f20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b1561477657565b5060405162461bcd60e51b815260206004820152601860248201527729b2b6b0b73a34b1a9a12a1d103830b930b69032b93937b960411b6044820152606490fd5b815191600160401b8311614826575b8154838355808410614808575b50602080910191600052806000206000925b8484106147f3575050505050565b600183828293518555019201930192906147e5565b6148209083600052846020600020918201910161283e565b386147d3565b61482e6109db565b6147c6565b600454600160401b919082811015614917575b614857600191828101600455613127565b93909361490a575b8251614874906001600160a01b031685611a15565b60208084015183860155600285019080604086015180519485116148fd575b83548585558086106148e0575b500191600052806000206000925b8484106148cd575050505050509060036060610a9f93015191016147b7565b80518255928501929085019082016148ae565b6148f790856000528684600020918201910161283e565b386148a0565b6149056109db565b614893565b6149126110b8565b61485f565b61491f6109db565b614846565b1561492b57565b5060405162461bcd60e51b815260206004820152603760248201527f53656d616e7469635342543a207472616e7366657220746f206e6f6e204552436044820152761b9918a932b1b2b4bb32b91034b6b83632b6b2b73a32b960491b6064820152608490fd5b939492936001600160a01b03811693909291906149af851515614714565b600a5415156149bd9061476f565b6004549687966149cb611a34565b6149d3611a34565b6149db610aa1565b6001600160a01b038a168152916000602084015260408301526060820152614a0290614833565b614a0b88613127565b5060020194614a1989613127565b5060030194614a29908688614b43565b614a34908587614c13565b614a3f908486614ca9565b614a4a908385614d3c565b614a549183614ec1565b541515614a609061476f565b614a6981610c18565b8054614a7490611a97565b905582614a7f6121b3565b90614a8992615672565b614a9290614924565b8181604051600080516020615c9d83398151915260008092a4614ab482613127565b50614abe906131a3565b614ac790613f93565b604051803392614ad79082610952565b037f6ca139c4cce2c6dfdd350d203c7ac907df3bdc839acb0c9f1d59d01950aaaead91a490565b805490600160401b821015614b36575b60018201808255821015614b29575b60005260206000200155565b614b31611b03565b614b1d565b614b3e6109db565b614b0e565b929190600091825b8151811015614c0b57614b5e8183611b59565b519060ff6001614b7a8451801515806130405761300890612eeb565b500154166005811015614bef57614bac57611c19602083614b9f614ba795518b614afe565b015185614afe565b614b4b565b50505050505050608460405162461bcd60e51b81526020600482015260216024820152600080516020615c3d8339815191526044820152603960f91b6064820152fd5b5050634e487b7160e01b84525050602160045250602492509050fd5b505050509050565b909291600090815b8151811015614c0b57614c2e8183611b59565b5190614c468251801515806130405761300890612eeb565b5060ff600180920154166005811015614c8c571415614bac57611c19614c8792614c8160125491614c7a6020820151613cce565b5188614afe565b88614afe565b614c1b565b5050634e487b7160e01b8452505060216004525060249350915050fd5b90929192600093845b8151811015614c0b57614cc58183611b59565b519060ff6001614ce18451801515806130405761300890612eeb565b500154166005811015614d205760021415614bac57611c1982614d08614d1b945188614afe565b602001516001600160a01b031685614afe565b614cb2565b5050634e487b7160e01b86525050602160045250602492915050fd5b90929160005b8151811015614df157614d558183611b59565b51614d608151614f85565b6020908181019182518015159081614de5575b5015614d995750614d949291614d8d611c19925187614afe565b5187614afe565b614d42565b95505050505050606491506040519062461bcd60e51b82526004820152601e60248201527f53656d616e7469635342543a207375626a656374206e6f7420657869737400006044820152fd5b9050600a541138614d73565b5050509050565b90601354600160401b9081811015614eb4575b614e1c600191828101601355612f91565b929092614ea7575b8451908151908111614e9a575b8354818555808210614e7c575b50602080920184600052826000206000915b838310614e695750505050610a9f9394015191016147b7565b8051825591850191908501908401614e50565b614e949085600052826020600020918201910161283e565b38614e3e565b614ea26109db565b614e31565b614eaf6110b8565b614e24565b614ebc6109db565b614e0b565b929160005b8151811015614df15780611c19614ee0614f809385611b59565b51614eef815160115411612eeb565b614f7a60135491614f73614f01611a34565b614f24614f0c611a34565b91614f15610a92565b90815260209283820152614df8565b614f2d85612f91565b5090614f4a6001614f3d88612f91565b5001918501518284614b43565b614f5960408501518284614c13565b614f6860608501518284614ca9565b608084015191614d3c565b5189614afe565b85614afe565b614ec6565b6001614f9e60ff92801515806130405761300890612eeb565b500154166005811015614ff35760031415614fb557565b5060405162461bcd60e51b81526020600482015260216024820152600080516020615c3d8339815191526044820152603960f91b6064820152608490fd5b5050634e487b7160e01b600052602160045260246000fd5b6001604092615032600091338352600860205261502d60ff8785205416611c54565b612dce565b549061503f82151561476f565b818152600b602052615056613db986832086612e1a565b61506e600a54958284889452600b6020522085612e1a565b556040519261507c846109f2565b8352602083019081528160401b8410156150c6575b818401600a556150b26150a385612f64565b9490946150b9575b5184612d0c565b5191015590565b6150c16110b8565b6150ab565b6150ce6109db565b615091565b92919094939533600052600860205260406000205460ff166150f490611c54565b6001600160a01b0384169461510a861515614714565b600a5487106151189061476f565b600454978897615126611a34565b61512e611a34565b90615137610aa1565b6001600160a01b038b16815292602084015260408301526060820152614a0290614833565b33600052600860205261517660ff60406000205416611c54565b6151886151838333613b6a565b61523f565b615191826134cf565b6001600160a01b0380831692916151aa911683146152a1565b6151d96151bc61322e61322886613127565b916151c685615549565b6151d1600354611af3565b600355610c18565b6151e38154611abf565b90556151ee83613127565b5080546001600160a01b0319169055604051600080516020615c1d8339815191529084600085600080516020615c9d8339815191528285a4602081528061523a3394602083019061092d565b0390a4565b1561524657565b5060405162461bcd60e51b815260206004820152602c60248201527f53656d616e7469635342543a2063616c6c6572206973206e6f7420617070726f60448201526b3b32b21037b91037bbb732b960a11b6064820152608490fd5b156152a857565b5060405162461bcd60e51b815260206004820152601660248201527529b2b6b0b73a34b1a9a12a1d103737ba1037bbb732b960511b6044820152606490fd5b9091600091338352600860205260409161530660ff8486205416611c54565b61531a61531582600354611ab3565b600355565b61532382610c18565b61532e828254611adc565b9055835b81811061534157505050505050565b806153506153ec9284896153f1565b3561535e6151838233613b6a565b61537061536b828761354d565b6152a1565b61537f61322e61322883613127565b61538882615549565b6153a561539483613127565b5080546001600160a01b0319169055565b86516001600160a01b0387169190600080516020615c1d83398151915290848b85600080516020615c9d8339815191528285a4806153e4339482610952565b0390a4611af3565b615332565b91908110156154015760051b0190565b610cad611b03565b1561541057565b5060405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9061546c836134cf565b6001600160a01b0383811692909182168314156154ed576154a66154b792821694615498861515615409565b6154a187615549565b610c18565b6154b08154611abf565b9055610c18565b6154c18154611a97565b90556154d6826154d085613127565b50611a15565b600080516020615c9d8339815191526000604051a4565b505050505050608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152fd5b600081815260066020526040812080546001600160a01b03191690556001600160a01b03615576836134cf565b16600080516020615cdd83398151915282604051a4565b8160005260066020526155a4816040600020611a15565b6001600160a01b03806155b6846134cf565b16911690600080516020615cdd8339815191526000604051a4565b908160209103126108e357516108858161085a565b610885939260809260018060a01b03168252600060208301526040820152816060820152019061092d565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526108859291019061092d565b3d1561566d573d9061565382610ac0565b916156616040519384610a50565b82523d6000602084013e565b606090565b919091803b61568357505050600190565b6156ab602091600093604051948580948193630a85bd0160e11b998a845233600485016155e6565b03926001600160a01b03165af160009181615707575b506156f9575050506156d1615642565b805190816156f457505060405162461bcd60e51b815280613ab160048201613ad7565b602001fd5b6001600160e01b0319161490565b6157209192506157173d82610a50565b3d8101906155d1565b90386156c1565b92919091823b61573a5750505050600190565b6156ab926020926000604051809681958294630a85bd0160e11b9a8b85523360048601615611565b919061576c61191d565b6001600160401b03811161582f575b61578a81612b69600c546110cf565b6000601f82116001146157c3578192936000926157b85750508160011b916000199060031b1c191617600c55565b013590503880612b88565b600c600052601f19821693600080516020615bdd83398151915291805b86811061581757508360019596106157fd57505050811b01600c55565b0135600019600384901b60f8161c19169055388080612be0565b909260206001819286860135815501940191016157e0565b6158376109db565b61577b565b61584461191d565b60ff8019600954169115151617600955565b919061586061191d565b6001600160401b038111615920575b600190615880816129a784546110cf565b6000601f82116001146158b857819293946000926158ad575050600019600383901b1c191690821b179055565b0135905038806129c7565b6001600052601f19821694600080516020615cbd83398151915291805b87811061590a575083859697106158f057505050811b019055565b0135600019600384901b60f8161c19169055388080612a1c565b82820135845592850192602091820191016158d5565b6159286109db565b61586f565b919061593761191d565b6001600160401b0381116159fa575b61595581612a866002546110cf565b6000601f821160011461598e578192936000926159835750508160011b916000199060031b1c191617600255565b013590503880612aa5565b6002600052601f19821693600080516020615bbd83398151915291805b8681106159e257508360019596106159c857505050811b01600255565b0135600019600384901b60f8161c19169055388080612afd565b909260206001819286860135815501940191016159ab565b615a026109db565b615946565b615a0f61191d565b6001600160a01b038116908115615aa65760ff615a2b82610bfe565b5416615a5457611f21615a3d91610bfe565b600080516020615c5d8339815191526000604051a2565b505060405162461bcd60e51b815260206004820152602160248201527f53656d616e7469635342543a206d696e74657220616c726561647920616464656044820152601960fa1b606482015260849150fd5b505060405162461bcd60e51b815260206004820152602c60248201527f53656d616e7469635342543a206d696e746572206d757374206e6f742062652060448201526b6e756c6c206164647265737360a01b606482015260849150fd5b615b0b61191d565b6001600160a01b03811660008181526008602052604090205490919060ff1615615b6957615b3890610bfe565b60ff1981541690557f7df677640dd30a79584f8ecea06aeea15d215b861c5d3b5f8c26962d691f820e6000604051a2565b505060405162461bcd60e51b815260206004820152602260248201527f53656d616e7469635342543a206d696e74657220646f6573206e6f74206578696044820152611cdd60f21b606482015260849150fdfe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acedf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7d7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb58ea074c4be03960be214c047b695cecdc52be7382eee092c135d1726fabfc44453656d616e7469635342543a207072656469636174652074797065206572726f3a159411d00fa06a3ec11d4578931f1b7f877cceadb1e083929d74ec020cb2438be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a364697066735822122069132b817d5aea5a5883e13fe40c2757b9efa9f1ea6a771163c2f2a99b91adf46c6578706572696d656e74616cf564736f6c634300080c0041
Deployed Bytecode
0x6040608081526004361015610015575b50600080fd5b600090813560e01c806301ffc9a71461082957806302fe53051461081157806306fdde03146107f5578063081812fc146107d9578063095ea7b3146107c15780631249c58b146107aa578063152407ae1461078e57806318160ddd1461077257806323b872dd1461075a5780632f745c591461073d5780633092afd514610726578063372c12b1146106f157806342842e0e146106d957806347d0efe9146105875780634f6ccce7146106bd5780635036d1a8146106a057806352e89bbd1461067d57806358e23bac146106615780635e1045ec1461064a5780636352211e146106235780636c0360eb1461060757806370a08231146105eb578063715018a6146105d4578063761b3ec5146105bc5780638cc08025146105875780638da5cb5b1461055f57806392ff0d31146105345780639377268d1461051857806395d89b41146104fc578063983b2d56146104e55780639cd23707146104ce5780639dc29fac146104b6578063a22cb4651461049e578063a6c1653d14610481578063a9ff13a614610458578063ac72200d1461042d578063b2dc5dc314610415578063b84c8246146103fd578063b88d4fde146103e2578063c47f0027146103ca578063c5b8f772146103ad578063c87b56dd14610391578063d49116f514610373578063d4b0c4031461034a578063deeec3441461032e578063e985e9c5146102fe578063f2fde38b146102e4578063f46eccc41461029e578063f5c57a8f146102765763fbafb69814610248575061000f565b346102725761026e915061026361025e36610963565b61320b565b905191829182610952565b0390f35b5080fd5b50346102725761026e915061029361028d36611886565b90611b7b565b90519182918261189c565b50346102725761026e91506102d36102b536610ba7565b6001600160a01b031660009081526008602052604090205460ff1690565b905191829182901515815260200190565b5034610272576102fb6102f636610ba7565b611977565b51f35b50346102725761026e91506102d361032761032261031b36611853565b9190610bca565b610c32565b5460ff1690565b50346102725761026e915061026361034536610963565b612e4d565b50346102725761026e915061036661036136610963565b612fef565b9290915192839283611814565b5034610272576102fb6103853661173c565b9594909493919361256b565b50346102725761026e91506102636103a836610963565b613653565b50346102725761026e91506102d36103c4366109b4565b9061354d565b5034610272576102fb6103dc36610888565b90615856565b5034610272576102fb6103f436611595565b92919091613ac2565b5034610272576102fb61040f36610888565b9061592d565b5034610272576102fb61042736611534565b916152e7565b50346102725761026e9150610441366108ea565b61044961328a565b90519081529081906020820190565b50346102725761026e915061047461046f36610963565b6130c2565b929091519283928361150f565b50346102725761026e915061044961049836610c49565b90613096565b5034610272576102fb6104b0366114de565b906138a6565b5034610272576102fb6104c8366109b4565b9061515c565b5034610272576102fb6104e0366114c2565b61583c565b5034610272576102fb6104f736610ba7565b615a07565b50346102725761026e9150610510366108ea565b61026361122a565b50346102725761026e915061044961052f36610b46565b612ee2565b50346102725761026e9150610548366108ea565b60ff60095416905191829182901515815260200190565b50346102725761026e91610572366108ea565b5490519182916001600160a01b031682610975565b50346102725761026e91506102d361059e36610ba7565b6001600160a01b031660009081526016602052604090205460ff1690565b5034610272576102fb6105ce3661145e565b9061211a565b5034610272576105e3366108ea565b6102fb6118e0565b50346102725761026e915061044961060236610ba7565b613455565b50346102725761026e915061061b366108ea565b6102636111a3565b50346102725761026e915061063f61063a36610963565b6134cf565b905191829182610975565b5034610272576102fb61065c366113d8565b611c9f565b50346102725761026e9150610675366108ea565b6102636112b1565b50346102725761026e915061044961069436610ffb565b959490949391936150d3565b50346102725761026e91506104496106b736610c49565b9061500b565b50346102725761026e91506104496106d436610963565b613388565b5034610272576102fb6106eb36610b70565b91613a32565b50346102725761026e91506102d361070836610ba7565b6001600160a01b031660009081526014602052604090205460ff1690565b5034610272576102fb61073836610ba7565b615b03565b50346102725761026e9150610449610754366109b4565b906132b3565b5034610272576102fb61076c36610b70565b916139a0565b50346102725761026e9150610786366108ea565b61044961329c565b50346102725761026e91506104496107a536610b46565b612e40565b5034610272576107b9366108ea565b6102fb611e87565b5034610272576102fb6107d3366109b4565b90613714565b50346102725761026e915061063f6107f036610963565b613821565b50346102725761026e9150610809366108ea565b61026361110b565b5034610272576102fb61082336610888565b90615762565b5050346108575750607f196108526108486108433661086d565b6123b8565b151560805260a090565b016080f35b80fd5b6001600160e01b03198116141561000f57565b602090600319011261000f576004356108858161085a565b90565b9060206003198301126108e3576001600160401b0391600435908382116108da57806023830112156108da5781600401359384116108da57602484830101116108d2576024019190565b505050600080fd5b50505050600080fd5b5050600080fd5b600090600319011261000f57565b918091926000905b828210610918575011610911575050565b6000910152565b91508060209183015181860152018291610900565b90602091610946815180928185528580860191016108f8565b601f01601f1916010190565b90602061088592818152019061092d565b602090600319011261000f5760043590565b6001600160a01b03909116815260200190565b600435906001600160a01b0382168214156108e357565b35906001600160a01b0382168214156108e357565b604090600319011261000f576004356001600160a01b0381168114156108e3579060243590565b50634e487b7160e01b600052604160045260246000fd5b604081019081106001600160401b03821117610a0d57604052565b610a156109db565b604052565b602081019081106001600160401b03821117610a0d57604052565b606081019081106001600160401b03821117610a0d57604052565b601f909101601f19168101906001600160401b03821190821017610a0d57604052565b6040519060a082016001600160401b03811183821017610a0d57604052565b60405190610a9f826109f2565b565b60405190608082016001600160401b03811183821017610a0d57604052565b6020906001600160401b038111610add575b601f01601f19160190565b610ae56109db565b610ad2565b929192610af682610ac0565b91610b046040519384610a50565b829481845281830111610b21578281602093846000960137010152565b5050505050600080fd5b9080601f830112156108d25781602061088593359101610aea565b60206003198201126108e357600435906001600160401b0382116108d25761088591600401610b2b565b606090600319011261000f576001600160a01b03906004358281168114156108d257916024359081168114156108d2579060443590565b602090600319011261000f576004356001600160a01b0381168114156108e35790565b6001600160a01b0316600090815260076020526040902090565b6001600160a01b0316600090815260166020526040902090565b6001600160a01b0316600090815260086020526040902090565b6001600160a01b0316600090815260056020526040902090565b9060018060a01b0316600052602052604060002090565b9060406003198301126108e3576001600160401b036004358181116108da5783610c7591600401610b2b565b926024359182116108da5761088591600401610b2b565b6020906001600160401b038111610ca5575b60051b0190565b610cad6109db565b610c9e565b81601f820112156108d257803590610cc982610c8c565b92604092610cd984519586610a50565b808552602091828087019260061b85010193818511610d34578301915b848310610d065750505050505090565b8583830312610d34578386918251610d1d816109f2565b853581528286013583820152815201920191610cf6565b5050505050505050600080fd5b81601f820112156108d257803590610d5882610c8c565b92604092610d6884519586610a50565b808552602093848087019260051b85010193838511610d3457858101925b858410610d97575050505050505090565b6001600160401b038435818111610e055783019184601f198489030112610e05578451610dc3816109f2565b89840135815285840135928311610df457610de5888b80969581960101610b2b565b83820152815201930192610d86565b505050505050505050505050600080fd5b5050505050505050505050600080fd5b81601f820112156108d257803590610e2c82610c8c565b92604092610e3c84519586610a50565b808552602091828087019260061b85010193818511610d34578301915b848310610e695750505050505090565b8583830312610d34578386918251610e80816109f2565b85358152610e8f83870161099f565b83820152815201920191610e59565b9080601f830112156108d2578135610eb581610c8c565b92604091610ec583519586610a50565b808552602093848087019260051b84010193818511610d3457858401925b858410610ef4575050505050505090565b6001600160401b038435818111610e055786019160a080601f198588030112610df457610f1f610a73565b908a850135825285850135848111610fe857878c610f3f92880101610cb2565b8b83015260609081860135858111610fd457888d610f5f92890101610d41565b8784015260809182870135868111610fbf57898e610f7f928a0101610e15565b90840152850135938411610fad57610f9e878c80979681970101610cb2565b90820152815201930192610ee3565b50505050505050505050505050600080fd5b50505050505050505050505050505050600080fd5b505050505050505050505050505050600080fd5b5050505050505050505050505050600080fd5b9060e06003198301126108e357611010610988565b91602435916001600160401b036044358181116110ad578361103491600401610cb2565b926064358281116110a1578161104c91600401610d41565b92608435838111610d34578261106491600401610e15565b9260a435818111611093578361107c91600401610cb2565b9260c4359182116110935761088591600401610e9e565b505050505050505050600080fd5b50505050505050600080fd5b505050505050600080fd5b50634e487b7160e01b600052600060045260246000fd5b90600182811c92168015611101575b60208310146110e957565b5050634e487b7160e01b600052602260045260246000fd5b91607f16916110de565b604051906000826001918254611120816110cf565b808452908481169081156111865750600114611144575b50610a9f92500383610a50565b9280915060005260209081600020936000915b81831061116e575050610a9f935082010138611137565b85548884018501529485019487945091830191611157565b94505050505060ff19166020830152610a9f826040810138611137565b60405190600082600c54916111b7836110cf565b80835260019380851690811561118657506001146111dc5750610a9f92500383610a50565b600c6000908152600080516020615bdd83398151915294602093509091905b818310611212575050610a9f935082010138611137565b855488840185015294850194879450918301916111fb565b604051906000826002549161123e836110cf565b80835260019380851690811561118657506001146112635750610a9f92500383610a50565b60026000908152600080516020615bbd83398151915294602093509091905b818310611299575050610a9f935082010138611137565b85548884018501529485019487945091830191611282565b60405190600082600d54916112c5836110cf565b80835260019380851690811561118657506001146112ea5750610a9f92500383610a50565b600d6000908152600080516020615bfd83398151915294602093509091905b818310611320575050610a9f935082010138611137565b85548884018501529485019487945091830191611309565b906040519182600082549261134c846110cf565b9081845260019485811690816000146113b95750600114611376575b5050610a9f92500383610a50565b9093915060005260209081600020936000915b8183106113a1575050610a9f93508201013880611368565b85548884018501529485019487945091830191611389565b9550505050505060ff19166020830152610a9f82604081013880611368565b6020806003198301126108d257600435916001600160401b0383116108da57806023840112156108da57826004013561141081610c8c565b9361141e6040519586610a50565b81855260248486019260051b8201019283116110ad57602401905b828210611447575050505090565b8380916114538461099f565b815201910190611439565b60031901608081126108e35760601361000f57604051606081016001600160401b038111828210176114b5575b60405260043560ff81168114156108d2578152602435602082015260443560408201529060643590565b6114bd6109db565b61148b565b602090600319011261000f576004358015158114156108e35790565b604090600319011261000f576004356001600160a01b0381168114156108e357906024358015158114156108d25790565b90916115266108859360408452604084019061092d565b91602081840391015261092d565b60406003198201126108e3576004356001600160a01b0381168114156108d257916001600160401b039160243590838211610b215780602383011215610b21578160040135938411610b215760248460051b830101116108da576024019190565b9060806003198301126108e3576001600160a01b03916004358381168114156108da57926024359081168114156108da579160443591606435906001600160401b0382116110ad57806023830112156110ad5781602461088593600401359101610aea565b9080601f830112156108d25781359061161282610c8c565b926116206040519485610a50565b828452602092838086019160051b830101928084116110a157848301915b84831061164e5750505050505090565b82356001600160401b03811161109357869161166f84848094890101610b2b565b81520192019161163e565b9080601f830112156108d25781359161169283610c8c565b9260406116a181519586610a50565b8185526020938486019185600594851b8601019482861161109357868101935b8685106116d357505050505050505090565b6001600160401b03908535828111610df45783019184601f198488030112610df457845192611701846109f2565b8a810135918211610fad5761171b878c8894840101610b2b565b845201359087821015610df457828a939284809401528152019401936116c1565b60e06003198201126108e357611750610988565b916001600160401b039160243590838211610b2157611773816004938401610b2b565b936044358181116110a1578261178a918501610b2b565b93606435828111610d3457836117a1918601610b2b565b9360843583811161109357846117b8918301610b2b565b9360a4358481116117e457816117cf9184016115fa565b9360c4359081116117e457610885920161167a565b50505050505050505050600080fd5b600511156117fd57565b50634e487b7160e01b600052602160045260246000fd5b9291906118299060408552604085019061092d565b9260058210156118395760200152565b50505050634e487b7160e01b600052602160045260246000fd5b604090600319011261000f576001600160a01b03906004358281168114156108d257916024359081168114156108d25790565b604090600319011261000f576004359060243590565b6020908160408183019282815285518094520193019160005b8281106118c3575050505090565b83516001600160a01b0316855293810193928101926001016118b5565b6118e861191d565b600080546001600160a01b0319811682556040516001600160a01b0390911690600080516020615c7d833981519152908390a3565b6000546001600160a01b031633141561193257565b50606460405162461bcd60e51b815260206004820152602060248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152fd5b61197f61191d565b6001600160a01b039081169081156119be57600080546001600160a01b0319811684178255604051921691600080516020615c7d8339815191529190a3565b505060405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260849150fd5b80546001600160a01b0319166001600160a01b03909216919091179055565b60405190611a4182610a1a565b6000808352366020840137565b90611a5882610c8c565b611a656040519182610a50565b8281528092611a76601f1991610c8c565b0190602036910137565b50634e487b7160e01b600052601160045260246000fd5b6001906001198111611aa7570190565b611aaf611a80565b0190565b81198111611aa7570190565b60018110611acf575b6000190190565b611ad7611a80565b611ac8565b818110611ae7570390565b611aef611a80565b0390565b6001906000198114611aa7570190565b50634e487b7160e01b600052603260045260246000fd5b601554811015611b36575b601560005260206000200190600090565b611b3e611b03565b611b25565b602090805115611b51570190565b611aaf611b03565b6020918151811015611b6e575b60051b010190565b611b76611b03565b611b66565b9190601554808411611c48578381611bc092611b978584611ab3565b1115611c385780935b81611bab8285611ab3565b1115611c305750818110611c23575b03611a4e565b92805b828110611bcf57505050565b80611c19611bf7611be2611c1e94611b1a565b905460039190911b1c6001600160a01b031690565b611c0a611c048685611adc565b89611b59565b6001600160a01b039091169052565b611af3565b611bc3565b611c2b611a80565b611bba565b915050611a4e565b611c428483611ab3565b93611ba0565b50509050610885611a34565b15611c5b57565b5060405162461bcd60e51b815260206004820152601b60248201527a29b2b6b0b73a34b1a9a12a1d1036bab9ba1031329036b4b73a32b960291b6044820152606490fd5b90600033815260206008815260ff906040611cbe838286205416611c54565b835b8651811015611d4657611cfd906001600160a01b0380611ce0838b611b59565b5116875260149081865286858920541615611d02575b5050611af3565b611cc0565b611d0c838b611b59565b511687528452611d1d838720611d4f565b611d3f611d3a611d2d838b611b59565b516001600160a01b031690565b611d5c565b3880611cf6565b50505050509050565b805460ff19166001179055565b601554600160401b811015611dcf575b6001810180601555811015611dc2575b60156000527f55f448fdea98c4d29eb340757ef0a66cd03dbb9538908a6a81d96026b71ec4750180546001600160a01b0319166001600160a01b03909216919091179055565b611dca611b03565b611d7c565b611dd76109db565b611d6c565b15611de357565b5060405162461bcd60e51b815260206004820152601960248201527814995b185d1a5bdb880e88185b1c9958591e481b5a5b9d1959603a1b6044820152606490fd5b604090815191611e34836109f2565b600183528291600091825b602080821015611e6b57825160209291611e58826109f2565b8682528681830152828901015201611e3f565b50505091925050565b604051611e8081610a1a565b6000815290565b33600052601460205260ff6040600020541615611f2657611eb9611eb4611eb061032733610be4565b1590565b611ddc565b611f14611ec4611e25565b611ecc610a92565b6001815260016020820152611ee082611b43565b52611eea81611b43565b50611ef3611e74565b90611efc611e74565b611f04611e74565b90611f0d611e74565b9333614991565b50610a9f611f2133610be4565b611d4f565b5060405162461bcd60e51b815260206004820152601c60248201527b14995b185d1a5bdb880e881c195c9b5a5cdcda5bdb8819195b9a595960221b6044820152606490fd5b15611f7257565b50606460405162461bcd60e51b815260206004820152602060248201527f596f752068617665207375636365737366756c6c7920636c61696d65642069746044820152fd5b15611fbe57565b5060405162461bcd60e51b815260206004820152601660248201527514da59db985d1d5c994819185d1848195e1c1a5c995960521b6044820152606490fd5b90611aaf602092828151948592016108f8565b610a9f919392936040519485918351612031816020968780880191016108f8565b8301612045825180938780850191016108f8565b01612058825180938680850191016108f8565b01038085520183610a50565b1561206b57565b5060405162461bcd60e51b815260206004820152607460248201527f5369676e4461746120657863657074696f6e2e20506c7a206a6f696e2052656c60448201527f6174696f6e206f6666696369616c20446973636f726420746f206f70656e206160648201527f207469636b657420666f7220737570706f7274203e3e2068747470733a2f2f646084820152736973636f72642e67672f716d473441484b36553560601b60a482015260c490fd5b6102b56121ae9161216c611eb99461213f61213a611eb061032733610be4565b611f6b565b61214a428211611fb7565b612153306122bf565b90612166612160336122bf565b916121f6565b91612010565b60405161218f81612181602082018095611ffd565b03601f198101835282610a50565b5190209061219e815160ff1690565b604060208301519201519261249c565b612064565b604051906121c082610a1a565b60008252565b602190805160011015611b51570190565b9060209180518210156121e957010190565b6121f1611b03565b010190565b80156122a157806000908282935b61228d575061221283610ac0565b926122206040519485610a50565b80845281601f1961223083610ac0565b013660208701375b6122425750505090565b61224b90611abf565b90600a90603082820680198211612280575b0160f81b6001600160f81b031916841a61227784876121d7565b53049081612238565b612288611a80565b61225d565b92612299600a91611af3565b930480612204565b506040516122ae816109f2565b60018152600360fc1b602082015290565b604051906001600160a01b03166122d582610a35565b602a8252604036602084013760306122ec83611b43565b5360786122f8836121c6565b536029905b600182116123105761088591501561236c565b80600f61234c92166010811015612352575b6f181899199a1a9b1b9c1cb0b131b232b360811b901a61234284866121d7565b5360041c9161235f565b906122fd565b61235a611b03565b612322565b8015611acf576000190190565b1561237357565b50606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b6001600160e01b0319166380ac58cd60e01b811490811590828261247e575b831561246d575b831561245c575b83156123f2575b50505090565b92509061244b575b811561243a575b8115612429575b8115612418575b503880806123ec565b6301ffc9a760e01b1490503861240f565b6316388eeb60e21b81149150612408565b631f75f6d360e31b81149150612401565b635b5e139f60e01b811491506123fa565b6316388eeb60e21b821493506123e5565b631f75f6d360e31b821493506123de565b635b5e139f60e01b821493506123d7565b506040513d6000823e3d90fd5b9290916040516124ab816109f2565b601c948582526020957b0ca2ba3432b932bab69029b4b3b732b21026b2b9b9b0b3b29d05199960211b87840152604051926000905b8883831061255657505092600096949260ff92608097951161254b575b603c820152603c815261250f81610a35565b8781519101209360405194855216868401526040830152606082015282805260015afa1561253e575b60005190565b61254661248f565b612538565b87603c8301526124fd565b909181818401015182828801015201906124e0565b9492909593916000549660ff8860a81c161580988199612695575b8115612672575b501561260e576000805460ff60a01b1916600160a01b1790556125b496886125f6576126a7565b6125ba57565b6000805460ff60a81b19169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602090a1565b6000805460ff60a81b1916600160a81b1790556126a7565b505050505050505050608460405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152fd5b303b15915081612684575b503861258d565b60a01c60ff1660011490503861267d565b9050600160ff8260a01c161090612586565b95939491946126b461191d565b6040516020810160208152816126cd604082018561092d565b03916126e1601f1993848101835282610a50565b519020906040516127136020820192826127078560409060208152600060208201520190565b03908101835282610a50565b5190201461278557612757612761946127526127669861274d61275c96612748611f218e6127438e5115156127e1565b610bfe565b612982565b612a63565b612b46565b612c29565b613d39565b613eaf565b60018060a01b0316600080516020615c5d8339815191526000604051a2565b5050505050505050608460405162461bcd60e51b815260206004820152602760248201527f53656d616e7469635342543a20736368656d61205552492063616e6e6f7420626044820152666520656d70747960c81b6064820152fd5b156127e857565b5060405162461bcd60e51b815260206004820152602760248201527f53656d616e7469635342543a207072656469636174652063616e206e6f7420626044820152666520656d70747960c81b6064820152608490fd5b818110612849575050565b6000815560010161283e565b90601f8211612862575050565b610a9f91600c6000526020600020906020601f840160051c83019310612890575b601f0160051c019061283e565b9091508190612883565b90601f82116128a7575050565b610a9f9160016000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b90601f82116128e1575050565b610a9f9160026000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b90601f821161291b575050565b610a9f91600d6000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b9190601f811161295757505050565b610a9f926000526020600020906020601f840160051c8301931061289057601f0160051c019061283e565b80519091906001600160401b038111612a56575b6001906129ac816129a784546110cf565b61289a565b602080601f83116001146129e75750819293946000926129dc575b5050600019600383901b1c191690821b179055565b0151905038806129c7565b6001600052601f19831695909190600080516020615cbd833981519152926000905b888210612a3f5750508385969710612a26575b505050811b019055565b015160001960f88460031b161c19169055388080612a1c565b808785968294968601518155019501930190612a09565b612a5e6109db565b612996565b80519091906001600160401b038111612b39575b612a8b81612a866002546110cf565b6128d4565b602080601f8311600114612ac75750819293600092612abc575b50508160011b916000199060031b1c191617600255565b015190503880612aa5565b6002600052601f19831694909190600080516020615bbd833981519152926000905b878210612b21575050836001959610612b08575b505050811b01600255565b015160001960f88460031b161c19169055388080612afd565b80600185968294968601518155019501930190612ae9565b612b416109db565b612a77565b80519091906001600160401b038111612c1c575b612b6e81612b69600c546110cf565b612855565b602080601f8311600114612baa5750819293600092612b9f575b50508160011b916000199060031b1c191617600c55565b015190503880612b88565b600c600052601f19831694909190600080516020615bdd833981519152926000905b878210612c04575050836001959610612beb575b505050811b01600c55565b015160001960f88460031b161c19169055388080612be0565b80600185968294968601518155019501930190612bcc565b612c246109db565b612b5a565b80519091906001600160401b038111612cff575b612c5181612c4c600d546110cf565b61290e565b602080601f8311600114612c8d5750819293600092612c82575b50508160011b916000199060031b1c191617600d55565b015190503880612c6b565b600d600052601f19831694909190600080516020615bfd833981519152926000905b878210612ce7575050836001959610612cce575b505050811b01600d55565b015160001960f88460031b161c19169055388080612cc3565b80600185968294968601518155019501930190612caf565b612d076109db565b612c3d565b81519192916001600160401b038111612dc1575b612d3481612d2e84546110cf565b84612948565b602080601f8311600114612d70575081929394600092612d65575b50508160011b916000199060031b1c1916179055565b015190503880612d4f565b90601f19831695612d8685600052602060002090565b926000905b888210612da957505083600195969710612a2657505050811b019055565b80600185968294968601518155019501930190612d8b565b612dc96109db565b612d20565b6020612de79181604051938285809451938492016108f8565b8101600e81520301902090565b6020612e0d9181604051938285809451938492016108f8565b8101601081520301902090565b602090612e349282604051948386809551938492016108f8565b82019081520301902090565b612e4990612dce565b5490565b80151580612ed7575b15612e915761088590600f54811015612e84575b600f600052600080516020615cfd83398151915201611338565b612e8c611b03565b612e6a565b505060405162461bcd60e51b815260206004820152601c60248201527b14d95b585b9d1a58d4d0950e8818db185cdcc81b9bdd08195e1a5cdd60221b6044820152606490fd5b50600f548110612e56565b612e4990612df4565b15612ef257565b50606460405162461bcd60e51b815260206004820152602060248201527f53656d616e7469635342543a20707265646963617465206e6f742065786973746044820152fd5b601154811015612f57575b601160005260206000209060011b0190600090565b612f5f611b03565b612f42565b600a54811015612f84575b600a60005260206000209060011b0190600090565b612f8c611b03565b612f6f565b601354811015612fb1575b601360005260206000209060011b0190600090565b612fb9611b03565b612f9c565b90604051612fcb816109f2565b60ff60018294612fda81611338565b84520154169060058210156118395760200152565b61300d6130139180151580613040575b61300890612eeb565b612f37565b50612fbe565b906020825192015160058110156130275790565b505050634e487b7160e01b600052602160045260246000fd5b506011548110612fff565b1561305257565b5060405162461bcd60e51b815260206004820152601b60248201527a14d95b585b9d1a58d4d0950e88191bd95cc81b9bdd08195e1a5cdd602a1b6044820152606490fd5b6130a26130b692612dce565b54600052600b602052604060002090612e1a565b5461088581151561304b565b908115158061311c575b6130d59061304b565b61088560016130f56130ef6130e986612f64565b50611338565b94612f64565b500154600f54811015612e8457600f600052600080516020615cfd83398151915201611338565b50600a5482106130cc565b600454811015613147575b600460005260206000209060021b0190600090565b61314f611b03565b613132565b9060405191828154918282526020928383019160005283600020936000905b82821061318957505050610a9f92500383610a50565b855484526001958601958895509381019390910190613173565b604051909190608081016001600160401b038111828210176131fe575b60405260606131f96003839560018060a01b038154168552600181015460208601526131ee60028201613154565b604086015201613154565b910152565b6132066109db565b6131c0565b61321481613b2a565b156132335761322e61322861088592613127565b506131a3565b613f93565b505060405162461bcd60e51b815260206004820152602760248201527f53656d616e7469635342543a2053656d616e74696353425420646f6573206e6f6044820152661d08195e1a5cdd60ca1b6064820152608490fd5b60045460018110611acf576000190190565b6132a461328a565b60035490818110611ae7570390565b9060006001918293600454945b8581106133265750505050505050608460405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152fd5b61332f81613127565b50546001600160a01b03838116911614613352575b61334d90611af3565b6132c0565b9282811461337f578461334d916001198111613372575b01939050613344565b61337a611a80565b613369565b50505091505090565b60006001908192600454935b8481106133f957505050505050608460405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a20746f6b656e20696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152fd5b61340281613127565b50546001600160a01b0316613420575b61341b90611af3565b613394565b9181811461344d578361341b916001198111613440575b01929050613412565b613448611a80565b613437565b505091505090565b6001600160a01b0316801561347557600052600560205260406000205490565b505060405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608490fd5b6134d881613b2a565b156134f4576134e690613127565b50546001600160a01b031690565b505060405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608490fd5b90613557906134cf565b6001600160a01b0390811691161490565b600c5460009291613578826110cf565b916001908181169081156135c9575060011461359357505050565b9091929350600c60005260209081600020906000915b8583106135b857505050500190565b8054858401529183019181016135a9565b60ff191683525050019150565b6000929181546135e5816110cf565b9260019180831690811561363e5750600114613602575b50505050565b90919293945060005260209081600020906000915b85831061362d57505050500190388080806135fc565b805485840152918301918101613617565b60ff19168452505050019150388080806135fc565b61365c81613b2a565b156136b55761366c600c546110cf565b156136ac5761088561368061369b926121f6565b61218160405193849261369560208501613568565b90611ffd565b64173539b7b760d91b815260050190565b506108856121b3565b505060405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608490fd5b9061371e816134cf565b6001600160a01b0381811690841681146137ce5733149081156137b4575b501561374b57610a9f9161558d565b505060405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776044820152771b995c881b9bdc88185c1c1c9bdd995908199bdc88185b1b60421b606482015260849150fd5b60ff91506137c6906103223391610bca565b54163861373c565b5050505050608460405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152fd5b61382a81613b2a565b1561384a576000908152600660205260409020546001600160a01b031690565b505060405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608490fd5b6001600160a01b038116919033831461390f576138d0903360005260076020526040600020610c32565b9015159060ff1981541660ff83161790556040519081527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3160203392a3565b50505050606460405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152fd5b1561395a57565b5060405162461bcd60e51b815260206004820152601e60248201527f53656d616e7469635342543a206d757374207472616e7366657261626c6500006044820152606490fd5b90610a9f92916139b460ff60095416613953565b6139c66139c18433613b6a565b6139cb565b615462565b156139d257565b5060405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608490fd5b9091613a909260ff6009541692613a4884613953565b60405193613a7390602086016001600160401b03811187821017613ab5575b60405260008652613953565b613a806139c18433613b6a565b613a8b838383615462565b615727565b15613a9757565b5060405162461bcd60e51b815280613ab160048201613ad7565b0390fd5b613abd6109db565b613a67565b90613a90939291613a7360ff60095416613953565b60809060208152603260208201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b60608201520190565b8015159081613b57575b81613b3d575090565b613b479150613127565b50546001600160a01b0316151590565b9050613b6161328a565b81111590613b34565b6001600160a01b0380613b7c846134cf565b169080831690828214948515613bbb575b5050508215613b9b57505090565b60ff925090613bb69160005260076020526040600020610c32565b541690565b613bc89192939550613821565b161491388080613b8d565b15613bda57565b5060405162461bcd60e51b815260206004820152602260248201527f53656d616e7469635342543a20436c6173732063616e6e6f7420626520656d70604482015261747960f01b6064820152608490fd5b15613c3257565b5060405162461bcd60e51b815260206004820152601a60248201527914d95b585b9d1a58d4d0950e88185b1c9958591e48185919195960321b6044820152606490fd5b600f54610a9f9190600160401b811015613cc1575b6001810180600f55811015613cb4575b600f600052600080516020615cfd83398151915201612d0c565b613cbc611b03565b613c9a565b613cc96109db565b613c8a565b601254610a9f9190600160401b811015613d2c575b6001810180601255811015613d1f575b60126000527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec344401612d0c565b613d27611b03565b613cf3565b613d346109db565b613ce3565b9060005b8251811015613de85780613d54613de39285611b59565b51613dad604080516020613da381830183613d6f8883610952565b0393613d83601f1995868101835282610a50565b519020935191820192826127078560409060208152600060208201520190565b5190201415613bd3565b613dc0613db982612dce565b5415613c2b565b613dc981613c75565b613ddd613dd7600f54611abf565b91612dce565b55611af3565b613d3d565b509050565b15613df457565b5060405162461bcd60e51b815260206004820152602660248201527f53656d616e7469635342543a207072656469636174652063616e6e6f7420626560448201526520656d70747960d01b6064820152608490fd5b60206001613e6a6011548260401b811015613ea2575b828101601155612f37565b613e95575b613e7a845182612d0c565b0191015160058110156130275760ff80198354169116179055565b613e9d6110b8565b613e6f565b613eaa6109db565b613e5f565b9060005b8251811015613de85780613eca613f1f9285611b59565b51613ef48151604090815190613eea60209183613d6f8482019283610952565b5190201415613ded565b613f01613db98251612df4565b613f0a81613e49565b613ddd613f18601154611abf565b9151612df4565b613eb3565b6020610a9f919392936040519481613f4587935180928680870191016108f8565b8201612058825180938680850191016108f8565b60405190613f66826109f2565b60018252603b60f81b6020830152565b60405190613f83826109f2565b60018252601760f91b6020830152565b613f9c8161425d565b91600080935b60408401805180518710156141825791614035916020613fd161300d613fcb8b61403b98611b59565b51612f37565b018051613fdd816117f3565b613fe6816117f3565b61404957509061401d614026916140176140018b8651611b59565b516140108c60608d0151611b59565b5190614316565b90613f24565b915b5151611abf565b87141561404157614017613f76565b94611af3565b93613fa2565b614017613f59565b8051614054816117f3565b61405d816117f3565b600114156140985750906140926140269161401761407c8b8651611b59565b5161408b8c60608d0151611b59565b519061434b565b9161401f565b80516140a3816117f3565b6140ac816117f3565b600214156140e1575090614092614026916140176140cb8b8651611b59565b516140da8c60608d0151611b59565b51906143c0565b80516140ec816117f3565b6140f5816117f3565b6003141561412a575090614092614026916140176141148b8651611b59565b516141238c60608d0151611b59565b519061442e565b51614134816117f3565b61413d816117f3565b60041461414e575b6140269061401f565b9061417a614026916140176141648b8651611b59565b516141738c60608d0151611b59565b5190614556565b919050614145565b50509350509050565b60405190614198826109f2565b600482526314dbdd5b60e21b6020830152565b604051906141b8826109f2565b60018252601d60f91b6020830152565b604051906141d5826109f2565b60018252605f60f81b6020830152565b604051906141f2826109f2565b60018252600160fd1b6020830152565b919493610a9f9360405196879385516142238160209889808a0191016108f8565b8501614237825180938980850191016108f8565b0161424a825180938880850191016108f8565b01612045825180938780850191016108f8565b6020810180516108859290600090806142c957505061427a61418b565b915b5190816142b7575161429791506001600160a01b03166122bf565b61429f6141ab565b916142a86141c8565b906142b16141e5565b93614202565b506130e96142c491612f64565b614297565b60206142e592600f548310156142eb575b600f81522001611338565b9161427c565b6142f3611b03565b6142da565b60405190614305826109f2565b6002825261381d60f11b6020830152565b9061433c61216061432c61300d61088595612f37565b6143346142f8565b905190613f24565b906143456141e5565b90612010565b9061435e61432c61300d61088594612f37565b906012548110156143b3575b6012600052602060002001906143ab60016040518094614399601160f91b9182602085015260218401906135d6565b90815203601e19810185520183610a50565b6143456141e5565b6143bb611b03565b61436a565b906143d361432c61300d61088594612f37565b6143ab6143de6141ab565b6143e661418b565b6144006143f16141c8565b956001600160a01b03166122bf565b604051958692845161441a816020978880890191016108f8565b840161424a825180938880850191016108f8565b9061443e61300d61088593612f37565b906143ab600161444d83612f64565b500154600f548110156144f1575b600f6000526144e361447f6144766020938460002001611338565b956143346142f8565b936144886141ab565b9261449a6144946141c8565b92612f64565b509160405197856144b48a9751809286808b0191016108f8565b86016144c8825180938680850191016108f8565b016144db825180938580850191016108f8565b0101906135d6565b03601f198101845283610a50565b6144f9611b03565b61445b565b6040519061450b826109f2565b6002825261203b60f01b6020830152565b60405190614529826109f2565b60018252605b60f81b6020830152565b60405190614546826109f2565b60018252605d60f81b6020830152565b9061456961432c61300d61459294612f37565b9061458561457f61457983612f91565b50613154565b91612f91565b5060019384809201613154565b9161459b6121b3565b926000925b6145c6575b50505061088592506145b56141e5565b6145bd61451c565b906142b1614539565b909192825184101561470e57859060206145e661300d613fcb8888611b59565b0180516145f2816117f3565b6145fb816117f3565b614658575061461c906140176146118787611b59565b516140108887611b59565b935b6146288451611abf565b8110614640575b61463890611af3565b9291906145a0565b93614650614638916140176144fe565b94905061462f565b8051614663816117f3565b61466c816117f3565b8314156146965750614690906140176146858787611b59565b5161408b8887611b59565b9361461e565b80516146a1816117f3565b6146aa816117f3565b600214156146cf5750614690906140176146c48787611b59565b516140da8887611b59565b949094516146dc816117f3565b6146e5816117f3565b6003146146f15761461e565b93614690906140176147038787611b59565b516141238887611b59565b926145a5565b1561471b57565b5060405162461bcd60e51b815260206004820152602560248201527f53656d616e7469635342543a206d696e7420746f20746865207a65726f206164604482015264647265737360d81b6064820152608490fd5b1561477657565b5060405162461bcd60e51b815260206004820152601860248201527729b2b6b0b73a34b1a9a12a1d103830b930b69032b93937b960411b6044820152606490fd5b815191600160401b8311614826575b8154838355808410614808575b50602080910191600052806000206000925b8484106147f3575050505050565b600183828293518555019201930192906147e5565b6148209083600052846020600020918201910161283e565b386147d3565b61482e6109db565b6147c6565b600454600160401b919082811015614917575b614857600191828101600455613127565b93909361490a575b8251614874906001600160a01b031685611a15565b60208084015183860155600285019080604086015180519485116148fd575b83548585558086106148e0575b500191600052806000206000925b8484106148cd575050505050509060036060610a9f93015191016147b7565b80518255928501929085019082016148ae565b6148f790856000528684600020918201910161283e565b386148a0565b6149056109db565b614893565b6149126110b8565b61485f565b61491f6109db565b614846565b1561492b57565b5060405162461bcd60e51b815260206004820152603760248201527f53656d616e7469635342543a207472616e7366657220746f206e6f6e204552436044820152761b9918a932b1b2b4bb32b91034b6b83632b6b2b73a32b960491b6064820152608490fd5b939492936001600160a01b03811693909291906149af851515614714565b600a5415156149bd9061476f565b6004549687966149cb611a34565b6149d3611a34565b6149db610aa1565b6001600160a01b038a168152916000602084015260408301526060820152614a0290614833565b614a0b88613127565b5060020194614a1989613127565b5060030194614a29908688614b43565b614a34908587614c13565b614a3f908486614ca9565b614a4a908385614d3c565b614a549183614ec1565b541515614a609061476f565b614a6981610c18565b8054614a7490611a97565b905582614a7f6121b3565b90614a8992615672565b614a9290614924565b8181604051600080516020615c9d83398151915260008092a4614ab482613127565b50614abe906131a3565b614ac790613f93565b604051803392614ad79082610952565b037f6ca139c4cce2c6dfdd350d203c7ac907df3bdc839acb0c9f1d59d01950aaaead91a490565b805490600160401b821015614b36575b60018201808255821015614b29575b60005260206000200155565b614b31611b03565b614b1d565b614b3e6109db565b614b0e565b929190600091825b8151811015614c0b57614b5e8183611b59565b519060ff6001614b7a8451801515806130405761300890612eeb565b500154166005811015614bef57614bac57611c19602083614b9f614ba795518b614afe565b015185614afe565b614b4b565b50505050505050608460405162461bcd60e51b81526020600482015260216024820152600080516020615c3d8339815191526044820152603960f91b6064820152fd5b5050634e487b7160e01b84525050602160045250602492509050fd5b505050509050565b909291600090815b8151811015614c0b57614c2e8183611b59565b5190614c468251801515806130405761300890612eeb565b5060ff600180920154166005811015614c8c571415614bac57611c19614c8792614c8160125491614c7a6020820151613cce565b5188614afe565b88614afe565b614c1b565b5050634e487b7160e01b8452505060216004525060249350915050fd5b90929192600093845b8151811015614c0b57614cc58183611b59565b519060ff6001614ce18451801515806130405761300890612eeb565b500154166005811015614d205760021415614bac57611c1982614d08614d1b945188614afe565b602001516001600160a01b031685614afe565b614cb2565b5050634e487b7160e01b86525050602160045250602492915050fd5b90929160005b8151811015614df157614d558183611b59565b51614d608151614f85565b6020908181019182518015159081614de5575b5015614d995750614d949291614d8d611c19925187614afe565b5187614afe565b614d42565b95505050505050606491506040519062461bcd60e51b82526004820152601e60248201527f53656d616e7469635342543a207375626a656374206e6f7420657869737400006044820152fd5b9050600a541138614d73565b5050509050565b90601354600160401b9081811015614eb4575b614e1c600191828101601355612f91565b929092614ea7575b8451908151908111614e9a575b8354818555808210614e7c575b50602080920184600052826000206000915b838310614e695750505050610a9f9394015191016147b7565b8051825591850191908501908401614e50565b614e949085600052826020600020918201910161283e565b38614e3e565b614ea26109db565b614e31565b614eaf6110b8565b614e24565b614ebc6109db565b614e0b565b929160005b8151811015614df15780611c19614ee0614f809385611b59565b51614eef815160115411612eeb565b614f7a60135491614f73614f01611a34565b614f24614f0c611a34565b91614f15610a92565b90815260209283820152614df8565b614f2d85612f91565b5090614f4a6001614f3d88612f91565b5001918501518284614b43565b614f5960408501518284614c13565b614f6860608501518284614ca9565b608084015191614d3c565b5189614afe565b85614afe565b614ec6565b6001614f9e60ff92801515806130405761300890612eeb565b500154166005811015614ff35760031415614fb557565b5060405162461bcd60e51b81526020600482015260216024820152600080516020615c3d8339815191526044820152603960f91b6064820152608490fd5b5050634e487b7160e01b600052602160045260246000fd5b6001604092615032600091338352600860205261502d60ff8785205416611c54565b612dce565b549061503f82151561476f565b818152600b602052615056613db986832086612e1a565b61506e600a54958284889452600b6020522085612e1a565b556040519261507c846109f2565b8352602083019081528160401b8410156150c6575b818401600a556150b26150a385612f64565b9490946150b9575b5184612d0c565b5191015590565b6150c16110b8565b6150ab565b6150ce6109db565b615091565b92919094939533600052600860205260406000205460ff166150f490611c54565b6001600160a01b0384169461510a861515614714565b600a5487106151189061476f565b600454978897615126611a34565b61512e611a34565b90615137610aa1565b6001600160a01b038b16815292602084015260408301526060820152614a0290614833565b33600052600860205261517660ff60406000205416611c54565b6151886151838333613b6a565b61523f565b615191826134cf565b6001600160a01b0380831692916151aa911683146152a1565b6151d96151bc61322e61322886613127565b916151c685615549565b6151d1600354611af3565b600355610c18565b6151e38154611abf565b90556151ee83613127565b5080546001600160a01b0319169055604051600080516020615c1d8339815191529084600085600080516020615c9d8339815191528285a4602081528061523a3394602083019061092d565b0390a4565b1561524657565b5060405162461bcd60e51b815260206004820152602c60248201527f53656d616e7469635342543a2063616c6c6572206973206e6f7420617070726f60448201526b3b32b21037b91037bbb732b960a11b6064820152608490fd5b156152a857565b5060405162461bcd60e51b815260206004820152601660248201527529b2b6b0b73a34b1a9a12a1d103737ba1037bbb732b960511b6044820152606490fd5b9091600091338352600860205260409161530660ff8486205416611c54565b61531a61531582600354611ab3565b600355565b61532382610c18565b61532e828254611adc565b9055835b81811061534157505050505050565b806153506153ec9284896153f1565b3561535e6151838233613b6a565b61537061536b828761354d565b6152a1565b61537f61322e61322883613127565b61538882615549565b6153a561539483613127565b5080546001600160a01b0319169055565b86516001600160a01b0387169190600080516020615c1d83398151915290848b85600080516020615c9d8339815191528285a4806153e4339482610952565b0390a4611af3565b615332565b91908110156154015760051b0190565b610cad611b03565b1561541057565b5060405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608490fd5b9061546c836134cf565b6001600160a01b0383811692909182168314156154ed576154a66154b792821694615498861515615409565b6154a187615549565b610c18565b6154b08154611abf565b9055610c18565b6154c18154611a97565b90556154d6826154d085613127565b50611a15565b600080516020615c9d8339815191526000604051a4565b505050505050608460405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152fd5b600081815260066020526040812080546001600160a01b03191690556001600160a01b03615576836134cf565b16600080516020615cdd83398151915282604051a4565b8160005260066020526155a4816040600020611a15565b6001600160a01b03806155b6846134cf565b16911690600080516020615cdd8339815191526000604051a4565b908160209103126108e357516108858161085a565b610885939260809260018060a01b03168252600060208301526040820152816060820152019061092d565b6001600160a01b0391821681529116602082015260408101919091526080606082018190526108859291019061092d565b3d1561566d573d9061565382610ac0565b916156616040519384610a50565b82523d6000602084013e565b606090565b919091803b61568357505050600190565b6156ab602091600093604051948580948193630a85bd0160e11b998a845233600485016155e6565b03926001600160a01b03165af160009181615707575b506156f9575050506156d1615642565b805190816156f457505060405162461bcd60e51b815280613ab160048201613ad7565b602001fd5b6001600160e01b0319161490565b6157209192506157173d82610a50565b3d8101906155d1565b90386156c1565b92919091823b61573a5750505050600190565b6156ab926020926000604051809681958294630a85bd0160e11b9a8b85523360048601615611565b919061576c61191d565b6001600160401b03811161582f575b61578a81612b69600c546110cf565b6000601f82116001146157c3578192936000926157b85750508160011b916000199060031b1c191617600c55565b013590503880612b88565b600c600052601f19821693600080516020615bdd83398151915291805b86811061581757508360019596106157fd57505050811b01600c55565b0135600019600384901b60f8161c19169055388080612be0565b909260206001819286860135815501940191016157e0565b6158376109db565b61577b565b61584461191d565b60ff8019600954169115151617600955565b919061586061191d565b6001600160401b038111615920575b600190615880816129a784546110cf565b6000601f82116001146158b857819293946000926158ad575050600019600383901b1c191690821b179055565b0135905038806129c7565b6001600052601f19821694600080516020615cbd83398151915291805b87811061590a575083859697106158f057505050811b019055565b0135600019600384901b60f8161c19169055388080612a1c565b82820135845592850192602091820191016158d5565b6159286109db565b61586f565b919061593761191d565b6001600160401b0381116159fa575b61595581612a866002546110cf565b6000601f821160011461598e578192936000926159835750508160011b916000199060031b1c191617600255565b013590503880612aa5565b6002600052601f19821693600080516020615bbd83398151915291805b8681106159e257508360019596106159c857505050811b01600255565b0135600019600384901b60f8161c19169055388080612afd565b909260206001819286860135815501940191016159ab565b615a026109db565b615946565b615a0f61191d565b6001600160a01b038116908115615aa65760ff615a2b82610bfe565b5416615a5457611f21615a3d91610bfe565b600080516020615c5d8339815191526000604051a2565b505060405162461bcd60e51b815260206004820152602160248201527f53656d616e7469635342543a206d696e74657220616c726561647920616464656044820152601960fa1b606482015260849150fd5b505060405162461bcd60e51b815260206004820152602c60248201527f53656d616e7469635342543a206d696e746572206d757374206e6f742062652060448201526b6e756c6c206164647265737360a01b606482015260849150fd5b615b0b61191d565b6001600160a01b03811660008181526008602052604090205490919060ff1615615b6957615b3890610bfe565b60ff1981541690557f7df677640dd30a79584f8ecea06aeea15d215b861c5d3b5f8c26962d691f820e6000604051a2565b505060405162461bcd60e51b815260206004820152602260248201527f53656d616e7469635342543a206d696e74657220646f6573206e6f74206578696044820152611cdd60f21b606482015260849150fdfe405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acedf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7d7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb58ea074c4be03960be214c047b695cecdc52be7382eee092c135d1726fabfc44453656d616e7469635342543a207072656469636174652074797065206572726f3a159411d00fa06a3ec11d4578931f1b7f877cceadb1e083929d74ec020cb2438be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf68c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802a364697066735822122069132b817d5aea5a5883e13fe40c2757b9efa9f1ea6a771163c2f2a99b91adf46c6578706572696d656e74616cf564736f6c634300080c0041
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.