Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 18827532 | 193 days ago | IN | Create: NextGenCore | 0 ETH | 0.35709574 |
Loading...
Loading
Contract Name:
NextGenCore
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT /** * * @title: NextGen 6529 - Core Contract * @date: 20-December-2023 * @version: 10.29 * @author: 6529 team */ pragma solidity ^0.8.19; import "./ERC721Enumerable.sol"; import "./Strings.sol"; import "./Base64.sol"; import "./IRandomizer.sol"; import "./INextGenAdmins.sol"; import "./IMinterContract.sol"; import "./ERC2981.sol"; contract NextGenCore is ERC721Enumerable, ERC2981 { using Strings for uint256; // declare variables uint256 public newCollectionIndex; // struct that holds a collection's info struct collectionInfoStructure { string collectionName; string collectionArtist; string collectionDescription; string collectionWebsite; string collectionLicense; string collectionBaseURI; string collectionLibrary; string[] collectionScript; } // mapping of collectionInfo struct mapping (uint256 => collectionInfoStructure) private collectionInfo; // struct that holds a collection's additional data struct collectionAdditonalDataStructure { address collectionArtistAddress; uint256 maxCollectionPurchases; uint256 collectionCirculationSupply; uint256 collectionTotalSupply; uint256 reservedMinTokensIndex; uint256 reservedMaxTokensIndex; uint setFinalSupplyTimeAfterMint; address randomizerContract; IRandomizer randomizer; } // mapping of collectionAdditionalData struct mapping (uint256 => collectionAdditonalDataStructure) private collectionAdditionalData; // checks if a collection was created mapping (uint256 => bool) private isCollectionCreated; // checks if data on a collection were added mapping (uint256 => bool) private wereDataAdded; // maps tokends ids with collectionsids mapping (uint256 => uint256) private tokenIdsToCollectionIds; // stores the token hash generated by randomizer contracts mapping(uint256 => bytes32) private tokenToHash; // amount of minted tokens per address per collection during public sale mapping (uint256 => mapping (address => uint256)) private tokensMintedPerAddress; // amount of minted tokens per address per collection during allowlist mapping (uint256 => mapping (address => uint256)) private tokensMintedAllowlistAddress; // amount of tokens airdropped per address per collection mapping (uint256 => mapping (address => uint256)) private tokensAirdropPerAddress; // amount of burnt tokens per collection mapping (uint256 => uint256) public burnAmount; // metadata view (offchain/onchain) mapping (uint256 => bool) public onchainMetadata; // artist signature per collection mapping (uint256 => string) public artistsSignatures; // additional metadata per token mapping (uint256 => string) public tokenData; // on-chain image URI and attributes per token mapping (uint256 => string[2]) private tokenImageAndAttributes; // collection lock status (status cannot revert) mapping (uint256 => bool) private collectionFreeze; // checks if an artist signed its collection mapping (uint256 => bool) public artistSigned; // external contracts declaration INextGenAdmins private adminsContract; address public minterContract; // constructor constructor(string memory name, string memory symbol, address _adminsContract) ERC721(name, symbol) { adminsContract = INextGenAdmins(_adminsContract); newCollectionIndex = newCollectionIndex + 1; _setDefaultRoyalty(0xC8ed02aFEBD9aCB14c33B5330c803feacAF01377, 690); } // certain functions can only be called by a global or function admin modifier FunctionAdminRequired(bytes4 _selector) { require(adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true , "Not allowed"); _; } // certain functions can only be called by a collection, global or function admin modifier CollectionAdminRequired(uint256 _collectionID, bytes4 _selector) { require(adminsContract.retrieveCollectionAdmin(msg.sender,_collectionID) == true || adminsContract.retrieveFunctionAdmin(msg.sender, _selector) == true || adminsContract.retrieveGlobalAdmin(msg.sender) == true, "Not allowed"); _; } // function to create a Collection function createCollection(string memory _collectionName, string memory _collectionArtist, string memory _collectionDescription, string memory _collectionWebsite, string memory _collectionLicense, string memory _collectionBaseURI, string memory _collectionLibrary, string[] memory _collectionScript) public FunctionAdminRequired(this.createCollection.selector) { collectionInfo[newCollectionIndex].collectionName = _collectionName; collectionInfo[newCollectionIndex].collectionArtist = _collectionArtist; collectionInfo[newCollectionIndex].collectionDescription = _collectionDescription; collectionInfo[newCollectionIndex].collectionWebsite = _collectionWebsite; collectionInfo[newCollectionIndex].collectionLicense = _collectionLicense; collectionInfo[newCollectionIndex].collectionBaseURI = _collectionBaseURI; collectionInfo[newCollectionIndex].collectionLibrary = _collectionLibrary; collectionInfo[newCollectionIndex].collectionScript = _collectionScript; isCollectionCreated[newCollectionIndex] = true; newCollectionIndex = newCollectionIndex + 1; } // function to add/modify the additional data of a collection // once a collection is created and total supply is set it cannot change function setCollectionData(uint256 _collectionID, address _collectionArtistAddress, uint256 _maxCollectionPurchases, uint256 _collectionTotalSupply, uint _setFinalSupplyTimeAfterMint) public CollectionAdminRequired(_collectionID, this.setCollectionData.selector) { require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false) && (_collectionTotalSupply <= 10000000000), "err/freezed"); if (collectionAdditionalData[_collectionID].collectionTotalSupply == 0) { collectionAdditionalData[_collectionID].collectionArtistAddress = _collectionArtistAddress; collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases; collectionAdditionalData[_collectionID].collectionCirculationSupply = 0; collectionAdditionalData[_collectionID].collectionTotalSupply = _collectionTotalSupply; collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint; collectionAdditionalData[_collectionID].reservedMinTokensIndex = (_collectionID * 10000000000); collectionAdditionalData[_collectionID].reservedMaxTokensIndex = (_collectionID * 10000000000) + _collectionTotalSupply - 1; wereDataAdded[_collectionID] = true; } else if (artistSigned[_collectionID] == false) { collectionAdditionalData[_collectionID].collectionArtistAddress = _collectionArtistAddress; collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases; collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint; } else { collectionAdditionalData[_collectionID].maxCollectionPurchases = _maxCollectionPurchases; collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint = _setFinalSupplyTimeAfterMint; } } // set a randomizer contract on a collection function addRandomizer(uint256 _collectionID, address _randomizerContract) public FunctionAdminRequired(this.addRandomizer.selector) { require(IRandomizer(_randomizerContract).isRandomizerContract() == true, "Contract is not Randomizer"); collectionAdditionalData[_collectionID].randomizerContract = _randomizerContract; collectionAdditionalData[_collectionID].randomizer = IRandomizer(_randomizerContract); } // airdrop (function is called from minter contract) function airDropTokens(uint256 mintIndex, address _recipient, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID) external { require(msg.sender == minterContract, "Caller is not the Minter Contract"); collectionAdditionalData[_collectionID].collectionCirculationSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply + 1; if (collectionAdditionalData[_collectionID].collectionTotalSupply >= collectionAdditionalData[_collectionID].collectionCirculationSupply) { tokensAirdropPerAddress[_collectionID][_recipient] = tokensAirdropPerAddress[_collectionID][_recipient] + 1; _mintProcessing(mintIndex, _recipient, _tokenData, _collectionID, _saltfun_o); } else { revert("Supply reached"); } } // mint (function is called from minter contract) function mint(uint256 mintIndex, address _mintingAddress , address _mintTo, string memory _tokenData, uint256 _saltfun_o, uint256 _collectionID, uint256 phase) external { require(msg.sender == minterContract, "Caller is not the Minter Contract"); collectionAdditionalData[_collectionID].collectionCirculationSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply + 1; if (collectionAdditionalData[_collectionID].collectionTotalSupply >= collectionAdditionalData[_collectionID].collectionCirculationSupply) { if (phase == 1) { tokensMintedAllowlistAddress[_collectionID][_mintingAddress] = tokensMintedAllowlistAddress[_collectionID][_mintingAddress] + 1; } else { tokensMintedPerAddress[_collectionID][_mintingAddress] = tokensMintedPerAddress[_collectionID][_mintingAddress] + 1; } _mintProcessing(mintIndex, _mintTo, _tokenData, _collectionID, _saltfun_o); } else { revert("Supply reached"); } } // burn function function burn(uint256 _collectionID, uint256 _tokenId) public { require(_isApprovedOrOwner(_msgSender(), _tokenId), "ERC721: caller is not token owner or approved"); require ((_tokenId >= collectionAdditionalData[_collectionID].reservedMinTokensIndex) && (_tokenId <= collectionAdditionalData[_collectionID].reservedMaxTokensIndex), "id err"); _burn(_tokenId); burnAmount[_collectionID] = burnAmount[_collectionID] + 1; } // burn to mint (function is called from minter contract) function burnToMint(uint256 mintIndex, uint256 _burnCollectionID, uint256 _tokenId, uint256 _mintCollectionID, uint256 _saltfun_o, address burner) external { require(msg.sender == minterContract, "Caller is not the Minter Contract"); require(_isApprovedOrOwner(burner, _tokenId), "ERC721: caller is not token owner or approved"); collectionAdditionalData[_mintCollectionID].collectionCirculationSupply = collectionAdditionalData[_mintCollectionID].collectionCirculationSupply + 1; if (collectionAdditionalData[_mintCollectionID].collectionTotalSupply >= collectionAdditionalData[_mintCollectionID].collectionCirculationSupply) { address owner = ownerOf(_tokenId); _burn(_tokenId); burnAmount[_burnCollectionID] = burnAmount[_burnCollectionID] + 1; tokensMintedPerAddress[_mintCollectionID][owner] = tokensMintedPerAddress[_mintCollectionID][owner] + 1; _mintProcessing(mintIndex, owner, tokenData[_tokenId], _mintCollectionID, _saltfun_o); } else { revert("Supply reached"); } } // mint processing function _mintProcessing(uint256 _mintIndex, address _recipient, string memory _tokenData, uint256 _collectionID, uint256 _saltfun_o) internal { tokenData[_mintIndex] = _tokenData; tokenIdsToCollectionIds[_mintIndex] = _collectionID; _safeMint(_recipient, _mintIndex); collectionAdditionalData[_collectionID].randomizer.calculateTokenHash(_collectionID, _mintIndex, _saltfun_o); } // Additional setter functions // function to update a collection's info function updateCollectionInfo(uint256 _collectionID, string memory _newCollectionName, string memory _newCollectionArtist, string memory _newCollectionDescription, string memory _newCollectionWebsite, string memory _newCollectionLicense, string memory _newCollectionBaseURI, string memory _newCollectionLibrary, uint256 _index, string[] memory _newCollectionScript) public CollectionAdminRequired(_collectionID, this.updateCollectionInfo.selector) { require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false), "Not allowed"); if (_index == 1000000) { collectionInfo[_collectionID].collectionName = _newCollectionName; collectionInfo[_collectionID].collectionArtist = _newCollectionArtist; collectionInfo[_collectionID].collectionDescription = _newCollectionDescription; collectionInfo[_collectionID].collectionWebsite = _newCollectionWebsite; collectionInfo[_collectionID].collectionLicense = _newCollectionLicense; collectionInfo[_collectionID].collectionLibrary = _newCollectionLibrary; collectionInfo[_collectionID].collectionScript = _newCollectionScript; } else if (_index == 999999) { collectionInfo[_collectionID].collectionBaseURI = _newCollectionBaseURI; } else { collectionInfo[_collectionID].collectionScript[_index] = _newCollectionScript[0]; } } // function that is used by artists for signing function artistSignature(uint256 _collectionID, string memory _signature) public { require(msg.sender == collectionAdditionalData[_collectionID].collectionArtistAddress, "Not artist"); require(artistSigned[_collectionID] == false, "Signed"); require(bytes(_signature).length > 0); artistsSignatures[_collectionID] = _signature; artistSigned[_collectionID] = true; } // function to change the metadata view of a collection function changeMetadataView(uint256 _collectionID, bool _status) public CollectionAdminRequired(_collectionID, this.changeMetadataView.selector) { require((isCollectionCreated[_collectionID] == true) && (collectionFreeze[_collectionID] == false), "Not allowed"); onchainMetadata[_collectionID] = _status; } // function to change the token data of a token function changeTokenData(uint256 _tokenId, string memory newData) public FunctionAdminRequired(this.changeTokenData.selector) { require(collectionFreeze[tokenIdsToCollectionIds[_tokenId]] == false, "Data frozen"); _requireMinted(_tokenId); tokenData[_tokenId] = newData; } // function to store onchain an imageURI and attributes for a token function updateImagesAndAttributes(uint256[] memory _tokenId, string[] memory _images, string[] memory _attributes) public FunctionAdminRequired(this.updateImagesAndAttributes.selector) { require((_tokenId.length == _images.length) && (_images.length == _attributes.length) , "inv len"); for (uint256 x; x < _tokenId.length; x++) { require(collectionFreeze[tokenIdsToCollectionIds[_tokenId[x]]] == false, "Data frozen"); _requireMinted(_tokenId[x]); tokenImageAndAttributes[_tokenId[x]][0] = _images[x]; tokenImageAndAttributes[_tokenId[x]][1] = _attributes[x]; } } // function to lock collection, this action connot be reverted function freezeCollection(uint256 _collectionID) public FunctionAdminRequired(this.freezeCollection.selector) { require(block.timestamp > IMinterContract(minterContract).getEndTime(_collectionID) && IMinterContract(minterContract).getEndTime(_collectionID) != 0); require(wereDataAdded[_collectionID] == true, "No Data"); collectionFreeze[_collectionID] = true; } // function to set the tokenHash (this function is called only from randomizer contracts) function setTokenHash(uint256 _collectionID, uint256 _mintIndex, bytes32 _hash) external { require(msg.sender == collectionAdditionalData[_collectionID].randomizerContract); require(tokenToHash[_mintIndex] == 0x0000000000000000000000000000000000000000000000000000000000000000); tokenToHash[_mintIndex] = _hash; } // function to set final supply, this applies only for unminted collections and will adjust totalSupply = circulatingSupply function setFinalSupply(uint256 _collectionID) public FunctionAdminRequired(this.setFinalSupply.selector) { require (block.timestamp > IMinterContract(minterContract).getEndTime(_collectionID) + collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint, "Time has not passed"); collectionAdditionalData[_collectionID].collectionTotalSupply = collectionAdditionalData[_collectionID].collectionCirculationSupply; collectionAdditionalData[_collectionID].reservedMaxTokensIndex = (_collectionID * 10000000000) + collectionAdditionalData[_collectionID].collectionTotalSupply - 1; } // function to add a minter contract function addMinterContract(address _minterContract) public FunctionAdminRequired(this.addMinterContract.selector) { require(IMinterContract(_minterContract).isMinterContract() == true, "Contract is not Minter"); minterContract = _minterContract; } // function to update the admin contract function updateAdminContract(address _newadminsContract) public FunctionAdminRequired(this.updateAdminContract.selector) { require(INextGenAdmins(_newadminsContract).isAdminContract() == true, "Contract is not Admin"); adminsContract = INextGenAdmins(_newadminsContract); } // function to update default royalties function setDefaultRoyalties(address _royaltyAddress, uint96 _bps) public FunctionAdminRequired(this.setDefaultRoyalties.selector) { _setDefaultRoyalty(_royaltyAddress, _bps); } // Retrieve Functions // function that overrides supportInterface function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, ERC2981) returns (bool) { return super.supportsInterface(interfaceId); } // function that return the tokenURI function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); if (onchainMetadata[tokenIdsToCollectionIds[tokenId]] == false && tokenToHash[tokenId] != 0x0000000000000000000000000000000000000000000000000000000000000000) { string memory baseURI = collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionBaseURI; return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } else if (onchainMetadata[tokenIdsToCollectionIds[tokenId]] == false && tokenToHash[tokenId] == 0x0000000000000000000000000000000000000000000000000000000000000000) { string memory baseURI = collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionBaseURI; return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "pending")) : ""; } else { string memory b64 = Base64.encode(abi.encodePacked("<html><head></head><body><script src=\"",collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionLibrary,"\"></script><script>",retrieveGenerativeScript(tokenId),"</script></body></html>")); string memory _uri = string(abi.encodePacked("data:application/json;utf8,{\"name\":\"",getTokenName(tokenId),"\",\"description\":\"",collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionDescription,"\",\"image\":\"",tokenImageAndAttributes[tokenId][0],"\",\"attributes\":[",tokenImageAndAttributes[tokenId][1],"],\"animation_url\":\"data:text/html;base64,",b64,"\"}")); return _uri; } } // function to retrieve the name attribute function getTokenName(uint256 tokenId) private view returns(string memory) { uint256 tok = tokenId - collectionAdditionalData[tokenIdsToCollectionIds[tokenId]].reservedMinTokensIndex; return string(abi.encodePacked(collectionInfo[viewColIDforTokenID(tokenId)].collectionName, " #" ,tok.toString())); } // function to retrieve the collection freeze status function collectionFreezeStatus(uint256 _collectionID) public view returns(bool){ return collectionFreeze[_collectionID]; } // function to return the collection id given a token id function viewColIDforTokenID(uint256 _tokenid) public view returns (uint256) { return(tokenIdsToCollectionIds[_tokenid]); } // function to retrieve if data were added on a collection function retrievewereDataAdded(uint256 _collectionID) external view returns(bool){ return wereDataAdded[_collectionID]; } // function to return the min index id of a collection function viewTokensIndexMin(uint256 _collectionID) external view returns (uint256) { return(collectionAdditionalData[_collectionID].reservedMinTokensIndex); } // function to return the max index id of a collection function viewTokensIndexMax(uint256 _collectionID) external view returns (uint256) { return(collectionAdditionalData[_collectionID].reservedMaxTokensIndex); } // function to return the circ supply of a collection function viewCirSupply(uint256 _collectionID) external view returns (uint256) { return(collectionAdditionalData[_collectionID].collectionCirculationSupply); } // function to return max allowance per address during public sale function viewMaxAllowance(uint256 _collectionID) external view returns (uint256) { return(collectionAdditionalData[_collectionID].maxCollectionPurchases); } // function to return tokens minted per address during allowlist function retrieveTokensMintedALPerAddress(uint256 _collectionID, address _address) external view returns(uint256) { return (tokensMintedAllowlistAddress[_collectionID][_address]); } // function to return tokens minted per address during public function retrieveTokensMintedPublicPerAddress(uint256 _collectionID, address _address) external view returns(uint256) { return (tokensMintedPerAddress[_collectionID][_address]); } // function to retrieve the airdropped tokens per address function retrieveTokensAirdroppedPerAddress(uint256 _collectionID, address _address) public view returns(uint256) { return (tokensAirdropPerAddress[_collectionID][_address]); } // function to return the artist's address function retrieveArtistAddress(uint256 _collectionID) external view returns(address) { return (collectionAdditionalData[_collectionID].collectionArtistAddress); } // function to retrieve a collection's info function retrieveCollectionInfo(uint256 _collectionID) public view returns(string memory, string memory, string memory, string memory, string memory, string memory){ return (collectionInfo[_collectionID].collectionName, collectionInfo[_collectionID].collectionArtist, collectionInfo[_collectionID].collectionDescription, collectionInfo[_collectionID].collectionWebsite, collectionInfo[_collectionID].collectionLicense, collectionInfo[_collectionID].collectionBaseURI); } // function to retrieve the library and script of a collection function retrieveCollectionLibraryAndScript(uint256 _collectionID) public view returns(string memory, string[] memory){ return (collectionInfo[_collectionID].collectionLibrary, collectionInfo[_collectionID].collectionScript); } // function to retrieve the additional data of a Collection function retrieveCollectionAdditionalData(uint256 _collectionID) public view returns(address, uint256, uint256, uint256, uint, address){ return (collectionAdditionalData[_collectionID].collectionArtistAddress, collectionAdditionalData[_collectionID].maxCollectionPurchases, collectionAdditionalData[_collectionID].collectionCirculationSupply, collectionAdditionalData[_collectionID].collectionTotalSupply, collectionAdditionalData[_collectionID].setFinalSupplyTimeAfterMint, collectionAdditionalData[_collectionID].randomizerContract); } // function to retrieve the token hash function retrieveTokenHash(uint256 _tokenid) public view returns(bytes32){ return (tokenToHash[_tokenid]); } // function to retrieve the generative script of a token function retrieveGenerativeScript(uint256 tokenId) public view returns(string memory){ _requireMinted(tokenId); string memory scripttext; for (uint256 i=0; i < collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionScript.length; i++) { scripttext = string(abi.encodePacked(scripttext, collectionInfo[tokenIdsToCollectionIds[tokenId]].collectionScript[i])); } return string(abi.encodePacked("let hash='",Strings.toHexString(uint256(tokenToHash[tokenId]), 32),"';let tokenId=",tokenId.toString(),";let tokenData=[",tokenData[tokenId],"];", scripttext)); } // function to retrieve the supply of a collection function totalSupplyOfCollection(uint256 _collectionID) public view returns (uint256) { return (collectionAdditionalData[_collectionID].collectionCirculationSupply - burnAmount[_collectionID]); } // function to retrieve the token image uri and the attributes stored on-chain for a token id. function retrievetokenImageAndAttributes(uint256 _tokenId) public view returns(string memory, string memory) { return (tokenImageAndAttributes[_tokenId][0],tokenImageAndAttributes[_tokenId][1]); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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) (utils/Base64.sol) pragma solidity ^0.8.19; /** * @dev Provides a set of functions to operate with Base64 strings. * * _Available since v4.5._ */ library Base64 { /** * @dev Base64 Encoding/Decoding Table */ string internal constant _TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; /** * @dev Converts a `bytes` to its Bytes64 `string` representation. */ function encode(bytes memory data) internal pure returns (string memory) { /** * Inspired by Brecht Devos (Brechtpd) implementation - MIT licence * https://github.com/Brechtpd/base64/blob/e78d9fd951e7b0977ddca77d92dc85183770daf4/base64.sol */ if (data.length == 0) return ""; // Loads the table into memory string memory table = _TABLE; // Encoding takes 3 bytes chunks of binary data from `bytes` data parameter // and split into 4 numbers of 6 bits. // The final Base64 length should be `bytes` data length multiplied by 4/3 rounded up // - `data.length + 2` -> Round up // - `/ 3` -> Number of 3-bytes chunks // - `4 *` -> 4 characters for each chunk string memory result = new string(4 * ((data.length + 2) / 3)); /// @solidity memory-safe-assembly assembly { // Prepare the lookup table (skip the first "length" byte) let tablePtr := add(table, 1) // Prepare result pointer, jump over length let resultPtr := add(result, 32) // Run over the input, 3 bytes at a time for { let dataPtr := data let endPtr := add(data, mload(data)) } lt(dataPtr, endPtr) { } { // Advance 3 bytes dataPtr := add(dataPtr, 3) let input := mload(dataPtr) // To write each character, shift the 3 bytes (18 bits) chunk // 4 times in blocks of 6 bits for each character (18, 12, 6, 0) // and apply logical AND with 0x3F which is the number of // the previous character in the ASCII table prior to the Base64 Table // The result is then added to the table to get the character to write, // and finally write it in the result pointer but with a left shift // of 256 (1 byte) - 8 (1 ASCII char) = 248 bits mstore8(resultPtr, mload(add(tablePtr, and(shr(18, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(12, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(shr(6, input), 0x3F)))) resultPtr := add(resultPtr, 1) // Advance mstore8(resultPtr, mload(add(tablePtr, and(input, 0x3F)))) resultPtr := add(resultPtr, 1) // Advance } // When data `bytes` is not exactly 3 bytes long // it is padded with `=` characters at the end switch mod(mload(data), 3) case 1 { mstore8(sub(resultPtr, 1), 0x3d) mstore8(sub(resultPtr, 2), 0x3d) } case 2 { mstore8(sub(resultPtr, 1), 0x3d) } } return result; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @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. */ import "./IERC165.sol"; 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 (last updated v5.0.0) (token/common/ERC2981.sol) pragma solidity ^0.8.19; import "./IERC2981.sol"; import "./ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 tokenId => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev The default royalty set is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidDefaultRoyalty(uint256 numerator, uint256 denominator); /** * @dev The default royalty receiver is invalid. */ error ERC2981InvalidDefaultRoyaltyReceiver(address receiver); /** * @dev The royalty set for an specific `tokenId` is invalid (eg. (numerator / denominator) >= 1). */ error ERC2981InvalidTokenRoyalty(uint256 tokenId, uint256 numerator, uint256 denominator); /** * @dev The royalty receiver for `tokenId` is invalid. */ error ERC2981InvalidTokenRoyaltyReceiver(uint256 tokenId, address receiver); /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidDefaultRoyalty(feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidDefaultRoyaltyReceiver(address(0)); } _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { uint256 denominator = _feeDenominator(); if (feeNumerator > denominator) { // Royalty fee will exceed the sale price revert ERC2981InvalidTokenRoyalty(tokenId, feeNumerator, denominator); } if (receiver == address(0)) { revert ERC2981InvalidTokenRoyaltyReceiver(tokenId, address(0)); } _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ import "./Context.sol"; import "./ERC165.sol"; import "./IERC721.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Strings.sol"; import "./IERC721Receiver.sol"; contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _ownerOf(tokenId); require(owner != address(0), "ERC721: invalid token ID"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { _requireMinted(tokenId); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved"); _safeTransfer(from, to, tokenId, data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist */ function _ownerOf(uint256 tokenId) internal view virtual returns (address) { return _owners[tokenId]; } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _ownerOf(tokenId) != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint(address to, uint256 tokenId, bytes memory data) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, 1); // Check that tokenId was not minted by `_beforeTokenTransfer` hook require(!_exists(tokenId), "ERC721: token already minted"); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, 1); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * This is an internal function that does not check if the sender is authorized to operate on the token. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId, 1); // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook owner = ERC721.ownerOf(tokenId); // Clear approvals delete _tokenApprovals[tokenId]; unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, 1); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer(address from, address to, uint256 tokenId) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId, 1); // Check that tokenId was not transferred by `_beforeTokenTransfer` hook require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); // Clear approvals from the previous owner delete _tokenApprovals[tokenId]; unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, 1); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll(address owner, address operator, bool approved) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * - `batchSize` is non-zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {} /** * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override. * * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such * that `ownerOf(tokenId)` is `a`. */ // solhint-disable-next-line func-name-mixedcase function __unsafe_increaseBalance(address account, uint256 amount) internal { _balances[account] += amount; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ import "./ERC721.sol"; import "./IERC721Enumerable.sol"; abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev See {ERC721-_beforeTokenTransfer}. */ function _beforeTokenTransfer( address from, address to, uint256 firstTokenId, uint256 batchSize ) internal virtual override { super._beforeTokenTransfer(from, to, firstTokenId, batchSize); if (batchSize > 1) { // Will only trigger during construction. Batch transferring (minting) is not available afterwards. revert("ERC721Enumerable: consecutive transfers not supported"); } uint256 tokenId = firstTokenId; if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// 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 (last updated v5.0.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.19; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ import "./IERC165.sol"; 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * 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.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ import "./IERC721.sol"; 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 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ import "./IERC721.sol"; 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.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 pragma solidity ^0.8.19; interface IMinterContract { // retrieve if the contract is minter contract function isMinterContract() external view returns (bool); // retrieve the public end time of a sale function getEndTime(uint256 _collectionID) external view returns (uint); // retrieve auction end time function getAuctionEndTime(uint256 _tokenId) external view returns (uint); // retrieve auction status function getAuctionStatus(uint256 _tokenId) external view returns (bool); // retrieve primary addresses function retrievePrimaryAddressesAndPercentages(uint256 _collectionID) external view returns(address, address, address, uint256, uint256, uint256, bool); // retrieve secondary addresses function retrieveSecondaryAddressesAndPercentages(uint256 _collectionID) external view returns(address, address, address, uint256, uint256, uint256, bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; interface INextGenAdmins { // retrieve global admin function retrieveGlobalAdmin(address _address) external view returns(bool); // retrieve function admin function retrieveFunctionAdmin(address _address, bytes4 _selector) external view returns(bool); // retrieve collection admin function retrieveCollectionAdmin(address _address, uint256 _collectionID) external view returns(bool); // retrieve if the contract is admin contract function isAdminContract() external view returns (bool); // retrieve owner function owner() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.19; interface IRandomizer { // function that calculates the random hash and returns it to the gencore contract function calculateTokenHash(uint256 _collectionID, uint256 _mintIndex, uint256 _saltfun_o) external; // get randomizer contract status function isRandomizerContract() external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ import "./Math.sol"; import "./SignedMath.sol"; library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_adminsContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidDefaultRoyalty","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidDefaultRoyaltyReceiver","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"}],"name":"ERC2981InvalidTokenRoyalty","type":"error"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC2981InvalidTokenRoyaltyReceiver","type":"error"},{"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":"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":"_minterContract","type":"address"}],"name":"addMinterContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_randomizerContract","type":"address"}],"name":"addRandomizer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"address","name":"_recipient","type":"address"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"airDropTokens","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":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"string","name":"_signature","type":"string"}],"name":"artistSignature","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistSigned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"artistsSignatures","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"uint256","name":"_burnCollectionID","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_mintCollectionID","type":"uint256"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"address","name":"burner","type":"address"}],"name":"burnToMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"bool","name":"_status","type":"bool"}],"name":"changeMetadataView","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"newData","type":"string"}],"name":"changeTokenData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"collectionFreezeStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_collectionName","type":"string"},{"internalType":"string","name":"_collectionArtist","type":"string"},{"internalType":"string","name":"_collectionDescription","type":"string"},{"internalType":"string","name":"_collectionWebsite","type":"string"},{"internalType":"string","name":"_collectionLicense","type":"string"},{"internalType":"string","name":"_collectionBaseURI","type":"string"},{"internalType":"string","name":"_collectionLibrary","type":"string"},{"internalType":"string[]","name":"_collectionScript","type":"string[]"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"freezeCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintIndex","type":"uint256"},{"internalType":"address","name":"_mintingAddress","type":"address"},{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"string","name":"_tokenData","type":"string"},{"internalType":"uint256","name":"_saltfun_o","type":"uint256"},{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"phase","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newCollectionIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"onchainMetadata","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_collectionID","type":"uint256"}],"name":"retrieveArtistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionAdditionalData","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionInfo","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrieveCollectionLibraryAndScript","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"retrieveGenerativeScript","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenid","type":"uint256"}],"name":"retrieveTokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensAirdroppedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensMintedALPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"retrieveTokensMintedPublicPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"retrievetokenImageAndAttributes","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"retrievewereDataAdded","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"address","name":"_collectionArtistAddress","type":"address"},{"internalType":"uint256","name":"_maxCollectionPurchases","type":"uint256"},{"internalType":"uint256","name":"_collectionTotalSupply","type":"uint256"},{"internalType":"uint256","name":"_setFinalSupplyTimeAfterMint","type":"uint256"}],"name":"setCollectionData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyAddress","type":"address"},{"internalType":"uint96","name":"_bps","type":"uint96"}],"name":"setDefaultRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"setFinalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"uint256","name":"_mintIndex","type":"uint256"},{"internalType":"bytes32","name":"_hash","type":"bytes32"}],"name":"setTokenHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"_collectionID","type":"uint256"}],"name":"totalSupplyOfCollection","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":"_newadminsContract","type":"address"}],"name":"updateAdminContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"},{"internalType":"string","name":"_newCollectionName","type":"string"},{"internalType":"string","name":"_newCollectionArtist","type":"string"},{"internalType":"string","name":"_newCollectionDescription","type":"string"},{"internalType":"string","name":"_newCollectionWebsite","type":"string"},{"internalType":"string","name":"_newCollectionLicense","type":"string"},{"internalType":"string","name":"_newCollectionBaseURI","type":"string"},{"internalType":"string","name":"_newCollectionLibrary","type":"string"},{"internalType":"uint256","name":"_index","type":"uint256"},{"internalType":"string[]","name":"_newCollectionScript","type":"string[]"}],"name":"updateCollectionInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"},{"internalType":"string[]","name":"_images","type":"string[]"},{"internalType":"string[]","name":"_attributes","type":"string[]"}],"name":"updateImagesAndAttributes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewCirSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenid","type":"uint256"}],"name":"viewColIDforTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewMaxAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewTokensIndexMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_collectionID","type":"uint256"}],"name":"viewTokensIndexMin","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200635c3803806200635c83398101604081905262000034916200021f565b828260006200004483826200033b565b5060016200005382826200033b565b5050601d80546001600160a01b0319166001600160a01b03841617905550600c546200008190600162000407565b600c55620000a673c8ed02afebd9acb14c33b5330c803feacaf013776102b2620000af565b5050506200042f565b6127106001600160601b038216811015620000f457604051636f483d0960e01b81526001600160601b0383166004820152602481018290526044015b60405180910390fd5b6001600160a01b0383166200012057604051635b6cc80560e11b815260006004820152602401620000eb565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200018257600080fd5b81516001600160401b03808211156200019f576200019f6200015a565b604051601f8301601f19908116603f01168101908282118183101715620001ca57620001ca6200015a565b81604052838152602092508683858801011115620001e757600080fd5b600091505b838210156200020b5785820183015181830184015290820190620001ec565b600093810190920192909252949350505050565b6000806000606084860312156200023557600080fd5b83516001600160401b03808211156200024d57600080fd5b6200025b8783880162000170565b945060208601519150808211156200027257600080fd5b50620002818682870162000170565b604086015190935090506001600160a01b0381168114620002a157600080fd5b809150509250925092565b600181811c90821680620002c157607f821691505b602082108103620002e257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200033657600081815260208120601f850160051c81016020861015620003115750805b601f850160051c820191505b8181101562000332578281556001016200031d565b5050505b505050565b81516001600160401b038111156200035757620003576200015a565b6200036f81620003688454620002ac565b84620002e8565b602080601f831160018114620003a757600084156200038e5750858301515b600019600386901b1c1916600185901b17855562000332565b600085815260208120601f198616915b82811015620003d857888601518255948401946001909101908401620003b7565b5085821015620003f75787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200042957634e487b7160e01b600052601160045260246000fd5b92915050565b615f1d806200043f6000396000f3fe608060405234801561001057600080fd5b50600436106103245760003560e01c806392f00233116101a9578063cb6d67e0116100ef578063de00e1f71161009d578063de00e1f7146108af578063e943a2c7146108c2578063e985e9c5146108f8578063e9b7a8601461090b578063f18332dd1461092e578063f35c145214610941578063f6a85dd014610954578063fa92668a1461096757600080fd5b8063cb6d67e0146107d5578063cd02771a1461080b578063d09502711461081e578063d3322d5314610843578063d374100014610856578063d3d5492814610879578063d9a03e381461089c57600080fd5b8063ad24102011610157578063ad24102014610717578063af569fd41461072a578063b390c0ab1461074d578063b4b5b48f14610760578063b88d4fde14610773578063b990296814610786578063bcc405d0146107af578063c87b56dd146107c257600080fd5b806392f002331461066a578063945e549b1461067d57806394c14957146106a057806395d89b41146106d65780639a8490f3146106de5780639cac0f1f146106f1578063a22cb4651461070457600080fd5b806339143a1d1161026e578063663a3c001161021c578063663a3c00146105b15780636799a46a146105ba5780636c6aab16146105cd5780636fa13531146105f05780636fafdf831461060357806370a08231146106235780637b5dbac51461063657806380f8c8ab1461064957600080fd5b806339143a1d146104995780633d2bed8d146104ac57806342842e0e146104cd5780634ab6897c146104e05780634f6ccce7146105005780635c91d74a146105135780636352211e1461059e57600080fd5b806318160ddd116102d657806318160ddd146103e45780631aab8d69146103f657806323b872dd146104095780632a55205a1461041c5780632ed330f71461043d5780632f745c5914610460578063366b0ab214610473578063388d2c241461048657600080fd5b806301ffc9a71461032957806302de55d01461035157806306fdde0314610366578063074b55391461037b578063081812fc1461039e578063095ea7b3146103be57806316e7c899146103d1575b600080fd5b61033c610337366004614b85565b610987565b60405190151581526020015b60405180910390f35b61036461035f366004614d11565b610998565b005b61036e610bf0565b6040516103489190614ea0565b61033c610389366004614eb3565b60176020526000908152604090205460ff1681565b6103b16103ac366004614eb3565b610c82565b6040516103489190614ecc565b6103646103cc366004614ef7565b610ca9565b6103646103df366004614f21565b610dbe565b6008545b604051908152602001610348565b610364610404366004615075565b61110e565b6103646104173660046150a1565b61131a565b61042f61042a3660046150dd565b61134c565b6040516103489291906150ff565b61033c61044b366004614eb3565b6000908152601b602052604090205460ff1690565b6103e861046e366004614ef7565b6113f8565b610364610481366004614eb3565b61148e565b610364610494366004615118565b6116ce565b6103646104a7366004615133565b6118b4565b6104bf6104ba366004614eb3565b611ab7565b604051610348929190615184565b6103646104db3660046150a1565b611c3e565b6103e86104ee366004614eb3565b60009081526012602052604090205490565b6103e861050e366004614eb3565b611c59565b610562610521366004614eb3565b6000908152600e60205260409020805460018201546002830154600384015460068501546007909501546001600160a01b0394851696939592949193911690565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c001610348565b6103b16105ac366004614eb3565b611cec565b6103e8600c5481565b6103646105c83660046151f6565b611d21565b6103e86105db366004614eb3565b6000908152600e602052604090206005015490565b61036e6105fe366004614eb3565b611dff565b6103e8610611366004614eb3565b60166020526000908152604090205481565b6103e8610631366004615118565b611f06565b61036461064436600461523c565b611f8c565b61065c610657366004614eb3565b6122eb565b604051610348929190615282565b601e546103b1906001600160a01b031681565b6103e861068b366004614eb3565b6000908152600e602052604090206001015490565b6103e86106ae366004615075565b60009182526015602090815260408084206001600160a01b0393909316845291905290205490565b61036e612425565b6103646106ec3660046151f6565b612434565b6103646106ff3660046152b0565b6125af565b6103646107123660046152ea565b612601565b610364610725366004615321565b612610565b6103e8610738366004614eb3565b6000908152600e602052604090206002015490565b61036461075b3660046150dd565b6128f1565b61036e61076e366004614eb3565b6129b6565b6103646107813660046153fd565b612a50565b6103b1610794366004614eb3565b6000908152600e60205260409020546001600160a01b031690565b6103646107bd366004614eb3565b612a82565b61036e6107d0366004614eb3565b612cf2565b6103e86107e3366004615075565b60009182526014602090815260408084206001600160a01b0393909316845291905290205490565b610364610819366004615478565b612ff1565b61083161082c366004614eb3565b613113565b604051610348969594939291906154b0565b610364610851366004615532565b6134a5565b61033c610864366004614eb3565b60009081526010602052604090205460ff1690565b61033c610887366004614eb3565b601c6020526000908152604090205460ff1681565b61036e6108aa366004614eb3565b6135cc565b6103646108bd366004615118565b6135e5565b6103e86108d0366004615075565b60009182526013602090815260408084206001600160a01b0393909316845291905290205490565b61033c6109063660046155b4565b6137cc565b6103e8610919366004614eb3565b6000908152600e602052604090206004015490565b6103e861093c366004614eb3565b6137fa565b61036461094f3660046155de565b613821565b610364610962366004615646565b6138e9565b6103e8610975366004614eb3565b60009081526011602052604090205490565b600061099282613af4565b92915050565b601d5460405163feb2e23360e01b8152622de55d60e41b916001600160a01b03169063feb2e233906109d0903390859060040161566b565b602060405180830381865afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a11919061568e565b151560011480610a935750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610a4c903390600401614ecc565b602060405180830381865afa158015610a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8d919061568e565b15156001145b610ab85760405162461bcd60e51b8152600401610aaf906156ab565b60405180910390fd5b600c546000908152600d60205260409020610ad38a82615750565b50600c546000908152600d60205260409020600101610af28982615750565b50600c546000908152600d60205260409020600201610b118882615750565b50600c546000908152600d60205260409020600301610b308782615750565b50600c546000908152600d60205260409020600401610b4f8682615750565b50600c546000908152600d60205260409020600501610b6e8582615750565b50600c546000908152600d60205260409020600601610b8d8482615750565b50600c546000908152600d602090815260409091208351610bb692600790920191850190614ab2565b50600c80546000908152600f60205260409020805460ff191660019081179091559054610be291615825565b600c55505050505050505050565b606060008054610bff906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2b906156d0565b8015610c785780601f10610c4d57610100808354040283529160200191610c78565b820191906000526020600020905b815481529060010190602001808311610c5b57829003601f168201915b5050505050905090565b6000610c8d82613b19565b506000908152600460205260409020546001600160a01b031690565b6000610cb482611cec565b9050806001600160a01b0316836001600160a01b031603610d215760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610aaf565b336001600160a01b0382161480610d3d5750610d3d81336137cc565b610daf5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610aaf565b610db98383613b41565b505050565b601d54604051630cab15dd60e31b81528b916316e7c89960e01b916001600160a01b0390911690636558aee890610dfb90339086906004016150ff565b602060405180830381865afa158015610e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3c919061568e565b151560011480610ec05750601d5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390610e79903390859060040161566b565b602060405180830381865afa158015610e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eba919061568e565b15156001145b80610f3d5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610ef6903390600401614ecc565b602060405180830381865afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f37919061568e565b15156001145b610f595760405162461bcd60e51b8152600401610aaf906156ab565b60008c8152600f602052604090205460ff1615156001148015610f8b575060008c8152601b602052604090205460ff16155b610fa75760405162461bcd60e51b8152600401610aaf906156ab565b83620f4240036110815760008c8152600d60205260409020610fc98c82615750565b5060008c8152600d60205260409020600101610fe58b82615750565b5060008c8152600d602052604090206002016110018a82615750565b5060008c8152600d6020526040902060030161101d8982615750565b5060008c8152600d602052604090206004016110398882615750565b5060008c8152600d602052604090206006016110558682615750565b5060008c8152600d60209081526040909120845161107b92600790920191860190614ab2565b50611100565b83620f423f036110a65760008c8152600d6020526040902060050161107b8782615750565b826000815181106110b9576110b9615838565b6020026020010151600d60008e815260200190815260200160002060070185815481106110e8576110e8615838565b9060005260206000200190816110fe9190615750565b505b505050505050505050505050565b601d5460405163feb2e23360e01b8152631aab8d6960e01b916001600160a01b03169063feb2e23390611147903390859060040161566b565b602060405180830381865afa158015611164573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611188919061568e565b15156001148061120a5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906111c3903390600401614ecc565b602060405180830381865afa1580156111e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611204919061568e565b15156001145b6112265760405162461bcd60e51b8152600401610aaf906156ab565b816001600160a01b0316634cf0c6976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611288919061568e565b15156001146112d95760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206973206e6f742052616e646f6d697a65720000000000006044820152606401610aaf565b506000918252600e60205260409091206007810180546001600160a01b039093166001600160a01b0319938416811790915560089091018054909216179055565b611325335b82613baf565b6113415760405162461bcd60e51b8152600401610aaf9061584e565b610db9838383613c0e565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916113c1575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906113e0906001600160601b03168761589b565b6113ea91906158b2565b915196919550909350505050565b600061140383611f06565b82106114655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610aaf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b601d5460405163feb2e23360e01b8152631b35855960e11b916001600160a01b03169063feb2e233906114c7903390859060040161566b565b602060405180830381865afa1580156114e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611508919061568e565b15156001148061158a5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611543903390600401614ecc565b602060405180830381865afa158015611560573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611584919061568e565b15156001145b6115a65760405162461bcd60e51b8152600401610aaf906156ab565b6000828152600e60205260409081902060060154601e549151639067b67760e01b81526004810185905290916001600160a01b031690639067b67790602401602060405180830381865afa158015611602573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162691906158d4565b6116309190615825565b42116116745760405162461bcd60e51b8152602060048201526013602482015272151a5b59481a185cc81b9bdd081c185cdcd959606a1b6044820152606401610aaf565b6000828152600e60205260409020600281015460039091018190556001906116a1846402540be40061589b565b6116ab9190615825565b6116b591906158ed565b6000928352600e60205260409092206005019190915550565b601d5460405163feb2e23360e01b8152630e234b0960e21b916001600160a01b03169063feb2e23390611707903390859060040161566b565b602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611748919061568e565b1515600114806117ca5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611783903390600401614ecc565b602060405180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c4919061568e565b15156001145b6117e65760405162461bcd60e51b8152600401610aaf906156ab565b816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611824573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611848919061568e565b15156001146118915760405162461bcd60e51b815260206004820152601560248201527421b7b73a3930b1ba1034b9903737ba1020b236b4b760591b6044820152606401610aaf565b50601d80546001600160a01b0319166001600160a01b0392909216919091179055565b601e546001600160a01b031633146118de5760405162461bcd60e51b8152600401610aaf90615900565b6118e88185613baf565b6119045760405162461bcd60e51b8152600401610aaf9061584e565b6000838152600e6020526040902060020154611921906001615825565b6000848152600e60205260409020600281018290556003015410611a7657600061194a85611cec565b905061195585613d6d565b60008681526016602052604090205461196f906001615825565b600087815260166020908152604080832093909355868252601381528282206001600160a01b0385168352905220546119a9906001615825565b60008581526013602090815260408083206001600160a01b038616845282528083209390935587825260199052208054611a709189918491906119eb906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a17906156d0565b8015611a645780601f10611a3957610100808354040283529160200191611a64565b820191906000526020600020905b815481529060010190602001808311611a4757829003601f168201915b50505050508787613dfe565b50611aaf565b60405162461bcd60e51b815260206004820152600e60248201526d14dd5c1c1b1e481c995858da195960921b6044820152606401610aaf565b505050505050565b6000818152600d602052604090206006810180546060928392916007909101908290611ae2906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0e906156d0565b8015611b5b5780601f10611b3057610100808354040283529160200191611b5b565b820191906000526020600020905b815481529060010190602001808311611b3e57829003601f168201915b5050505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611c2f578382906000526020600020018054611ba2906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611bce906156d0565b8015611c1b5780601f10611bf057610100808354040283529160200191611c1b565b820191906000526020600020905b815481529060010190602001808311611bfe57829003601f168201915b505050505081526020019060010190611b83565b50505050905091509150915091565b610db983838360405180602001604052806000815250612a50565b6000611c6460085490565b8210611cc75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610aaf565b60088281548110611cda57611cda615838565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109925760405162461bcd60e51b8152600401610aaf90615941565b6000828152600e60205260409020546001600160a01b03163314611d745760405162461bcd60e51b815260206004820152600a602482015269139bdd08185c9d1a5cdd60b21b6044820152606401610aaf565b6000828152601c602052604090205460ff1615611dbc5760405162461bcd60e51b815260206004820152600660248201526514da59db995960d21b6044820152606401610aaf565b6000815111611dca57600080fd5b6000828152601860205260409020611de28282615750565b50506000908152601c60205260409020805460ff19166001179055565b6060611e0a82613b19565b606060005b6000848152601160209081526040808320548352600d909152902060070154811015611ea7576000848152601160209081526040808320548352600d9091529020600701805483919083908110611e6857611e68615838565b90600052602060002001604051602001611e839291906159e6565b60405160208183030381529060405291508080611e9f90615a04565b915050611e0f565b50600083815260126020908152604090912054611ec391613eb5565b611ecc84614050565b6000858152601960209081526040918290209151611eef94939291869101615a1d565b604051602081830303815290604052915050919050565b60006001600160a01b038216611f705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610aaf565b506001600160a01b031660009081526003602052604090205490565b601d54604051630cab15dd60e31b81528691637b5dbac560e01b916001600160a01b0390911690636558aee890611fc990339086906004016150ff565b602060405180830381865afa158015611fe6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200a919061568e565b15156001148061208e5750601d5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390612047903390859060040161566b565b602060405180830381865afa158015612064573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612088919061568e565b15156001145b8061210b5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906120c4903390600401614ecc565b602060405180830381865afa1580156120e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612105919061568e565b15156001145b6121275760405162461bcd60e51b8152600401610aaf906156ab565b6000878152600f602052604090205460ff161515600114801561215957506000878152601b602052604090205460ff16155b801561216a57506402540be4008411155b6121a45760405162461bcd60e51b815260206004820152600b60248201526a195c9c8bd99c99595e995960aa1b6044820152606401610aaf565b6000878152600e60205260408120600301549003612273576000878152600e6020526040812080546001600160a01b0319166001600160a01b0389161781556001810187905560028101919091556003810185905560060183905561220e876402540be40061589b565b6000888152600e6020526040902060040155600184612232896402540be40061589b565b61223c9190615825565b61224691906158ed565b6000888152600e60209081526040808320600501939093556010905220805460ff191660011790556122e2565b6000878152601c602052604081205460ff16151590036122c6576000878152600e6020526040902080546001600160a01b0319166001600160a01b038816178155600181018690556006018390556122e2565b6000878152600e60205260409020600181018690556006018390555b50505050505050565b6000818152601a602052604090208054606091829160018201908290612310906156d0565b80601f016020809104026020016040519081016040528092919081815260200182805461233c906156d0565b80156123895780601f1061235e57610100808354040283529160200191612389565b820191906000526020600020905b81548152906001019060200180831161236c57829003601f168201915b5050505050915080805461239c906156d0565b80601f01602080910402602001604051908101604052809291908181526020018280546123c8906156d0565b80156124155780601f106123ea57610100808354040283529160200191612415565b820191906000526020600020905b8154815290600101906020018083116123f857829003601f168201915b5050505050905091509150915091565b606060018054610bff906156d0565b601d5460405163feb2e23360e01b8152639a8490f360e01b916001600160a01b03169063feb2e2339061246d903390859060040161566b565b602060405180830381865afa15801561248a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ae919061568e565b1515600114806125305750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906124e9903390600401614ecc565b602060405180830381865afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a919061568e565b15156001145b61254c5760405162461bcd60e51b8152600401610aaf906156ab565b6000838152601160209081526040808320548352601b90915290205460ff16156125885760405162461bcd60e51b8152600401610aaf90615ac6565b61259183613b19565b60008381526019602052604090206125a98382615750565b50505050565b6000838152600e60205260409020600701546001600160a01b031633146125d557600080fd5b600082815260126020526040902054156125ee57600080fd5b6000918252601260205260409091205550565b61260c3383836140e2565b5050565b601d5460405163feb2e23360e01b8152630569208160e51b916001600160a01b03169063feb2e23390612649903390859060040161566b565b602060405180830381865afa158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a919061568e565b15156001148061270c5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906126c5903390600401614ecc565b602060405180830381865afa1580156126e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612706919061568e565b15156001145b6127285760405162461bcd60e51b8152600401610aaf906156ab565b8251845114801561273a575081518351145b6127705760405162461bcd60e51b815260206004820152600760248201526634b73b103632b760c91b6044820152606401610aaf565b60005b84518110156128ea57601b60006011600088858151811061279657612796615838565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff16151560001515146127ec5760405162461bcd60e51b8152600401610aaf90615ac6565b61280e85828151811061280157612801615838565b6020026020010151613b19565b83818151811061282057612820615838565b6020026020010151601a600087848151811061283e5761283e615838565b6020026020010151815260200190815260200160002060006002811061286657612866615838565b01906128729082615750565b5082818151811061288557612885615838565b6020026020010151601a60008784815181106128a3576128a3615838565b602002602001015181526020019081526020016000206001600281106128cb576128cb615838565b01906128d79082615750565b50806128e281615a04565b915050612773565b5050505050565b6128fa3361131f565b6129165760405162461bcd60e51b8152600401610aaf9061584e565b6000828152600e6020526040902060040154811080159061294857506000828152600e60205260409020600501548111155b61297d5760405162461bcd60e51b815260206004820152600660248201526534b21032b93960d11b6044820152606401610aaf565b61298681613d6d565b6000828152601660205260409020546129a0906001615825565b6000928352601660205260409092209190915550565b601960205260009081526040902080546129cf906156d0565b80601f01602080910402602001604051908101604052809291908181526020018280546129fb906156d0565b8015612a485780601f10612a1d57610100808354040283529160200191612a48565b820191906000526020600020905b815481529060010190602001808311612a2b57829003601f168201915b505050505081565b612a5a3383613baf565b612a765760405162461bcd60e51b8152600401610aaf9061584e565b6125a9848484846141ac565b601d5460405163feb2e23360e01b8152630bcc405d60e41b916001600160a01b03169063feb2e23390612abb903390859060040161566b565b602060405180830381865afa158015612ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afc919061568e565b151560011480612b7e5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612b37903390600401614ecc565b602060405180830381865afa158015612b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b78919061568e565b15156001145b612b9a5760405162461bcd60e51b8152600401610aaf906156ab565b601e54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612be3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0791906158d4565b42118015612c805750601e54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7d91906158d4565b15155b612c8957600080fd5b60008281526010602052604090205460ff161515600114612cd65760405162461bcd60e51b81526020600482015260076024820152664e6f204461746160c81b6044820152606401610aaf565b506000908152601b60205260409020805460ff19166001179055565b6060612cfd82613b19565b6000828152601160209081526040808320548352601790915290205460ff16158015612d36575060008281526012602052604090205415155b15612e24576000828152601160209081526040808320548352600d90915281206005018054612d64906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054612d90906156d0565b8015612ddd5780601f10612db257610100808354040283529160200191612ddd565b820191906000526020600020905b815481529060010190602001808311612dc057829003601f168201915b505050505090506000815111612e025760405180602001604052806000815250612e1d565b80612e0c84614050565b604051602001611eef929190615aeb565b9392505050565b6000828152601160209081526040808320548352601790915290205460ff16158015612e5c5750600082815260126020526040902054155b15612f39576000828152601160209081526040808320548352600d90915281206005018054612e8a906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054612eb6906156d0565b8015612f035780601f10612ed857610100808354040283529160200191612f03565b820191906000526020600020905b815481529060010190602001808311612ee657829003601f168201915b505050505090506000815111612f285760405180602001604052806000815250612e1d565b80604051602001611eef9190615b1a565b6000828152601160209081526040808320548352600d9091528120612f8990600601612f6485611dff565b604051602001612f75929190615b45565b6040516020818303038152906040526141df565b90506000612f9684614331565b6000858152601160209081526040808320548352600d8252808320888452601a8352928190209051612fd49493600201926001830191889101615be2565b60408051601f19818403018152919052949350505050565b919050565b601d5460405163feb2e23360e01b81526366813b8d60e11b916001600160a01b03169063feb2e2339061302a903390859060040161566b565b602060405180830381865afa158015613047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306b919061568e565b1515600114806130ed5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906130a6903390600401614ecc565b602060405180830381865afa1580156130c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e7919061568e565b15156001145b6131095760405162461bcd60e51b8152600401610aaf906156ab565b610db98383614396565b6000818152600d60205260409020805460609182918291829182918291600182019060028301906003840190600485019060058601908690613154906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613180906156d0565b80156131cd5780601f106131a2576101008083540402835291602001916131cd565b820191906000526020600020905b8154815290600101906020018083116131b057829003601f168201915b505050505095508480546131e0906156d0565b80601f016020809104026020016040519081016040528092919081815260200182805461320c906156d0565b80156132595780601f1061322e57610100808354040283529160200191613259565b820191906000526020600020905b81548152906001019060200180831161323c57829003601f168201915b5050505050945083805461326c906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613298906156d0565b80156132e55780601f106132ba576101008083540402835291602001916132e5565b820191906000526020600020905b8154815290600101906020018083116132c857829003601f168201915b505050505093508280546132f8906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613324906156d0565b80156133715780601f1061334657610100808354040283529160200191613371565b820191906000526020600020905b81548152906001019060200180831161335457829003601f168201915b50505050509250818054613384906156d0565b80601f01602080910402602001604051908101604052809291908181526020018280546133b0906156d0565b80156133fd5780601f106133d2576101008083540402835291602001916133fd565b820191906000526020600020905b8154815290600101906020018083116133e057829003601f168201915b50505050509150808054613410906156d0565b80601f016020809104026020016040519081016040528092919081815260200182805461343c906156d0565b80156134895780601f1061345e57610100808354040283529160200191613489565b820191906000526020600020905b81548152906001019060200180831161346c57829003601f168201915b5050505050905095509550955095509550955091939550919395565b601e546001600160a01b031633146134cf5760405162461bcd60e51b8152600401610aaf90615900565b6000828152600e60205260409020600201546134ec906001615825565b6000838152600e60205260409020600281018290556003015410611a7657806001036135685760008281526014602090815260408083206001600160a01b038a168452909152902054613540906001615825565b60008381526014602090815260408083206001600160a01b038b1684529091529020556135ba565b60008281526013602090815260408083206001600160a01b038a168452909152902054613596906001615825565b60008381526013602090815260408083206001600160a01b038b1684529091529020555b6135c78786868587613dfe565b6122e2565b601860205260009081526040902080546129cf906156d0565b601d5460405163feb2e23360e01b815263de00e1f760e01b916001600160a01b03169063feb2e2339061361e903390859060040161566b565b602060405180830381865afa15801561363b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365f919061568e565b1515600114806136e15750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061369a903390600401614ecc565b602060405180830381865afa1580156136b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136db919061568e565b15156001145b6136fd5760405162461bcd60e51b8152600401610aaf906156ab565b816001600160a01b031663fb9422ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561373b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375f919061568e565b15156001146137a95760405162461bcd60e51b815260206004820152601660248201527521b7b73a3930b1ba1034b9903737ba1026b4b73a32b960511b6044820152606401610aaf565b50601e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600081815260166020908152604080832054600e90925282206002015461099291906158ed565b601e546001600160a01b0316331461384b5760405162461bcd60e51b8152600401610aaf90615900565b6000818152600e6020526040902060020154613868906001615825565b6000828152600e60205260409020600281018290556003015410611a765760008181526015602090815260408083206001600160a01b03881684529091529020546138b4906001615825565b60008281526015602090815260408083206001600160a01b03891684529091529020556138e48585858486613dfe565b6128ea565b601d54604051630cab15dd60e31b81528391630f6a85dd60e41b916001600160a01b0390911690636558aee89061392690339086906004016150ff565b602060405180830381865afa158015613943573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613967919061568e565b1515600114806139eb5750601d5460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906139a4903390859060040161566b565b602060405180830381865afa1580156139c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e5919061568e565b15156001145b80613a685750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590613a21903390600401614ecc565b602060405180830381865afa158015613a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a62919061568e565b15156001145b613a845760405162461bcd60e51b8152600401610aaf906156ab565b6000848152600f602052604090205460ff1615156001148015613ab657506000848152601b602052604090205460ff16155b613ad25760405162461bcd60e51b8152600401610aaf906156ab565b5050600091825260176020526040909120805460ff1916911515919091179055565b60006001600160e01b0319821663152a902d60e11b1480610992575061099282614439565b613b228161445e565b613b3e5760405162461bcd60e51b8152600401610aaf90615941565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b7682611cec565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080613bbb83611cec565b9050806001600160a01b0316846001600160a01b03161480613be25750613be281856137cc565b80613c065750836001600160a01b0316613bfb84610c82565b6001600160a01b0316145b949350505050565b826001600160a01b0316613c2182611cec565b6001600160a01b031614613c475760405162461bcd60e51b8152600401610aaf90615cff565b6001600160a01b038216613ca95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aaf565b613cb6838383600161447b565b826001600160a01b0316613cc982611cec565b6001600160a01b031614613cef5760405162461bcd60e51b8152600401610aaf90615cff565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080546000190190559087168086528386208054600101905586865260029094528285208054909216841790915590518493600080516020615ec883398151915291a4505050565b6000613d7882611cec565b9050613d8881600084600161447b565b613d9182611cec565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552600384528285208054600019019055878552600290935281842080549091169055519293508492600080516020615ec8833981519152908390a45050565b6000858152601960205260409020613e168482615750565b506000858152601160205260409020829055613e3284866145a3565b6000828152600e60205260409081902060080154905163bf1b89d360e01b81526004810184905260248101879052604481018390526001600160a01b039091169063bf1b89d390606401600060405180830381600087803b158015613e9657600080fd5b505af1158015613eaa573d6000803e3d6000fd5b505050505050505050565b60606000613ec483600261589b565b613ecf906002615825565b6001600160401b03811115613ee657613ee6614ba2565b6040519080825280601f01601f191660200182016040528015613f10576020820181803683370190505b509050600360fc1b81600081518110613f2b57613f2b615838565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613f5a57613f5a615838565b60200101906001600160f81b031916908160001a9053506000613f7e84600261589b565b613f89906001615825565b90505b6001811115614001576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613fbd57613fbd615838565b1a60f81b828281518110613fd357613fd3615838565b60200101906001600160f81b031916908160001a90535060049490941c93613ffa81615d44565b9050613f8c565b508315612e1d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610aaf565b6060600061405d836145bd565b60010190506000816001600160401b0381111561407c5761407c614ba2565b6040519080825280601f01601f1916602001820160405280156140a6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140b057509392505050565b816001600160a01b0316836001600160a01b03160361413f5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610aaf565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6141b7848484613c0e565b6141c384848484614695565b6125a95760405162461bcd60e51b8152600401610aaf90615d5b565b606081516000036141fe57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e88604091399050600060038451600261422d9190615825565b61423791906158b2565b61424290600461589b565b6001600160401b0381111561425957614259614ba2565b6040519080825280601f01601f191660200182016040528015614283576020820181803683370190505b509050600182016020820185865187015b808210156142ef576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250614294565b505060038651066001811461430b576002811461431e57614326565b603d6001830353603d6002830353614326565b603d60018303535b509195945050505050565b6000818152601160209081526040808320548352600e9091528120600401546060919061435e90846158ed565b6000848152601160209081526040808320548352600d909152902090915061438582614050565b604051602001611eef929190615dad565b6127106001600160601b0382168110156143d557604051636f483d0960e01b81526001600160601b038316600482015260248101829052604401610aaf565b6001600160a01b0383166143ff576000604051635b6cc80560e11b8152600401610aaf9190614ecc565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b60006001600160e01b0319821663780e9d6360e01b1480610992575061099282614796565b6000908152600260205260409020546001600160a01b0316151590565b60018111156144ea5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610aaf565b816001600160a01b0385166145465761454181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614569565b836001600160a01b0316856001600160a01b0316146145695761456985826147e6565b6001600160a01b038416614580576138e481614883565b846001600160a01b0316846001600160a01b0316146128ea576128ea8482614932565b61260c828260405180602001604052806000815250614976565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106145fc5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614628576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061464657662386f26fc10000830492506010015b6305f5e100831061465e576305f5e100830492506008015b612710831061467257612710830492506004015b60648310614684576064830492506002015b600a83106109925760010192915050565b60006001600160a01b0384163b1561478b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906146d9903390899088908890600401615de0565b6020604051808303816000875af1925050508015614714575060408051601f3d908101601f1916820190925261471191810190615e1d565b60015b614771573d808015614742576040519150601f19603f3d011682016040523d82523d6000602084013e614747565b606091505b5080516000036147695760405162461bcd60e51b8152600401610aaf90615d5b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613c06565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806147c757506001600160e01b03198216635b5e139f60e01b145b8061099257506301ffc9a760e01b6001600160e01b0319831614610992565b600060016147f384611f06565b6147fd91906158ed565b600083815260076020526040902054909150808214614850576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614895906001906158ed565b600083815260096020526040812054600880549394509092849081106148bd576148bd615838565b9060005260206000200154905080600883815481106148de576148de615838565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061491657614916615e3a565b6001900381819060005260206000200160009055905550505050565b600061493d83611f06565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61498083836149a9565b61498d6000848484614695565b610db95760405162461bcd60e51b8152600401610aaf90615d5b565b6001600160a01b0382166149ff5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610aaf565b614a088161445e565b15614a255760405162461bcd60e51b8152600401610aaf90615e50565b614a3360008383600161447b565b614a3c8161445e565b15614a595760405162461bcd60e51b8152600401610aaf90615e50565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020615ec8833981519152908290a45050565b828054828255906000526020600020908101928215614af8579160200282015b82811115614af85782518290614ae89082615750565b5091602001919060010190614ad2565b50614b04929150614b08565b5090565b80821115614b04576000614b1c8282614b25565b50600101614b08565b508054614b31906156d0565b6000825580601f10614b41575050565b601f016020900490600052602060002090810190613b3e91905b80821115614b045760008155600101614b5b565b6001600160e01b031981168114613b3e57600080fd5b600060208284031215614b9757600080fd5b8135612e1d81614b6f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614be057614be0614ba2565b604052919050565b60006001600160401b03831115614c0157614c01614ba2565b614c14601f8401601f1916602001614bb8565b9050828152838383011115614c2857600080fd5b828260208301376000602084830101529392505050565b600082601f830112614c5057600080fd5b612e1d83833560208501614be8565b60006001600160401b03821115614c7857614c78614ba2565b5060051b60200190565b600082601f830112614c9357600080fd5b81356020614ca8614ca383614c5f565b614bb8565b82815260059290921b84018101918181019086841115614cc757600080fd5b8286015b84811015614d065780356001600160401b03811115614cea5760008081fd5b614cf88986838b0101614c3f565b845250918301918301614ccb565b509695505050505050565b600080600080600080600080610100898b031215614d2e57600080fd5b88356001600160401b0380821115614d4557600080fd5b614d518c838d01614c3f565b995060208b0135915080821115614d6757600080fd5b614d738c838d01614c3f565b985060408b0135915080821115614d8957600080fd5b614d958c838d01614c3f565b975060608b0135915080821115614dab57600080fd5b614db78c838d01614c3f565b965060808b0135915080821115614dcd57600080fd5b614dd98c838d01614c3f565b955060a08b0135915080821115614def57600080fd5b614dfb8c838d01614c3f565b945060c08b0135915080821115614e1157600080fd5b614e1d8c838d01614c3f565b935060e08b0135915080821115614e3357600080fd5b50614e408b828c01614c82565b9150509295985092959890939650565b60005b83811015614e6b578181015183820152602001614e53565b50506000910152565b60008151808452614e8c816020860160208601614e50565b601f01601f19169290920160200192915050565b602081526000612e1d6020830184614e74565b600060208284031215614ec557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114612fec57600080fd5b60008060408385031215614f0a57600080fd5b614f1383614ee0565b946020939093013593505050565b6000806000806000806000806000806101408b8d031215614f4157600080fd5b8a35995060208b01356001600160401b0380821115614f5f57600080fd5b614f6b8e838f01614c3f565b9a5060408d0135915080821115614f8157600080fd5b614f8d8e838f01614c3f565b995060608d0135915080821115614fa357600080fd5b614faf8e838f01614c3f565b985060808d0135915080821115614fc557600080fd5b614fd18e838f01614c3f565b975060a08d0135915080821115614fe757600080fd5b614ff38e838f01614c3f565b965060c08d013591508082111561500957600080fd5b6150158e838f01614c3f565b955060e08d013591508082111561502b57600080fd5b6150378e838f01614c3f565b94506101008d013593506101208d013591508082111561505657600080fd5b506150638d828e01614c82565b9150509295989b9194979a5092959850565b6000806040838503121561508857600080fd5b8235915061509860208401614ee0565b90509250929050565b6000806000606084860312156150b657600080fd5b6150bf84614ee0565b92506150cd60208501614ee0565b9150604084013590509250925092565b600080604083850312156150f057600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b60006020828403121561512a57600080fd5b612e1d82614ee0565b60008060008060008060c0878903121561514c57600080fd5b863595506020870135945060408701359350606087013592506080870135915061517860a08801614ee0565b90509295509295509295565b6040815260006151976040830185614e74565b6020838203818501528185518084528284019150828160051b85010183880160005b838110156151e757601f198784030185526151d5838351614e74565b948601949250908501906001016151b9565b50909998505050505050505050565b6000806040838503121561520957600080fd5b8235915060208301356001600160401b0381111561522657600080fd5b61523285828601614c3f565b9150509250929050565b600080600080600060a0868803121561525457600080fd5b8535945061526460208701614ee0565b94979496505050506040830135926060810135926080909101359150565b6040815260006152956040830185614e74565b82810360208401526152a78185614e74565b95945050505050565b6000806000606084860312156152c557600080fd5b505081359360208301359350604090920135919050565b8015158114613b3e57600080fd5b600080604083850312156152fd57600080fd5b61530683614ee0565b91506020830135615316816152dc565b809150509250929050565b60008060006060848603121561533657600080fd5b83356001600160401b038082111561534d57600080fd5b818601915086601f83011261536157600080fd5b81356020615371614ca383614c5f565b82815260059290921b8401810191818101908a84111561539057600080fd5b948201945b838610156153ae57853582529482019490820190615395565b975050870135925050808211156153c457600080fd5b6153d087838801614c82565b935060408601359150808211156153e657600080fd5b506153f386828701614c82565b9150509250925092565b6000806000806080858703121561541357600080fd5b61541c85614ee0565b935061542a60208601614ee0565b92506040850135915060608501356001600160401b0381111561544c57600080fd5b8501601f8101871361545d57600080fd5b61546c87823560208401614be8565b91505092959194509250565b6000806040838503121561548b57600080fd5b61549483614ee0565b915060208301356001600160601b038116811461531657600080fd5b60c0815260006154c360c0830189614e74565b82810360208401526154d58189614e74565b905082810360408401526154e98188614e74565b905082810360608401526154fd8187614e74565b905082810360808401526155118186614e74565b905082810360a08401526155258185614e74565b9998505050505050505050565b600080600080600080600060e0888a03121561554d57600080fd5b8735965061555d60208901614ee0565b955061556b60408901614ee0565b945060608801356001600160401b0381111561558657600080fd5b6155928a828b01614c3f565b979a969950949760808101359660a0820135965060c090910135945092505050565b600080604083850312156155c757600080fd5b6155d083614ee0565b915061509860208401614ee0565b600080600080600060a086880312156155f657600080fd5b8535945061560660208701614ee0565b935060408601356001600160401b0381111561562157600080fd5b61562d88828901614c3f565b9598949750949560608101359550608001359392505050565b6000806040838503121561565957600080fd5b823591506020830135615316816152dc565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b6000602082840312156156a057600080fd5b8151612e1d816152dc565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b600181811c908216806156e457607f821691505b60208210810361570457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610db957600081815260208120601f850160051c810160208610156157315750805b601f850160051c820191505b81811015611aaf5782815560010161573d565b81516001600160401b0381111561576957615769614ba2565b61577d8161577784546156d0565b8461570a565b602080601f8311600181146157b2576000841561579a5750858301515b600019600386901b1c1916600185901b178555611aaf565b600085815260208120601f198616915b828110156157e1578886015182559484019460019091019084016157c2565b50858210156157ff5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808201808211156109925761099261580f565b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b80820281158282048414176109925761099261580f565b6000826158cf57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156158e657600080fd5b5051919050565b818103818111156109925761099261580f565b60208082526021908201527f43616c6c6572206973206e6f7420746865204d696e74657220436f6e747261636040820152601d60fa1b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b60008154615980816156d0565b6001828116801561599857600181146159ad576159dc565b60ff19841687528215158302870194506159dc565b8560005260208060002060005b858110156159d35781548a8201529084019082016159ba565b50505082870194505b5050505092915050565b600083516159f8818460208801614e50565b6152a781840185615973565b600060018201615a1657615a1661580f565b5060010190565b696c657420686173683d2760b01b815260008551615a4281600a850160208a01614e50565b6d273b6c657420746f6b656e49643d60901b600a918401918201528551615a70816018840160208a01614e50565b6f3b6c657420746f6b656e446174613d5b60801b60189290910191820152615a9b6028820186615973565b9050615d3b60f01b81528351615ab8816002840160208801614e50565b016002019695505050505050565b6020808252600b908201526a2230ba3090333937bd32b760a91b604082015260600190565b60008351615afd818460208801614e50565b835190830190615b11818360208801614e50565b01949350505050565b60008251615b2c818460208701614e50565b6670656e64696e6760c81b920191825250600701919050565b7f3c68746d6c3e3c686561643e3c2f686561643e3c626f64793e3c7363726970748152651039b9319e9160d11b60208201526000615b866026830185615973565b72111f1e17b9b1b934b83a1f1e39b1b934b83a1f60691b81528351615bb2816013840160208801614e50565b761e17b9b1b934b83a1f1e17b137b23c9f1e17b43a36b61f60491b60139290910191820152602a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651615c27816024850160208b01614e50565b701116113232b9b1b934b83a34b7b7111d1160791b602491840191820152615c526035820188615973565b6a11161134b6b0b3b2911d1160a91b81529050615c72600b820187615973565b6f222c2261747472696275746573223a5b60801b81529050615c976010820186615973565b90507f5d2c22616e696d6174696f6e5f75726c223a22646174613a746578742f68746d8152681b0ed8985cd94d8d0b60ba1b60208201528351615ce1816029840160208801614e50565b61227d60f01b60299290910191820152602b01979650505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b600081615d5357615d5361580f565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000615db98285615973565b61202360f01b81528351615dd4816002840160208801614e50565b01600201949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e1390830184614e74565b9695505050505050565b600060208284031215615e2f57600080fd5b8151612e1d81614b6f565b634e487b7160e01b600052603160045260246000fd5b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204e01c7afc738bf76fafb57bef1c544457acbb30776380f79698019d88361af0364736f6c63430008130033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f8000000000000000000000000000000000000000000000000000000000000000c4e65787447656e2036353239000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e45585447000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103245760003560e01c806392f00233116101a9578063cb6d67e0116100ef578063de00e1f71161009d578063de00e1f7146108af578063e943a2c7146108c2578063e985e9c5146108f8578063e9b7a8601461090b578063f18332dd1461092e578063f35c145214610941578063f6a85dd014610954578063fa92668a1461096757600080fd5b8063cb6d67e0146107d5578063cd02771a1461080b578063d09502711461081e578063d3322d5314610843578063d374100014610856578063d3d5492814610879578063d9a03e381461089c57600080fd5b8063ad24102011610157578063ad24102014610717578063af569fd41461072a578063b390c0ab1461074d578063b4b5b48f14610760578063b88d4fde14610773578063b990296814610786578063bcc405d0146107af578063c87b56dd146107c257600080fd5b806392f002331461066a578063945e549b1461067d57806394c14957146106a057806395d89b41146106d65780639a8490f3146106de5780639cac0f1f146106f1578063a22cb4651461070457600080fd5b806339143a1d1161026e578063663a3c001161021c578063663a3c00146105b15780636799a46a146105ba5780636c6aab16146105cd5780636fa13531146105f05780636fafdf831461060357806370a08231146106235780637b5dbac51461063657806380f8c8ab1461064957600080fd5b806339143a1d146104995780633d2bed8d146104ac57806342842e0e146104cd5780634ab6897c146104e05780634f6ccce7146105005780635c91d74a146105135780636352211e1461059e57600080fd5b806318160ddd116102d657806318160ddd146103e45780631aab8d69146103f657806323b872dd146104095780632a55205a1461041c5780632ed330f71461043d5780632f745c5914610460578063366b0ab214610473578063388d2c241461048657600080fd5b806301ffc9a71461032957806302de55d01461035157806306fdde0314610366578063074b55391461037b578063081812fc1461039e578063095ea7b3146103be57806316e7c899146103d1575b600080fd5b61033c610337366004614b85565b610987565b60405190151581526020015b60405180910390f35b61036461035f366004614d11565b610998565b005b61036e610bf0565b6040516103489190614ea0565b61033c610389366004614eb3565b60176020526000908152604090205460ff1681565b6103b16103ac366004614eb3565b610c82565b6040516103489190614ecc565b6103646103cc366004614ef7565b610ca9565b6103646103df366004614f21565b610dbe565b6008545b604051908152602001610348565b610364610404366004615075565b61110e565b6103646104173660046150a1565b61131a565b61042f61042a3660046150dd565b61134c565b6040516103489291906150ff565b61033c61044b366004614eb3565b6000908152601b602052604090205460ff1690565b6103e861046e366004614ef7565b6113f8565b610364610481366004614eb3565b61148e565b610364610494366004615118565b6116ce565b6103646104a7366004615133565b6118b4565b6104bf6104ba366004614eb3565b611ab7565b604051610348929190615184565b6103646104db3660046150a1565b611c3e565b6103e86104ee366004614eb3565b60009081526012602052604090205490565b6103e861050e366004614eb3565b611c59565b610562610521366004614eb3565b6000908152600e60205260409020805460018201546002830154600384015460068501546007909501546001600160a01b0394851696939592949193911690565b604080516001600160a01b03978816815260208101969096528501939093526060840191909152608083015290911660a082015260c001610348565b6103b16105ac366004614eb3565b611cec565b6103e8600c5481565b6103646105c83660046151f6565b611d21565b6103e86105db366004614eb3565b6000908152600e602052604090206005015490565b61036e6105fe366004614eb3565b611dff565b6103e8610611366004614eb3565b60166020526000908152604090205481565b6103e8610631366004615118565b611f06565b61036461064436600461523c565b611f8c565b61065c610657366004614eb3565b6122eb565b604051610348929190615282565b601e546103b1906001600160a01b031681565b6103e861068b366004614eb3565b6000908152600e602052604090206001015490565b6103e86106ae366004615075565b60009182526015602090815260408084206001600160a01b0393909316845291905290205490565b61036e612425565b6103646106ec3660046151f6565b612434565b6103646106ff3660046152b0565b6125af565b6103646107123660046152ea565b612601565b610364610725366004615321565b612610565b6103e8610738366004614eb3565b6000908152600e602052604090206002015490565b61036461075b3660046150dd565b6128f1565b61036e61076e366004614eb3565b6129b6565b6103646107813660046153fd565b612a50565b6103b1610794366004614eb3565b6000908152600e60205260409020546001600160a01b031690565b6103646107bd366004614eb3565b612a82565b61036e6107d0366004614eb3565b612cf2565b6103e86107e3366004615075565b60009182526014602090815260408084206001600160a01b0393909316845291905290205490565b610364610819366004615478565b612ff1565b61083161082c366004614eb3565b613113565b604051610348969594939291906154b0565b610364610851366004615532565b6134a5565b61033c610864366004614eb3565b60009081526010602052604090205460ff1690565b61033c610887366004614eb3565b601c6020526000908152604090205460ff1681565b61036e6108aa366004614eb3565b6135cc565b6103646108bd366004615118565b6135e5565b6103e86108d0366004615075565b60009182526013602090815260408084206001600160a01b0393909316845291905290205490565b61033c6109063660046155b4565b6137cc565b6103e8610919366004614eb3565b6000908152600e602052604090206004015490565b6103e861093c366004614eb3565b6137fa565b61036461094f3660046155de565b613821565b610364610962366004615646565b6138e9565b6103e8610975366004614eb3565b60009081526011602052604090205490565b600061099282613af4565b92915050565b601d5460405163feb2e23360e01b8152622de55d60e41b916001600160a01b03169063feb2e233906109d0903390859060040161566b565b602060405180830381865afa1580156109ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a11919061568e565b151560011480610a935750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610a4c903390600401614ecc565b602060405180830381865afa158015610a69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a8d919061568e565b15156001145b610ab85760405162461bcd60e51b8152600401610aaf906156ab565b60405180910390fd5b600c546000908152600d60205260409020610ad38a82615750565b50600c546000908152600d60205260409020600101610af28982615750565b50600c546000908152600d60205260409020600201610b118882615750565b50600c546000908152600d60205260409020600301610b308782615750565b50600c546000908152600d60205260409020600401610b4f8682615750565b50600c546000908152600d60205260409020600501610b6e8582615750565b50600c546000908152600d60205260409020600601610b8d8482615750565b50600c546000908152600d602090815260409091208351610bb692600790920191850190614ab2565b50600c80546000908152600f60205260409020805460ff191660019081179091559054610be291615825565b600c55505050505050505050565b606060008054610bff906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c2b906156d0565b8015610c785780601f10610c4d57610100808354040283529160200191610c78565b820191906000526020600020905b815481529060010190602001808311610c5b57829003601f168201915b5050505050905090565b6000610c8d82613b19565b506000908152600460205260409020546001600160a01b031690565b6000610cb482611cec565b9050806001600160a01b0316836001600160a01b031603610d215760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610aaf565b336001600160a01b0382161480610d3d5750610d3d81336137cc565b610daf5760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610aaf565b610db98383613b41565b505050565b601d54604051630cab15dd60e31b81528b916316e7c89960e01b916001600160a01b0390911690636558aee890610dfb90339086906004016150ff565b602060405180830381865afa158015610e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e3c919061568e565b151560011480610ec05750601d5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390610e79903390859060040161566b565b602060405180830381865afa158015610e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eba919061568e565b15156001145b80610f3d5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590610ef6903390600401614ecc565b602060405180830381865afa158015610f13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f37919061568e565b15156001145b610f595760405162461bcd60e51b8152600401610aaf906156ab565b60008c8152600f602052604090205460ff1615156001148015610f8b575060008c8152601b602052604090205460ff16155b610fa75760405162461bcd60e51b8152600401610aaf906156ab565b83620f4240036110815760008c8152600d60205260409020610fc98c82615750565b5060008c8152600d60205260409020600101610fe58b82615750565b5060008c8152600d602052604090206002016110018a82615750565b5060008c8152600d6020526040902060030161101d8982615750565b5060008c8152600d602052604090206004016110398882615750565b5060008c8152600d602052604090206006016110558682615750565b5060008c8152600d60209081526040909120845161107b92600790920191860190614ab2565b50611100565b83620f423f036110a65760008c8152600d6020526040902060050161107b8782615750565b826000815181106110b9576110b9615838565b6020026020010151600d60008e815260200190815260200160002060070185815481106110e8576110e8615838565b9060005260206000200190816110fe9190615750565b505b505050505050505050505050565b601d5460405163feb2e23360e01b8152631aab8d6960e01b916001600160a01b03169063feb2e23390611147903390859060040161566b565b602060405180830381865afa158015611164573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611188919061568e565b15156001148061120a5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906111c3903390600401614ecc565b602060405180830381865afa1580156111e0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611204919061568e565b15156001145b6112265760405162461bcd60e51b8152600401610aaf906156ab565b816001600160a01b0316634cf0c6976040518163ffffffff1660e01b8152600401602060405180830381865afa158015611264573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611288919061568e565b15156001146112d95760405162461bcd60e51b815260206004820152601a60248201527f436f6e7472616374206973206e6f742052616e646f6d697a65720000000000006044820152606401610aaf565b506000918252600e60205260409091206007810180546001600160a01b039093166001600160a01b0319938416811790915560089091018054909216179055565b611325335b82613baf565b6113415760405162461bcd60e51b8152600401610aaf9061584e565b610db9838383613c0e565b6000828152600b602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916113c1575060408051808201909152600a546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906113e0906001600160601b03168761589b565b6113ea91906158b2565b915196919550909350505050565b600061140383611f06565b82106114655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610aaf565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b601d5460405163feb2e23360e01b8152631b35855960e11b916001600160a01b03169063feb2e233906114c7903390859060040161566b565b602060405180830381865afa1580156114e4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611508919061568e565b15156001148061158a5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611543903390600401614ecc565b602060405180830381865afa158015611560573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611584919061568e565b15156001145b6115a65760405162461bcd60e51b8152600401610aaf906156ab565b6000828152600e60205260409081902060060154601e549151639067b67760e01b81526004810185905290916001600160a01b031690639067b67790602401602060405180830381865afa158015611602573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061162691906158d4565b6116309190615825565b42116116745760405162461bcd60e51b8152602060048201526013602482015272151a5b59481a185cc81b9bdd081c185cdcd959606a1b6044820152606401610aaf565b6000828152600e60205260409020600281015460039091018190556001906116a1846402540be40061589b565b6116ab9190615825565b6116b591906158ed565b6000928352600e60205260409092206005019190915550565b601d5460405163feb2e23360e01b8152630e234b0960e21b916001600160a01b03169063feb2e23390611707903390859060040161566b565b602060405180830381865afa158015611724573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611748919061568e565b1515600114806117ca5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590611783903390600401614ecc565b602060405180830381865afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c4919061568e565b15156001145b6117e65760405162461bcd60e51b8152600401610aaf906156ab565b816001600160a01b0316639068edac6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611824573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611848919061568e565b15156001146118915760405162461bcd60e51b815260206004820152601560248201527421b7b73a3930b1ba1034b9903737ba1020b236b4b760591b6044820152606401610aaf565b50601d80546001600160a01b0319166001600160a01b0392909216919091179055565b601e546001600160a01b031633146118de5760405162461bcd60e51b8152600401610aaf90615900565b6118e88185613baf565b6119045760405162461bcd60e51b8152600401610aaf9061584e565b6000838152600e6020526040902060020154611921906001615825565b6000848152600e60205260409020600281018290556003015410611a7657600061194a85611cec565b905061195585613d6d565b60008681526016602052604090205461196f906001615825565b600087815260166020908152604080832093909355868252601381528282206001600160a01b0385168352905220546119a9906001615825565b60008581526013602090815260408083206001600160a01b038616845282528083209390935587825260199052208054611a709189918491906119eb906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611a17906156d0565b8015611a645780601f10611a3957610100808354040283529160200191611a64565b820191906000526020600020905b815481529060010190602001808311611a4757829003601f168201915b50505050508787613dfe565b50611aaf565b60405162461bcd60e51b815260206004820152600e60248201526d14dd5c1c1b1e481c995858da195960921b6044820152606401610aaf565b505050505050565b6000818152600d602052604090206006810180546060928392916007909101908290611ae2906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611b0e906156d0565b8015611b5b5780601f10611b3057610100808354040283529160200191611b5b565b820191906000526020600020905b815481529060010190602001808311611b3e57829003601f168201915b5050505050915080805480602002602001604051908101604052809291908181526020016000905b82821015611c2f578382906000526020600020018054611ba2906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611bce906156d0565b8015611c1b5780601f10611bf057610100808354040283529160200191611c1b565b820191906000526020600020905b815481529060010190602001808311611bfe57829003601f168201915b505050505081526020019060010190611b83565b50505050905091509150915091565b610db983838360405180602001604052806000815250612a50565b6000611c6460085490565b8210611cc75760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610aaf565b60088281548110611cda57611cda615838565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806109925760405162461bcd60e51b8152600401610aaf90615941565b6000828152600e60205260409020546001600160a01b03163314611d745760405162461bcd60e51b815260206004820152600a602482015269139bdd08185c9d1a5cdd60b21b6044820152606401610aaf565b6000828152601c602052604090205460ff1615611dbc5760405162461bcd60e51b815260206004820152600660248201526514da59db995960d21b6044820152606401610aaf565b6000815111611dca57600080fd5b6000828152601860205260409020611de28282615750565b50506000908152601c60205260409020805460ff19166001179055565b6060611e0a82613b19565b606060005b6000848152601160209081526040808320548352600d909152902060070154811015611ea7576000848152601160209081526040808320548352600d9091529020600701805483919083908110611e6857611e68615838565b90600052602060002001604051602001611e839291906159e6565b60405160208183030381529060405291508080611e9f90615a04565b915050611e0f565b50600083815260126020908152604090912054611ec391613eb5565b611ecc84614050565b6000858152601960209081526040918290209151611eef94939291869101615a1d565b604051602081830303815290604052915050919050565b60006001600160a01b038216611f705760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610aaf565b506001600160a01b031660009081526003602052604090205490565b601d54604051630cab15dd60e31b81528691637b5dbac560e01b916001600160a01b0390911690636558aee890611fc990339086906004016150ff565b602060405180830381865afa158015611fe6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061200a919061568e565b15156001148061208e5750601d5460405163feb2e23360e01b81526001600160a01b039091169063feb2e23390612047903390859060040161566b565b602060405180830381865afa158015612064573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612088919061568e565b15156001145b8061210b5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906120c4903390600401614ecc565b602060405180830381865afa1580156120e1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612105919061568e565b15156001145b6121275760405162461bcd60e51b8152600401610aaf906156ab565b6000878152600f602052604090205460ff161515600114801561215957506000878152601b602052604090205460ff16155b801561216a57506402540be4008411155b6121a45760405162461bcd60e51b815260206004820152600b60248201526a195c9c8bd99c99595e995960aa1b6044820152606401610aaf565b6000878152600e60205260408120600301549003612273576000878152600e6020526040812080546001600160a01b0319166001600160a01b0389161781556001810187905560028101919091556003810185905560060183905561220e876402540be40061589b565b6000888152600e6020526040902060040155600184612232896402540be40061589b565b61223c9190615825565b61224691906158ed565b6000888152600e60209081526040808320600501939093556010905220805460ff191660011790556122e2565b6000878152601c602052604081205460ff16151590036122c6576000878152600e6020526040902080546001600160a01b0319166001600160a01b038816178155600181018690556006018390556122e2565b6000878152600e60205260409020600181018690556006018390555b50505050505050565b6000818152601a602052604090208054606091829160018201908290612310906156d0565b80601f016020809104026020016040519081016040528092919081815260200182805461233c906156d0565b80156123895780601f1061235e57610100808354040283529160200191612389565b820191906000526020600020905b81548152906001019060200180831161236c57829003601f168201915b5050505050915080805461239c906156d0565b80601f01602080910402602001604051908101604052809291908181526020018280546123c8906156d0565b80156124155780601f106123ea57610100808354040283529160200191612415565b820191906000526020600020905b8154815290600101906020018083116123f857829003601f168201915b5050505050905091509150915091565b606060018054610bff906156d0565b601d5460405163feb2e23360e01b8152639a8490f360e01b916001600160a01b03169063feb2e2339061246d903390859060040161566b565b602060405180830381865afa15801561248a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ae919061568e565b1515600114806125305750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906124e9903390600401614ecc565b602060405180830381865afa158015612506573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061252a919061568e565b15156001145b61254c5760405162461bcd60e51b8152600401610aaf906156ab565b6000838152601160209081526040808320548352601b90915290205460ff16156125885760405162461bcd60e51b8152600401610aaf90615ac6565b61259183613b19565b60008381526019602052604090206125a98382615750565b50505050565b6000838152600e60205260409020600701546001600160a01b031633146125d557600080fd5b600082815260126020526040902054156125ee57600080fd5b6000918252601260205260409091205550565b61260c3383836140e2565b5050565b601d5460405163feb2e23360e01b8152630569208160e51b916001600160a01b03169063feb2e23390612649903390859060040161566b565b602060405180830381865afa158015612666573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061268a919061568e565b15156001148061270c5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906126c5903390600401614ecc565b602060405180830381865afa1580156126e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612706919061568e565b15156001145b6127285760405162461bcd60e51b8152600401610aaf906156ab565b8251845114801561273a575081518351145b6127705760405162461bcd60e51b815260206004820152600760248201526634b73b103632b760c91b6044820152606401610aaf565b60005b84518110156128ea57601b60006011600088858151811061279657612796615838565b6020026020010151815260200190815260200160002054815260200190815260200160002060009054906101000a900460ff16151560001515146127ec5760405162461bcd60e51b8152600401610aaf90615ac6565b61280e85828151811061280157612801615838565b6020026020010151613b19565b83818151811061282057612820615838565b6020026020010151601a600087848151811061283e5761283e615838565b6020026020010151815260200190815260200160002060006002811061286657612866615838565b01906128729082615750565b5082818151811061288557612885615838565b6020026020010151601a60008784815181106128a3576128a3615838565b602002602001015181526020019081526020016000206001600281106128cb576128cb615838565b01906128d79082615750565b50806128e281615a04565b915050612773565b5050505050565b6128fa3361131f565b6129165760405162461bcd60e51b8152600401610aaf9061584e565b6000828152600e6020526040902060040154811080159061294857506000828152600e60205260409020600501548111155b61297d5760405162461bcd60e51b815260206004820152600660248201526534b21032b93960d11b6044820152606401610aaf565b61298681613d6d565b6000828152601660205260409020546129a0906001615825565b6000928352601660205260409092209190915550565b601960205260009081526040902080546129cf906156d0565b80601f01602080910402602001604051908101604052809291908181526020018280546129fb906156d0565b8015612a485780601f10612a1d57610100808354040283529160200191612a48565b820191906000526020600020905b815481529060010190602001808311612a2b57829003601f168201915b505050505081565b612a5a3383613baf565b612a765760405162461bcd60e51b8152600401610aaf9061584e565b6125a9848484846141ac565b601d5460405163feb2e23360e01b8152630bcc405d60e41b916001600160a01b03169063feb2e23390612abb903390859060040161566b565b602060405180830381865afa158015612ad8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612afc919061568e565b151560011480612b7e5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590612b37903390600401614ecc565b602060405180830381865afa158015612b54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b78919061568e565b15156001145b612b9a5760405162461bcd60e51b8152600401610aaf906156ab565b601e54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612be3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c0791906158d4565b42118015612c805750601e54604051639067b67760e01b8152600481018490526001600160a01b0390911690639067b67790602401602060405180830381865afa158015612c59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c7d91906158d4565b15155b612c8957600080fd5b60008281526010602052604090205460ff161515600114612cd65760405162461bcd60e51b81526020600482015260076024820152664e6f204461746160c81b6044820152606401610aaf565b506000908152601b60205260409020805460ff19166001179055565b6060612cfd82613b19565b6000828152601160209081526040808320548352601790915290205460ff16158015612d36575060008281526012602052604090205415155b15612e24576000828152601160209081526040808320548352600d90915281206005018054612d64906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054612d90906156d0565b8015612ddd5780601f10612db257610100808354040283529160200191612ddd565b820191906000526020600020905b815481529060010190602001808311612dc057829003601f168201915b505050505090506000815111612e025760405180602001604052806000815250612e1d565b80612e0c84614050565b604051602001611eef929190615aeb565b9392505050565b6000828152601160209081526040808320548352601790915290205460ff16158015612e5c5750600082815260126020526040902054155b15612f39576000828152601160209081526040808320548352600d90915281206005018054612e8a906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054612eb6906156d0565b8015612f035780601f10612ed857610100808354040283529160200191612f03565b820191906000526020600020905b815481529060010190602001808311612ee657829003601f168201915b505050505090506000815111612f285760405180602001604052806000815250612e1d565b80604051602001611eef9190615b1a565b6000828152601160209081526040808320548352600d9091528120612f8990600601612f6485611dff565b604051602001612f75929190615b45565b6040516020818303038152906040526141df565b90506000612f9684614331565b6000858152601160209081526040808320548352600d8252808320888452601a8352928190209051612fd49493600201926001830191889101615be2565b60408051601f19818403018152919052949350505050565b919050565b601d5460405163feb2e23360e01b81526366813b8d60e11b916001600160a01b03169063feb2e2339061302a903390859060040161566b565b602060405180830381865afa158015613047573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061306b919061568e565b1515600114806130ed5750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d55906130a6903390600401614ecc565b602060405180830381865afa1580156130c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130e7919061568e565b15156001145b6131095760405162461bcd60e51b8152600401610aaf906156ab565b610db98383614396565b6000818152600d60205260409020805460609182918291829182918291600182019060028301906003840190600485019060058601908690613154906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613180906156d0565b80156131cd5780601f106131a2576101008083540402835291602001916131cd565b820191906000526020600020905b8154815290600101906020018083116131b057829003601f168201915b505050505095508480546131e0906156d0565b80601f016020809104026020016040519081016040528092919081815260200182805461320c906156d0565b80156132595780601f1061322e57610100808354040283529160200191613259565b820191906000526020600020905b81548152906001019060200180831161323c57829003601f168201915b5050505050945083805461326c906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613298906156d0565b80156132e55780601f106132ba576101008083540402835291602001916132e5565b820191906000526020600020905b8154815290600101906020018083116132c857829003601f168201915b505050505093508280546132f8906156d0565b80601f0160208091040260200160405190810160405280929190818152602001828054613324906156d0565b80156133715780601f1061334657610100808354040283529160200191613371565b820191906000526020600020905b81548152906001019060200180831161335457829003601f168201915b50505050509250818054613384906156d0565b80601f01602080910402602001604051908101604052809291908181526020018280546133b0906156d0565b80156133fd5780601f106133d2576101008083540402835291602001916133fd565b820191906000526020600020905b8154815290600101906020018083116133e057829003601f168201915b50505050509150808054613410906156d0565b80601f016020809104026020016040519081016040528092919081815260200182805461343c906156d0565b80156134895780601f1061345e57610100808354040283529160200191613489565b820191906000526020600020905b81548152906001019060200180831161346c57829003601f168201915b5050505050905095509550955095509550955091939550919395565b601e546001600160a01b031633146134cf5760405162461bcd60e51b8152600401610aaf90615900565b6000828152600e60205260409020600201546134ec906001615825565b6000838152600e60205260409020600281018290556003015410611a7657806001036135685760008281526014602090815260408083206001600160a01b038a168452909152902054613540906001615825565b60008381526014602090815260408083206001600160a01b038b1684529091529020556135ba565b60008281526013602090815260408083206001600160a01b038a168452909152902054613596906001615825565b60008381526013602090815260408083206001600160a01b038b1684529091529020555b6135c78786868587613dfe565b6122e2565b601860205260009081526040902080546129cf906156d0565b601d5460405163feb2e23360e01b815263de00e1f760e01b916001600160a01b03169063feb2e2339061361e903390859060040161566b565b602060405180830381865afa15801561363b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061365f919061568e565b1515600114806136e15750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d559061369a903390600401614ecc565b602060405180830381865afa1580156136b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136db919061568e565b15156001145b6136fd5760405162461bcd60e51b8152600401610aaf906156ab565b816001600160a01b031663fb9422ff6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561373b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061375f919061568e565b15156001146137a95760405162461bcd60e51b815260206004820152601660248201527521b7b73a3930b1ba1034b9903737ba1026b4b73a32b960511b6044820152606401610aaf565b50601e80546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b600081815260166020908152604080832054600e90925282206002015461099291906158ed565b601e546001600160a01b0316331461384b5760405162461bcd60e51b8152600401610aaf90615900565b6000818152600e6020526040902060020154613868906001615825565b6000828152600e60205260409020600281018290556003015410611a765760008181526015602090815260408083206001600160a01b03881684529091529020546138b4906001615825565b60008281526015602090815260408083206001600160a01b03891684529091529020556138e48585858486613dfe565b6128ea565b601d54604051630cab15dd60e31b81528391630f6a85dd60e41b916001600160a01b0390911690636558aee89061392690339086906004016150ff565b602060405180830381865afa158015613943573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613967919061568e565b1515600114806139eb5750601d5460405163feb2e23360e01b81526001600160a01b039091169063feb2e233906139a4903390859060040161566b565b602060405180830381865afa1580156139c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139e5919061568e565b15156001145b80613a685750601d5460405163b3076d5560e01b81526001600160a01b039091169063b3076d5590613a21903390600401614ecc565b602060405180830381865afa158015613a3e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a62919061568e565b15156001145b613a845760405162461bcd60e51b8152600401610aaf906156ab565b6000848152600f602052604090205460ff1615156001148015613ab657506000848152601b602052604090205460ff16155b613ad25760405162461bcd60e51b8152600401610aaf906156ab565b5050600091825260176020526040909120805460ff1916911515919091179055565b60006001600160e01b0319821663152a902d60e11b1480610992575061099282614439565b613b228161445e565b613b3e5760405162461bcd60e51b8152600401610aaf90615941565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190613b7682611cec565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080613bbb83611cec565b9050806001600160a01b0316846001600160a01b03161480613be25750613be281856137cc565b80613c065750836001600160a01b0316613bfb84610c82565b6001600160a01b0316145b949350505050565b826001600160a01b0316613c2182611cec565b6001600160a01b031614613c475760405162461bcd60e51b8152600401610aaf90615cff565b6001600160a01b038216613ca95760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610aaf565b613cb6838383600161447b565b826001600160a01b0316613cc982611cec565b6001600160a01b031614613cef5760405162461bcd60e51b8152600401610aaf90615cff565b600081815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038781168086526003855283862080546000190190559087168086528386208054600101905586865260029094528285208054909216841790915590518493600080516020615ec883398151915291a4505050565b6000613d7882611cec565b9050613d8881600084600161447b565b613d9182611cec565b600083815260046020908152604080832080546001600160a01b03199081169091556001600160a01b038516808552600384528285208054600019019055878552600290935281842080549091169055519293508492600080516020615ec8833981519152908390a45050565b6000858152601960205260409020613e168482615750565b506000858152601160205260409020829055613e3284866145a3565b6000828152600e60205260409081902060080154905163bf1b89d360e01b81526004810184905260248101879052604481018390526001600160a01b039091169063bf1b89d390606401600060405180830381600087803b158015613e9657600080fd5b505af1158015613eaa573d6000803e3d6000fd5b505050505050505050565b60606000613ec483600261589b565b613ecf906002615825565b6001600160401b03811115613ee657613ee6614ba2565b6040519080825280601f01601f191660200182016040528015613f10576020820181803683370190505b509050600360fc1b81600081518110613f2b57613f2b615838565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110613f5a57613f5a615838565b60200101906001600160f81b031916908160001a9053506000613f7e84600261589b565b613f89906001615825565b90505b6001811115614001576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110613fbd57613fbd615838565b1a60f81b828281518110613fd357613fd3615838565b60200101906001600160f81b031916908160001a90535060049490941c93613ffa81615d44565b9050613f8c565b508315612e1d5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610aaf565b6060600061405d836145bd565b60010190506000816001600160401b0381111561407c5761407c614ba2565b6040519080825280601f01601f1916602001820160405280156140a6576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846140b057509392505050565b816001600160a01b0316836001600160a01b03160361413f5760405162461bcd60e51b815260206004820152601960248201527822a9219b99189d1030b8383937bb32903a379031b0b63632b960391b6044820152606401610aaf565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6141b7848484613c0e565b6141c384848484614695565b6125a95760405162461bcd60e51b8152600401610aaf90615d5b565b606081516000036141fe57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e88604091399050600060038451600261422d9190615825565b61423791906158b2565b61424290600461589b565b6001600160401b0381111561425957614259614ba2565b6040519080825280601f01601f191660200182016040528015614283576020820181803683370190505b509050600182016020820185865187015b808210156142ef576003820191508151603f8160121c168501518453600184019350603f81600c1c168501518453600184019350603f8160061c168501518453600184019350603f8116850151845350600183019250614294565b505060038651066001811461430b576002811461431e57614326565b603d6001830353603d6002830353614326565b603d60018303535b509195945050505050565b6000818152601160209081526040808320548352600e9091528120600401546060919061435e90846158ed565b6000848152601160209081526040808320548352600d909152902090915061438582614050565b604051602001611eef929190615dad565b6127106001600160601b0382168110156143d557604051636f483d0960e01b81526001600160601b038316600482015260248101829052604401610aaf565b6001600160a01b0383166143ff576000604051635b6cc80560e11b8152600401610aaf9190614ecc565b50604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600a55565b60006001600160e01b0319821663780e9d6360e01b1480610992575061099282614796565b6000908152600260205260409020546001600160a01b0316151590565b60018111156144ea5760405162461bcd60e51b815260206004820152603560248201527f455243373231456e756d657261626c653a20636f6e7365637574697665207472604482015274185b9cd9995c9cc81b9bdd081cdd5c1c1bdc9d1959605a1b6064820152608401610aaf565b816001600160a01b0385166145465761454181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614569565b836001600160a01b0316856001600160a01b0316146145695761456985826147e6565b6001600160a01b038416614580576138e481614883565b846001600160a01b0316846001600160a01b0316146128ea576128ea8482614932565b61260c828260405180602001604052806000815250614976565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106145fc5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614628576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061464657662386f26fc10000830492506010015b6305f5e100831061465e576305f5e100830492506008015b612710831061467257612710830492506004015b60648310614684576064830492506002015b600a83106109925760010192915050565b60006001600160a01b0384163b1561478b57604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906146d9903390899088908890600401615de0565b6020604051808303816000875af1925050508015614714575060408051601f3d908101601f1916820190925261471191810190615e1d565b60015b614771573d808015614742576040519150601f19603f3d011682016040523d82523d6000602084013e614747565b606091505b5080516000036147695760405162461bcd60e51b8152600401610aaf90615d5b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613c06565b506001949350505050565b60006001600160e01b031982166380ac58cd60e01b14806147c757506001600160e01b03198216635b5e139f60e01b145b8061099257506301ffc9a760e01b6001600160e01b0319831614610992565b600060016147f384611f06565b6147fd91906158ed565b600083815260076020526040902054909150808214614850576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614895906001906158ed565b600083815260096020526040812054600880549394509092849081106148bd576148bd615838565b9060005260206000200154905080600883815481106148de576148de615838565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061491657614916615e3a565b6001900381819060005260206000200160009055905550505050565b600061493d83611f06565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b61498083836149a9565b61498d6000848484614695565b610db95760405162461bcd60e51b8152600401610aaf90615d5b565b6001600160a01b0382166149ff5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610aaf565b614a088161445e565b15614a255760405162461bcd60e51b8152600401610aaf90615e50565b614a3360008383600161447b565b614a3c8161445e565b15614a595760405162461bcd60e51b8152600401610aaf90615e50565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b031916841790555183929190600080516020615ec8833981519152908290a45050565b828054828255906000526020600020908101928215614af8579160200282015b82811115614af85782518290614ae89082615750565b5091602001919060010190614ad2565b50614b04929150614b08565b5090565b80821115614b04576000614b1c8282614b25565b50600101614b08565b508054614b31906156d0565b6000825580601f10614b41575050565b601f016020900490600052602060002090810190613b3e91905b80821115614b045760008155600101614b5b565b6001600160e01b031981168114613b3e57600080fd5b600060208284031215614b9757600080fd5b8135612e1d81614b6f565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715614be057614be0614ba2565b604052919050565b60006001600160401b03831115614c0157614c01614ba2565b614c14601f8401601f1916602001614bb8565b9050828152838383011115614c2857600080fd5b828260208301376000602084830101529392505050565b600082601f830112614c5057600080fd5b612e1d83833560208501614be8565b60006001600160401b03821115614c7857614c78614ba2565b5060051b60200190565b600082601f830112614c9357600080fd5b81356020614ca8614ca383614c5f565b614bb8565b82815260059290921b84018101918181019086841115614cc757600080fd5b8286015b84811015614d065780356001600160401b03811115614cea5760008081fd5b614cf88986838b0101614c3f565b845250918301918301614ccb565b509695505050505050565b600080600080600080600080610100898b031215614d2e57600080fd5b88356001600160401b0380821115614d4557600080fd5b614d518c838d01614c3f565b995060208b0135915080821115614d6757600080fd5b614d738c838d01614c3f565b985060408b0135915080821115614d8957600080fd5b614d958c838d01614c3f565b975060608b0135915080821115614dab57600080fd5b614db78c838d01614c3f565b965060808b0135915080821115614dcd57600080fd5b614dd98c838d01614c3f565b955060a08b0135915080821115614def57600080fd5b614dfb8c838d01614c3f565b945060c08b0135915080821115614e1157600080fd5b614e1d8c838d01614c3f565b935060e08b0135915080821115614e3357600080fd5b50614e408b828c01614c82565b9150509295985092959890939650565b60005b83811015614e6b578181015183820152602001614e53565b50506000910152565b60008151808452614e8c816020860160208601614e50565b601f01601f19169290920160200192915050565b602081526000612e1d6020830184614e74565b600060208284031215614ec557600080fd5b5035919050565b6001600160a01b0391909116815260200190565b80356001600160a01b0381168114612fec57600080fd5b60008060408385031215614f0a57600080fd5b614f1383614ee0565b946020939093013593505050565b6000806000806000806000806000806101408b8d031215614f4157600080fd5b8a35995060208b01356001600160401b0380821115614f5f57600080fd5b614f6b8e838f01614c3f565b9a5060408d0135915080821115614f8157600080fd5b614f8d8e838f01614c3f565b995060608d0135915080821115614fa357600080fd5b614faf8e838f01614c3f565b985060808d0135915080821115614fc557600080fd5b614fd18e838f01614c3f565b975060a08d0135915080821115614fe757600080fd5b614ff38e838f01614c3f565b965060c08d013591508082111561500957600080fd5b6150158e838f01614c3f565b955060e08d013591508082111561502b57600080fd5b6150378e838f01614c3f565b94506101008d013593506101208d013591508082111561505657600080fd5b506150638d828e01614c82565b9150509295989b9194979a5092959850565b6000806040838503121561508857600080fd5b8235915061509860208401614ee0565b90509250929050565b6000806000606084860312156150b657600080fd5b6150bf84614ee0565b92506150cd60208501614ee0565b9150604084013590509250925092565b600080604083850312156150f057600080fd5b50508035926020909101359150565b6001600160a01b03929092168252602082015260400190565b60006020828403121561512a57600080fd5b612e1d82614ee0565b60008060008060008060c0878903121561514c57600080fd5b863595506020870135945060408701359350606087013592506080870135915061517860a08801614ee0565b90509295509295509295565b6040815260006151976040830185614e74565b6020838203818501528185518084528284019150828160051b85010183880160005b838110156151e757601f198784030185526151d5838351614e74565b948601949250908501906001016151b9565b50909998505050505050505050565b6000806040838503121561520957600080fd5b8235915060208301356001600160401b0381111561522657600080fd5b61523285828601614c3f565b9150509250929050565b600080600080600060a0868803121561525457600080fd5b8535945061526460208701614ee0565b94979496505050506040830135926060810135926080909101359150565b6040815260006152956040830185614e74565b82810360208401526152a78185614e74565b95945050505050565b6000806000606084860312156152c557600080fd5b505081359360208301359350604090920135919050565b8015158114613b3e57600080fd5b600080604083850312156152fd57600080fd5b61530683614ee0565b91506020830135615316816152dc565b809150509250929050565b60008060006060848603121561533657600080fd5b83356001600160401b038082111561534d57600080fd5b818601915086601f83011261536157600080fd5b81356020615371614ca383614c5f565b82815260059290921b8401810191818101908a84111561539057600080fd5b948201945b838610156153ae57853582529482019490820190615395565b975050870135925050808211156153c457600080fd5b6153d087838801614c82565b935060408601359150808211156153e657600080fd5b506153f386828701614c82565b9150509250925092565b6000806000806080858703121561541357600080fd5b61541c85614ee0565b935061542a60208601614ee0565b92506040850135915060608501356001600160401b0381111561544c57600080fd5b8501601f8101871361545d57600080fd5b61546c87823560208401614be8565b91505092959194509250565b6000806040838503121561548b57600080fd5b61549483614ee0565b915060208301356001600160601b038116811461531657600080fd5b60c0815260006154c360c0830189614e74565b82810360208401526154d58189614e74565b905082810360408401526154e98188614e74565b905082810360608401526154fd8187614e74565b905082810360808401526155118186614e74565b905082810360a08401526155258185614e74565b9998505050505050505050565b600080600080600080600060e0888a03121561554d57600080fd5b8735965061555d60208901614ee0565b955061556b60408901614ee0565b945060608801356001600160401b0381111561558657600080fd5b6155928a828b01614c3f565b979a969950949760808101359660a0820135965060c090910135945092505050565b600080604083850312156155c757600080fd5b6155d083614ee0565b915061509860208401614ee0565b600080600080600060a086880312156155f657600080fd5b8535945061560660208701614ee0565b935060408601356001600160401b0381111561562157600080fd5b61562d88828901614c3f565b9598949750949560608101359550608001359392505050565b6000806040838503121561565957600080fd5b823591506020830135615316816152dc565b6001600160a01b039290921682526001600160e01b031916602082015260400190565b6000602082840312156156a057600080fd5b8151612e1d816152dc565b6020808252600b908201526a139bdd08185b1b1bddd95960aa1b604082015260600190565b600181811c908216806156e457607f821691505b60208210810361570457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610db957600081815260208120601f850160051c810160208610156157315750805b601f850160051c820191505b81811015611aaf5782815560010161573d565b81516001600160401b0381111561576957615769614ba2565b61577d8161577784546156d0565b8461570a565b602080601f8311600181146157b2576000841561579a5750858301515b600019600386901b1c1916600185901b178555611aaf565b600085815260208120601f198616915b828110156157e1578886015182559484019460019091019084016157c2565b50858210156157ff5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b808201808211156109925761099261580f565b634e487b7160e01b600052603260045260246000fd5b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b80820281158282048414176109925761099261580f565b6000826158cf57634e487b7160e01b600052601260045260246000fd5b500490565b6000602082840312156158e657600080fd5b5051919050565b818103818111156109925761099261580f565b60208082526021908201527f43616c6c6572206973206e6f7420746865204d696e74657220436f6e747261636040820152601d60fa1b606082015260800190565b602080825260189082015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604082015260600190565b60008154615980816156d0565b6001828116801561599857600181146159ad576159dc565b60ff19841687528215158302870194506159dc565b8560005260208060002060005b858110156159d35781548a8201529084019082016159ba565b50505082870194505b5050505092915050565b600083516159f8818460208801614e50565b6152a781840185615973565b600060018201615a1657615a1661580f565b5060010190565b696c657420686173683d2760b01b815260008551615a4281600a850160208a01614e50565b6d273b6c657420746f6b656e49643d60901b600a918401918201528551615a70816018840160208a01614e50565b6f3b6c657420746f6b656e446174613d5b60801b60189290910191820152615a9b6028820186615973565b9050615d3b60f01b81528351615ab8816002840160208801614e50565b016002019695505050505050565b6020808252600b908201526a2230ba3090333937bd32b760a91b604082015260600190565b60008351615afd818460208801614e50565b835190830190615b11818360208801614e50565b01949350505050565b60008251615b2c818460208701614e50565b6670656e64696e6760c81b920191825250600701919050565b7f3c68746d6c3e3c686561643e3c2f686561643e3c626f64793e3c7363726970748152651039b9319e9160d11b60208201526000615b866026830185615973565b72111f1e17b9b1b934b83a1f1e39b1b934b83a1f60691b81528351615bb2816013840160208801614e50565b761e17b9b1b934b83a1f1e17b137b23c9f1e17b43a36b61f60491b60139290910191820152602a01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c7b226e616d81526332911d1160e11b602082015260008651615c27816024850160208b01614e50565b701116113232b9b1b934b83a34b7b7111d1160791b602491840191820152615c526035820188615973565b6a11161134b6b0b3b2911d1160a91b81529050615c72600b820187615973565b6f222c2261747472696275746573223a5b60801b81529050615c976010820186615973565b90507f5d2c22616e696d6174696f6e5f75726c223a22646174613a746578742f68746d8152681b0ed8985cd94d8d0b60ba1b60208201528351615ce1816029840160208801614e50565b61227d60f01b60299290910191820152602b01979650505050505050565b60208082526025908201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060408201526437bbb732b960d91b606082015260800190565b600081615d5357615d5361580f565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000615db98285615973565b61202360f01b81528351615dd4816002840160208801614e50565b01600201949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e1390830184614e74565b9695505050505050565b600060208284031215615e2f57600080fd5b8151612e1d81614b6f565b634e487b7160e01b600052603160045260246000fd5b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060408201526060019056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212204e01c7afc738bf76fafb57bef1c544457acbb30776380f79698019d88361af0364736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f8000000000000000000000000000000000000000000000000000000000000000c4e65787447656e2036353239000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054e45585447000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : name (string): NextGen 6529
Arg [1] : symbol (string): NEXTG
Arg [2] : _adminsContract (address): 0x26AD9C64930bf5e057cB895a183436b30ad140f8
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000026ad9c64930bf5e057cb895a183436b30ad140f8
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [4] : 4e65787447656e20363532390000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [6] : 4e45585447000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
399:26116:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18715:182;;;;;;:::i;:::-;;:::i;:::-;;;565:14:20;;558:22;540:41;;528:2;513:18;18715:182:17;;;;;;;;4568:1149;;;;;;:::i;:::-;;:::i;:::-;;2486:100:5;;;:::i;:::-;;;;;;;:::i;2752:48:17:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3998:171:5;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3516:416::-;;;;;;:::i;:::-;;:::i;12579:1466:17:-;;;;;;:::i;:::-;;:::i;1675:113:6:-;1763:10;:17;1675:113;;;8168:25:20;;;8156:2;8141:18;1675:113:6;8022:177:20;7885:441:17;;;;;;:::i;:::-;;:::i;4698:301:5:-;;;;;;:::i;:::-;;:::i;2361:429:4:-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21002:137:17:-;;;;;;:::i;:::-;21077:4;21100:31;;;:16;:31;;;;;;;;;21002:137;1343:256:6;;;;;;:::i;:::-;;:::i;17084:618:17:-;;;;;;:::i;:::-;;:::i;18081:296::-;;;;;;:::i;:::-;;:::i;10914:1115::-;;;;;;:::i;:::-;;:::i;24178:241::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;5070:151:5:-;;;;;;:::i;:::-;;:::i;25099:122:17:-;;;;;;:::i;:::-;25164:7;25191:21;;;:11;:21;;;;;;;25099:122;1865:233:6;;;;;;:::i;:::-;;:::i;24494:551:17:-;;;;;;:::i;:::-;24579:7;24648:39;;;:24;:39;;;;;:63;;;24713:62;;;24777:67;;;;24846:61;;;;24909:67;;;;24978:58;;;;;-1:-1:-1;;;;;24648:63:17;;;;24713:62;;24777:67;;24846:61;;24978:58;;;24494:551;;;;;-1:-1:-1;;;;;11511:15:20;;;11493:34;;11558:2;11543:18;;11536:34;;;;11586:18;;11579:34;;;;11644:2;11629:18;;11622:34;;;;11687:3;11672:19;;11665:35;11737:15;;;11473:3;11716:19;;11709:44;11442:3;11427:19;24494:551:17;11168:591:20;2196:223:5;;;;;;:::i;:::-;;:::i;516:33:17:-;;;;;;14108:415;;;;;;:::i;:::-;;:::i;21861:172::-;;;;;;:::i;:::-;21935:7;21962:39;;;:24;:39;;;;;:62;;;;21861:172;25293:622;;;;;;:::i;:::-;;:::i;2656:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;1927:207:5;;;;;;:::i;:::-;;:::i;5872:1953:17:-;;;;;;:::i;:::-;;:::i;26300:210::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;3427:29::-;;;;;-1:-1:-1;;;;;3427:29:17;;;22352:170;;;;;;:::i;:::-;22424:7;22451:39;;;:24;:39;;;;;:62;;;;22352:170;23135:190;;;;;;:::i;:::-;23240:7;23268:38;;;:23;:38;;;;;;;;-1:-1:-1;;;;;23268:48:17;;;;;;;;;;;;;23135:190;2655:104:5;;;:::i;14987:304:17:-;;;;;;:::i;:::-;;:::i;16601:344::-;;;;;;:::i;:::-;;:::i;4241:155:5:-;;;;;;:::i;:::-;;:::i;15374:649:17:-;;;;;;:::i;:::-;;:::i;22100:172::-;;;;;;:::i;:::-;22169:7;22196:39;;;:24;:39;;;;;:67;;;;22100:172;10379:462;;;;;;:::i;:::-;;:::i;2949:44::-;;;;;;:::i;:::-;;:::i;5292:279:5:-;;;;;;:::i;:::-;;:::i;23381:176:17:-;;;;;;:::i;:::-;23457:7;23485:39;;;:24;:39;;;;;:63;-1:-1:-1;;;;;23485:63:17;;23381:176;16101:395;;;;;;:::i;:::-;;:::i;18949:1604::-;;;;;;:::i;:::-;;:::i;22600:195::-;;;;;;:::i;:::-;22705:7;22733:43;;;:28;:43;;;;;;;;-1:-1:-1;;;;;22733:53:17;;;;;;;;;;;;;22600:195;18436:191;;;;;;:::i;:::-;;:::i;23616:484::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;9279:1068::-;;;;;;:::i;:::-;;:::i;21418:135::-;;;;;;:::i;:::-;21494:4;21517:28;;;:13;:28;;;;;;;;;21418:135;3289:45;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2850:52;;;;;;:::i;:::-;;:::i;17754:271::-;;;;;;:::i;:::-;;:::i;22870:193::-;;;;;;:::i;:::-;22979:7;23007:37;;;:22;:37;;;;;;;;-1:-1:-1;;;;;23007:47:17;;;;;;;;;;;;;22870:193;4467:164:5;;;;;;:::i;:::-;;:::i;21621:172:17:-;;;;;;:::i;:::-;21695:7;21722:39;;;:24;:39;;;;;:62;;;;21621:172;25981:209;;;;;;:::i;:::-;;:::i;8398:816::-;;;;;;:::i;:::-;;:::i;14594:330::-;;;;;;:::i;:::-;;:::i;21209:137::-;;;;;;:::i;:::-;21277:7;21304:33;;;:23;:33;;;;;;;21209:137;18715:182;18827:4;18852:36;18876:11;18852:23;:36::i;:::-;18845:43;18715:182;-1:-1:-1;;18715:182:17:o;4568:1149::-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;4896:30:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;4896:30;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;;;;;;;;;4954:18:::1;::::0;4939:34:::1;::::0;;;:14:::1;:34;::::0;;;;:67:::1;4991:15:::0;4939:34;:67:::1;:::i;:::-;-1:-1:-1::0;5032:18:17::1;::::0;5017:34:::1;::::0;;;:14:::1;:34;::::0;;;;:51:::1;;:71;5071:17:::0;5017:51;:71:::1;:::i;:::-;-1:-1:-1::0;5114:18:17::1;::::0;5099:34:::1;::::0;;;:14:::1;:34;::::0;;;;:56:::1;;:81;5158:22:::0;5099:56;:81:::1;:::i;:::-;-1:-1:-1::0;5206:18:17::1;::::0;5191:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5246:18:::0;5191:52;:73:::1;:::i;:::-;-1:-1:-1::0;5290:18:17::1;::::0;5275:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5330:18:::0;5275:52;:73:::1;:::i;:::-;-1:-1:-1::0;5374:18:17::1;::::0;5359:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5414:18:::0;5359:52;:73:::1;:::i;:::-;-1:-1:-1::0;5458:18:17::1;::::0;5443:34:::1;::::0;;;:14:::1;:34;::::0;;;;:52:::1;;:73;5498:18:::0;5443:52;:73:::1;:::i;:::-;-1:-1:-1::0;5542:18:17::1;::::0;5527:34:::1;::::0;;;:14:::1;:34;::::0;;;;;;;:71;;::::1;::::0;:51:::1;::::0;;::::1;::::0;:71;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;5629:18:17::1;::::0;;5609:39:::1;::::0;;;:19:::1;:39;::::0;;;;:46;;-1:-1:-1;;5609:46:17::1;5651:4;5609:46:::0;;::::1;::::0;;;5687:18;;:22:::1;::::0;::::1;:::i;:::-;5666:18;:43:::0;-1:-1:-1;;;;;;;;;4568:1149:17:o;2486:100:5:-;2540:13;2573:5;2566:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2486:100;:::o;3998:171::-;4074:7;4094:23;4109:7;4094:14;:23::i;:::-;-1:-1:-1;4137:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4137:24:5;;3998:171::o;3516:416::-;3597:13;3613:23;3628:7;3613:14;:23::i;:::-;3597:39;;3661:5;-1:-1:-1;;;;;3655:11:5;:2;-1:-1:-1;;;;;3655:11:5;;3647:57;;;;-1:-1:-1;;;3647:57:5;;23135:2:20;3647:57:5;;;23117:21:20;23174:2;23154:18;;;23147:30;23213:34;23193:18;;;23186:62;-1:-1:-1;;;23264:18:20;;;23257:31;23305:19;;3647:57:5;22933:397:20;3647:57:5;736:10:2;-1:-1:-1;;;;;3739:21:5;;;;:62;;-1:-1:-1;3764:37:5;3781:5;736:10:2;4467:164:5;:::i;3764:37::-;3717:173;;;;-1:-1:-1;;;3717:173:5;;23537:2:20;3717:173:5;;;23519:21:20;23576:2;23556:18;;;23549:30;23615:34;23595:18;;;23588:62;23686:31;23666:18;;;23659:59;23735:19;;3717:173:5;23335:425:20;3717:173:5;3903:21;3912:2;3916:7;3903:8;:21::i;:::-;3586:346;3516:416;;:::o;12579:1466:17:-;4283:14;;:64;;-1:-1:-1;;;4283:64:17;;12976:13;;-1:-1:-1;;;12991:34:17;-1:-1:-1;;;;;4283:14:17;;;;:38;;:64;;4322:10;;12976:13;;4283:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4351:4;4283:72;;:143;;-1:-1:-1;4359:14:17;;:59;;-1:-1:-1;;;4359:59:17;;-1:-1:-1;;;;;4359:14:17;;;;:36;;:59;;4396:10;;4408:9;;4359:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4422:4;4359:67;4283:143;:201;;;-1:-1:-1;4430:14:17;;:46;;-1:-1:-1;;;4430:46:17;;-1:-1:-1;;;;;4430:14:17;;;;:34;;:46;;4465:10;;4430:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4480:4;4430:54;4283:201;4275:225;;;;-1:-1:-1;;;4275:225:17;;;;;;;:::i;:::-;13047:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;13046:90:::0;::::1;;;-1:-1:-1::0;13095:31:17::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;13046:90;13038:114;;;;-1:-1:-1::0;;;13038:114:17::1;;;;;;;:::i;:::-;13168:6;13178:7;13168:17:::0;13164:874:::1;;13202:29;::::0;;;:14:::1;:29;::::0;;;;:65:::1;13249:18:::0;13202:29;:65:::1;:::i;:::-;-1:-1:-1::0;13282:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:46:::1;;:69;13331:20:::0;13282:46;:69:::1;:::i;:::-;-1:-1:-1::0;13366:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:51:::1;;:79;13420:25:::0;13366:51;:79:::1;:::i;:::-;-1:-1:-1::0;13460:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13510:21:::0;13460:47;:71:::1;:::i;:::-;-1:-1:-1::0;13546:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13596:21:::0;13546:47;:71:::1;:::i;:::-;-1:-1:-1::0;13632:29:17::1;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13682:21:::0;13632:47;:71:::1;:::i;:::-;-1:-1:-1::0;13718:29:17::1;::::0;;;:14:::1;:29;::::0;;;;;;;:69;;::::1;::::0;:46:::1;::::0;;::::1;::::0;:69;::::1;::::0;::::1;:::i;:::-;;13164:874;;;13809:6;13819;13809:16:::0;13805:233:::1;;13842:29;::::0;;;:14:::1;:29;::::0;;;;:47:::1;;:71;13892:21:::0;13842:47;:71:::1;:::i;13805:233::-;14003:20;14024:1;14003:23;;;;;;;;:::i;:::-;;;;;;;13946:14;:29;13961:13;13946:29;;;;;;;;;;;:46;;13993:6;13946:54;;;;;;;;:::i;:::-;;;;;;;;:80;;;;;;:::i;:::-;;13805:233;12579:1466:::0;;;;;;;;;;;;:::o;7885:441::-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;7989:27:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;7989:27;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;8049:19:::1;-1:-1:-1::0;;;;;8037:53:17::1;;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:63;;8096:4;8037:63;8029:102;;;::::0;-1:-1:-1;;;8029:102:17;;24099:2:20;8029:102:17::1;::::0;::::1;24081:21:20::0;24138:2;24118:18;;;24111:30;24177:28;24157:18;;;24150:56;24223:18;;8029:102:17::1;23897:350:20::0;8029:102:17::1;-1:-1:-1::0;8142:39:17::1;::::0;;;:24:::1;:39;::::0;;;;;:58:::1;::::0;::::1;:80:::0;;-1:-1:-1;;;;;8142:80:17;;::::1;-1:-1:-1::0;;;;;;8142:80:17;;::::1;::::0;::::1;::::0;;;8233:50:::1;::::0;;::::1;:85:::0;;;;::::1;;::::0;;7885:441::o;4698:301:5:-;4859:41;736:10:2;4878:12:5;4892:7;4859:18;:41::i;:::-;4851:99;;;;-1:-1:-1;;;4851:99:5;;;;;;;:::i;:::-;4963:28;4973:4;4979:2;4983:7;4963:9;:28::i;2361:429:4:-;2447:7;2505:26;;;:17;:26;;;;;;;;2476:55;;;;;;;;;-1:-1:-1;;;;;2476:55:4;;;;;-1:-1:-1;;;2476:55:4;;;-1:-1:-1;;;;;2476:55:4;;;;;;;;2447:7;;2544:92;;-1:-1:-1;2595:29:4;;;;;;;;;2605:19;2595:29;-1:-1:-1;;;;;2595:29:4;;;;-1:-1:-1;;;2595:29:4;;-1:-1:-1;;;;;2595:29:4;;;;;2544:92;2685:23;;;;2648:21;;3156:5;;2673:35;;-1:-1:-1;;;;;2673:35:4;:9;:35;:::i;:::-;2672:57;;;;:::i;:::-;2750:16;;;;;-1:-1:-1;2361:429:4;;-1:-1:-1;;;;2361:429:4:o;1343:256:6:-;1440:7;1476:23;1493:5;1476:16;:23::i;:::-;1468:5;:31;1460:87;;;;-1:-1:-1;;;1460:87:6;;25395:2:20;1460:87:6;;;25377:21:20;25434:2;25414:18;;;25407:30;25473:34;25453:18;;;25446:62;-1:-1:-1;;;25524:18:20;;;25517:41;25575:19;;1460:87:6;25193:407:20;1460:87:6;-1:-1:-1;;;;;;1565:19:6;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1343:256::o;17084:618:17:-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;17160:28:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;17160:28;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;17288:39:::1;::::0;;;:24:::1;:39;::::0;;;;;;:67:::1;;::::0;17244:14:::1;::::0;17228:57;;-1:-1:-1;;;17228:57:17;;::::1;::::0;::::1;8168:25:20::0;;;17288:67:17;;-1:-1:-1;;;;;17244:14:17::1;::::0;17228:42:::1;::::0;8141:18:20;;17228:57:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:127;;;;:::i;:::-;17210:15;:145;17201:178;;;::::0;-1:-1:-1;;;17201:178:17;;25996:2:20;17201:178:17::1;::::0;::::1;25978:21:20::0;26035:2;26015:18;;;26008:30;-1:-1:-1;;;26054:18:20;;;26047:49;26113:18;;17201:178:17::1;25794:343:20::0;17201:178:17::1;17454:39;::::0;;;:24:::1;:39;::::0;;;;:67:::1;::::0;::::1;::::0;17390:61:::1;::::0;;::::1;:131:::0;;;17693:1:::1;::::0;17598:27:::1;17479:13:::0;17614:11:::1;17598:27;:::i;:::-;17597:93;;;;:::i;:::-;:97;;;;:::i;:::-;17532:39;::::0;;;:24:::1;:39;::::0;;;;;:62:::1;;:162:::0;;;;-1:-1:-1;17084:618:17:o;18081:296::-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;18167:33:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;18167:33;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;18236:18:::1;-1:-1:-1::0;;;;;18221:50:17::1;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;18277:4;18221:60;18213:94;;;::::0;-1:-1:-1;;;18213:94:17;;26477:2:20;18213:94:17::1;::::0;::::1;26459:21:20::0;26516:2;26496:18;;;26489:30;-1:-1:-1;;;26535:18:20;;;26528:51;26596:18;;18213:94:17::1;26275:345:20::0;18213:94:17::1;-1:-1:-1::0;18318:14:17::1;:51:::0;;-1:-1:-1;;;;;;18318:51:17::1;-1:-1:-1::0;;;;;18318:51:17;;;::::1;::::0;;;::::1;::::0;;18081:296::o;10914:1115::-;11103:14;;-1:-1:-1;;;;;11103:14:17;11089:10;:28;11081:74;;;;-1:-1:-1;;;11081:74:17;;;;;;;:::i;:::-;11174:36;11193:6;11201:8;11174:18;:36::i;:::-;11166:94;;;;-1:-1:-1;;;11166:94:17;;;;;;;:::i;:::-;11345:43;;;;:24;:43;;;;;:71;;;:75;;11419:1;11345:75;:::i;:::-;11271:43;;;;:24;:43;;;;;:71;;;:149;;;11435:65;;;:140;11431:591;;11592:13;11608:17;11616:8;11608:7;:17::i;:::-;11592:33;;11640:15;11646:8;11640:5;:15::i;:::-;11702:29;;;;:10;:29;;;;;;:33;;11734:1;11702:33;:::i;:::-;11670:29;;;;:10;:29;;;;;;;;:65;;;;11801:41;;;:22;:41;;;;;-1:-1:-1;;;;;11801:48:17;;;;;;;;:52;;11852:1;11801:52;:::i;:::-;11750:41;;;;:22;:41;;;;;;;;-1:-1:-1;;;;;11750:48:17;;;;;;;;;:103;;;;11902:19;;;:9;:19;;;11868:85;;;;11884:9;;11792:5;;11902:19;11868:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11923:17;11942:10;11868:15;:85::i;:::-;11577:388;11431:591;;;11986:24;;-1:-1:-1;;;11986:24:17;;27229:2:20;11986:24:17;;;27211:21:20;27268:2;27248:18;;;27241:30;-1:-1:-1;;;27287:18:20;;;27280:44;27341:18;;11986:24:17;27027:338:20;11431:591:17;10914:1115;;;;;;:::o;24178:241::-;24315:29;;;;:14;:29;;;;;:47;;;24307:104;;24265:13;;;;24315:47;24364:46;;;;;24315:47;;24307:104;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24178:241;;;:::o;5070:151:5:-;5174:39;5191:4;5197:2;5201:7;5174:39;;;;;;;;;;;;:16;:39::i;1865:233:6:-;1940:7;1976:30;1763:10;:17;;1675:113;1976:30;1968:5;:38;1960:95;;;;-1:-1:-1;;;1960:95:6;;27572:2:20;1960:95:6;;;27554:21:20;27611:2;27591:18;;;27584:30;27650:34;27630:18;;;27623:62;-1:-1:-1;;;27701:18:20;;;27694:42;27753:19;;1960:95:6;27370:408:20;1960:95:6;2073:10;2084:5;2073:17;;;;;;;;:::i;:::-;;;;;;;;;2066:24;;1865:233;;;:::o;2196:223:5:-;2268:7;6929:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6929:16:5;;2332:56;;;;-1:-1:-1;;;2332:56:5;;;;;;;:::i;14108:415:17:-;14222:39;;;;:24;:39;;;;;:63;-1:-1:-1;;;;;14222:63:17;14208:10;:77;14200:100;;;;-1:-1:-1;;;14200:100:17;;28338:2:20;14200:100:17;;;28320:21:20;28377:2;28357:18;;;28350:30;-1:-1:-1;;;28396:18:20;;;28389:40;28446:18;;14200:100:17;28136:334:20;14200:100:17;14319:27;;;;:12;:27;;;;;;;;:36;14311:55;;;;-1:-1:-1;;;14311:55:17;;28677:2:20;14311:55:17;;;28659:21:20;28716:1;28696:18;;;28689:29;-1:-1:-1;;;28734:18:20;;;28727:36;28780:18;;14311:55:17;28475:329:20;14311:55:17;14412:1;14391:10;14385:24;:28;14377:37;;;;;;14425:32;;;;:17;:32;;;;;:45;14460:10;14425:32;:45;:::i;:::-;-1:-1:-1;;14481:27:17;;;;:12;:27;;;;;:34;;-1:-1:-1;;14481:34:17;14511:4;14481:34;;;14108:415::o;25293:622::-;25364:13;25389:23;25404:7;25389:14;:23::i;:::-;25423:24;25463:9;25458:248;25480:48;25495:32;;;:23;:32;;;;;;;;;25480:48;;:14;:48;;;;;:65;;:72;25476:76;;25458:248;;;25623:48;25638:32;;;:23;:32;;;;;;;;;25623:48;;:14;:48;;;;;:65;;:68;;25611:10;;25623:65;25689:1;;25623:68;;;;;;:::i;:::-;;;;;;;;25594:98;;;;;;;;;:::i;:::-;;;;;;;;;;;;;25574:119;;25554:3;;;;;:::i;:::-;;;;25458:248;;;-1:-1:-1;25788:20:17;;;;:11;:20;;;;;;;;;25760:54;;:19;:54::i;:::-;25832:18;:7;:16;:18::i;:::-;25870;;;;:9;:18;;;;;;;;;25730:176;;;;;;25870:18;25895:10;;25730:176;;:::i;:::-;;;;;;;;;;;;;25716:191;;;25293:622;;;:::o;1927:207:5:-;1999:7;-1:-1:-1;;;;;2027:19:5;;2019:73;;;;-1:-1:-1;;;2019:73:5;;31643:2:20;2019:73:5;;;31625:21:20;31682:2;31662:18;;;31655:30;31721:34;31701:18;;;31694:62;-1:-1:-1;;;31772:18:20;;;31765:39;31821:19;;2019:73:5;31441:405:20;2019:73:5;-1:-1:-1;;;;;;2110:16:5;;;;;:9;:16;;;;;;;1927:207::o;5872:1953:17:-;4283:14;;:64;;-1:-1:-1;;;4283:64:17;;6087:13;;-1:-1:-1;;;6102:31:17;-1:-1:-1;;;;;4283:14:17;;;;:38;;:64;;4322:10;;6087:13;;4283:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4351:4;4283:72;;:143;;-1:-1:-1;4359:14:17;;:59;;-1:-1:-1;;;4359:59:17;;-1:-1:-1;;;;;4359:14:17;;;;:36;;:59;;4396:10;;4408:9;;4359:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4422:4;4359:67;4283:143;:201;;;-1:-1:-1;4430:14:17;;:46;;-1:-1:-1;;;4430:46:17;;-1:-1:-1;;;;;4430:14:17;;;;:34;;:46;;4465:10;;4430:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4480:4;4430:54;4283:201;4275:225;;;;-1:-1:-1;;;4275:225:17;;;;;;;:::i;:::-;6155:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;6154:90:::0;::::1;;;-1:-1:-1::0;6203:31:17::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;6154:90;:133;;;;;6275:11;6249:22;:37;;6154:133;6146:157;;;::::0;-1:-1:-1;;;6146:157:17;;32053:2:20;6146:157:17::1;::::0;::::1;32035:21:20::0;32092:2;32072:18;;;32065:30;-1:-1:-1;;;32111:18:20;;;32104:41;32162:18;;6146:157:17::1;31851:335:20::0;6146:157:17::1;6318:39;::::0;;;:24:::1;:39;::::0;;;;:61:::1;;::::0;:66;;6314:1504:::1;;6401:39;::::0;;;:24:::1;:39;::::0;;;;:90;;-1:-1:-1;;;;;;6401:90:17::1;-1:-1:-1::0;;;;;6401:90:17;::::1;;::::0;;-1:-1:-1;6506:62:17;::::1;:88:::0;;;6609:67:::1;::::0;::::1;:71:::0;;;;6695:61:::1;::::0;::::1;:86:::0;;;6796:67:::1;;:98:::0;;;6975:27:::1;6401:39:::0;6991:11:::1;6975:27;:::i;:::-;6909:39;::::0;;;:24:::1;:39;::::0;;;;:62:::1;;:94:::0;7140:1:::1;7115:22:::0;7084:27:::1;6934:13:::0;7100:11:::1;7084:27;:::i;:::-;7083:54;;;;:::i;:::-;:58;;;;:::i;:::-;7018:39;::::0;;;:24:::1;:39;::::0;;;;;;;:62:::1;;:123:::0;;;;7156:13:::1;:28:::0;;;:35;;-1:-1:-1;;7156:35:17::1;7187:4;7156:35;::::0;;6314:1504:::1;;;7213:27;::::0;;;:12:::1;:27;::::0;;;;;::::1;;:36;;::::0;;7209:609:::1;;7266:39;::::0;;;:24:::1;:39;::::0;;;;:90;;-1:-1:-1;;;;;;7266:90:17::1;-1:-1:-1::0;;;;;7266:90:17;::::1;;::::0;;-1:-1:-1;7371:62:17;::::1;:88:::0;;;7474:67:::1;;:98:::0;;;7209:609:::1;;;7605:39;::::0;;;:24:::1;:39;::::0;;;;:62:::1;::::0;::::1;:88:::0;;;7708:67:::1;;:98:::0;;;7209:609:::1;5872:1953:::0;;;;;;;:::o;26300:210::-;26428:33;;;;:23;:33;;;;;26420:82;;26379:13;;;;26499:1;26465:36;;;26428:33;;26420:82;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26300:210;;;:::o;2655:104:5:-;2711:13;2744:7;2737:14;;;;;:::i;14987:304:17:-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;15082:29:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;15082:29;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;15132:51:::1;15149:33:::0;;;:23:::1;:33;::::0;;;;;;;;15132:51;;:16:::1;:51:::0;;;;;;::::1;;:60;15124:84;;;;-1:-1:-1::0;;;15124:84:17::1;;;;;;;:::i;:::-;15219:24;15234:8;15219:14;:24::i;:::-;15254:19;::::0;;;:9:::1;:19;::::0;;;;:29:::1;15276:7:::0;15254:19;:29:::1;:::i;:::-;;14987:304:::0;;;:::o;16601:344::-;16723:39;;;;:24;:39;;;;;:58;;;-1:-1:-1;;;;;16723:58:17;16709:10;:72;16701:81;;;;;;16801:23;;;;:11;:23;;;;;;:93;16793:102;;;;;;16906:23;;;;:11;:23;;;;;;:31;-1:-1:-1;16601:344:17:o;4241:155:5:-;4336:52;736:10:2;4369:8:5;4379;4336:18;:52::i;:::-;4241:155;;:::o;15374:649:17:-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;15519:39:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;15519:39;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;15599:7:::1;:14;15580:8;:15;:33;15579:77;;;;;15637:11;:18;15619:7;:14;:36;15579:77;15571:98;;;::::0;-1:-1:-1;;;15571:98:17;;32733:2:20;15571:98:17::1;::::0;::::1;32715:21:20::0;32772:1;32752:18;;;32745:29;-1:-1:-1;;;32790:18:20;;;32783:37;32837:18;;15571:98:17::1;32531:330:20::0;15571:98:17::1;15685:9;15680:336;15700:8;:15;15696:1;:19;15680:336;;;15745:16;:54;15762:23;:36;15786:8;15795:1;15786:11;;;;;;;;:::i;:::-;;;;;;;15762:36;;;;;;;;;;;;15745:54;;;;;;;;;;;;;;;;;;;;;:63;;15803:5;15745:63;;;15737:87;;;;-1:-1:-1::0;;;15737:87:17::1;;;;;;;:::i;:::-;15839:27;15854:8;15863:1;15854:11;;;;;;;;:::i;:::-;;;;;;;15839:14;:27::i;:::-;15923:7;15931:1;15923:10;;;;;;;;:::i;:::-;;;;;;;15881:23;:36;15905:8;15914:1;15905:11;;;;;;;;:::i;:::-;;;;;;;15881:36;;;;;;;;;;;15918:1;15881:39;;;;;;;:::i;:::-;;::::0;:52:::1;::::0;:39;:52:::1;:::i;:::-;;15990:11;16002:1;15990:14;;;;;;;;:::i;:::-;;;;;;;15948:23;:36;15972:8;15981:1;15972:11;;;;;;;;:::i;:::-;;;;;;;15948:36;;;;;;;;;;;15985:1;15948:39;;;;;;;:::i;:::-;;::::0;:56:::1;::::0;:39;:56:::1;:::i;:::-;-1:-1:-1::0;15717:3:17;::::1;::::0;::::1;:::i;:::-;;;;15680:336;;;;15374:649:::0;;;;:::o;10379:462::-;10460:42;736:10:2;10479:12:17;656:98:2;10460:42:17;10452:100;;;;-1:-1:-1;;;10452:100:17;;;;;;;:::i;:::-;10585:39;;;;:24;:39;;;;;:62;;;10573:74;;;;;10572:156;;-1:-1:-1;10665:39:17;;;;:24;:39;;;;;:62;;;10653:74;;;10572:156;10563:176;;;;-1:-1:-1;;;10563:176:17;;33068:2:20;10563:176:17;;;33050:21:20;33107:1;33087:18;;;33080:29;-1:-1:-1;;;33125:18:20;;;33118:36;33171:18;;10563:176:17;32866:329:20;10563:176:17;10750:15;10756:8;10750:5;:15::i;:::-;10804:25;;;;:10;:25;;;;;;:29;;10832:1;10804:29;:::i;:::-;10776:25;;;;:10;:25;;;;;;:57;;;;-1:-1:-1;10379:462:17:o;2949:44::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5292:279:5:-;5423:41;736:10:2;5456:7:5;5423:18;:41::i;:::-;5415:99;;;;-1:-1:-1;;;5415:99:5;;;;;;;:::i;:::-;5525:38;5539:4;5545:2;5549:7;5558:4;5525:13;:38::i;16101:395:17:-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;16179:30:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;16179:30;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;16264:14:::1;::::0;16248:57:::1;::::0;-1:-1:-1;;;16248:57:17;;::::1;::::0;::::1;8168:25:20::0;;;-1:-1:-1;;;;;16264:14:17;;::::1;::::0;16248:42:::1;::::0;8141:18:20;;16248:57:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16230:15;:75;:141;;;;-1:-1:-1::0;16325:14:17::1;::::0;16309:57:::1;::::0;-1:-1:-1;;;16309:57:17;;::::1;::::0;::::1;8168:25:20::0;;;-1:-1:-1;;;;;16325:14:17;;::::1;::::0;16309:42:::1;::::0;8141:18:20;;16309:57:17::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62:::0;::::1;16230:141;16222:150;;;::::0;::::1;;16391:28;::::0;;;:13:::1;:28;::::0;;;;;::::1;;:36;;:28:::0;:36:::1;16383:56;;;::::0;-1:-1:-1;;;16383:56:17;;33402:2:20;16383:56:17::1;::::0;::::1;33384:21:20::0;33441:1;33421:18;;;33414:29;-1:-1:-1;;;33459:18:20;;;33452:37;33506:18;;16383:56:17::1;33200:330:20::0;16383:56:17::1;-1:-1:-1::0;16450:31:17::1;::::0;;;:16:::1;:31;::::0;;;;:38;;-1:-1:-1;;16450:38:17::1;16484:4;16450:38;::::0;;16101:395::o;18949:1604::-;19022:13;19048:23;19063:7;19048:14;:23::i;:::-;19086:49;19102:32;;;:23;:32;;;;;;;;;19086:49;;:15;:49;;;;;;;;:58;;;:152;;-1:-1:-1;19148:20:17;;;;:11;:20;;;;;;:90;;19086:152;19082:1464;;;19255:21;19294:32;;;:23;:32;;;;;;;;;19279:48;;:14;:48;;;;;:66;;19255:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19391:1;19373:7;19367:21;:25;:86;;;;;;;;;;;;;;;;;19419:7;19428:18;:7;:16;:18::i;:::-;19402:45;;;;;;;;;:::i;19367:86::-;19360:93;18949:1604;-1:-1:-1;;;18949:1604:17:o;19082:1464::-;19475:49;19491:32;;;:23;:32;;;;;;;;;19475:49;;:15;:49;;;;;;;;:58;;;:152;;-1:-1:-1;19537:20:17;;;;:11;:20;;;;;;:90;19475:152;19471:1075;;;19644:21;19683:32;;;:23;:32;;;;;;;;;19668:48;;:14;:48;;;;;:66;;19644:90;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19780:1;19762:7;19756:21;:25;:77;;;;;;;;;;;;;;;;;19808:7;19791:36;;;;;;;;:::i;19471:1075::-;19875:17;19983:32;;;:23;:32;;;;;;;;;19968:48;;:14;:48;;;;;19895:224;;19968:66;;20058:33;20007:7;20058:24;:33::i;:::-;19909:209;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19895:13;:224::i;:::-;19875:244;;20134:18;20221:21;20234:7;20221:12;:21::i;:::-;20267:48;20282:32;;;:23;:32;;;;;;;;;20267:48;;:14;:48;;;;;20356:32;;;:23;:32;;;;;;20162:345;;;;;20267:70;;;20447:1;20414:35;;;20497:3;;20162:345;;:::i;:::-;;;;-1:-1:-1;;20162:345:17;;;;;;;;;;18949:1604;-1:-1:-1;;;;18949:1604:17:o;19471:1075::-;18949:1604;;;:::o;18436:191::-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;18532:33:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;18532:33;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;18578:41:::1;18597:15;18614:4;18578:18;:41::i;23616:484::-:0;23799:29;;;;:14;:29;;;;;23791:301;;23691:13;;;;;;;;;;;;23845:46;;;;23893:51;;;;23946:47;;;;23995;;;;24044;;;;23799:29;;23791:301;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23616:484;;;;;;;:::o;9279:1068::-;9481:14;;-1:-1:-1;;;;;9481:14:17;9467:10;:28;9459:74;;;;-1:-1:-1;;;9459:74:17;;;;;;;:::i;:::-;9614:39;;;;:24;:39;;;;;:67;;;:71;;9684:1;9614:71;:::i;:::-;9544:39;;;;:24;:39;;;;;:67;;;:141;;;9700:61;;;:132;9696:644;;9853:5;9862:1;9853:10;9849:334;;9947:43;;;;:28;:43;;;;;;;;-1:-1:-1;;;;;9947:60:17;;;;;;;;;;:64;;10010:1;9947:64;:::i;:::-;9884:43;;;;:28;:43;;;;;;;;-1:-1:-1;;;;;9884:60:17;;;;;;;;;:127;9849:334;;;10109:37;;;;:22;:37;;;;;;;;-1:-1:-1;;;;;10109:54:17;;;;;;;;;;:58;;10166:1;10109:58;:::i;:::-;10052:37;;;;:22;:37;;;;;;;;-1:-1:-1;;;;;10052:54:17;;;;;;;;;:115;9849:334;10197:74;10213:9;10224:7;10233:10;10245:13;10260:10;10197:15;:74::i;:::-;9696:644;;2850:52;;;;;;;;;;;;;;;;:::i;17754:271::-;3935:14;;:59;;-1:-1:-1;;;3935:59:17;;-1:-1:-1;;;17835:31:17;-1:-1:-1;;;;;3935:14:17;;:36;;:59;;3972:10;;17835:31;;3935:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;3998:4;3935:67;;:125;;-1:-1:-1;4006:14:17;;:46;;-1:-1:-1;;;4006:46:17;;-1:-1:-1;;;;;4006:14:17;;;;:34;;:46;;4041:10;;4006:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4056:4;4006:54;3935:125;3927:150;;;;-1:-1:-1;;;3927:150:17;;;;;;;:::i;:::-;17904:15:::1;-1:-1:-1::0;;;;;17888:49:17::1;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;;17943:4;17888:59;17880:94;;;::::0;-1:-1:-1;;;17880:94:17;;37660:2:20;17880:94:17::1;::::0;::::1;37642:21:20::0;37699:2;37679:18;;;37672:30;-1:-1:-1;;;37718:18:20;;;37711:52;37780:18;;17880:94:17::1;37458:346:20::0;17880:94:17::1;-1:-1:-1::0;17985:14:17::1;:32:::0;;-1:-1:-1;;;;;;17985:32:17::1;-1:-1:-1::0;;;;;17985:32:17;;;::::1;::::0;;;::::1;::::0;;17754:271::o;4467:164:5:-;-1:-1:-1;;;;;4588:25:5;;;4564:4;4588:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4467:164::o;25981:209:17:-;26058:7;26156:25;;;:10;:25;;;;;;;;;26086:24;:39;;;;;:67;;;:95;;26156:25;26086:95;:::i;8398:816::-;8571:14;;-1:-1:-1;;;;;8571:14:17;8557:10;:28;8549:74;;;;-1:-1:-1;;;8549:74:17;;;;;;;:::i;:::-;8704:39;;;;:24;:39;;;;;:67;;;:71;;8774:1;8704:71;:::i;:::-;8634:39;;;;:24;:39;;;;;:67;;;:141;;;8790:61;;;:132;8786:421;;8992:38;;;;:23;:38;;;;;;;;-1:-1:-1;;;;;8992:50:17;;;;;;;;;;:54;;9045:1;8992:54;:::i;:::-;8939:38;;;;:23;:38;;;;;;;;-1:-1:-1;;;;;8939:50:17;;;;;;;;;:107;9061:77;9077:9;8978:10;9100;8963:13;9127:10;9061:15;:77::i;:::-;8786:421;;14594:330;4283:14;;:64;;-1:-1:-1;;;4283:64:17;;14690:13;;-1:-1:-1;;;14705:32:17;-1:-1:-1;;;;;4283:14:17;;;;:38;;:64;;4322:10;;14690:13;;4283:64;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:72;;4351:4;4283:72;;:143;;-1:-1:-1;4359:14:17;;:59;;-1:-1:-1;;;4359:59:17;;-1:-1:-1;;;;;4359:14:17;;;;:36;;:59;;4396:10;;4408:9;;4359:59;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:67;;4422:4;4359:67;4283:143;:201;;;-1:-1:-1;4430:14:17;;:46;;-1:-1:-1;;;4430:46:17;;-1:-1:-1;;;;;4430:14:17;;;;:34;;:46;;4465:10;;4430:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;4480:4;4430:54;4283:201;4275:225;;;;-1:-1:-1;;;4275:225:17;;;;;;;:::i;:::-;14760:34:::1;::::0;;;:19:::1;:34;::::0;;;;;::::1;;:42;;:34:::0;:42:::1;14759:90:::0;::::1;;;-1:-1:-1::0;14808:31:17::1;::::0;;;:16:::1;:31;::::0;;;;;::::1;;:40;14759:90;14751:114;;;;-1:-1:-1::0;;;14751:114:17::1;;;;;;;:::i;:::-;-1:-1:-1::0;;14876:30:17::1;::::0;;;:15:::1;:30;::::0;;;;;:40;;-1:-1:-1;;14876:40:17::1;::::0;::::1;;::::0;;;::::1;::::0;;14594:330::o;2091:215:4:-;2193:4;-1:-1:-1;;;;;;2217:41:4;;-1:-1:-1;;;2217:41:4;;:81;;;2262:36;2286:11;2262:23;:36::i;13561:135:5:-;13643:16;13651:7;13643;:16::i;:::-;13635:53;;;;-1:-1:-1;;;13635:53:5;;;;;;;:::i;:::-;13561:135;:::o;12874:174::-;12949:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;12949:29:5;-1:-1:-1;;;;;12949:29:5;;;;;;;;:24;;13003:23;12949:24;13003:14;:23::i;:::-;-1:-1:-1;;;;;12994:46:5;;;;;;;;;;;12874:174;;:::o;7561:264::-;7654:4;7671:13;7687:23;7702:7;7687:14;:23::i;:::-;7671:39;;7740:5;-1:-1:-1;;;;;7729:16:5;:7;-1:-1:-1;;;;;7729:16:5;;:52;;;;7749:32;7766:5;7773:7;7749:16;:32::i;:::-;7729:87;;;;7809:7;-1:-1:-1;;;;;7785:31:5;:20;7797:7;7785:11;:20::i;:::-;-1:-1:-1;;;;;7785:31:5;;7729:87;7721:96;7561:264;-1:-1:-1;;;;7561:264:5:o;11526:1229::-;11651:4;-1:-1:-1;;;;;11624:31:5;:23;11639:7;11624:14;:23::i;:::-;-1:-1:-1;;;;;11624:31:5;;11616:81;;;;-1:-1:-1;;;11616:81:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;11716:16:5;;11708:65;;;;-1:-1:-1;;;11708:65:5;;38417:2:20;11708:65:5;;;38399:21:20;38456:2;38436:18;;;38429:30;38495:34;38475:18;;;38468:62;-1:-1:-1;;;38546:18:20;;;38539:34;38590:19;;11708:65:5;38215:400:20;11708:65:5;11786:42;11807:4;11813:2;11817:7;11826:1;11786:20;:42::i;:::-;11958:4;-1:-1:-1;;;;;11931:31:5;:23;11946:7;11931:14;:23::i;:::-;-1:-1:-1;;;;;11931:31:5;;11923:81;;;;-1:-1:-1;;;11923:81:5;;;;;;;:::i;:::-;12076:24;;;;:15;:24;;;;;;;;12069:31;;-1:-1:-1;;;;;;12069:31:5;;;;;;-1:-1:-1;;;;;12552:15:5;;;;;;:9;:15;;;;;:20;;-1:-1:-1;;12552:20:5;;;12587:13;;;;;;;;;:18;;12069:31;12587:18;;;12627:16;;;:7;:16;;;;;;:21;;;;;;;;;;12666:27;;12092:7;;-1:-1:-1;;;;;;;;;;;12666:27:5;;3586:346;3516:416;;:::o;10406:783::-;10466:13;10482:23;10497:7;10482:14;:23::i;:::-;10466:39;;10518:51;10539:5;10554:1;10558:7;10567:1;10518:20;:51::i;:::-;10682:23;10697:7;10682:14;:23::i;:::-;10753:24;;;;:15;:24;;;;;;;;10746:31;;-1:-1:-1;;;;;;10746:31:5;;;;;;-1:-1:-1;;;;;10998:16:5;;;;;:9;:16;;;;;:21;;-1:-1:-1;;10998:21:5;;;11048:16;;;:7;:16;;;;;;11041:23;;;;;;;11082:36;10674:31;;-1:-1:-1;10769:7:5;;-1:-1:-1;;;;;;;;;;;11082:36:5;10753:24;;11082:36;4241:155;;:::o;12063:421:17:-;12217:21;;;;:9;:21;;;;;:34;12241:10;12217:21;:34;:::i;:::-;-1:-1:-1;12262:35:17;;;;:23;:35;;;;;:51;;;12324:33;12334:10;12286;12324:9;:33::i;:::-;12368:39;;;;:24;:39;;;;;;;:50;;;:108;;-1:-1:-1;;;12368:108:17;;;;;38822:25:20;;;38863:18;;;38856:34;;;38906:18;;;38899:34;;;-1:-1:-1;;;;;12368:50:17;;;;:69;;38795:18:20;;12368:108:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12063:421;;;;;:::o;1869:447:19:-;1944:13;1970:19;2002:10;2006:6;2002:1;:10;:::i;:::-;:14;;2015:1;2002:14;:::i;:::-;-1:-1:-1;;;;;1992:25:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1992:25:19;;1970:47;;-1:-1:-1;;;2028:6:19;2035:1;2028:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2028:15:19;;;;;;;;;-1:-1:-1;;;2054:6:19;2061:1;2054:9;;;;;;;;:::i;:::-;;;;:15;-1:-1:-1;;;;;2054:15:19;;;;;;;;-1:-1:-1;2085:9:19;2097:10;2101:6;2097:1;:10;:::i;:::-;:14;;2110:1;2097:14;:::i;:::-;2085:26;;2080:131;2117:1;2113;:5;2080:131;;;-1:-1:-1;;;2161:5:19;2169:3;2161:11;2152:21;;;;;;;:::i;:::-;;;;2140:6;2147:1;2140:9;;;;;;;;:::i;:::-;;;;:33;-1:-1:-1;;;;;2140:33:19;;;;;;;;-1:-1:-1;2198:1:19;2188:11;;;;;2120:3;;;:::i;:::-;;;2080:131;;;-1:-1:-1;2229:10:19;;2221:55;;;;-1:-1:-1;;;2221:55:19;;39287:2:20;2221:55:19;;;39269:21:20;;;39306:18;;;39299:30;39365:34;39345:18;;;39338:62;39417:18;;2221:55:19;39085:356:20;457:716:19;513:13;564:14;581:17;592:5;581:10;:17::i;:::-;601:1;581:21;564:38;;617:20;651:6;-1:-1:-1;;;;;640:18:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;640:18:19;-1:-1:-1;617:41:19;-1:-1:-1;782:28:19;;;798:2;782:28;839:288;-1:-1:-1;;871:5:19;-1:-1:-1;;;1008:2:19;997:14;;992:30;871:5;979:44;1069:2;1060:11;;;-1:-1:-1;1090:21:19;839:288;1090:21;-1:-1:-1;1148:6:19;457:716;-1:-1:-1;;;457:716:19:o;13191:281:5:-;13312:8;-1:-1:-1;;;;;13303:17:5;:5;-1:-1:-1;;;;;13303:17:5;;13295:55;;;;-1:-1:-1;;;13295:55:5;;39648:2:20;13295:55:5;;;39630:21:20;39687:2;39667:18;;;39660:30;-1:-1:-1;;;39706:18:20;;;39699:55;39771:18;;13295:55:5;39446:349:20;13295:55:5;-1:-1:-1;;;;;13361:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13361:46:5;;;;;;;;;;13423:41;;540::20;;;13423::5;;513:18:20;13423:41:5;;;;;;;13191:281;;;:::o;6452:270::-;6565:28;6575:4;6581:2;6585:7;6565:9;:28::i;:::-;6612:47;6635:4;6641:2;6645:7;6654:4;6612:22;:47::i;:::-;6604:110;;;;-1:-1:-1;;;6604:110:5;;;;;;;:::i;525:3097:1:-;583:13;820:4;:11;835:1;820:16;816:31;;-1:-1:-1;;838:9:1;;;;;;;;;-1:-1:-1;838:9:1;;;525:3097::o;816:31::-;900:19;922:6;;;;;;;;;;;;;;;;;900:28;;1339:20;1398:1;1379:4;:11;1393:1;1379:15;;;;:::i;:::-;1378:21;;;;:::i;:::-;1373:27;;:1;:27;:::i;:::-;-1:-1:-1;;;;;1362:39:1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1362:39:1;;1339:62;;1581:1;1574:5;1570:13;1685:2;1677:6;1673:15;1796:4;1848;1842:11;1836:4;1832:22;1758:1432;1882:6;1873:7;1870:19;1758:1432;;;1988:1;1979:7;1975:15;1964:26;;2027:7;2021:14;2680:4;2672:5;2668:2;2664:14;2660:25;2650:8;2646:40;2640:47;2629:9;2621:67;2734:1;2723:9;2719:17;2706:30;;2826:4;2818:5;2814:2;2810:14;2806:25;2796:8;2792:40;2786:47;2775:9;2767:67;2880:1;2869:9;2865:17;2852:30;;2971:4;2963:5;2960:1;2956:13;2952:24;2942:8;2938:39;2932:46;2921:9;2913:66;3025:1;3014:9;3010:17;2997:30;;3108:4;3101:5;3097:16;3087:8;3083:31;3077:38;3066:9;3058:58;;3162:1;3151:9;3147:17;3134:30;;1758:1432;;;1762:107;;3352:1;3345:4;3339:11;3335:19;3373:1;3368:123;;;;3510:1;3505:73;;;;3328:250;;3368:123;3421:4;3417:1;3406:9;3402:17;3394:32;3471:4;3467:1;3456:9;3452:17;3444:32;3368:123;;3505:73;3558:4;3554:1;3543:9;3539:17;3531:32;3328:250;-1:-1:-1;3608:6:1;;525:3097;-1:-1:-1;;;;;525:3097:1:o;20611:325:17:-;20698:11;20747:32;;;:23;:32;;;;;;;;;20722:58;;:24;:58;;;;;:81;;;20671:13;;20698:11;20712:91;;20771:7;20712:91;:::i;:::-;20845:44;21304:33;;;:23;:33;;;;;;;;;20845:44;;:14;:44;;;;;20698:105;;-1:-1:-1;20912:14:17;20698:105;20912:12;:14::i;:::-;20828:99;;;;;;;;;:::i;3440:518:4:-;3156:5;-1:-1:-1;;;;;3589:26:4;;;-1:-1:-1;3585:176:4;;;3694:55;;-1:-1:-1;;;3694:55:4;;-1:-1:-1;;;;;40946:39:20;;3694:55:4;;;40928:58:20;41002:18;;;40995:34;;;40901:18;;3694:55:4;40755:280:20;3585:176:4;-1:-1:-1;;;;;3775:22:4;;3771:110;;3866:1;3821:48;;-1:-1:-1;;;3821:48:4;;;;;;;;:::i;3771:110::-;-1:-1:-1;3915:35:4;;;;;;;;;-1:-1:-1;;;;;3915:35:4;;;;;;-1:-1:-1;;;;;3915:35:4;;;;;;;;;;-1:-1:-1;;;3893:57:4;;;;:19;:57;3440:518::o;1035:224:6:-;1137:4;-1:-1:-1;;;;;;1161:50:6;;-1:-1:-1;;;1161:50:6;;:90;;;1215:36;1239:11;1215:23;:36::i;7266:128:5:-;7331:4;6929:16;;;:7;:16;;;;;;-1:-1:-1;;;;;6929:16:5;7355:31;;;7266:128::o;2172:915:6:-;2439:1;2427:9;:13;2423:222;;;2570:63;;-1:-1:-1;;;2570:63:6;;41242:2:20;2570:63:6;;;41224:21:20;41281:2;41261:18;;;41254:30;41320:34;41300:18;;;41293:62;-1:-1:-1;;;41371:18:20;;;41364:51;41432:19;;2570:63:6;41040:417:20;2423:222:6;2675:12;-1:-1:-1;;;;;2704:18:6;;2700:187;;2739:40;2771:7;3914:10;:17;;3887:24;;;;:15;:24;;;;;:44;;;3942:24;;;;;;;;;;;;3810:164;2739:40;2700:187;;;2809:2;-1:-1:-1;;;;;2801:10:6;:4;-1:-1:-1;;;;;2801:10:6;;2797:90;;2828:47;2861:4;2867:7;2828:32;:47::i;:::-;-1:-1:-1;;;;;2901:16:6;;2897:183;;2934:45;2971:7;2934:36;:45::i;2897:183::-;3007:4;-1:-1:-1;;;;;3001:10:6;:2;-1:-1:-1;;;;;3001:10:6;;2997:83;;3028:40;3056:2;3060:7;3028:27;:40::i;8167:110:5:-;8243:26;8253:2;8257:7;8243:26;;;;;;;;;;;;:9;:26::i;10390:948:16:-;10443:7;;-1:-1:-1;;;10521:17:16;;10517:106;;-1:-1:-1;;;10559:17:16;;;-1:-1:-1;10605:2:16;10595:12;10517:106;10650:8;10641:5;:17;10637:106;;10688:8;10679:17;;;-1:-1:-1;10725:2:16;10715:12;10637:106;10770:8;10761:5;:17;10757:106;;10808:8;10799:17;;;-1:-1:-1;10845:2:16;10835:12;10757:106;10890:7;10881:5;:16;10877:103;;10927:7;10918:16;;;-1:-1:-1;10963:1:16;10953:11;10877:103;11007:7;10998:5;:16;10994:103;;11044:7;11035:16;;;-1:-1:-1;11080:1:16;11070:11;10994:103;11124:7;11115:5;:16;11111:103;;11161:7;11152:16;;;-1:-1:-1;11197:1:16;11187:11;11111:103;11241:7;11232:5;:16;11228:68;;11279:1;11269:11;11324:6;10390:948;-1:-1:-1;;10390:948:16:o;14260:853:5:-;14414:4;-1:-1:-1;;;;;14435:13:5;;1746:19:0;:23;14431:675:5;;14471:71;;-1:-1:-1;;;14471:71:5;;-1:-1:-1;;;;;14471:36:5;;;;;:71;;736:10:2;;14522:4:5;;14528:7;;14537:4;;14471:71;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14471:71:5;;;;;;;;-1:-1:-1;;14471:71:5;;;;;;;;;;;;:::i;:::-;;;14467:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14712:6;:13;14729:1;14712:18;14708:328;;14755:60;;-1:-1:-1;;;14755:60:5;;;;;;;:::i;14708:328::-;14986:6;14980:13;14971:6;14967:2;14963:15;14956:38;14467:584;-1:-1:-1;;;;;;14593:51:5;-1:-1:-1;;;14593:51:5;;-1:-1:-1;14586:58:5;;14431:675;-1:-1:-1;15090:4:5;14260:853;;;;;;:::o;1558:305::-;1660:4;-1:-1:-1;;;;;;1697:40:5;;-1:-1:-1;;;1697:40:5;;:105;;-1:-1:-1;;;;;;;1754:48:5;;-1:-1:-1;;;1754:48:5;1697:105;:158;;;-1:-1:-1;;;;;;;;;;965:40:3;;;1819:36:5;856:157:3;4601:988:6;4867:22;4917:1;4892:22;4909:4;4892:16;:22::i;:::-;:26;;;;:::i;:::-;4929:18;4950:26;;;:17;:26;;;;;;4867:51;;-1:-1:-1;5083:28:6;;;5079:328;;-1:-1:-1;;;;;5150:18:6;;5128:19;5150:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5201:30;;;;;;:44;;;5318:30;;:17;:30;;;;;:43;;;5079:328;-1:-1:-1;5503:26:6;;;;:17;:26;;;;;;;;5496:33;;;-1:-1:-1;;;;;5547:18:6;;;;;:12;:18;;;;;:34;;;;;;;5540:41;4601:988::o;5884:1079::-;6162:10;:17;6137:22;;6162:21;;6182:1;;6162:21;:::i;:::-;6194:18;6215:24;;;:15;:24;;;;;;6588:10;:26;;6137:46;;-1:-1:-1;6215:24:6;;6137:46;;6588:26;;;;;;:::i;:::-;;;;;;;;;6566:48;;6652:11;6627:10;6638;6627:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6732:28;;;:15;:28;;;;;;;:41;;;6904:24;;;;;6897:31;6939:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5955:1008;;;5884:1079;:::o;3388:221::-;3473:14;3490:20;3507:2;3490:16;:20::i;:::-;-1:-1:-1;;;;;3521:16:6;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3566:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3388:221:6:o;8504:285:5:-;8599:18;8605:2;8609:7;8599:5;:18::i;:::-;8650:53;8681:1;8685:2;8689:7;8698:4;8650:22;:53::i;:::-;8628:153;;;;-1:-1:-1;;;8628:153:5;;;;;;;:::i;9125:942::-;-1:-1:-1;;;;;9205:16:5;;9197:61;;;;-1:-1:-1;;;9197:61:5;;42544:2:20;9197:61:5;;;42526:21:20;;;42563:18;;;42556:30;42622:34;42602:18;;;42595:62;42674:18;;9197:61:5;42342:356:20;9197:61:5;9278:16;9286:7;9278;:16::i;:::-;9277:17;9269:58;;;;-1:-1:-1;;;9269:58:5;;;;;;;:::i;:::-;9340:48;9369:1;9373:2;9377:7;9386:1;9340:20;:48::i;:::-;9487:16;9495:7;9487;:16::i;:::-;9486:17;9478:58;;;;-1:-1:-1;;;9478:58:5;;;;;;;:::i;:::-;-1:-1:-1;;;;;9885:13:5;;;;;;:9;:13;;;;;;;;:18;;9902:1;9885:18;;;9927:16;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9927:21:5;;;;;9966:33;9935:7;;9885:13;;-1:-1:-1;;;;;;;;;;;9966:33:5;9885:13;;9966:33;4241:155;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:20;-1:-1:-1;;;;;;88:32:20;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:20;825:40;;-1:-1:-1;;;;;880:34:20;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:20:o;1004:407::-;1069:5;-1:-1:-1;;;;;1095:6:20;1092:30;1089:56;;;1125:18;;:::i;:::-;1163:57;1208:2;1187:15;;-1:-1:-1;;1183:29:20;1214:4;1179:40;1163:57;:::i;:::-;1154:66;;1243:6;1236:5;1229:21;1283:3;1274:6;1269:3;1265:16;1262:25;1259:45;;;1300:1;1297;1290:12;1259:45;1349:6;1344:3;1337:4;1330:5;1326:16;1313:43;1403:1;1396:4;1387:6;1380:5;1376:18;1372:29;1365:40;1004:407;;;;;:::o;1416:222::-;1459:5;1512:3;1505:4;1497:6;1493:17;1489:27;1479:55;;1530:1;1527;1520:12;1479:55;1552:80;1628:3;1619:6;1606:20;1599:4;1591:6;1587:17;1552:80;:::i;1643:182::-;1702:4;-1:-1:-1;;;;;1727:6:20;1724:30;1721:56;;;1757:18;;:::i;:::-;-1:-1:-1;1802:1:20;1798:14;1814:4;1794:25;;1643:182::o;1830:887::-;1883:5;1936:3;1929:4;1921:6;1917:17;1913:27;1903:55;;1954:1;1951;1944:12;1903:55;1990:6;1977:20;2016:4;2040:59;2056:42;2095:2;2056:42;:::i;:::-;2040:59;:::i;:::-;2133:15;;;2219:1;2215:10;;;;2203:23;;2199:32;;;2164:12;;;;2243:15;;;2240:35;;;2271:1;2268;2261:12;2240:35;2307:2;2299:6;2295:15;2319:369;2335:6;2330:3;2327:15;2319:369;;;2421:3;2408:17;-1:-1:-1;;;;;2444:11:20;2441:35;2438:125;;;2517:1;2546:2;2542;2535:14;2438:125;2588:57;2641:3;2636:2;2622:11;2614:6;2610:24;2606:33;2588:57;:::i;:::-;2576:70;;-1:-1:-1;2666:12:20;;;;2352;;2319:369;;;-1:-1:-1;2706:5:20;1830:887;-1:-1:-1;;;;;;1830:887:20:o;2722:1783::-;2949:6;2957;2965;2973;2981;2989;2997;3005;3058:3;3046:9;3037:7;3033:23;3029:33;3026:53;;;3075:1;3072;3065:12;3026:53;3115:9;3102:23;-1:-1:-1;;;;;3185:2:20;3177:6;3174:14;3171:34;;;3201:1;3198;3191:12;3171:34;3224:50;3266:7;3257:6;3246:9;3242:22;3224:50;:::i;:::-;3214:60;;3327:2;3316:9;3312:18;3299:32;3283:48;;3356:2;3346:8;3343:16;3340:36;;;3372:1;3369;3362:12;3340:36;3395:52;3439:7;3428:8;3417:9;3413:24;3395:52;:::i;:::-;3385:62;;3500:2;3489:9;3485:18;3472:32;3456:48;;3529:2;3519:8;3516:16;3513:36;;;3545:1;3542;3535:12;3513:36;3568:52;3612:7;3601:8;3590:9;3586:24;3568:52;:::i;:::-;3558:62;;3673:2;3662:9;3658:18;3645:32;3629:48;;3702:2;3692:8;3689:16;3686:36;;;3718:1;3715;3708:12;3686:36;3741:52;3785:7;3774:8;3763:9;3759:24;3741:52;:::i;:::-;3731:62;;3846:3;3835:9;3831:19;3818:33;3802:49;;3876:2;3866:8;3863:16;3860:36;;;3892:1;3889;3882:12;3860:36;3915:52;3959:7;3948:8;3937:9;3933:24;3915:52;:::i;:::-;3905:62;;4020:3;4009:9;4005:19;3992:33;3976:49;;4050:2;4040:8;4037:16;4034:36;;;4066:1;4063;4056:12;4034:36;4089:52;4133:7;4122:8;4111:9;4107:24;4089:52;:::i;:::-;4079:62;;4194:3;4183:9;4179:19;4166:33;4150:49;;4224:2;4214:8;4211:16;4208:36;;;4240:1;4237;4230:12;4208:36;4263:52;4307:7;4296:8;4285:9;4281:24;4263:52;:::i;:::-;4253:62;;4368:3;4357:9;4353:19;4340:33;4324:49;;4398:2;4388:8;4385:16;4382:36;;;4414:1;4411;4404:12;4382:36;;4437:62;4491:7;4480:8;4469:9;4465:24;4437:62;:::i;:::-;4427:72;;;2722:1783;;;;;;;;;;;:::o;4510:250::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4695:11;;;4689:18;4676:11;;;4669:39;4641:2;4634:10;4605:113;;;-1:-1:-1;;4752:1:20;4734:16;;4727:27;4510:250::o;4765:271::-;4807:3;4845:5;4839:12;4872:6;4867:3;4860:19;4888:76;4957:6;4950:4;4945:3;4941:14;4934:4;4927:5;4923:16;4888:76;:::i;:::-;5018:2;4997:15;-1:-1:-1;;4993:29:20;4984:39;;;;5025:4;4980:50;;4765:271;-1:-1:-1;;4765:271:20:o;5041:220::-;5190:2;5179:9;5172:21;5153:4;5210:45;5251:2;5240:9;5236:18;5228:6;5210:45;:::i;5266:180::-;5325:6;5378:2;5366:9;5357:7;5353:23;5349:32;5346:52;;;5394:1;5391;5384:12;5346:52;-1:-1:-1;5417:23:20;;5266:180;-1:-1:-1;5266:180:20:o;5451:203::-;-1:-1:-1;;;;;5615:32:20;;;;5597:51;;5585:2;5570:18;;5451:203::o;5659:173::-;5727:20;;-1:-1:-1;;;;;5776:31:20;;5766:42;;5756:70;;5822:1;5819;5812:12;5837:254;5905:6;5913;5966:2;5954:9;5945:7;5941:23;5937:32;5934:52;;;5982:1;5979;5972:12;5934:52;6005:29;6024:9;6005:29;:::i;:::-;5995:39;6081:2;6066:18;;;;6053:32;;-1:-1:-1;;;5837:254:20:o;6096:1921::-;6341:6;6349;6357;6365;6373;6381;6389;6397;6405;6413;6466:3;6454:9;6445:7;6441:23;6437:33;6434:53;;;6483:1;6480;6473:12;6434:53;6519:9;6506:23;6496:33;;6580:2;6569:9;6565:18;6552:32;-1:-1:-1;;;;;6644:2:20;6636:6;6633:14;6630:34;;;6660:1;6657;6650:12;6630:34;6683:50;6725:7;6716:6;6705:9;6701:22;6683:50;:::i;:::-;6673:60;;6786:2;6775:9;6771:18;6758:32;6742:48;;6815:2;6805:8;6802:16;6799:36;;;6831:1;6828;6821:12;6799:36;6854:52;6898:7;6887:8;6876:9;6872:24;6854:52;:::i;:::-;6844:62;;6959:2;6948:9;6944:18;6931:32;6915:48;;6988:2;6978:8;6975:16;6972:36;;;7004:1;7001;6994:12;6972:36;7027:52;7071:7;7060:8;7049:9;7045:24;7027:52;:::i;:::-;7017:62;;7132:3;7121:9;7117:19;7104:33;7088:49;;7162:2;7152:8;7149:16;7146:36;;;7178:1;7175;7168:12;7146:36;7201:52;7245:7;7234:8;7223:9;7219:24;7201:52;:::i;:::-;7191:62;;7306:3;7295:9;7291:19;7278:33;7262:49;;7336:2;7326:8;7323:16;7320:36;;;7352:1;7349;7342:12;7320:36;7375:52;7419:7;7408:8;7397:9;7393:24;7375:52;:::i;:::-;7365:62;;7480:3;7469:9;7465:19;7452:33;7436:49;;7510:2;7500:8;7497:16;7494:36;;;7526:1;7523;7516:12;7494:36;7549:52;7593:7;7582:8;7571:9;7567:24;7549:52;:::i;:::-;7539:62;;7654:3;7643:9;7639:19;7626:33;7610:49;;7684:2;7674:8;7671:16;7668:36;;;7700:1;7697;7690:12;7668:36;7723:52;7767:7;7756:8;7745:9;7741:24;7723:52;:::i;:::-;7713:62;;7822:3;7811:9;7807:19;7794:33;7784:43;;7880:3;7869:9;7865:19;7852:33;7836:49;;7910:2;7900:8;7897:16;7894:36;;;7926:1;7923;7916:12;7894:36;;7949:62;8003:7;7992:8;7981:9;7977:24;7949:62;:::i;:::-;7939:72;;;6096:1921;;;;;;;;;;;;;:::o;8204:254::-;8272:6;8280;8333:2;8321:9;8312:7;8308:23;8304:32;8301:52;;;8349:1;8346;8339:12;8301:52;8385:9;8372:23;8362:33;;8414:38;8448:2;8437:9;8433:18;8414:38;:::i;:::-;8404:48;;8204:254;;;;;:::o;8463:328::-;8540:6;8548;8556;8609:2;8597:9;8588:7;8584:23;8580:32;8577:52;;;8625:1;8622;8615:12;8577:52;8648:29;8667:9;8648:29;:::i;:::-;8638:39;;8696:38;8730:2;8719:9;8715:18;8696:38;:::i;:::-;8686:48;;8781:2;8770:9;8766:18;8753:32;8743:42;;8463:328;;;;;:::o;8796:248::-;8864:6;8872;8925:2;8913:9;8904:7;8900:23;8896:32;8893:52;;;8941:1;8938;8931:12;8893:52;-1:-1:-1;;8964:23:20;;;9034:2;9019:18;;;9006:32;;-1:-1:-1;8796:248:20:o;9049:274::-;-1:-1:-1;;;;;9241:32:20;;;;9223:51;;9305:2;9290:18;;9283:34;9211:2;9196:18;;9049:274::o;9328:186::-;9387:6;9440:2;9428:9;9419:7;9415:23;9411:32;9408:52;;;9456:1;9453;9446:12;9408:52;9479:29;9498:9;9479:29;:::i;9519:529::-;9623:6;9631;9639;9647;9655;9663;9716:3;9704:9;9695:7;9691:23;9687:33;9684:53;;;9733:1;9730;9723:12;9684:53;9769:9;9756:23;9746:33;;9826:2;9815:9;9811:18;9798:32;9788:42;;9877:2;9866:9;9862:18;9849:32;9839:42;;9928:2;9917:9;9913:18;9900:32;9890:42;;9979:3;9968:9;9964:19;9951:33;9941:43;;10003:39;10037:3;10026:9;10022:19;10003:39;:::i;:::-;9993:49;;9519:529;;;;;;;;:::o;10053:928::-;10300:2;10289:9;10282:21;10263:4;10326:45;10367:2;10356:9;10352:18;10344:6;10326:45;:::i;:::-;10390:2;10440:9;10432:6;10428:22;10423:2;10412:9;10408:18;10401:50;10471:6;10506;10500:13;10537:6;10529;10522:22;10572:2;10564:6;10560:15;10553:22;;10631:2;10621:6;10618:1;10614:14;10606:6;10602:27;10598:36;10669:2;10661:6;10657:15;10690:1;10700:252;10714:6;10711:1;10708:13;10700:252;;;10804:2;10800:7;10791:6;10783;10779:19;10775:33;10770:3;10763:46;10832:40;10865:6;10856;10850:13;10832:40;:::i;:::-;10930:12;;;;10822:50;-1:-1:-1;10895:15:20;;;;10736:1;10729:9;10700:252;;;-1:-1:-1;10969:6:20;;10053:928;-1:-1:-1;;;;;;;;;10053:928:20:o;11764:390::-;11842:6;11850;11903:2;11891:9;11882:7;11878:23;11874:32;11871:52;;;11919:1;11916;11909:12;11871:52;11955:9;11942:23;11932:33;;12016:2;12005:9;12001:18;11988:32;-1:-1:-1;;;;;12035:6:20;12032:30;12029:50;;;12075:1;12072;12065:12;12029:50;12098;12140:7;12131:6;12120:9;12116:22;12098:50;:::i;:::-;12088:60;;;11764:390;;;;;:::o;12159:460::-;12254:6;12262;12270;12278;12286;12339:3;12327:9;12318:7;12314:23;12310:33;12307:53;;;12356:1;12353;12346:12;12307:53;12392:9;12379:23;12369:33;;12421:38;12455:2;12444:9;12440:18;12421:38;:::i;:::-;12159:460;;12411:48;;-1:-1:-1;;;;12506:2:20;12491:18;;12478:32;;12557:2;12542:18;;12529:32;;12608:3;12593:19;;;12580:33;;-1:-1:-1;12159:460:20:o;12624:383::-;12821:2;12810:9;12803:21;12784:4;12847:45;12888:2;12877:9;12873:18;12865:6;12847:45;:::i;:::-;12940:9;12932:6;12928:22;12923:2;12912:9;12908:18;12901:50;12968:33;12994:6;12986;12968:33;:::i;:::-;12960:41;12624:383;-1:-1:-1;;;;;12624:383:20:o;13012:316::-;13089:6;13097;13105;13158:2;13146:9;13137:7;13133:23;13129:32;13126:52;;;13174:1;13171;13164:12;13126:52;-1:-1:-1;;13197:23:20;;;13267:2;13252:18;;13239:32;;-1:-1:-1;13318:2:20;13303:18;;;13290:32;;13012:316;-1:-1:-1;13012:316:20:o;13333:118::-;13419:5;13412:13;13405:21;13398:5;13395:32;13385:60;;13441:1;13438;13431:12;13456:315;13521:6;13529;13582:2;13570:9;13561:7;13557:23;13553:32;13550:52;;;13598:1;13595;13588:12;13550:52;13621:29;13640:9;13621:29;:::i;:::-;13611:39;;13700:2;13689:9;13685:18;13672:32;13713:28;13735:5;13713:28;:::i;:::-;13760:5;13750:15;;;13456:315;;;;;:::o;13776:1383::-;13948:6;13956;13964;14017:2;14005:9;13996:7;13992:23;13988:32;13985:52;;;14033:1;14030;14023:12;13985:52;14073:9;14060:23;-1:-1:-1;;;;;14143:2:20;14135:6;14132:14;14129:34;;;14159:1;14156;14149:12;14129:34;14197:6;14186:9;14182:22;14172:32;;14242:7;14235:4;14231:2;14227:13;14223:27;14213:55;;14264:1;14261;14254:12;14213:55;14300:2;14287:16;14322:4;14346:59;14362:42;14401:2;14362:42;:::i;14346:59::-;14439:15;;;14521:1;14517:10;;;;14509:19;;14505:28;;;14470:12;;;;14545:19;;;14542:39;;;14577:1;14574;14567:12;14542:39;14601:11;;;;14621:142;14637:6;14632:3;14629:15;14621:142;;;14703:17;;14691:30;;14654:12;;;;14741;;;;14621:142;;;14782:5;-1:-1:-1;;14825:18:20;;14812:32;;-1:-1:-1;;14856:16:20;;;14853:36;;;14885:1;14882;14875:12;14853:36;14908:62;14962:7;14951:8;14940:9;14936:24;14908:62;:::i;:::-;14898:72;;15023:2;15012:9;15008:18;14995:32;14979:48;;15052:2;15042:8;15039:16;15036:36;;;15068:1;15065;15058:12;15036:36;;15091:62;15145:7;15134:8;15123:9;15119:24;15091:62;:::i;:::-;15081:72;;;13776:1383;;;;;:::o;15164:667::-;15259:6;15267;15275;15283;15336:3;15324:9;15315:7;15311:23;15307:33;15304:53;;;15353:1;15350;15343:12;15304:53;15376:29;15395:9;15376:29;:::i;:::-;15366:39;;15424:38;15458:2;15447:9;15443:18;15424:38;:::i;:::-;15414:48;;15509:2;15498:9;15494:18;15481:32;15471:42;;15564:2;15553:9;15549:18;15536:32;-1:-1:-1;;;;;15583:6:20;15580:30;15577:50;;;15623:1;15620;15613:12;15577:50;15646:22;;15699:4;15691:13;;15687:27;-1:-1:-1;15677:55:20;;15728:1;15725;15718:12;15677:55;15751:74;15817:7;15812:2;15799:16;15794:2;15790;15786:11;15751:74;:::i;:::-;15741:84;;;15164:667;;;;;;;:::o;15836:366::-;15903:6;15911;15964:2;15952:9;15943:7;15939:23;15935:32;15932:52;;;15980:1;15977;15970:12;15932:52;16003:29;16022:9;16003:29;:::i;:::-;15993:39;;16082:2;16071:9;16067:18;16054:32;-1:-1:-1;;;;;16119:5:20;16115:38;16108:5;16105:49;16095:77;;16168:1;16165;16158:12;16207:1039;16596:3;16585:9;16578:22;16559:4;16623:46;16664:3;16653:9;16649:19;16641:6;16623:46;:::i;:::-;16717:9;16709:6;16705:22;16700:2;16689:9;16685:18;16678:50;16751:33;16777:6;16769;16751:33;:::i;:::-;16737:47;;16832:9;16824:6;16820:22;16815:2;16804:9;16800:18;16793:50;16866:33;16892:6;16884;16866:33;:::i;:::-;16852:47;;16947:9;16939:6;16935:22;16930:2;16919:9;16915:18;16908:50;16981:33;17007:6;16999;16981:33;:::i;:::-;16967:47;;17063:9;17055:6;17051:22;17045:3;17034:9;17030:19;17023:51;17097:33;17123:6;17115;17097:33;:::i;:::-;17083:47;;17179:9;17171:6;17167:22;17161:3;17150:9;17146:19;17139:51;17207:33;17233:6;17225;17207:33;:::i;:::-;17199:41;16207:1039;-1:-1:-1;;;;;;;;;16207:1039:20:o;17251:746::-;17374:6;17382;17390;17398;17406;17414;17422;17475:3;17463:9;17454:7;17450:23;17446:33;17443:53;;;17492:1;17489;17482:12;17443:53;17528:9;17515:23;17505:33;;17557:38;17591:2;17580:9;17576:18;17557:38;:::i;:::-;17547:48;;17614:38;17648:2;17637:9;17633:18;17614:38;:::i;:::-;17604:48;;17703:2;17692:9;17688:18;17675:32;-1:-1:-1;;;;;17722:6:20;17719:30;17716:50;;;17762:1;17759;17752:12;17716:50;17785;17827:7;17818:6;17807:9;17803:22;17785:50;:::i;:::-;17251:746;;;;-1:-1:-1;17251:746:20;;17882:3;17867:19;;17854:33;;17934:3;17919:19;;17906:33;;-1:-1:-1;17986:3:20;17971:19;;;17958:33;;-1:-1:-1;17251:746:20;-1:-1:-1;;;17251:746:20:o;18002:260::-;18070:6;18078;18131:2;18119:9;18110:7;18106:23;18102:32;18099:52;;;18147:1;18144;18137:12;18099:52;18170:29;18189:9;18170:29;:::i;:::-;18160:39;;18218:38;18252:2;18241:9;18237:18;18218:38;:::i;18267:602::-;18372:6;18380;18388;18396;18404;18457:3;18445:9;18436:7;18432:23;18428:33;18425:53;;;18474:1;18471;18464:12;18425:53;18510:9;18497:23;18487:33;;18539:38;18573:2;18562:9;18558:18;18539:38;:::i;:::-;18529:48;;18628:2;18617:9;18613:18;18600:32;-1:-1:-1;;;;;18647:6:20;18644:30;18641:50;;;18687:1;18684;18677:12;18641:50;18710;18752:7;18743:6;18732:9;18728:22;18710:50;:::i;:::-;18267:602;;;;-1:-1:-1;18700:60:20;;18807:2;18792:18;;18779:32;;-1:-1:-1;18858:3:20;18843:19;18830:33;;18267:602;-1:-1:-1;;;18267:602:20:o;18874:309::-;18939:6;18947;19000:2;18988:9;18979:7;18975:23;18971:32;18968:52;;;19016:1;19013;19006:12;18968:52;19052:9;19039:23;19029:33;;19112:2;19101:9;19097:18;19084:32;19125:28;19147:5;19125:28;:::i;19188:299::-;-1:-1:-1;;;;;19378:32:20;;;;19360:51;;-1:-1:-1;;;;;;19447:33:20;19442:2;19427:18;;19420:61;19348:2;19333:18;;19188:299::o;19492:245::-;19559:6;19612:2;19600:9;19591:7;19587:23;19583:32;19580:52;;;19628:1;19625;19618:12;19580:52;19660:9;19654:16;19679:28;19701:5;19679:28;:::i;19742:335::-;19944:2;19926:21;;;19983:2;19963:18;;;19956:30;-1:-1:-1;;;20017:2:20;20002:18;;19995:41;20068:2;20053:18;;19742:335::o;20082:380::-;20161:1;20157:12;;;;20204;;;20225:61;;20279:4;20271:6;20267:17;20257:27;;20225:61;20332:2;20324:6;20321:14;20301:18;20298:38;20295:161;;20378:10;20373:3;20369:20;20366:1;20359:31;20413:4;20410:1;20403:15;20441:4;20438:1;20431:15;20295:161;;20082:380;;;:::o;20593:545::-;20695:2;20690:3;20687:11;20684:448;;;20731:1;20756:5;20752:2;20745:17;20801:4;20797:2;20787:19;20871:2;20859:10;20855:19;20852:1;20848:27;20842:4;20838:38;20907:4;20895:10;20892:20;20889:47;;;-1:-1:-1;20930:4:20;20889:47;20985:2;20980:3;20976:12;20973:1;20969:20;20963:4;20959:31;20949:41;;21040:82;21058:2;21051:5;21048:13;21040:82;;;21103:17;;;21084:1;21073:13;21040:82;;21314:1352;21440:3;21434:10;-1:-1:-1;;;;;21459:6:20;21456:30;21453:56;;;21489:18;;:::i;:::-;21518:97;21608:6;21568:38;21600:4;21594:11;21568:38;:::i;:::-;21562:4;21518:97;:::i;:::-;21670:4;;21734:2;21723:14;;21751:1;21746:663;;;;22453:1;22470:6;22467:89;;;-1:-1:-1;22522:19:20;;;22516:26;22467:89;-1:-1:-1;;21271:1:20;21267:11;;;21263:24;21259:29;21249:40;21295:1;21291:11;;;21246:57;22569:81;;21716:944;;21746:663;20540:1;20533:14;;;20577:4;20564:18;;-1:-1:-1;;21782:20:20;;;21900:236;21914:7;21911:1;21908:14;21900:236;;;22003:19;;;21997:26;21982:42;;22095:27;;;;22063:1;22051:14;;;;21930:19;;21900:236;;;21904:3;22164:6;22155:7;22152:19;22149:201;;;22225:19;;;22219:26;-1:-1:-1;;22308:1:20;22304:14;;;22320:3;22300:24;22296:37;22292:42;22277:58;22262:74;;22149:201;-1:-1:-1;;;;;22396:1:20;22380:14;;;22376:22;22363:36;;-1:-1:-1;21314:1352:20:o;22671:127::-;22732:10;22727:3;22723:20;22720:1;22713:31;22763:4;22760:1;22753:15;22787:4;22784:1;22777:15;22803:125;22868:9;;;22889:10;;;22886:36;;;22902:18;;:::i;23765:127::-;23826:10;23821:3;23817:20;23814:1;23807:31;23857:4;23854:1;23847:15;23881:4;23878:1;23871:15;24252:409;24454:2;24436:21;;;24493:2;24473:18;;;24466:30;24532:34;24527:2;24512:18;;24505:62;-1:-1:-1;;;24598:2:20;24583:18;;24576:43;24651:3;24636:19;;24252:409::o;24666:168::-;24739:9;;;24770;;24787:15;;;24781:22;;24767:37;24757:71;;24808:18;;:::i;24971:217::-;25011:1;25037;25027:132;;25081:10;25076:3;25072:20;25069:1;25062:31;25116:4;25113:1;25106:15;25144:4;25141:1;25134:15;25027:132;-1:-1:-1;25173:9:20;;24971:217::o;25605:184::-;25675:6;25728:2;25716:9;25707:7;25703:23;25699:32;25696:52;;;25744:1;25741;25734:12;25696:52;-1:-1:-1;25767:16:20;;25605:184;-1:-1:-1;25605:184:20:o;26142:128::-;26209:9;;;26230:11;;;26227:37;;;26244:18;;:::i;26625:397::-;26827:2;26809:21;;;26866:2;26846:18;;;26839:30;26905:34;26900:2;26885:18;;26878:62;-1:-1:-1;;;26971:2:20;26956:18;;26949:31;27012:3;26997:19;;26625:397::o;27783:348::-;27985:2;27967:21;;;28024:2;28004:18;;;27997:30;-1:-1:-1;;;28058:2:20;28043:18;;28036:54;28122:2;28107:18;;27783:348::o;28809:722::-;28859:3;28900:5;28894:12;28929:36;28955:9;28929:36;:::i;:::-;28984:1;29001:18;;;29028:133;;;;29175:1;29170:355;;;;28994:531;;29028:133;-1:-1:-1;;29061:24:20;;29049:37;;29134:14;;29127:22;29115:35;;29106:45;;;-1:-1:-1;29028:133:20;;29170:355;29201:5;29198:1;29191:16;29230:4;29275:2;29272:1;29262:16;29300:1;29314:165;29328:6;29325:1;29322:13;29314:165;;;29406:14;;29393:11;;;29386:35;29449:16;;;;29343:10;;29314:165;;;29318:3;;;29508:6;29503:3;29499:16;29492:23;;28994:531;;;;;28809:722;;;;:::o;29536:369::-;29712:3;29750:6;29744:13;29766:66;29825:6;29820:3;29813:4;29805:6;29801:17;29766:66;:::i;:::-;29848:51;29891:6;29886:3;29882:16;29874:6;29848:51;:::i;29910:135::-;29949:3;29970:17;;;29967:43;;29990:18;;:::i;:::-;-1:-1:-1;30037:1:20;30026:13;;29910:135::o;30050:1386::-;-1:-1:-1;;;30751:3:20;30744:25;30726:3;30798:6;30792:13;30814:75;30882:6;30877:2;30872:3;30868:12;30861:4;30853:6;30849:17;30814:75;:::i;:::-;-1:-1:-1;;;30948:2:20;30908:16;;;30940:11;;;30933:37;30995:13;;31017:76;30995:13;31079:2;31071:11;;31064:4;31052:17;;31017:76;:::i;:::-;-1:-1:-1;;;31153:2:20;31112:17;;;;31145:11;;;31138:39;31196:46;31238:2;31230:11;;31222:6;31196:46;:::i;:::-;31186:56;;-1:-1:-1;;;31258:2:20;31251:16;31298:6;31292:13;31314:75;31380:8;31376:1;31372:2;31368:10;31361:4;31353:6;31349:17;31314:75;:::i;:::-;31409:17;31428:1;31405:25;;30050:1386;-1:-1:-1;;;;;;30050:1386:20:o;32191:335::-;32393:2;32375:21;;;32432:2;32412:18;;;32405:30;-1:-1:-1;;;32466:2:20;32451:18;;32444:41;32517:2;32502:18;;32191:335::o;33535:496::-;33714:3;33752:6;33746:13;33768:66;33827:6;33822:3;33815:4;33807:6;33803:17;33768:66;:::i;:::-;33897:13;;33856:16;;;;33919:70;33897:13;33856:16;33966:4;33954:17;;33919:70;:::i;:::-;34005:20;;33535:496;-1:-1:-1;;;;33535:496:20:o;34036:458::-;34268:3;34306:6;34300:13;34322:66;34381:6;34376:3;34369:4;34361:6;34357:17;34322:66;:::i;:::-;-1:-1:-1;;;34410:16:20;;34435:24;;;-1:-1:-1;34486:1:20;34475:13;;34036:458;-1:-1:-1;34036:458:20:o;34499:975::-;35008:34;34996:47;;-1:-1:-1;;;35068:2:20;35059:12;;35052:46;-1:-1:-1;35117:47:20;35160:2;35151:12;;35143:6;35117:47;:::i;:::-;-1:-1:-1;;;35173:62:20;;35258:13;;35280:72;35258:13;35340:2;35332:11;;35327:2;35315:15;;35280:72;:::i;:::-;-1:-1:-1;;;35410:2:20;35371:15;;;;35402:11;;;35395:46;35465:2;35457:11;;34499:975;-1:-1:-1;;;;34499:975:20:o;35479:1974::-;36429:66;36424:3;36417:79;36535:10;36530:3;36526:20;36521:2;36516:3;36512:12;36505:42;36399:3;36576:6;36570:13;36592:73;36658:6;36653:2;36648:3;36644:12;36639:2;36631:6;36627:15;36592:73;:::i;:::-;-1:-1:-1;;;36724:2:20;36684:16;;;36716:11;;;36709:67;36795:46;36837:2;36829:11;;36821:6;36795:46;:::i;:::-;-1:-1:-1;;;36850:46:20;;36785:56;-1:-1:-1;36915:46:20;36957:2;36949:11;;36941:6;36915:46;:::i;:::-;-1:-1:-1;;;36970:56:20;;36905;-1:-1:-1;37045:46:20;37087:2;37079:11;;37071:6;37045:46;:::i;:::-;37035:56;;37111:66;37107:2;37100:78;-1:-1:-1;;;37202:2:20;37198;37194:11;37187:32;37250:6;37244:13;37266:74;37331:8;37326:2;37322;37318:11;37313:2;37305:6;37301:15;37266:74;:::i;:::-;-1:-1:-1;;;37400:2:20;37359:17;;;;37392:11;;;37385:35;37444:2;37436:11;;35479:1974;-1:-1:-1;;;;;;;35479:1974:20:o;37809:401::-;38011:2;37993:21;;;38050:2;38030:18;;;38023:30;38089:34;38084:2;38069:18;;38062:62;-1:-1:-1;;;38155:2:20;38140:18;;38133:35;38200:3;38185:19;;37809:401::o;38944:136::-;38983:3;39011:5;39001:39;;39020:18;;:::i;:::-;-1:-1:-1;;;39056:18:20;;38944:136::o;39800:414::-;40002:2;39984:21;;;40041:2;40021:18;;;40014:30;40080:34;40075:2;40060:18;;40053:62;-1:-1:-1;;;40146:2:20;40131:18;;40124:48;40204:3;40189:19;;39800:414::o;40219:531::-;40496:3;40524:38;40558:3;40550:6;40524:38;:::i;:::-;-1:-1:-1;;;40578:2:20;40571:16;40616:6;40610:13;40632:73;40698:6;40694:1;40690:2;40686:10;40679:4;40671:6;40667:17;40632:73;:::i;:::-;40725:15;40742:1;40721:23;;40219:531;-1:-1:-1;;;;40219:531:20:o;41462:489::-;-1:-1:-1;;;;;41731:15:20;;;41713:34;;41783:15;;41778:2;41763:18;;41756:43;41830:2;41815:18;;41808:34;;;41878:3;41873:2;41858:18;;41851:31;;;41656:4;;41899:46;;41925:19;;41917:6;41899:46;:::i;:::-;41891:54;41462:489;-1:-1:-1;;;;;;41462:489:20:o;41956:249::-;42025:6;42078:2;42066:9;42057:7;42053:23;42049:32;42046:52;;;42094:1;42091;42084:12;42046:52;42126:9;42120:16;42145:30;42169:5;42145:30;:::i;42210:127::-;42271:10;42266:3;42262:20;42259:1;42252:31;42302:4;42299:1;42292:15;42326:4;42323:1;42316:15;42703:352;42905:2;42887:21;;;42944:2;42924:18;;;42917:30;42983;42978:2;42963:18;;42956:58;43046:2;43031:18;;42703:352::o
Swarm Source
ipfs://4e01c7afc738bf76fafb57bef1c544457acbb30776380f79698019d88361af03
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.