Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
GangsterAllStarEvolutionV2
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-09-09 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; abstract contract Ownable { address public owner; /// @dev This emits when ownership of a contract changes. event OwnershipTransferred(address indexed _previousOwner, address indexed _newOwner); // constructor() { owner = msg.sender; } modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; } function transferOwnership(address new_) external onlyOwner { address oldOwner = owner; owner = new_; emit OwnershipTransferred(oldOwner, new_); } function mockTransferOwnership(address old_, address new_) external onlyOwner { // only a mock transfer event emit OwnershipTransferred(old_, new_); } } abstract contract ERC721G { // Standard ERC721 Events event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); // // ERC721G Events // event TokenStaked(uint256 indexed tokenId_, address indexed staker, // uint256 timestamp_); // event TokenUnstaked(uint256 indexed tokenid_, address indexed staker, // uint256 timestamp_, uint256 totalTimeStaked_); // Standard ERC721 Global Variables string public name; // Token Name string public symbol; // Token Symbol // ERC721G Global Variables uint256 public tokenIndex; // The running index for the next TokenId /// @custom:oz-upgrades-unsafe-allow state-variable-immutable uint256 public immutable startTokenId; // Bytes Storage for the starting TokenId /// @custom:oz-upgrades-unsafe-allow state-variable-immutable uint256 public immutable maxBatchSize; // Staking Address supports Proxy // address public immutable stakingAddress = address(this); // The staking address function stakingAddress() public view returns (address) { return address(this); } /** @dev instructions: * name_ sets the token name * symbol_ sets the token symbol * startId_ sets the starting tokenId (recommended 0-1) * maxBatchSize_ sets the maximum batch size for each mint (recommended 5-20) */ /// @custom:oz-upgrades-unsafe-allow constructor constructor( string memory name_, string memory symbol_, uint256 startId_, uint256 maxBatchSize_) { name = name_; symbol = symbol_; tokenIndex = startId_; startTokenId = startId_; maxBatchSize = maxBatchSize_; } // ERC721G Structs struct OwnerStruct { address owner; // stores owner address for OwnerOf uint32 lastTransfer; // stores the last transfer of the token uint32 stakeTimestamp; // stores the stake timestamp in _setStakeTimestamp() uint32 totalTimeStaked; // stores the total time staked accumulated } struct BalanceStruct { uint32 balance; // stores the token balance of the address uint32 mintedAmount; // stores the minted amount of the address on mint // 24 Free Bytes } // ERC721G Mappings mapping(uint256 => OwnerStruct) public _tokenData; // ownerOf replacement mapping(address => BalanceStruct) public _balanceData; // balanceOf replacement mapping(uint256 => OwnerStruct) public mintIndex; // uninitialized ownerOf pointer // ERC721 Mappings mapping(uint256 => address) public getApproved; // for single token approvals mapping(address => mapping(address => bool)) public isApprovedForAll; // approveall // TIME by 0xInuarashi function _getBlockTimestampCompressed() public virtual view returns (uint32) { return uint32(block.timestamp / 10); } function _compressTimestamp(uint256 timestamp_) public virtual view returns (uint32) { return uint32(timestamp_ / 10); } function _expandTimestamp(uint32 timestamp_) public virtual view returns (uint256) { return uint256(timestamp_) * 10; } function getLastTransfer(uint256 tokenId_) public virtual view returns (uint256) { return _expandTimestamp(_getTokenDataOf(tokenId_).lastTransfer); } function getStakeTimestamp(uint256 tokenId_) public virtual view returns (uint256) { return _expandTimestamp(_getTokenDataOf(tokenId_).stakeTimestamp); } function getTotalTimeStaked(uint256 tokenId_) public virtual view returns (uint256) { return _expandTimestamp(_getTokenDataOf(tokenId_).totalTimeStaked); } ///// ERC721G: ERC721-Like Simple Read Outputs ///// function totalSupply() public virtual view returns (uint256) { return tokenIndex - startTokenId; } function balanceOf(address address_) public virtual view returns (uint256) { return _balanceData[address_].balance; } ///// ERC721G: Range-Based Logic ///// /** @dev explanation: * _getTokenDataOf() finds and returns either the (and in priority) * - the initialized storage pointer from _tokenData * - the uninitialized storage pointer from mintIndex * * if the _tokenData storage slot is populated, return it * otherwise, do a reverse-lookup to find the uninitialized pointer from mintIndex */ function _getTokenDataOf(uint256 tokenId_) public virtual view returns (OwnerStruct memory) { // The tokenId must be above startTokenId only require(tokenId_ >= startTokenId, "TokenId below starting Id!"); // If the _tokenData is initialized (not 0x0), return the _tokenData if (_tokenData[tokenId_].owner != address(0) || tokenId_ >= tokenIndex) { return _tokenData[tokenId_]; } // Else, do a reverse-lookup to find the corresponding uninitialized pointer else { unchecked { uint256 _lowerRange = tokenId_; while (mintIndex[_lowerRange].owner == address(0)) { _lowerRange--; } return mintIndex[_lowerRange]; }} } /** @dev explanation: * ownerOf calls _getTokenDataOf() which returns either the initialized or * uninitialized pointer. * Then, it checks if the token is staked or not through stakeTimestamp. * If the token is staked, return the stakingAddress, otherwise, return the owner. */ function ownerOf(uint256 tokenId_) public virtual view returns (address) { OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_); return _OwnerStruct.stakeTimestamp == 0 ? _OwnerStruct.owner : stakingAddress(); } /** @dev explanation: * _trueOwnerOf() calls _getTokenDataOf() which returns either the initialized or * uninitialized pointer. * It returns the owner directly without any checks. * Used internally for proving the staker address on unstake. */ function _trueOwnerOf(uint256 tokenId_) public virtual view returns (address) { return _getTokenDataOf(tokenId_).owner; } ///// ERC721G: Internal Single-Contract Staking Logic ///// /** @dev explanation: * _initializeTokenIf() is used as a beginning-hook to functions that require * that the token is explicitly INITIALIZED before the function is able to be used. * It will check if the _tokenData slot is initialized or not. * If it is not, it will initialize it. * Used internally for staking logic. */ function _initializeTokenIf(uint256 tokenId_, OwnerStruct memory _OwnerStruct) internal virtual { // If the target _tokenData is not initialized, initialize it. if (_tokenData[tokenId_].owner == address(0)) { _tokenData[tokenId_] = _OwnerStruct; } } /** @dev explanation: * _setStakeTimestamp() is our staking / unstaking logic. * If timestamp_ is > 0, the action is "stake" * If timestamp_ is == 0, the action is "unstake" * * We grab the tokenData using _getTokenDataOf and then read its values. * As this function requires INITIALIZED tokens only, we call _initializeTokenIf() * to initialize any token using this function first. * * Processing of the function is explained in in-line comments. */ function _setStakeTimestamp(uint256 tokenId_, uint256 timestamp_) internal virtual returns (address) { // First, call _getTokenDataOf and grab the relevant tokenData OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_); address _owner = _OwnerStruct.owner; uint32 _stakeTimestamp = _OwnerStruct.stakeTimestamp; // _setStakeTimestamp requires initialization _initializeTokenIf(tokenId_, _OwnerStruct); // Clear any token approvals delete getApproved[tokenId_]; // if timestamp_ > 0, the action is "stake" if (timestamp_ > 0) { // Make sure that the token is not staked already require(_stakeTimestamp == 0, "ERC721G: _setStakeTimestamp() already staked"); // Callbrate balances between staker and stakingAddress unchecked { _balanceData[_owner].balance--; _balanceData[stakingAddress()].balance++; } // Emit Transfer event from trueOwner emit Transfer(_owner, stakingAddress(), tokenId_); } // if timestamp_ == 0, the action is "unstake" else { // Make sure the token is not staked require(_stakeTimestamp != 0, "ERC721G: _setStakeTimestamp() already unstaked"); // Callibrate balances between stakingAddress and staker unchecked { _balanceData[_owner].balance++; _balanceData[stakingAddress()].balance--; } // we add total time staked to the token on unstake uint32 _timeStaked = _getBlockTimestampCompressed() - _stakeTimestamp; _tokenData[tokenId_].totalTimeStaked += _timeStaked; // Emit Transfer event to trueOwner emit Transfer(stakingAddress(), _owner, tokenId_); } // Set the stakeTimestamp to timestamp_ _tokenData[tokenId_].stakeTimestamp = _compressTimestamp(timestamp_); // We save internal gas by returning the owner for a follow-up function return _owner; } /** @dev explanation: * _stake() works like an extended function of _setStakeTimestamp() * where the logic of _setStakeTimestamp() runs and returns the _owner address * afterwards, we do the post-hook required processing to finish the staking logic * in this function. * * Processing logic explained in in-line comments. */ function _stake(uint256 tokenId_) internal virtual returns (address) { // set the stakeTimestamp to block.timestamp and return the owner return _setStakeTimestamp(tokenId_, block.timestamp); } /** @dev explanation: * _unstake() works like an extended unction of _setStakeTimestamp() * where the logic of _setStakeTimestamp() runs and returns the _owner address * afterwards, we do the post-hook required processing to finish the unstaking logic * in this function. * * Processing logic explained in in-line comments. */ function _unstake(uint256 tokenId_) internal virtual returns(address) { // set the stakeTimestamp to 0 and return the owner return _setStakeTimestamp(tokenId_, 0); } /** @dev explanation: * _mintAndStakeInternal() is the internal mintAndStake function that is called * to mintAndStake tokens to users. * * It populates mintIndex with the phantom-mint data (owner, lastTransferTime) * as well as the phantom-stake data (stakeTimestamp) * * Then, it emits the necessary phantom events to replicate the behavior as canon. * * Further logic explained in in-line comments. */ function _mintAndStakeInternal(address to_, uint256 amount_) internal virtual { // we cannot mint to 0x0 require(to_ != address(0), "ERC721G: _mintAndStakeInternal to 0x0"); // we limit max mints per SSTORE to prevent expensive gas lookup require(amount_ <= maxBatchSize, "ERC721G: _mintAndStakeInternal over maxBatchSize"); // process the required variables to write to mintIndex uint256 _startId = tokenIndex; uint256 _endId = _startId + amount_; uint32 _currentTime = _getBlockTimestampCompressed(); // write to the mintIndex to store the OwnerStruct for uninitialized tokenData mintIndex[_startId] = OwnerStruct( to_, // the address the token is minted to _currentTime, // the last transfer time _currentTime, // the curent time of staking 0 // the accumulated time staked ); unchecked { // we add the balance to the stakingAddress through our staking logic _balanceData[stakingAddress()].balance += uint32(amount_); // we add the mintedAmount to the to_ through our minting logic _balanceData[to_].mintedAmount += uint32(amount_); // emit phantom mint to to_, then emit a staking transfer do { emit Transfer(address(0), to_, _startId); emit Transfer(to_, stakingAddress(), _startId); // /** @dev testing: // * emitting a TokenStaked event for testing // */ // emit TokenStaked(_startId, to_, _currentTime); } while (++_startId < _endId); } // set the new tokenIndex to the _endId tokenIndex = _endId; } /** @dev explanation: * _mintAndStake() calls _mintAndStakeInternal() but calls it using a while-loop * based on the required minting amount to stay within the bounds of * max mints per batch (maxBatchSize) */ function _mintAndStake(address to_, uint256 amount_) internal virtual { uint256 _amountToMint = amount_; while (_amountToMint > maxBatchSize) { _amountToMint -= maxBatchSize; _mintAndStakeInternal(to_, maxBatchSize); } _mintAndStakeInternal(to_, _amountToMint); } ///// ERC721G Range-Based Internal Minting Logic ///// /** @dev explanation: * _mintInternal() is our internal batch minting logic. * First, we store the uninitialized pointer at mintIndex of _startId * Then, we process the balances changes * Finally, we phantom-mint the tokens using Transfer events loop. */ function _mintInternal(address to_, uint256 amount_) internal virtual { // cannot mint to 0x0 require(to_ != address(0), "ERC721G: _mintInternal to 0x0"); // we limit max mints to prevent expensive gas lookup require(amount_ <= maxBatchSize, "ERC721G: _mintInternal over maxBatchSize"); // process the token id data uint256 _startId = tokenIndex; uint256 _endId = _startId + amount_; // push the required phantom mint data to mintIndex mintIndex[_startId].owner = to_; mintIndex[_startId].lastTransfer = _getBlockTimestampCompressed(); // process the balance changes and do a loop to phantom-mint the tokens to to_ unchecked { _balanceData[to_].balance += uint32(amount_); _balanceData[to_].mintedAmount += uint32(amount_); do { emit Transfer(address(0), to_, _startId); } while (++_startId < _endId); } // set the new token index tokenIndex = _endId; } /** @dev explanation: * _mint() is the function that calls _mintInternal() using a while-loop * based on the maximum batch size (maxBatchSize) */ function _mint(address to_, uint256 amount_) internal virtual { uint256 _amountToMint = amount_; while (_amountToMint > maxBatchSize) { _amountToMint -= maxBatchSize; _mintInternal(to_, maxBatchSize); } _mintInternal(to_, _amountToMint); } /** @dev explanation: * _transfer() is the internal function that transfers the token from_ to to_ * it has ERC721-standard require checks * and then uses solmate-style approval clearing * * afterwards, it sets the _tokenData to the data of the to_ (transferee) as well as * set the balanceData. * * this results in INITIALIZATION of the token, if it has not been initialized yet. */ function _transfer(address from_, address to_, uint256 tokenId_) internal virtual { // the from_ address must be the ownerOf require(from_ == ownerOf(tokenId_), "ERC721G: _transfer != ownerOf"); // cannot transfer to 0x0 require(to_ != address(0), "ERC721G: _transfer to 0x0"); // delete any approvals delete getApproved[tokenId_]; // set _tokenData to to_ _tokenData[tokenId_].owner = to_; _tokenData[tokenId_].lastTransfer = _getBlockTimestampCompressed(); // update the balance data unchecked { _balanceData[from_].balance--; _balanceData[to_].balance++; } // emit a standard Transfer emit Transfer(from_, to_, tokenId_); } ///// ERC721G: User-Enabled Out-of-the-box Staking Functionality ///// /** @dev clarification: * As a developer, you DO NOT have to enable these functions, or use them * in the way defined in this section. * * The functions in this section are just out-of-the-box plug-and-play staking * which is enabled IMMEDIATELY. * (As well as some useful view-functions) * * You can choose to call the internal staking functions yourself, to create * custom staking logic based on the section (n-2) above. */ /** @dev explanation: * this is a staking function that receives calldata tokenIds_ array * and loops to call internal _stake in a gas-efficient way * written in a shorthand-style syntax */ function stake(uint256[] calldata tokenIds_) public virtual { uint256 i; uint256 l = tokenIds_.length; while (i < l) { // stake and return the owner's address address _owner = _stake(tokenIds_[i]); // make sure the msg.sender is the owner require(msg.sender == _owner, "You are not the owner!"); unchecked {++i;} } } /** @dev explanation: * this is an unstaking function that receives calldata tokenIds_ array * and loops to call internal _unstake in a gas-efficient way * written in a shorthand-style syntax */ function unstake(uint256[] calldata tokenIds_) public virtual { uint256 i; uint256 l = tokenIds_.length; while (i < l) { // unstake and return the owner's address address _owner = _unstake(tokenIds_[i]); // make sure the msg.sender is the owner require(msg.sender == _owner, "You are not the owner!"); unchecked {++i;} } } ///// ERC721G: User-Enabled Out-of-the-box Staking View Functions ///// /** @dev explanation: * balanceOfStaked loops through the entire tokens using * startTokenId as the start pointer, and * tokenIndex (current-next tokenId) as the end pointer * * it checks if the _trueOwnerOf() is the address_ or not * and if the owner() is not the address, indicating the * state that the token is staked. * * if so, it increases the balance. after the loop, it returns the balance. * * this is mainly for external view only. * !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER. */ function balanceOfStaked(address address_) public virtual view returns (uint256) { uint256 _balance; uint256 i = startTokenId; uint256 max = tokenIndex; while (i < max) { if (ownerOf(i) != address_ && _trueOwnerOf(i) == address_) { _balance++; } unchecked { ++i; } } return _balance; } /** @dev explanation: * walletOfOwnerStaked calls balanceOfStaked to get the staked * balance of a user. Afterwards, it runs staked-checking logic * to figure out the tokenIds that the user has staked * and then returns it in walletOfOwner fashion. * * this is mainly for external view only. * !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER. */ function walletOfOwnerStaked(address address_) public virtual view returns (uint256[] memory) { uint256 _balance = balanceOfStaked(address_); uint256[] memory _tokens = new uint256[] (_balance); uint256 _currentIndex; uint256 i = startTokenId; while (_currentIndex < _balance) { if (ownerOf(i) != address_ && _trueOwnerOf(i) == address_) { _tokens[_currentIndex++] = i; } unchecked { ++i; } } return _tokens; } /** @dev explanation: * balanceOf of the address returns UNSTAKED tokens only. * to get the total balance of the user containing both STAKED and UNSTAKED tokens, * we use this function. * * this is mainly for external view only. * !! NOT TO BE INTERFACED WITH CONTRACT WRITE FUNCTIONS EVER. */ function totalBalanceOf(address address_) public virtual view returns (uint256) { return balanceOf(address_) + balanceOfStaked(address_); } /** @dev explanation: * totalTimeStakedOfToken returns the accumulative total time staked of a tokenId * it reads from the totalTimeStaked of the tokenId_ and adds it with * a calculation of pending time staked and returns the sum of both values. * * this is mainly for external view / use only. * this function can be interfaced with contract writes. */ function totalTimeStakedOfToken(uint256 tokenId_) public virtual view returns (uint256) { OwnerStruct memory _OwnerStruct = _getTokenDataOf(tokenId_); uint256 _totalTimeStakedOnToken = _expandTimestamp(_OwnerStruct.totalTimeStaked); uint256 _totalTimeStakedPending = _OwnerStruct.stakeTimestamp > 0 ? _expandTimestamp( _getBlockTimestampCompressed() - _OwnerStruct.stakeTimestamp) : 0; return _totalTimeStakedOnToken + _totalTimeStakedPending; } /** @dev explanation: * totalTimeStakedOfTokens just returns an array of totalTimeStakedOfToken * based on tokenIds_ calldata. * * this is mainly for external view / use only. * this function can be interfaced with contract writes... however * BE CAREFUL and USE IT CORRECTLY. * (dont pass in 5000 tokenIds_ in a write function) */ function totalTimeStakedOfTokens(uint256[] calldata tokenIds_) public virtual view returns (uint256[] memory) { uint256 i; uint256 l = tokenIds_.length; uint256[] memory _totalTimeStakeds = new uint256[] (l); while (i < l) { _totalTimeStakeds[i] = totalTimeStakedOfToken(tokenIds_[i]); unchecked { ++i; } } return _totalTimeStakeds; } ///// ERC721G: ERC721 Standard Logic ///// /** @dev clarification: * no explanations here as these are standard ERC721 logics. * the reason that we can use standard ERC721 logics is because * the ERC721G logic is compartmentalized and supports internally * these ERC721 logics without any need of modification. */ function _isApprovedOrOwner(address spender_, uint256 tokenId_) internal view virtual returns (bool) { address _owner = ownerOf(tokenId_); return ( // "i am the owner of the token, and i am transferring it" _owner == spender_ // "the token's approved spender is me" || getApproved[tokenId_] == spender_ // "the owner has approved me to spend all his tokens" || isApprovedForAll[_owner][spender_]); } /** @dev clarification: * sets a specific address to be able to spend a specific token. */ function _approve(address to_, uint256 tokenId_) internal virtual { getApproved[tokenId_] = to_; emit Approval(ownerOf(tokenId_), to_, tokenId_); } function approve(address to_, uint256 tokenId_) public virtual { address _owner = ownerOf(tokenId_); require( // "i am the owner, and i am approving this token." _owner == msg.sender // "i am isApprovedForAll, so i can approve this token too." || isApprovedForAll[_owner][msg.sender], "ERC721G: approve not authorized"); _approve(to_, tokenId_); } function _setApprovalForAll(address owner_, address operator_, bool approved_) internal virtual { isApprovedForAll[owner_][operator_] = approved_; emit ApprovalForAll(owner_, operator_, approved_); } function setApprovalForAll(address operator_, bool approved_) public virtual { // this function can only be used as self-approvalforall for others. _setApprovalForAll(msg.sender, operator_, approved_); } function _exists(uint256 tokenId_) internal virtual view returns (bool) { return ownerOf(tokenId_) != address(0); } function transferFrom(address from_, address to_, uint256 tokenId_) public virtual { require(_isApprovedOrOwner(msg.sender, tokenId_), "ERC721G: transferFrom unauthorized"); _transfer(from_, to_, tokenId_); } function safeTransferFrom(address from_, address to_, uint256 tokenId_, bytes memory data_) public virtual { transferFrom(from_, to_, tokenId_); if (to_.code.length != 0) { (, bytes memory _returned) = to_.call(abi.encodeWithSelector( 0x150b7a02, msg.sender, from_, tokenId_, data_)); bytes4 _selector = abi.decode(_returned, (bytes4)); require(_selector == 0x150b7a02, "ERC721G: safeTransferFrom to_ non-ERC721Receivable!"); } } function safeTransferFrom(address from_, address to_, uint256 tokenId_) public virtual { safeTransferFrom(from_, to_, tokenId_, ""); } function supportsInterface(bytes4 iid_) public virtual view returns (bool) { return iid_ == 0x01ffc9a7 || iid_ == 0x80ac58cd || iid_ == 0x5b5e139f || iid_ == 0x7f5828d0; } function walletOfOwner(address address_) public virtual view returns (uint256[] memory) { uint256 _balance = balanceOf(address_); uint256[] memory _tokens = new uint256[] (_balance); uint256 _currentIndex; uint256 i = startTokenId; while (_currentIndex < _balance) { if (ownerOf(i) == address_) { _tokens[_currentIndex++] = i; } unchecked { ++i; } } return _tokens; } function tokenURI(uint256 tokenId_) public virtual view returns (string memory) {} // Proxy Padding bytes32[50] private proxyPadding; } abstract contract Minterable is Ownable { mapping(address => bool) public minters; modifier onlyMinter { require(minters[msg.sender], "Not Minter!"); _; } event MinterSet(address newMinter, bool status); function setMinter(address address_, bool bool_) external onlyOwner { minters[address_] = bool_; emit MinterSet(address_, bool_); } } contract GangsterAllStarEvolutionV2 is ERC721G, Ownable, Minterable { // Set the base ERC721G Constructor /// @custom:oz-upgrades-unsafe-allow constructor constructor() ERC721G("Gangster All Star: Evolution", "GAS:EVO", 1, 20) {} // Proxy Initializer Logic bool proxyIsInitialized; function proxyInitialize(address newOwner) external { require(!proxyIsInitialized); proxyIsInitialized = true; // Hardcode owner = newOwner; name = "Gangster All Star: Evolution"; symbol = "GAS:EVO"; tokenIndex = 1; } // On-Chain Generation Seed for Generative Art Generation bytes32 public generationSeed; function pullGenerationSeed() external onlyOwner { generationSeed = keccak256(abi.encodePacked( block.timestamp, block.number, block.difficulty, block.coinbase, block.gaslimit, blockhash(block.number) )); } // Define the NFT Constant Params uint256 public constant maxSupply = 7777; // Define NFT Global Params bool public stakingIsEnabled; bool public unstakingIsEnabled; function O_setStakingIsEnabled(bool bool_) external onlyOwner { stakingIsEnabled = bool_; } function O_setUnstakingIsEnabled(bool bool_) external onlyOwner { unstakingIsEnabled = bool_; } // Internal Overrides function _mint(address address_, uint256 amount_) internal override { require(maxSupply >= (totalSupply() + amount_), "ERC721G: _mint(): exceeds maxSupply"); ERC721G._mint(address_, amount_); } // Stake / Unstake Overrides for Future Compatibility function stake(uint256[] calldata tokenIds_) public override { require(stakingIsEnabled, "Staking functionality not enabled yet!"); ERC721G.stake(tokenIds_); } function unstake(uint256[] calldata tokenIds_) public override { require(unstakingIsEnabled, "Unstaking functionality not enabled yet!"); ERC721G.unstake(tokenIds_); } // Internal Functions function _mintMany(address[] memory addresses_, uint256[] memory amounts_) internal { require(addresses_.length == amounts_.length, "Array lengths mismatch!"); for (uint256 i = 0; i < addresses_.length;) { _mint(addresses_[i], amounts_[i]); unchecked { ++i; } } } // Controllerable Minting function mintAsController(address to_, uint256 amount_) external onlyMinter { _mint(to_, amount_); } function mintAsControllerMany(address[] calldata tos_, uint256[] calldata amounts_) external onlyMinter { _mintMany(tos_, amounts_); } // Token URI Configurations string internal baseURI; string internal baseURI_EXT; function O_setBaseURI(string calldata uri_) external onlyOwner { baseURI = uri_; } function O_setBaseURI_EXT(string calldata ext_) external onlyOwner { baseURI_EXT = ext_; } function _toString(uint256 value_) internal pure returns (string memory) { if (value_ == 0) { return "0"; } uint256 _iterate = value_; uint256 _digits; while (_iterate != 0) { _digits++; _iterate /= 10; } bytes memory _buffer = new bytes(_digits); while (value_ != 0) { _digits--; _buffer[_digits] = bytes1(uint8( 48 + uint256(value_ % 10 ))); value_ /= 10; } return string(_buffer); } function tokenURI(uint256 tokenId_) public view override returns (string memory) { // PoS Merge-Safe if (block.chainid != 1) return ""; return string(abi.encodePacked(baseURI, _toString(tokenId_), baseURI_EXT)); } // Proxy Padding bytes32[50] private proxyPadding; }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":false,"internalType":"address","name":"newMinter","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"MinterSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"_newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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":"string","name":"uri_","type":"string"}],"name":"O_setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"ext_","type":"string"}],"name":"O_setBaseURI_EXT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"O_setStakingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"O_setUnstakingIsEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balanceData","outputs":[{"internalType":"uint32","name":"balance","type":"uint32"},{"internalType":"uint32","name":"mintedAmount","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"timestamp_","type":"uint256"}],"name":"_compressTimestamp","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"timestamp_","type":"uint32"}],"name":"_expandTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_getBlockTimestampCompressed","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"_getTokenDataOf","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"internalType":"struct ERC721G.OwnerStruct","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenData","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"_trueOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"balanceOfStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"generationSeed","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getLastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getStakeTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"getTotalTimeStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBatchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"mintAsController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tos_","type":"address[]"},{"internalType":"uint256[]","name":"amounts_","type":"uint256[]"}],"name":"mintAsControllerMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintIndex","outputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint32","name":"lastTransfer","type":"uint32"},{"internalType":"uint32","name":"stakeTimestamp","type":"uint32"},{"internalType":"uint32","name":"totalTimeStaked","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"old_","type":"address"},{"internalType":"address","name":"new_","type":"address"}],"name":"mockTransferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"proxyInitialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pullGenerationSeed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from_","type":"address"},{"internalType":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator_","type":"address"},{"internalType":"bool","name":"approved_","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"iid_","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":[],"name":"tokenIndex","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":[{"internalType":"address","name":"address_","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"totalTimeStakedOfToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"totalTimeStakedOfTokens","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":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakingIsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"}],"name":"walletOfOwnerStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b506040518060400160405280601c81526020017f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000815250604051806040016040528060078152602001664741533a45564f60c81b8152506001601483600090816200007d919062000149565b5060016200008c848262000149565b50600282905560809190915260a05250620002159050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620000cf57607f821691505b602082108103620000f057634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200014457600081815260208120601f850160051c810160208610156200011f5750805b601f850160051c820191505b8181101562000140578281556001016200012b565b5050505b505050565b81516001600160401b03811115620001655762000165620000a4565b6200017d81620001768454620000ba565b84620000f6565b602080601f831160018114620001b557600084156200019c5750858301515b600019600386901b1c1916600185901b17855562000140565b600085815260208120601f198616915b82811015620001e657888601518255948401946001909101908401620001c5565b5085821015620002055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60805160a051612e586200027a6000396000818161046701528181611f2e01528181611f5901528181611f8601526122f101526000818161085801528181610bec01528181610cca01528181610e010152818161101201526113750152612e586000f3fe608060405234801561001057600080fd5b50600436106103425760003560e01c806388895767116101b8578063c969a5ab11610104578063e6798baa116100a2578063f16dc57d1161007c578063f16dc57d146108bb578063f2fde38b146108c3578063f46eccc4146108d6578063f6598295146108f957600080fd5b8063e6798baa14610853578063e985e9c51461087a578063f0e56f0d146108a857600080fd5b8063d55f9273116100de578063d55f927314610828578063d5abeb0114610831578063d7b4be241461083a578063e449f3411461084057600080fd5b8063c969a5ab146107ef578063ced74b5014610802578063cf456ae71461081557600080fd5b8063a22cb46511610171578063b88d4fde1161014b578063b88d4fde14610759578063ba745f2e1461076c578063bd5404a8146107c9578063c87b56dd146107dc57600080fd5b8063a22cb465146106e7578063b0b50ed5146106fa578063b4bd7c321461074757600080fd5b806388895767146106715780638da5cb5b1461069957806395d89b41146106ac578063993568c1146106b45780639b10b771146106c75780639ee0bcbc146106d457600080fd5b80633455f41e116102925780635266069d116102305780636352211e1161020a5780636352211e1461061357806370a08231146106265780637b2cbd2d14610655578063840234541461065e57600080fd5b80635266069d1461059e5780635aea7ec1146105ed5780635e7676e11461060057600080fd5b8063438b63001161026c578063438b630014610545578063470f2c1f146105655780634749900a146105785780634b0ee02a1461058b57600080fd5b80633455f41e1461050c578063403082f21461051f57806342842e0e1461053257600080fd5b80630ffdf268116102ff5780631c08c6b7116102d95780631c08c6b71461043c57806323b872dd1461044f5780632913daa0146104625780632c2cdd601461048957600080fd5b80630ffdf26814610400578063153db98a1461041357806318160ddd1461042657600080fd5b806301ffc9a714610347578063021bcdcf1461036f57806306fdde0314610384578063081812fc14610399578063095ea7b3146103da5780630fbf0a93146103ed575b600080fd5b61035a610355366004612520565b610901565b60405190151581526020015b60405180910390f35b61038261037d36600461253d565b61096e565b005b61038c6109b3565b60405161036691906125ff565b6103c26103a7366004612612565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610366565b6103826103e8366004612642565b610a41565b6103826103fb3660046126b8565b610ade565b61038261040e36600461270a565b610b4d565b610382610421366004612642565b610b91565b61042e610be8565b604051908152602001610366565b61038261044a36600461253d565b610c1d565b61038261045d366004612725565b610c54565b61042e7f000000000000000000000000000000000000000000000000000000000000000081565b6104d6610497366004612612565b6003602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff938416602086015291831691840191909152166060820152608001610366565b61042e61051a366004612761565b610cc0565b61042e61052d36600461277c565b610d5d565b610382610540366004612725565b610d70565b610558610553366004612761565b610d8b565b60405161036691906127a2565b6103826105733660046127e6565b610e87565b61038261058636600461270a565b610f47565b61042e610599366004612761565b610f84565b6105d06105ac366004612761565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610366565b6105586105fb366004612761565b610fb8565b6103c261060e366004612612565b6110b5565b6103c2610621366004612612565b6110c7565b61042e610634366004612761565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b61042e603d5481565b61055861066c3660046126b8565b6110f7565b61068461067f366004612612565b61119e565b60405163ffffffff9091168152602001610366565b603a546103c2906001600160a01b031681565b61038c6111ab565b61042e6106c2366004612612565b6111b8565b603e5461035a9060ff1681565b61042e6106e2366004612612565b6111cf565b6103826106f5366004612852565b6111e6565b6104d6610708366004612612565b6005602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e5461035a90610100900460ff1681565b61038261076736600461289b565b6111f1565b61077f61077a366004612612565b61134f565b604051610366919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103826107d7366004612761565b6114fb565b61038c6107ea366004612612565b6115ab565b6103826107fd366004612977565b6115fd565b61042e610810366004612612565b61166b565b610382610823366004612852565b6116ca565b61042e60025481565b61042e611e6181565b306103c2565b61038261084e3660046126b8565b611757565b61042e7f000000000000000000000000000000000000000000000000000000000000000081565b61035a610888366004612977565b600760209081526000928352604080842090915290825290205460ff1681565b61042e6108b6366004612612565b6117c9565b6106846117e0565b6103826108d1366004612761565b6117ed565b61035a6108e4366004612761565b603b6020526000908152604090205460ff1681565b610382611869565b60006301ffc9a760e01b6001600160e01b03198316148061093257506380ac58cd60e01b6001600160e01b03198316145b8061094d5750635b5e139f60e01b6001600160e01b03198316145b8061096857506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b031633146109a15760405162461bcd60e51b8152600401610998906129a1565b60405180910390fd5b603f6109ae828483612a45565b505050565b600080546109c0906129c5565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec906129c5565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b505050505081565b6000610a4c826110c7565b90506001600160a01b038116331480610a8857506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610ad45760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a6564006044820152606401610998565b6109ae83836118f2565b603e5460ff16610b3f5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b6064820152608401610998565b610b498282611960565b5050565b603a546001600160a01b03163314610b775760405162461bcd60e51b8152600401610998906129a1565b603e80549115156101000261ff0019909216919091179055565b336000908152603b602052604090205460ff16610bde5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b6044820152606401610998565b610b4982826119ee565b60007f0000000000000000000000000000000000000000000000000000000000000000600254610c189190612b1c565b905090565b603a546001600160a01b03163314610c475760405162461bcd60e51b8152600401610998906129a1565b60406109ae828483612a45565b610c5e3382611a68565b610cb55760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b6064820152608401610998565b6109ae838383611ae7565b60025460009081907f0000000000000000000000000000000000000000000000000000000000000000905b80821015610d5457846001600160a01b0316610d06836110c7565b6001600160a01b031614158015610d365750846001600160a01b0316610d2b836110b5565b6001600160a01b0316145b15610d495782610d4581612b2f565b9350505b816001019150610ceb565b50909392505050565b600061096863ffffffff8316600a612b48565b6109ae838383604051806020016040528060008152506111f1565b60606000610db4836001600160a01b031660009081526004602052604090205463ffffffff1690565b905060008167ffffffffffffffff811115610dd157610dd1612885565b604051908082528060200260200182016040528015610dfa578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000005b83821015610e7d57856001600160a01b0316610e3c826110c7565b6001600160a01b031603610e7557808383610e5681612b2f565b945081518110610e6857610e68612b67565b6020026020010181815250505b600101610e21565b5090949350505050565b336000908152603b602052604090205460ff16610ed45760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b6044820152606401610998565b610f4184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611c8092505050565b50505050565b603a546001600160a01b03163314610f715760405162461bcd60e51b8152600401610998906129a1565b603e805460ff1916911515919091179055565b6000610f8f82610cc0565b6001600160a01b03831660009081526004602052604090205463ffffffff166109689190612b7d565b60606000610fc583610cc0565b905060008167ffffffffffffffff811115610fe257610fe2612885565b60405190808252806020026020018201604052801561100b578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000005b83821015610e7d57856001600160a01b031661104d826110c7565b6001600160a01b03161415801561107d5750856001600160a01b0316611072826110b5565b6001600160a01b0316145b156110ad5780838361108e81612b2f565b9450815181106110a0576110a0612b67565b6020026020010181815250505b600101611032565b60006110c08261134f565b5192915050565b6000806110d38361134f565b9050806040015163ffffffff166000146110ed57306110f0565b80515b9392505050565b6060600082818167ffffffffffffffff81111561111657611116612885565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505b818310156111955761116c86868581811061116057611160612b67565b9050602002013561166b565b81848151811061117e5761117e612b67565b602002602001018181525050826001019250611143565b95945050505050565b6000610968600a83612ba6565b600180546109c0906129c5565b60006109686111c68361134f565b60600151610d5d565b60006109686111dd8361134f565b60400151610d5d565b610b49338383611d21565b6111fc848484610c54565b6001600160a01b0383163b15610f41576000836001600160a01b031663150b7a02338786866040516024016112349493929190612bba565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161126d9190612bf7565b6000604051808303816000865af19150503d80600081146112aa576040519150601f19603f3d011682016040523d82523d6000602084013e6112af565b606091505b509150506000818060200190518101906112c99190612c13565b9050630a85bd0160e11b6001600160e01b03198216146113475760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b6064820152608401610998565b505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000008210156113e35760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e67204964210000000000006044820152606401610998565b6000828152600360205260409020546001600160a01b031615158061140a57506002548210155b1561146e5750600090815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b6000818152600560205260409020546001600160a01b03166114955760001901611470565b600090815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b603c5460ff161561150b57600080fd5b603c805460ff19166001179055603a80546001600160a01b0383166001600160a01b031990911617905560408051808201909152601c81527f47616e677374657220416c6c20537461723a2045766f6c7574696f6e0000000060208201526000906115769082612c30565b506040805180820190915260078152664741533a45564f60c81b60208201526001906115a29082612c30565b50506001600255565b6060466001146115c957505060408051602081019091526000815290565b603f6115d483611d8e565b604080516020016115e793929190612d63565b6040516020818303038152906040529050919050565b603a546001600160a01b031633146116275760405162461bcd60e51b8152600401610998906129a1565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806116778361134f565b905060006116888260600151610d5d565b9050600080836040015163ffffffff16116116a45760006116be565b6116be83604001516116b46117e0565b61052d9190612d96565b90506111958183612b7d565b603a546001600160a01b031633146116f45760405162461bcd60e51b8152600401610998906129a1565b6001600160a01b0382166000818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166117bf5760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b6064820152608401610998565b610b498282611e90565b60006109686117d78361134f565b60200151610d5d565b6000610c18600a42612ba6565b603a546001600160a01b031633146118175760405162461bcd60e51b8152600401610998906129a1565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b603a546001600160a01b031633146118935760405162461bcd60e51b8152600401610998906129a1565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611927826110c7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815b80821015610f4157600061198f85858581811061198357611983612b67565b90506020020135611f1e565b9050336001600160a01b038216146119e25760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610998565b82600101925050611964565b806119f7610be8565b611a019190612b7d565b611e611015611a5e5760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b6064820152608401610998565b610b498282611f2a565b600080611a74836110c7565b9050836001600160a01b0316816001600160a01b03161480611aaf57506000838152600660205260409020546001600160a01b038581169116145b80611adf57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b611af0816110c7565b6001600160a01b0316836001600160a01b031614611b505760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f660000006044820152606401610998565b6001600160a01b038216611ba65760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f20307830000000000000006044820152606401610998565b600081815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b038416179055611bea6117e0565b6000828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b038088168085526004909352818420805460001981881601871663ffffffff199182161790915590871680855282852080548088166001019097169690921695909517905551849392600080516020612e0383398151915291a4505050565b8051825114611cd15760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610998565b60005b82518110156109ae57611d19838281518110611cf257611cf2612b67565b6020026020010151838381518110611d0c57611d0c612b67565b60200260200101516119ee565b600101611cd4565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081600003611db55750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ddf5780611dc981612b2f565b9150611dd89050600a83612ba6565b9150611db9565b60008167ffffffffffffffff811115611dfa57611dfa612885565b6040519080825280601f01601f191660200182016040528015611e24576020820181803683370190505b5090505b8415611adf5781611e3881612dba565b9250611e479050600a86612dd1565b611e52906030612b7d565b60f81b818381518110611e6757611e67612b67565b60200101906001600160f81b031916908160001a905350611e89600a86612ba6565b9450611e28565b6000815b80821015610f41576000611ebf858585818110611eb357611eb3612b67565b90506020020135611fb9565b9050336001600160a01b03821614611f125760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610998565b82600101925050611e94565b60006109688242611fc2565b805b7f0000000000000000000000000000000000000000000000000000000000000000811115611faf57611f7e7f000000000000000000000000000000000000000000000000000000000000000082612b1c565b9050611faa837f0000000000000000000000000000000000000000000000000000000000000000612299565b611f2c565b6109ae8382612299565b60006109688260005b600080611fce8461134f565b8051604082015191925090611fe38684612468565b600086815260066020526040902080546001600160a01b031916905584156120dd5763ffffffff81161561206e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b6064820152608401610998565b6001600160a01b038216600081815260046020526040808220805463ffffffff1980821663ffffffff928316600019018316179092553080855283852080548084166001019093169290931691909117909155905189939192600080516020612e0383398151915291a4612255565b8063ffffffff1660000361214a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b6064820152608401610998565b6001600160a01b03821660009081526004602081905260408220805463ffffffff8082166001011663ffffffff19909116179055906121863090565b6001600160a01b0316815260208101919091526040016000908120805463ffffffff19811663ffffffff91821660001901909116179055816121c66117e0565b6121d09190612d96565b600088815260036020526040902080549192508291601c90612200908490600160e01b900463ffffffff16612de5565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b03166122303090565b6001600160a01b0316600080516020612e0383398151915260405160405180910390a4505b61225e8561119e565b6000878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166122ef5760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f203078300000006044820152606401610998565b7f00000000000000000000000000000000000000000000000000000000000000008111156123705760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b6064820152608401610998565b600254600061237f8383612b7d565b600083815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506123b06117e0565b6000838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b03861690600090600080516020612e03833981519152908290a480826001019250821061242d57600255505050565b6000828152600360205260409020546001600160a01b0316610b4957600082815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b03198116811461251d57600080fd5b50565b60006020828403121561253257600080fd5b81356110f081612507565b6000806020838503121561255057600080fd5b823567ffffffffffffffff8082111561256857600080fd5b818501915085601f83011261257c57600080fd5b81358181111561258b57600080fd5b86602082850101111561259d57600080fd5b60209290920196919550909350505050565b60005b838110156125ca5781810151838201526020016125b2565b50506000910152565b600081518084526125eb8160208601602086016125af565b601f01601f19169290920160200192915050565b6020815260006110f060208301846125d3565b60006020828403121561262457600080fd5b5035919050565b80356001600160a01b03811681146114f657600080fd5b6000806040838503121561265557600080fd5b61265e8361262b565b946020939093013593505050565b60008083601f84011261267e57600080fd5b50813567ffffffffffffffff81111561269657600080fd5b6020830191508360208260051b85010111156126b157600080fd5b9250929050565b600080602083850312156126cb57600080fd5b823567ffffffffffffffff8111156126e257600080fd5b6126ee8582860161266c565b90969095509350505050565b803580151581146114f657600080fd5b60006020828403121561271c57600080fd5b6110f0826126fa565b60008060006060848603121561273a57600080fd5b6127438461262b565b92506127516020850161262b565b9150604084013590509250925092565b60006020828403121561277357600080fd5b6110f08261262b565b60006020828403121561278e57600080fd5b813563ffffffff811681146110f057600080fd5b6020808252825182820181905260009190848201906040850190845b818110156127da578351835292840192918401916001016127be565b50909695505050505050565b600080600080604085870312156127fc57600080fd5b843567ffffffffffffffff8082111561281457600080fd5b6128208883890161266c565b9096509450602087013591508082111561283957600080fd5b506128468782880161266c565b95989497509550505050565b6000806040838503121561286557600080fd5b61286e8361262b565b915061287c602084016126fa565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156128b157600080fd5b6128ba8561262b565b93506128c86020860161262b565b925060408501359150606085013567ffffffffffffffff808211156128ec57600080fd5b818701915087601f83011261290057600080fd5b81358181111561291257612912612885565b604051601f8201601f19908116603f0116810190838211818310171561293a5761293a612885565b816040528281528a602084870101111561295357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561298a57600080fd5b6129938361262b565b915061287c6020840161262b565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c908216806129d957607f821691505b6020821081036129f957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156109ae57600081815260208120601f850160051c81016020861015612a265750805b601f850160051c820191505b8181101561134757828155600101612a32565b67ffffffffffffffff831115612a5d57612a5d612885565b612a7183612a6b83546129c5565b836129ff565b6000601f841160018114612aa55760008515612a8d5750838201355b600019600387901b1c1916600186901b178355612aff565b600083815260209020601f19861690835b82811015612ad65786850135825560209485019460019092019101612ab6565b5086821015612af35760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561096857610968612b06565b600060018201612b4157612b41612b06565b5060010190565b6000816000190483118215151615612b6257612b62612b06565b500290565b634e487b7160e01b600052603260045260246000fd5b8082018082111561096857610968612b06565b634e487b7160e01b600052601260045260246000fd5b600082612bb557612bb5612b90565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bed908301846125d3565b9695505050505050565b60008251612c098184602087016125af565b9190910192915050565b600060208284031215612c2557600080fd5b81516110f081612507565b815167ffffffffffffffff811115612c4a57612c4a612885565b612c5e81612c5884546129c5565b846129ff565b602080601f831160018114612c935760008415612c7b5750858301515b600019600386901b1c1916600185901b178555611347565b600085815260208120601f198616915b82811015612cc257888601518255948401946001909101908401612ca3565b5085821015612ce05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612cfd816129c5565b60018281168015612d155760018114612d2a57612d59565b60ff1984168752821515830287019450612d59565b8560005260208060002060005b85811015612d505781548a820152908401908201612d37565b50505082870194505b5050505092915050565b6000612d6f8286612cf0565b8451612d7f8183602089016125af565b612d8b81830186612cf0565b979650505050505050565b63ffffffff828116828216039080821115612db357612db3612b06565b5092915050565b600081612dc957612dc9612b06565b506000190190565b600082612de057612de0612b90565b500690565b63ffffffff818116838216019080821115612db357612db3612b0656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ab836cfdf9236d9101c72fc7d0bf8ed1bac03fc39310067dc2c7088fe7922edd64736f6c63430008100033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103425760003560e01c806388895767116101b8578063c969a5ab11610104578063e6798baa116100a2578063f16dc57d1161007c578063f16dc57d146108bb578063f2fde38b146108c3578063f46eccc4146108d6578063f6598295146108f957600080fd5b8063e6798baa14610853578063e985e9c51461087a578063f0e56f0d146108a857600080fd5b8063d55f9273116100de578063d55f927314610828578063d5abeb0114610831578063d7b4be241461083a578063e449f3411461084057600080fd5b8063c969a5ab146107ef578063ced74b5014610802578063cf456ae71461081557600080fd5b8063a22cb46511610171578063b88d4fde1161014b578063b88d4fde14610759578063ba745f2e1461076c578063bd5404a8146107c9578063c87b56dd146107dc57600080fd5b8063a22cb465146106e7578063b0b50ed5146106fa578063b4bd7c321461074757600080fd5b806388895767146106715780638da5cb5b1461069957806395d89b41146106ac578063993568c1146106b45780639b10b771146106c75780639ee0bcbc146106d457600080fd5b80633455f41e116102925780635266069d116102305780636352211e1161020a5780636352211e1461061357806370a08231146106265780637b2cbd2d14610655578063840234541461065e57600080fd5b80635266069d1461059e5780635aea7ec1146105ed5780635e7676e11461060057600080fd5b8063438b63001161026c578063438b630014610545578063470f2c1f146105655780634749900a146105785780634b0ee02a1461058b57600080fd5b80633455f41e1461050c578063403082f21461051f57806342842e0e1461053257600080fd5b80630ffdf268116102ff5780631c08c6b7116102d95780631c08c6b71461043c57806323b872dd1461044f5780632913daa0146104625780632c2cdd601461048957600080fd5b80630ffdf26814610400578063153db98a1461041357806318160ddd1461042657600080fd5b806301ffc9a714610347578063021bcdcf1461036f57806306fdde0314610384578063081812fc14610399578063095ea7b3146103da5780630fbf0a93146103ed575b600080fd5b61035a610355366004612520565b610901565b60405190151581526020015b60405180910390f35b61038261037d36600461253d565b61096e565b005b61038c6109b3565b60405161036691906125ff565b6103c26103a7366004612612565b6006602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610366565b6103826103e8366004612642565b610a41565b6103826103fb3660046126b8565b610ade565b61038261040e36600461270a565b610b4d565b610382610421366004612642565b610b91565b61042e610be8565b604051908152602001610366565b61038261044a36600461253d565b610c1d565b61038261045d366004612725565b610c54565b61042e7f000000000000000000000000000000000000000000000000000000000000001481565b6104d6610497366004612612565b6003602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff938416602086015291831691840191909152166060820152608001610366565b61042e61051a366004612761565b610cc0565b61042e61052d36600461277c565b610d5d565b610382610540366004612725565b610d70565b610558610553366004612761565b610d8b565b60405161036691906127a2565b6103826105733660046127e6565b610e87565b61038261058636600461270a565b610f47565b61042e610599366004612761565b610f84565b6105d06105ac366004612761565b60046020526000908152604090205463ffffffff8082169164010000000090041682565b6040805163ffffffff938416815292909116602083015201610366565b6105586105fb366004612761565b610fb8565b6103c261060e366004612612565b6110b5565b6103c2610621366004612612565b6110c7565b61042e610634366004612761565b6001600160a01b031660009081526004602052604090205463ffffffff1690565b61042e603d5481565b61055861066c3660046126b8565b6110f7565b61068461067f366004612612565b61119e565b60405163ffffffff9091168152602001610366565b603a546103c2906001600160a01b031681565b61038c6111ab565b61042e6106c2366004612612565b6111b8565b603e5461035a9060ff1681565b61042e6106e2366004612612565b6111cf565b6103826106f5366004612852565b6111e6565b6104d6610708366004612612565b6005602052600090815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e5461035a90610100900460ff1681565b61038261076736600461289b565b6111f1565b61077f61077a366004612612565b61134f565b604051610366919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103826107d7366004612761565b6114fb565b61038c6107ea366004612612565b6115ab565b6103826107fd366004612977565b6115fd565b61042e610810366004612612565b61166b565b610382610823366004612852565b6116ca565b61042e60025481565b61042e611e6181565b306103c2565b61038261084e3660046126b8565b611757565b61042e7f000000000000000000000000000000000000000000000000000000000000000181565b61035a610888366004612977565b600760209081526000928352604080842090915290825290205460ff1681565b61042e6108b6366004612612565b6117c9565b6106846117e0565b6103826108d1366004612761565b6117ed565b61035a6108e4366004612761565b603b6020526000908152604090205460ff1681565b610382611869565b60006301ffc9a760e01b6001600160e01b03198316148061093257506380ac58cd60e01b6001600160e01b03198316145b8061094d5750635b5e139f60e01b6001600160e01b03198316145b8061096857506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b031633146109a15760405162461bcd60e51b8152600401610998906129a1565b60405180910390fd5b603f6109ae828483612a45565b505050565b600080546109c0906129c5565b80601f01602080910402602001604051908101604052809291908181526020018280546109ec906129c5565b8015610a395780601f10610a0e57610100808354040283529160200191610a39565b820191906000526020600020905b815481529060010190602001808311610a1c57829003601f168201915b505050505081565b6000610a4c826110c7565b90506001600160a01b038116331480610a8857506001600160a01b038116600090815260076020908152604080832033845290915290205460ff165b610ad45760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a6564006044820152606401610998565b6109ae83836118f2565b603e5460ff16610b3f5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b6064820152608401610998565b610b498282611960565b5050565b603a546001600160a01b03163314610b775760405162461bcd60e51b8152600401610998906129a1565b603e80549115156101000261ff0019909216919091179055565b336000908152603b602052604090205460ff16610bde5760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b6044820152606401610998565b610b4982826119ee565b60007f0000000000000000000000000000000000000000000000000000000000000001600254610c189190612b1c565b905090565b603a546001600160a01b03163314610c475760405162461bcd60e51b8152600401610998906129a1565b60406109ae828483612a45565b610c5e3382611a68565b610cb55760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b6064820152608401610998565b6109ae838383611ae7565b60025460009081907f0000000000000000000000000000000000000000000000000000000000000001905b80821015610d5457846001600160a01b0316610d06836110c7565b6001600160a01b031614158015610d365750846001600160a01b0316610d2b836110b5565b6001600160a01b0316145b15610d495782610d4581612b2f565b9350505b816001019150610ceb565b50909392505050565b600061096863ffffffff8316600a612b48565b6109ae838383604051806020016040528060008152506111f1565b60606000610db4836001600160a01b031660009081526004602052604090205463ffffffff1690565b905060008167ffffffffffffffff811115610dd157610dd1612885565b604051908082528060200260200182016040528015610dfa578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000015b83821015610e7d57856001600160a01b0316610e3c826110c7565b6001600160a01b031603610e7557808383610e5681612b2f565b945081518110610e6857610e68612b67565b6020026020010181815250505b600101610e21565b5090949350505050565b336000908152603b602052604090205460ff16610ed45760405162461bcd60e51b815260206004820152600b60248201526a4e6f74204d696e7465722160a81b6044820152606401610998565b610f4184848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808802828101820190935287825290935087925086918291850190849080828437600092019190915250611c8092505050565b50505050565b603a546001600160a01b03163314610f715760405162461bcd60e51b8152600401610998906129a1565b603e805460ff1916911515919091179055565b6000610f8f82610cc0565b6001600160a01b03831660009081526004602052604090205463ffffffff166109689190612b7d565b60606000610fc583610cc0565b905060008167ffffffffffffffff811115610fe257610fe2612885565b60405190808252806020026020018201604052801561100b578160200160208202803683370190505b50905060007f00000000000000000000000000000000000000000000000000000000000000015b83821015610e7d57856001600160a01b031661104d826110c7565b6001600160a01b03161415801561107d5750856001600160a01b0316611072826110b5565b6001600160a01b0316145b156110ad5780838361108e81612b2f565b9450815181106110a0576110a0612b67565b6020026020010181815250505b600101611032565b60006110c08261134f565b5192915050565b6000806110d38361134f565b9050806040015163ffffffff166000146110ed57306110f0565b80515b9392505050565b6060600082818167ffffffffffffffff81111561111657611116612885565b60405190808252806020026020018201604052801561113f578160200160208202803683370190505b5090505b818310156111955761116c86868581811061116057611160612b67565b9050602002013561166b565b81848151811061117e5761117e612b67565b602002602001018181525050826001019250611143565b95945050505050565b6000610968600a83612ba6565b600180546109c0906129c5565b60006109686111c68361134f565b60600151610d5d565b60006109686111dd8361134f565b60400151610d5d565b610b49338383611d21565b6111fc848484610c54565b6001600160a01b0383163b15610f41576000836001600160a01b031663150b7a02338786866040516024016112349493929190612bba565b6040516020818303038152906040529060e01b6020820180516001600160e01b03838183161783525050505060405161126d9190612bf7565b6000604051808303816000865af19150503d80600081146112aa576040519150601f19603f3d011682016040523d82523d6000602084013e6112af565b606091505b509150506000818060200190518101906112c99190612c13565b9050630a85bd0160e11b6001600160e01b03198216146113475760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b6064820152608401610998565b505050505050565b6040805160808101825260008082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000018210156113e35760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e67204964210000000000006044820152606401610998565b6000828152600360205260409020546001600160a01b031615158061140a57506002548210155b1561146e5750600090815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b6000818152600560205260409020546001600160a01b03166114955760001901611470565b600090815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b603c5460ff161561150b57600080fd5b603c805460ff19166001179055603a80546001600160a01b0383166001600160a01b031990911617905560408051808201909152601c81527f47616e677374657220416c6c20537461723a2045766f6c7574696f6e0000000060208201526000906115769082612c30565b506040805180820190915260078152664741533a45564f60c81b60208201526001906115a29082612c30565b50506001600255565b6060466001146115c957505060408051602081019091526000815290565b603f6115d483611d8e565b604080516020016115e793929190612d63565b6040516020818303038152906040529050919050565b603a546001600160a01b031633146116275760405162461bcd60e51b8152600401610998906129a1565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000806116778361134f565b905060006116888260600151610d5d565b9050600080836040015163ffffffff16116116a45760006116be565b6116be83604001516116b46117e0565b61052d9190612d96565b90506111958183612b7d565b603a546001600160a01b031633146116f45760405162461bcd60e51b8152600401610998906129a1565b6001600160a01b0382166000818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166117bf5760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b6064820152608401610998565b610b498282611e90565b60006109686117d78361134f565b60200151610d5d565b6000610c18600a42612ba6565b603a546001600160a01b031633146118175760405162461bcd60e51b8152600401610998906129a1565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b603a546001600160a01b031633146118935760405162461bcd60e51b8152600401610998906129a1565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b600081815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611927826110c7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000815b80821015610f4157600061198f85858581811061198357611983612b67565b90506020020135611f1e565b9050336001600160a01b038216146119e25760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610998565b82600101925050611964565b806119f7610be8565b611a019190612b7d565b611e611015611a5e5760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b6064820152608401610998565b610b498282611f2a565b600080611a74836110c7565b9050836001600160a01b0316816001600160a01b03161480611aaf57506000838152600660205260409020546001600160a01b038581169116145b80611adf57506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b611af0816110c7565b6001600160a01b0316836001600160a01b031614611b505760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f660000006044820152606401610998565b6001600160a01b038216611ba65760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f20307830000000000000006044820152606401610998565b600081815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b038416179055611bea6117e0565b6000828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b038088168085526004909352818420805460001981881601871663ffffffff199182161790915590871680855282852080548088166001019097169690921695909517905551849392600080516020612e0383398151915291a4505050565b8051825114611cd15760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610998565b60005b82518110156109ae57611d19838281518110611cf257611cf2612b67565b6020026020010151838381518110611d0c57611d0c612b67565b60200260200101516119ee565b600101611cd4565b6001600160a01b03838116600081815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b606081600003611db55750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611ddf5780611dc981612b2f565b9150611dd89050600a83612ba6565b9150611db9565b60008167ffffffffffffffff811115611dfa57611dfa612885565b6040519080825280601f01601f191660200182016040528015611e24576020820181803683370190505b5090505b8415611adf5781611e3881612dba565b9250611e479050600a86612dd1565b611e52906030612b7d565b60f81b818381518110611e6757611e67612b67565b60200101906001600160f81b031916908160001a905350611e89600a86612ba6565b9450611e28565b6000815b80821015610f41576000611ebf858585818110611eb357611eb3612b67565b90506020020135611fb9565b9050336001600160a01b03821614611f125760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610998565b82600101925050611e94565b60006109688242611fc2565b805b7f0000000000000000000000000000000000000000000000000000000000000014811115611faf57611f7e7f000000000000000000000000000000000000000000000000000000000000001482612b1c565b9050611faa837f0000000000000000000000000000000000000000000000000000000000000014612299565b611f2c565b6109ae8382612299565b60006109688260005b600080611fce8461134f565b8051604082015191925090611fe38684612468565b600086815260066020526040902080546001600160a01b031916905584156120dd5763ffffffff81161561206e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b6064820152608401610998565b6001600160a01b038216600081815260046020526040808220805463ffffffff1980821663ffffffff928316600019018316179092553080855283852080548084166001019093169290931691909117909155905189939192600080516020612e0383398151915291a4612255565b8063ffffffff1660000361214a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b6064820152608401610998565b6001600160a01b03821660009081526004602081905260408220805463ffffffff8082166001011663ffffffff19909116179055906121863090565b6001600160a01b0316815260208101919091526040016000908120805463ffffffff19811663ffffffff91821660001901909116179055816121c66117e0565b6121d09190612d96565b600088815260036020526040902080549192508291601c90612200908490600160e01b900463ffffffff16612de5565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b03166122303090565b6001600160a01b0316600080516020612e0383398151915260405160405180910390a4505b61225e8561119e565b6000878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166122ef5760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f203078300000006044820152606401610998565b7f00000000000000000000000000000000000000000000000000000000000000148111156123705760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b6064820152608401610998565b600254600061237f8383612b7d565b600083815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506123b06117e0565b6000838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b03861690600090600080516020612e03833981519152908290a480826001019250821061242d57600255505050565b6000828152600360205260409020546001600160a01b0316610b4957600082815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b03198116811461251d57600080fd5b50565b60006020828403121561253257600080fd5b81356110f081612507565b6000806020838503121561255057600080fd5b823567ffffffffffffffff8082111561256857600080fd5b818501915085601f83011261257c57600080fd5b81358181111561258b57600080fd5b86602082850101111561259d57600080fd5b60209290920196919550909350505050565b60005b838110156125ca5781810151838201526020016125b2565b50506000910152565b600081518084526125eb8160208601602086016125af565b601f01601f19169290920160200192915050565b6020815260006110f060208301846125d3565b60006020828403121561262457600080fd5b5035919050565b80356001600160a01b03811681146114f657600080fd5b6000806040838503121561265557600080fd5b61265e8361262b565b946020939093013593505050565b60008083601f84011261267e57600080fd5b50813567ffffffffffffffff81111561269657600080fd5b6020830191508360208260051b85010111156126b157600080fd5b9250929050565b600080602083850312156126cb57600080fd5b823567ffffffffffffffff8111156126e257600080fd5b6126ee8582860161266c565b90969095509350505050565b803580151581146114f657600080fd5b60006020828403121561271c57600080fd5b6110f0826126fa565b60008060006060848603121561273a57600080fd5b6127438461262b565b92506127516020850161262b565b9150604084013590509250925092565b60006020828403121561277357600080fd5b6110f08261262b565b60006020828403121561278e57600080fd5b813563ffffffff811681146110f057600080fd5b6020808252825182820181905260009190848201906040850190845b818110156127da578351835292840192918401916001016127be565b50909695505050505050565b600080600080604085870312156127fc57600080fd5b843567ffffffffffffffff8082111561281457600080fd5b6128208883890161266c565b9096509450602087013591508082111561283957600080fd5b506128468782880161266c565b95989497509550505050565b6000806040838503121561286557600080fd5b61286e8361262b565b915061287c602084016126fa565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156128b157600080fd5b6128ba8561262b565b93506128c86020860161262b565b925060408501359150606085013567ffffffffffffffff808211156128ec57600080fd5b818701915087601f83011261290057600080fd5b81358181111561291257612912612885565b604051601f8201601f19908116603f0116810190838211818310171561293a5761293a612885565b816040528281528a602084870101111561295357600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561298a57600080fd5b6129938361262b565b915061287c6020840161262b565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c908216806129d957607f821691505b6020821081036129f957634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156109ae57600081815260208120601f850160051c81016020861015612a265750805b601f850160051c820191505b8181101561134757828155600101612a32565b67ffffffffffffffff831115612a5d57612a5d612885565b612a7183612a6b83546129c5565b836129ff565b6000601f841160018114612aa55760008515612a8d5750838201355b600019600387901b1c1916600186901b178355612aff565b600083815260209020601f19861690835b82811015612ad65786850135825560209485019460019092019101612ab6565b5086821015612af35760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561096857610968612b06565b600060018201612b4157612b41612b06565b5060010190565b6000816000190483118215151615612b6257612b62612b06565b500290565b634e487b7160e01b600052603260045260246000fd5b8082018082111561096857610968612b06565b634e487b7160e01b600052601260045260246000fd5b600082612bb557612bb5612b90565b500490565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612bed908301846125d3565b9695505050505050565b60008251612c098184602087016125af565b9190910192915050565b600060208284031215612c2557600080fd5b81516110f081612507565b815167ffffffffffffffff811115612c4a57612c4a612885565b612c5e81612c5884546129c5565b846129ff565b602080601f831160018114612c935760008415612c7b5750858301515b600019600386901b1c1916600185901b178555611347565b600085815260208120601f198616915b82811015612cc257888601518255948401946001909101908401612ca3565b5085821015612ce05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008154612cfd816129c5565b60018281168015612d155760018114612d2a57612d59565b60ff1984168752821515830287019450612d59565b8560005260208060002060005b85811015612d505781548a820152908401908201612d37565b50505082870194505b5050505092915050565b6000612d6f8286612cf0565b8451612d7f8183602089016125af565b612d8b81830186612cf0565b979650505050505050565b63ffffffff828116828216039080821115612db357612db3612b06565b5092915050565b600081612dc957612dc9612b06565b506000190190565b600082612de057612de0612b90565b500690565b63ffffffff818116838216019080821115612db357612db3612b0656feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220ab836cfdf9236d9101c72fc7d0bf8ed1bac03fc39310067dc2c7088fe7922edd64736f6c63430008100033
Deployed Bytecode Sourcemap
28713:3865:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27505:186;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27505:186:0;;;;;;;;31587:97;;;;;;:::i;:::-;;:::i;:::-;;1441:18;;;:::i;:::-;;;;;;;:::i;3587:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3587:46:0;;;;;;-1:-1:-1;;;;;2294:32:1;;;2276:51;;2264:2;2249:18;3587:46:0;2130:203:1;25486:447:0;;;;;;:::i;:::-;;:::i;30428:182::-;;;;;;:::i;:::-;;:::i;29993:104::-;;;;;;:::i;:::-;;:::i;31206:114::-;;;;;;:::i;:::-;;:::i;4814:112::-;;;:::i;:::-;;;4085:25:1;;;4073:2;4058:18;4814:112:0;3939:177:1;31690:105:0;;;;;;:::i;:::-;;:::i;26547:244::-;;;;;;:::i;:::-;;:::i;1852:37::-;;;;;3309:49;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3309:49:0;;;;-1:-1:-1;;;3309:49:0;;;;;-1:-1:-1;;;3309:49:0;;;;;-1:-1:-1;;;3309:49:0;;;;;;;;;;-1:-1:-1;;;;;4697:32:1;;;4679:51;;4749:10;4795:15;;;4790:2;4775:18;;4768:43;4847:15;;;4827:18;;;4820:43;;;;4899:15;4894:2;4879:18;;4872:43;4666:3;4651:19;3309:49:0;4454:467:1;20635:406:0;;;;;;:::i;:::-;;:::i;4072:138::-;;;;;;:::i;:::-;;:::i;27343:154::-;;;;;;:::i;:::-;;:::i;27699:467::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;31326:153::-;;;;;;:::i;:::-;;:::i;29887:100::-;;;;;;:::i;:::-;;:::i;22362:153::-;;;;;;:::i;:::-;;:::i;3388:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;6993:10:1;7030:15;;;7012:34;;7082:15;;;;7077:2;7062:18;;7055:43;6956:18;3388:53:0;6813:291:1;21467:539:0;;;;;;:::i;:::-;;:::i;7154:135::-;;;;;;:::i;:::-;;:::i;6621:241::-;;;;;;:::i;:::-;;:::i;4932:131::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5025:22:0;4998:7;5025:22;;;:12;:22;;;;;:30;;;;4932:131;29395:29;;;;;;23890:424;;;;;;:::i;:::-;;:::i;3927:139::-;;;;;;:::i;:::-;;:::i;:::-;;;7465:10:1;7453:23;;;7435:42;;7423:2;7408:18;3927:139:0;7291:192:1;93:20:0;;;;;-1:-1:-1;;;;;93:20:0;;;1480;;;:::i;4574:174::-;;;;;;:::i;:::-;;:::i;29815:28::-;;;;;;;;;4396:172;;;;;;:::i;:::-;;:::i;26175:227::-;;;;;;:::i;:::-;;:::i;3473:48::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3473:48:0;;;;-1:-1:-1;;;3473:48:0;;;;;-1:-1:-1;;;3473:48:0;;;;;-1:-1:-1;;;3473:48:0;;;;;;29850:30;;;;;;;;;;;;26797:540;;;;;;:::i;:::-;;:::i;5520:773::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;9247:13:1;;-1:-1:-1;;;;;9243:39:1;9225:58;;9330:4;9318:17;;;9312:24;9355:10;9403:21;;;9381:20;;;9374:51;;;;9485:4;9473:17;;;9467:24;9463:33;;9441:20;;;9434:63;9557:4;9545:17;;;9539:24;9535:33;9513:20;;;9506:63;;;;9212:3;9197:19;;9022:553;29029:295:0;;;;;;:::i;:::-;;:::i;32265:245::-;;;;;;:::i;:::-;;:::i;582:173::-;;;;;;:::i;:::-;;:::i;22932:556::-;;;;;;:::i;:::-;;:::i;28552:154::-;;;;;;:::i;:::-;;:::i;1558:25::-;;;;;;29733:40;;29769:4;29733:40;;2025:95;2107:4;2025:95;;30616:190;;;;;;:::i;:::-;;:::i;1699:37::-;;;;;3670:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4222:168;;;;;;:::i;:::-;;:::i;3790:131::-;;;:::i;397:179::-;;;;;;:::i;:::-;;:::i;28375:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;29431:255;;;:::i;27505:186::-;27574:4;-1:-1:-1;;;;;;;;;27598:18:0;;;;:40;;-1:-1:-1;;;;;;;;;;27620:18:0;;;27598:40;:62;;;-1:-1:-1;;;;;;;;;;27642:18:0;;;27598:62;:84;;;-1:-1:-1;;;;;;;;;;27664:18:0;;;27598:84;27591:91;27505:186;-1:-1:-1;;27505:186:0:o;31587:97::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;;;;;;;;;31661:7:::1;:14;31671:4:::0;;31661:7;:14:::1;:::i;:::-;;31587:97:::0;;:::o;1441:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25486:447::-;25560:14;25577:17;25585:8;25577:7;:17::i;:::-;25560:34;-1:-1:-1;;;;;;25692:20:0;;25702:10;25692:20;;:148;;-1:-1:-1;;;;;;25804:24:0;;;;;;:16;:24;;;;;;;;25829:10;25804:36;;;;;;;;;;25692:148;25605:284;;;;-1:-1:-1;;;25605:284:0;;12829:2:1;25605:284:0;;;12811:21:1;12868:2;12848:18;;;12841:30;12907:33;12887:18;;;12880:61;12958:18;;25605:284:0;12627:355:1;25605:284:0;25902:23;25911:3;25916:8;25902;:23::i;30428:182::-;30508:16;;;;30500:67;;;;-1:-1:-1;;;30500:67:0;;13189:2:1;30500:67:0;;;13171:21:1;13228:2;13208:18;;;13201:30;13267:34;13247:18;;;13240:62;-1:-1:-1;;;13318:18:1;;;13311:36;13364:19;;30500:67:0;12987:402:1;30500:67:0;30578:24;30592:9;;30578:13;:24::i;:::-;30428:182;;:::o;29993:104::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;30068:18:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;30068:26:0;;::::1;::::0;;;::::1;::::0;;29993:104::o;31206:114::-;28459:10;28451:19;;;;:7;:19;;;;;;;;28443:43;;;;-1:-1:-1;;;28443:43:0;;13596:2:1;28443:43:0;;;13578:21:1;13635:2;13615:18;;;13608:30;-1:-1:-1;;;13654:18:1;;;13647:41;13705:18;;28443:43:0;13394:335:1;28443:43:0;31293:19:::1;31299:3;31304:7;31293:5;:19::i;4814:112::-:0;4866:7;4906:12;4893:10;;:25;;;;:::i;:::-;4886:32;;4814:112;:::o;31690:105::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;31768:11:::1;:18;31782:4:::0;;31768:11;:18:::1;:::i;26547:244::-:0;26649:40;26668:10;26680:8;26649:18;:40::i;:::-;26641:100;;;;-1:-1:-1;;;26641:100:0;;14201:2:1;26641:100:0;;;14183:21:1;14240:2;14220:18;;;14213:30;14279:34;14259:18;;;14252:62;-1:-1:-1;;;14330:18:1;;;14323:32;14372:19;;26641:100:0;13999:398:1;26641:100:0;26752:31;26762:5;26769:3;26774:8;26752:9;:31::i;20635:406::-;20809:10;;20713:7;;;;20772:12;;20830:178;20841:3;20837:1;:7;20830:178;;;20879:8;-1:-1:-1;;;;;20865:22:0;:10;20873:1;20865:7;:10::i;:::-;-1:-1:-1;;;;;20865:22:0;;;:53;;;;;20910:8;-1:-1:-1;;;;;20891:27:0;:15;20904:1;20891:12;:15::i;:::-;-1:-1:-1;;;;;20891:27:0;;20865:53;20861:104;;;20939:10;;;;:::i;:::-;;;;20861:104;20991:3;;;;;20830:178;;;-1:-1:-1;21025:8:0;;20635:406;-1:-1:-1;;;20635:406:0:o;4072:138::-;4151:7;4178:24;:19;;;4200:2;4178:24;:::i;27343:154::-;27447:42;27464:5;27471:3;27476:8;27447:42;;;;;;;;;;;;:16;:42::i;27699:467::-;27775:16;27804;27823:19;27833:8;-1:-1:-1;;;;;5025:22:0;4998:7;5025:22;;;:12;:22;;;;;:30;;;;4932:131;27823:19;27804:38;;27853:24;27895:8;27880:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27880:24:0;-1:-1:-1;27853:51:0;-1:-1:-1;27915:21:0;27959:12;27982:152;28005:8;27989:13;:24;27982:152;;;28048:8;-1:-1:-1;;;;;28034:22:0;:10;28042:1;28034:7;:10::i;:::-;-1:-1:-1;;;;;28034:22:0;;28030:61;;28087:1;28060:7;28068:15;;;;:::i;:::-;;;28060:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;28030:61;28117:3;;27982:152;;;-1:-1:-1;28151:7:0;;27699:467;-1:-1:-1;;;;27699:467:0:o;31326:153::-;28459:10;28451:19;;;;:7;:19;;;;;;;;28443:43;;;;-1:-1:-1;;;28443:43:0;;13596:2:1;28443:43:0;;;13578:21:1;13635:2;13615:18;;;13608:30;-1:-1:-1;;;13654:18:1;;;13647:41;13705:18;;28443:43:0;13394:335:1;28443:43:0;31446:25:::1;31456:4;;31446:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;31446:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;31462:8:0;;-1:-1:-1;31462:8:0;;;;31446:25;::::1;::::0;31462:8;;31446:25;31462:8;31446:25;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;31446:9:0::1;::::0;-1:-1:-1;;;31446:25:0:i:1;:::-;31326:153:::0;;;;:::o;29887:100::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;29960:16:::1;:24:::0;;-1:-1:-1;;29960:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;29887:100::o;22362:153::-;22433:7;22482:25;22498:8;22482:15;:25::i;:::-;-1:-1:-1;;;;;5025:22:0;;4998:7;5025:22;;;:12;:22;;;;;:30;;;22460:47;;;;:::i;21467:539::-;21548:16;21577;21596:25;21612:8;21596:15;:25::i;:::-;21577:44;;21632:24;21674:8;21659:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21659:24:0;-1:-1:-1;21632:51:0;-1:-1:-1;21694:21:0;21738:12;21761:213;21784:8;21768:13;:24;21761:213;;;21827:8;-1:-1:-1;;;;;21813:22:0;:10;21821:1;21813:7;:10::i;:::-;-1:-1:-1;;;;;21813:22:0;;;:53;;;;;21858:8;-1:-1:-1;;;;;21839:27:0;:15;21852:1;21839:12;:15::i;:::-;-1:-1:-1;;;;;21839:27:0;;21813:53;21809:122;;;21914:1;21887:7;21895:15;;;;:::i;:::-;;;21887:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;21809:122;21957:3;;21761:213;;7154:135;7223:7;7250:25;7266:8;7250:15;:25::i;:::-;:31;;7154:135;-1:-1:-1;;7154:135:0:o;6621:241::-;6685:7;6705:31;6739:25;6755:8;6739:15;:25::i;:::-;6705:59;;6782:12;:27;;;:32;;6813:1;6782:32;:72;;2107:4;6782:72;;;6817:18;;6782:72;6775:79;6621:241;-1:-1:-1;;;6621:241:0:o;23890:424::-;23987:16;24016:9;24048;24016;24048;24112:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24112:17:0;;24075:54;;24140:132;24151:1;24147;:5;24140:132;;;24192:36;24215:9;;24225:1;24215:12;;;;;;;:::i;:::-;;;;;;;24192:22;:36::i;:::-;24169:17;24187:1;24169:20;;;;;;;;:::i;:::-;;;;;;:59;;;;;24255:3;;;;;24140:132;;;24289:17;23890:424;-1:-1:-1;;;;;23890:424:0:o;3927:139::-;4009:6;4042:15;4055:2;4042:10;:15;:::i;1480:20::-;;;;;;;:::i;4574:174::-;4654:7;4681:59;4698:25;4714:8;4698:15;:25::i;:::-;:41;;;4681:16;:59::i;4396:172::-;4475:7;4502:58;4519:25;4535:8;4519:15;:25::i;:::-;:40;;;4502:16;:58::i;26175:227::-;26342:52;26361:10;26373:9;26384;26342:18;:52::i;26797:540::-;26920:34;26933:5;26940:3;26945:8;26920:12;:34::i;:::-;-1:-1:-1;;;;;26969:15:0;;;:20;26965:365;;27009:22;27035:3;-1:-1:-1;;;;;27035:8:0;27085:10;27097;27109:5;27116:8;27126:5;27044:88;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27044:88:0;;;;;;;;;;;27035:98;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27006:127;;;27148:16;27178:9;27167:31;;;;;;;;;;;;:::i;:::-;27148:50;-1:-1:-1;;;;;;;;;;27221:23:0;;;27213:105;;;;-1:-1:-1;;;27213:105:0;;16476:2:1;27213:105:0;;;16458:21:1;16515:2;16495:18;;;16488:30;16554:34;16534:18;;;16527:62;-1:-1:-1;;;16605:18:1;;;16598:49;16664:19;;27213:105:0;16274:415:1;27213:105:0;26991:339;;26797:540;;;;:::o;5520:773::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5704:12:0;5692:8;:24;;5684:63;;;;-1:-1:-1;;;5684:63:0;;16896:2:1;5684:63:0;;;16878:21:1;16935:2;16915:18;;;16908:30;16974:28;16954:18;;;16947:56;17020:18;;5684:63:0;16694:350:1;5684:63:0;5888:1;5850:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;5850:26:0;:40;;;:79;;;5919:10;;5907:8;:22;;5850:79;5846:440;;;-1:-1:-1;5953:20:0;;;;:10;:20;;;;;;;;;5946:27;;;;;;;;;-1:-1:-1;;;;;5946:27:0;;;;;-1:-1:-1;;;5946:27:0;;;;;;;;;;;-1:-1:-1;;;5946:27:0;;;;;;;;;;;-1:-1:-1;;;5946:27:0;;;;;;;;;5520:773::o;5846:440::-;6138:8;6161:69;6208:1;6168:22;;;:9;:22;;;;;:28;-1:-1:-1;;;;;6168:28:0;6161:69;;-1:-1:-1;;6214:13:0;6161:69;;;6251:22;;;;:9;:22;;;;;;;;;6244:29;;;;;;;;;-1:-1:-1;;;;;6244:29:0;;;;;-1:-1:-1;;;6244:29:0;;;;;;;;;;;-1:-1:-1;;;6244:29:0;;;;;;;;;;;-1:-1:-1;;;6244:29:0;;;;;;;;;5520:773;-1:-1:-1;;5520:773:0:o;5846:440::-;5520:773;;;:::o;29029:295::-;29101:18;;;;29100:19;29092:28;;;;;;29131:18;:25;;-1:-1:-1;;29131:25:0;29152:4;29131:25;;;29198:5;:16;;-1:-1:-1;;;;;29198:16:0;;-1:-1:-1;;;;;;29198:16:0;;;;;;29225:37;;;;;;;;;;;;;;;;;29131:18;;29225:37;;29131:18;29225:37;:::i;:::-;-1:-1:-1;29273:18:0;;;;;;;;;;;;-1:-1:-1;;;29273:18:0;;;;:6;;:18;;:6;:18;:::i;:::-;-1:-1:-1;;29315:1:0;29302:10;:14;29029:295::o;32265:245::-;32331:13;32388;32405:1;32388:18;32384:33;;-1:-1:-1;;32408:9:0;;;;;;;;;-1:-1:-1;32408:9:0;;;32265:245::o;32384:33::-;32459:7;32468:19;32478:8;32468:9;:19::i;:::-;32489:11;32442:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32428:74;;32265:245;;;:::o;582:173::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;742:4:::1;-1:-1:-1::0;;;;;715:32:0::1;736:4;-1:-1:-1::0;;;;;715:32:0::1;;;;;;;;;;;582:173:::0;;:::o;22932:556::-;23017:7;23037:31;23071:25;23087:8;23071:15;:25::i;:::-;23037:59;;23107:31;23141:46;23158:12;:28;;;23141:16;:46::i;:::-;23107:80;;23198:31;23276:1;23246:12;:27;;;:31;;;:165;;23410:1;23246:165;;;23293:96;23361:12;:27;;;23328:30;:28;:30::i;:::-;:60;;;;:::i;23293:96::-;23198:213;-1:-1:-1;23431:49:0;23198:213;23431:23;:49;:::i;28552:154::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28631:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:25;;-1:-1:-1;;28631:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;28672:26;;19955:51:1;;;20022:18;;;20015:50;28672:26:0::1;::::0;19928:18:1;28672:26:0::1;;;;;;;28552:154:::0;;:::o;30616:190::-;30698:18;;;;;;;30690:71;;;;-1:-1:-1;;;30690:71:0;;20278:2:1;30690:71:0;;;20260:21:1;20317:2;20297:18;;;20290:30;20356:34;20336:18;;;20329:62;-1:-1:-1;;;20407:18:1;;;20400:38;20455:19;;30690:71:0;20076:404:1;30690:71:0;30772:26;30788:9;;30772:15;:26::i;4222:168::-;4299:7;4326:56;4343:25;4359:8;4343:15;:25::i;:::-;:38;;;4326:16;:56::i;3790:131::-;3859:6;3892:20;3910:2;3892:15;:20;:::i;397:179::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;488:5:::1;::::0;;-1:-1:-1;;;;;504:12:0;;::::1;-1:-1:-1::0;;;;;;504:12:0;::::1;::::0;::::1;::::0;;;532:36:::1;::::0;488:5;::::1;::::0;504:12;488:5;;532:36:::1;::::0;469:16:::1;::::0;532:36:::1;457:119;397:179:::0;:::o;29431:255::-;351:5;;-1:-1:-1;;;;;351:5:0;360:10;351:19;343:42;;;;-1:-1:-1;;;343:42:0;;;;;;;:::i;:::-;29518:159:::1;::::0;;29549:15:::1;29518:159;::::0;::::1;20770:19:1::0;29566:12:0::1;20805::1::0;;;20798:28;;;29580:16:0::1;20842:12:1::0;;;;20835:28;;;;29611:14:0::1;20897:15:1::0;;-1:-1:-1;;20893:53:1;20879:12;;;20872:75;29627:14:0::1;20963:13:1::0;;;20956:29;29643:23:0;::::1;21001:13:1::0;;;20994:29;21039:13;;29518:159:0::1;::::0;;-1:-1:-1;;29518:159:0;;::::1;::::0;;;;;;29508:170;;29518:159:::1;29508:170:::0;;::::1;::::0;29491:14:::1;:187:::0;29431:255::o;25308:170::-;25385:21;;;;:11;:21;;;;;:27;;-1:-1:-1;;;;;;25385:27:0;-1:-1:-1;;;;;25385:27:0;;;;;;;;:21;;25437:17;25385:21;25437:7;:17::i;:::-;-1:-1:-1;;;;;25428:42:0;;;;;;;;;;;25308:170;;:::o;18855:424::-;18926:9;18958;18985:287;18996:1;18992;:5;18985:287;;;19068:14;19085:20;19092:9;;19102:1;19092:12;;;;;;;:::i;:::-;;;;;;;19085:6;:20::i;:::-;19068:37;-1:-1:-1;19183:10:0;-1:-1:-1;;;;;19183:20:0;;;19175:55;;;;-1:-1:-1;;;19175:55:0;;21265:2:1;19175:55:0;;;21247:21:1;21304:2;21284:18;;;21277:30;-1:-1:-1;;;21323:18:1;;;21316:52;21385:18;;19175:55:0;21063:346:1;19175:55:0;19256:3;;;;;18999:273;18985:287;;30132:229;30249:7;30233:13;:11;:13::i;:::-;:23;;;;:::i;:::-;29769:4;30219:38;;30211:99;;;;-1:-1:-1;;;30211:99:0;;21616:2:1;30211:99:0;;;21598:21:1;21655:2;21635:18;;;21628:30;21694:34;21674:18;;;21667:62;-1:-1:-1;;;21745:18:1;;;21738:33;21788:19;;30211:99:0;21414:399:1;30211:99:0;30321:32;30335:8;30345:7;30321:13;:32::i;24681:506::-;24782:4;24799:14;24816:17;24824:8;24816:7;:17::i;:::-;24799:34;;24948:8;-1:-1:-1;;;;;24938:18:0;:6;-1:-1:-1;;;;;24938:18:0;;:121;;;-1:-1:-1;25026:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;25026:33:0;;;:21;;:33;24938:121;:240;;;-1:-1:-1;;;;;;25144:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;24938:240;24844:335;24681:506;-1:-1:-1;;;;24681:506:0:o;17251:792::-;17411:17;17419:8;17411:7;:17::i;:::-;-1:-1:-1;;;;;17402:26:0;:5;-1:-1:-1;;;;;17402:26:0;;17394:68;;;;-1:-1:-1;;;17394:68:0;;22020:2:1;17394:68:0;;;22002:21:1;22059:2;22039:18;;;22032:30;22098:31;22078:18;;;22071:59;22147:18;;17394:68:0;21818:353:1;17394:68:0;-1:-1:-1;;;;;17516:17:0;;17508:55;;;;-1:-1:-1;;;17508:55:0;;22378:2:1;17508:55:0;;;22360:21:1;22417:2;22397:18;;;22390:30;22456:27;22436:18;;;22429:55;22501:18;;17508:55:0;22176:349:1;17508:55:0;17616:21;;;;:11;:21;;;;;;;;17609:28;;-1:-1:-1;;;;;;17609:28:0;;;;;;17684:10;:20;;;;;;:32;;;;;-1:-1:-1;;;;;17684:32:0;;;;;17763:30;:28;:30::i;:::-;17727:20;;;;:10;:20;;;;;;;;:66;;;;;;-1:-1:-1;;;17727:66:0;-1:-1:-1;;;;17727:66:0;;;;;;-1:-1:-1;;;;;17868:19:0;;;;;;:12;:19;;;;;;:29;;-1:-1:-1;;17868:29:0;;;;;;-1:-1:-1;;17868:29:0;;;;;;;17912:17;;;;;;;;;:27;;;;;-1:-1:-1;17912:27:0;;;;;;;;;;;;;;18005:30;17738:8;;17912:17;-1:-1:-1;;;;;;;;;;;18005:30:0;;17251:792;;;:::o;30841:326::-;30970:8;:15;30949:10;:17;:36;30941:72;;;;-1:-1:-1;;;30941:72:0;;22732:2:1;30941:72:0;;;22714:21:1;22771:2;22751:18;;;22744:30;22810:25;22790:18;;;22783:53;22853:18;;30941:72:0;22530:347:1;30941:72:0;31029:9;31024:136;31048:10;:17;31044:1;:21;31024:136;;;31083:33;31089:10;31100:1;31089:13;;;;;;;;:::i;:::-;;;;;;;31104:8;31113:1;31104:11;;;;;;;;:::i;:::-;;;;;;;31083:5;:33::i;:::-;31143:3;;31024:136;;25941:228;-1:-1:-1;;;;;26054:24:0;;;;;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;:47;;-1:-1:-1;;26054:47:0;;;;;;;;;;26117:44;;540:41:1;;;26117:44:0;;513:18:1;26117:44:0;;;;;;;25941:228;;;:::o;31801:458::-;31859:13;31889:6;31899:1;31889:11;31885:32;;-1:-1:-1;;31904:10:0;;;;;;;;;;;;-1:-1:-1;;;31904:10:0;;;;;31801:458::o;31885:32::-;31946:6;31927:16;31980:52;31987:13;;31980:52;;32004:9;;;;:::i;:::-;;-1:-1:-1;32015:14:0;;-1:-1:-1;32027:2:0;32015:14;;:::i;:::-;;;31980:52;;;32042:20;32075:7;32065:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32065:18:0;;32042:41;;32094:124;32101:11;;32094:124;;32116:9;;;;:::i;:::-;;-1:-1:-1;32186:11:0;;-1:-1:-1;32195:2:0;32186:6;:11;:::i;:::-;32173:26;;:2;:26;:::i;:::-;32146:55;;32127:7;32135;32127:16;;;;;;;;:::i;:::-;;;;:74;-1:-1:-1;;;;;32127:74:0;;;;;;;;-1:-1:-1;32203:12:0;32213:2;32203:12;;:::i;:::-;;;32094:124;;19513:430;19586:9;19618;19645:291;19656:1;19652;:5;19645:291;;;19730:14;19747:22;19756:9;;19766:1;19756:12;;;;;;;:::i;:::-;;;;;;;19747:8;:22::i;:::-;19730:39;-1:-1:-1;19847:10:0;-1:-1:-1;;;;;19847:20:0;;;19839:55;;;;-1:-1:-1;;;19839:55:0;;21265:2:1;19839:55:0;;;21247:21:1;21304:2;21284:18;;;21277:30;-1:-1:-1;;;21323:18:1;;;21316:52;21385:18;;19839:55:0;21063:346:1;19839:55:0;19920:3;;;;;19659:277;19645:291;;11188:215;11248:7;11350:45;11369:8;11379:15;11350:18;:45::i;16484:306::-;16581:7;16599:140;16622:12;16606:13;:28;16599:140;;;16651:29;16668:12;16651:29;;:::i;:::-;;;16695:32;16709:3;16714:12;16695:13;:32::i;:::-;16599:140;;;16749:33;16763:3;16768:13;16749;:33::i;11791:188::-;11852:7;11940:31;11959:8;11969:1;8571:2231;8668:7;8760:31;8794:25;8810:8;8794:15;:25::i;:::-;8847:18;;8901:27;;;;8760:59;;-1:-1:-1;8847:18:0;8996:42;9015:8;8760:59;8996:18;:42::i;:::-;9096:21;;;;:11;:21;;;;;9089:28;;-1:-1:-1;;;;;;9089:28:0;;;9187:14;;9183:1375;;9289:20;;;;9281:94;;;;-1:-1:-1;;;9281:94:0;;23342:2:1;9281:94:0;;;23324:21:1;23381:2;23361:18;;;23354:30;23420:34;23400:18;;;23393:62;-1:-1:-1;;;23471:18:1;;;23464:42;23523:19;;9281:94:0;23140:408:1;9281:94:0;-1:-1:-1;;;;;9503:20:0;;;;;;:12;:20;;;;;;:30;;-1:-1:-1;;9503:30:0;;;;;;;-1:-1:-1;;9503:30:0;;;;;;;2107:4;9552:30;;;;;;:40;;;;;-1:-1:-1;9552:40:0;;;;;;;;;;;;;;;9680:44;;9715:8;;2107:4;;-1:-1:-1;;;;;;;;;;;9680:44:0;;9183:1375;;;9882:15;:20;;9901:1;9882:20;9874:96;;;;-1:-1:-1;;;9874:96:0;;23755:2:1;9874:96:0;;;23737:21:1;23794:2;23774:18;;;23767:30;23833:34;23813:18;;;23806:62;-1:-1:-1;;;23884:18:1;;;23877:44;23938:19;;9874:96:0;23553:410:1;9874:96:0;-1:-1:-1;;;;;10098:20:0;;;;;;:12;:20;;;;;;;:30;;;;;;;;;-1:-1:-1;;10098:30:0;;;;;;:12;10160:16;2107:4;;2025:95;10160:16;-1:-1:-1;;;;;10147:30:0;;;;;;;;;;;;-1:-1:-1;10147:30:0;;;:40;;-1:-1:-1;;10147:40:0;;;;;;-1:-1:-1;;10147:40:0;;;;;;;10350:15;10317:30;:28;:30::i;:::-;:48;;;;:::i;:::-;10380:20;;;;:10;:20;;;;;:51;;10296:69;;-1:-1:-1;10296:69:0;;10380:36;;:51;;10296:69;;-1:-1:-1;;;10380:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10537:8;10529:6;-1:-1:-1;;;;;10502:44:0;10511:16;2107:4;;2025:95;10511:16;-1:-1:-1;;;;;10502:44:0;-1:-1:-1;;;;;;;;;;;10502:44:0;;;;;;;;;9809:749;9183:1375;10657:30;10676:10;10657:18;:30::i;:::-;10619:20;;;;:10;:20;;;;;:68;;;;;;;-1:-1:-1;;;10619:68:0;-1:-1:-1;;;;10619:68:0;;;;;;;;;-1:-1:-1;10788:6:0;-1:-1:-1;;8571:2231:0;;;;:::o;15246:1059::-;-1:-1:-1;;;;;15366:17:0;;15358:59;;;;-1:-1:-1;;;15358:59:0;;24347:2:1;15358:59:0;;;24329:21:1;24386:2;24366:18;;;24359:30;24425:31;24405:18;;;24398:59;24474:18;;15358:59:0;24145:353:1;15358:59:0;15512:12;15501:7;:23;;15493:90;;;;-1:-1:-1;;;15493:90:0;;24705:2:1;15493:90:0;;;24687:21:1;24744:2;24724:18;;;24717:30;24783:34;24763:18;;;24756:62;-1:-1:-1;;;24834:18:1;;;24827:38;24882:19;;15493:90:0;24503:404:1;15493:90:0;15653:10;;15634:16;15691:18;15702:7;15653:10;15691:18;:::i;:::-;15783:19;;;;:9;:19;;;;;:31;;-1:-1:-1;;;;;;15783:31:0;-1:-1:-1;;;;;15783:31:0;;;;;15674:35;-1:-1:-1;15860:30:0;:28;:30::i;:::-;15825:19;;;;:9;:19;;;;;;;;:65;;-1:-1:-1;;;;15825:65:0;-1:-1:-1;;;15825:65:0;;;;;;;;-1:-1:-1;;;;;16017:17:0;;;;:12;:17;;;;;:44;;-1:-1:-1;;16076:49:0;;16017:44;;;;;;;16076:49;;;;-1:-1:-1;;16017:44:0;;;;;;16076:49;;;;;;;;;;;;;;;;;16142:77;16152:35;;16178:8;;-1:-1:-1;;;;;16152:35:0;;;16169:1;;-1:-1:-1;;;;;;;;;;;16152:35:0;16169:1;;16152:35;16211:6;16198:10;;;;;;:19;16142:77;;16278:10;:19;-1:-1:-1;;;15246:1059:0:o;7738:300::-;7965:1;7927:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;7927:26:0;7923:108;;7984:20;;;;:10;:20;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7984:35:0;-1:-1:-1;;;;;7984:35:0;;;-1:-1:-1;;;7984:35:0;;;;;-1:-1:-1;;;;;7984:35:0;;;;-1:-1:-1;;;7984:35:0;-1:-1:-1;;;;;;7984:35:0;;;-1:-1:-1;;;;;7984:35:0;;;;;;;;;;;;;;;;;;;7738:300;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;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:592::-;663:6;671;724:2;712:9;703:7;699:23;695:32;692:52;;;740:1;737;730:12;692:52;780:9;767:23;809:18;850:2;842:6;839:14;836:34;;;866:1;863;856:12;836:34;904:6;893:9;889:22;879:32;;949:7;942:4;938:2;934:13;930:27;920:55;;971:1;968;961:12;920:55;1011:2;998:16;1037:2;1029:6;1026:14;1023:34;;;1053:1;1050;1043:12;1023:34;1098:7;1093:2;1084:6;1080:2;1076:15;1072:24;1069:37;1066:57;;;1119:1;1116;1109:12;1066:57;1150:2;1142:11;;;;;1172:6;;-1:-1:-1;592:592:1;;-1:-1:-1;;;;592:592:1:o;1189:250::-;1274:1;1284:113;1298:6;1295:1;1292:13;1284:113;;;1374:11;;;1368:18;1355:11;;;1348:39;1320:2;1313:10;1284:113;;;-1:-1:-1;;1431:1:1;1413:16;;1406:27;1189:250::o;1444:271::-;1486:3;1524:5;1518:12;1551:6;1546:3;1539:19;1567:76;1636:6;1629:4;1624:3;1620:14;1613:4;1606:5;1602:16;1567:76;:::i;:::-;1697:2;1676:15;-1:-1:-1;;1672:29:1;1663:39;;;;1704:4;1659:50;;1444:271;-1:-1:-1;;1444:271:1:o;1720:220::-;1869:2;1858:9;1851:21;1832:4;1889:45;1930:2;1919:9;1915:18;1907:6;1889:45;:::i;1945:180::-;2004:6;2057:2;2045:9;2036:7;2032:23;2028:32;2025:52;;;2073:1;2070;2063:12;2025:52;-1:-1:-1;2096:23:1;;1945:180;-1:-1:-1;1945:180:1:o;2338:173::-;2406:20;;-1:-1:-1;;;;;2455:31:1;;2445:42;;2435:70;;2501:1;2498;2491:12;2516:254;2584:6;2592;2645:2;2633:9;2624:7;2620:23;2616:32;2613:52;;;2661:1;2658;2651:12;2613:52;2684:29;2703:9;2684:29;:::i;:::-;2674:39;2760:2;2745:18;;;;2732:32;;-1:-1:-1;;;2516:254:1:o;2775:367::-;2838:8;2848:6;2902:3;2895:4;2887:6;2883:17;2879:27;2869:55;;2920:1;2917;2910:12;2869:55;-1:-1:-1;2943:20:1;;2986:18;2975:30;;2972:50;;;3018:1;3015;3008:12;2972:50;3055:4;3047:6;3043:17;3031:29;;3115:3;3108:4;3098:6;3095:1;3091:14;3083:6;3079:27;3075:38;3072:47;3069:67;;;3132:1;3129;3122:12;3069:67;2775:367;;;;;:::o;3147:437::-;3233:6;3241;3294:2;3282:9;3273:7;3269:23;3265:32;3262:52;;;3310:1;3307;3300:12;3262:52;3350:9;3337:23;3383:18;3375:6;3372:30;3369:50;;;3415:1;3412;3405:12;3369:50;3454:70;3516:7;3507:6;3496:9;3492:22;3454:70;:::i;:::-;3543:8;;3428:96;;-1:-1:-1;3147:437:1;-1:-1:-1;;;;3147:437:1:o;3589:160::-;3654:20;;3710:13;;3703:21;3693:32;;3683:60;;3739:1;3736;3729:12;3754:180;3810:6;3863:2;3851:9;3842:7;3838:23;3834:32;3831:52;;;3879:1;3876;3869:12;3831:52;3902:26;3918:9;3902:26;:::i;4121:328::-;4198:6;4206;4214;4267:2;4255:9;4246:7;4242:23;4238:32;4235:52;;;4283:1;4280;4273:12;4235:52;4306:29;4325:9;4306:29;:::i;:::-;4296:39;;4354:38;4388:2;4377:9;4373:18;4354:38;:::i;:::-;4344:48;;4439:2;4428:9;4424:18;4411:32;4401:42;;4121:328;;;;;:::o;4926:186::-;4985:6;5038:2;5026:9;5017:7;5013:23;5009:32;5006:52;;;5054:1;5051;5044:12;5006:52;5077:29;5096:9;5077:29;:::i;5117:276::-;5175:6;5228:2;5216:9;5207:7;5203:23;5199:32;5196:52;;;5244:1;5241;5234:12;5196:52;5283:9;5270:23;5333:10;5326:5;5322:22;5315:5;5312:33;5302:61;;5359:1;5356;5349:12;5398:632;5569:2;5621:21;;;5691:13;;5594:18;;;5713:22;;;5540:4;;5569:2;5792:15;;;;5766:2;5751:18;;;5540:4;5835:169;5849:6;5846:1;5843:13;5835:169;;;5910:13;;5898:26;;5979:15;;;;5944:12;;;;5871:1;5864:9;5835:169;;;-1:-1:-1;6021:3:1;;5398:632;-1:-1:-1;;;;;;5398:632:1:o;6035:773::-;6157:6;6165;6173;6181;6234:2;6222:9;6213:7;6209:23;6205:32;6202:52;;;6250:1;6247;6240:12;6202:52;6290:9;6277:23;6319:18;6360:2;6352:6;6349:14;6346:34;;;6376:1;6373;6366:12;6346:34;6415:70;6477:7;6468:6;6457:9;6453:22;6415:70;:::i;:::-;6504:8;;-1:-1:-1;6389:96:1;-1:-1:-1;6592:2:1;6577:18;;6564:32;;-1:-1:-1;6608:16:1;;;6605:36;;;6637:1;6634;6627:12;6605:36;;6676:72;6740:7;6729:8;6718:9;6714:24;6676:72;:::i;:::-;6035:773;;;;-1:-1:-1;6767:8:1;-1:-1:-1;;;;6035:773:1:o;7488:254::-;7553:6;7561;7614:2;7602:9;7593:7;7589:23;7585:32;7582:52;;;7630:1;7627;7620:12;7582:52;7653:29;7672:9;7653:29;:::i;:::-;7643:39;;7701:35;7732:2;7721:9;7717:18;7701:35;:::i;:::-;7691:45;;7488:254;;;;;:::o;7747:127::-;7808:10;7803:3;7799:20;7796:1;7789:31;7839:4;7836:1;7829:15;7863:4;7860:1;7853:15;7879:1138;7974:6;7982;7990;7998;8051:3;8039:9;8030:7;8026:23;8022:33;8019:53;;;8068:1;8065;8058:12;8019:53;8091:29;8110:9;8091:29;:::i;:::-;8081:39;;8139:38;8173:2;8162:9;8158:18;8139:38;:::i;:::-;8129:48;;8224:2;8213:9;8209:18;8196:32;8186:42;;8279:2;8268:9;8264:18;8251:32;8302:18;8343:2;8335:6;8332:14;8329:34;;;8359:1;8356;8349:12;8329:34;8397:6;8386:9;8382:22;8372:32;;8442:7;8435:4;8431:2;8427:13;8423:27;8413:55;;8464:1;8461;8454:12;8413:55;8500:2;8487:16;8522:2;8518;8515:10;8512:36;;;8528:18;;:::i;:::-;8603:2;8597:9;8571:2;8657:13;;-1:-1:-1;;8653:22:1;;;8677:2;8649:31;8645:40;8633:53;;;8701:18;;;8721:22;;;8698:46;8695:72;;;8747:18;;:::i;:::-;8787:10;8783:2;8776:22;8822:2;8814:6;8807:18;8862:7;8857:2;8852;8848;8844:11;8840:20;8837:33;8834:53;;;8883:1;8880;8873:12;8834:53;8939:2;8934;8930;8926:11;8921:2;8913:6;8909:15;8896:46;8984:1;8979:2;8974;8966:6;8962:15;8958:24;8951:35;9005:6;8995:16;;;;;;;7879:1138;;;;;;;:::o;9580:260::-;9648:6;9656;9709:2;9697:9;9688:7;9684:23;9680:32;9677:52;;;9725:1;9722;9715:12;9677:52;9748:29;9767:9;9748:29;:::i;:::-;9738:39;;9796:38;9830:2;9819:9;9815:18;9796:38;:::i;9845:334::-;10047:2;10029:21;;;10086:2;10066:18;;;10059:30;-1:-1:-1;;;10120:2:1;10105:18;;10098:40;10170:2;10155:18;;9845:334::o;10184:380::-;10263:1;10259:12;;;;10306;;;10327:61;;10381:4;10373:6;10369:17;10359:27;;10327:61;10434:2;10426:6;10423:14;10403:18;10400:38;10397:161;;10480:10;10475:3;10471:20;10468:1;10461:31;10515:4;10512:1;10505:15;10543:4;10540:1;10533:15;10397:161;;10184:380;;;:::o;10695:545::-;10797:2;10792:3;10789:11;10786:448;;;10833:1;10858:5;10854:2;10847:17;10903:4;10899:2;10889:19;10973:2;10961:10;10957:19;10954:1;10950:27;10944:4;10940:38;11009:4;10997:10;10994:20;10991:47;;;-1:-1:-1;11032:4:1;10991:47;11087:2;11082:3;11078:12;11075:1;11071:20;11065:4;11061:31;11051:41;;11142:82;11160:2;11153:5;11150:13;11142:82;;;11205:17;;;11186:1;11175:13;11142:82;;11416:1206;11540:18;11535:3;11532:27;11529:53;;;11562:18;;:::i;:::-;11591:94;11681:3;11641:38;11673:4;11667:11;11641:38;:::i;:::-;11635:4;11591:94;:::i;:::-;11711:1;11736:2;11731:3;11728:11;11753:1;11748:616;;;;12408:1;12425:3;12422:93;;;-1:-1:-1;12481:19:1;;;12468:33;12422:93;-1:-1:-1;;11373:1:1;11369:11;;;11365:24;11361:29;11351:40;11397:1;11393:11;;;11348:57;12528:78;;11721:895;;11748:616;10642:1;10635:14;;;10679:4;10666:18;;-1:-1:-1;;11784:17:1;;;11885:9;11907:229;11921:7;11918:1;11915:14;11907:229;;;12010:19;;;11997:33;11982:49;;12117:4;12102:20;;;;12070:1;12058:14;;;;11937:12;11907:229;;;11911:3;12164;12155:7;12152:16;12149:159;;;12288:1;12284:6;12278:3;12272;12269:1;12265:11;12261:21;12257:34;12253:39;12240:9;12235:3;12231:19;12218:33;12214:79;12206:6;12199:95;12149:159;;;12351:1;12345:3;12342:1;12338:11;12334:19;12328:4;12321:33;11721:895;;;11416:1206;;;:::o;13734:127::-;13795:10;13790:3;13786:20;13783:1;13776:31;13826:4;13823:1;13816:15;13850:4;13847:1;13840:15;13866:128;13933:9;;;13954:11;;;13951:37;;;13968:18;;:::i;14402:135::-;14441:3;14462:17;;;14459:43;;14482:18;;:::i;:::-;-1:-1:-1;14529:1:1;14518:13;;14402:135::o;14542:168::-;14582:7;14648:1;14644;14640:6;14636:14;14633:1;14630:21;14625:1;14618:9;14611:17;14607:45;14604:71;;;14655:18;;:::i;:::-;-1:-1:-1;14695:9:1;;14542:168::o;14715:127::-;14776:10;14771:3;14767:20;14764:1;14757:31;14807:4;14804:1;14797:15;14831:4;14828:1;14821:15;14847:125;14912:9;;;14933:10;;;14930:36;;;14946:18;;:::i;14977:127::-;15038:10;15033:3;15029:20;15026:1;15019:31;15069:4;15066:1;15059:15;15093:4;15090:1;15083:15;15109:120;15149:1;15175;15165:35;;15180:18;;:::i;:::-;-1:-1:-1;15214:9:1;;15109:120::o;15234:489::-;-1:-1:-1;;;;;15503:15:1;;;15485:34;;15555:15;;15550:2;15535:18;;15528:43;15602:2;15587:18;;15580:34;;;15650:3;15645:2;15630:18;;15623:31;;;15428:4;;15671:46;;15697:19;;15689:6;15671:46;:::i;:::-;15663:54;15234:489;-1:-1:-1;;;;;;15234:489:1:o;15728:287::-;15857:3;15895:6;15889:13;15911:66;15970:6;15965:3;15958:4;15950:6;15946:17;15911:66;:::i;:::-;15993:16;;;;;15728:287;-1:-1:-1;;15728:287:1:o;16020:249::-;16089:6;16142:2;16130:9;16121:7;16117:23;16113:32;16110:52;;;16158:1;16155;16148:12;16110:52;16190:9;16184:16;16209:30;16233:5;16209:30;:::i;17049:1352::-;17175:3;17169:10;17202:18;17194:6;17191:30;17188:56;;;17224:18;;:::i;:::-;17253:97;17343:6;17303:38;17335:4;17329:11;17303:38;:::i;:::-;17297:4;17253:97;:::i;:::-;17405:4;;17469:2;17458:14;;17486:1;17481:663;;;;18188:1;18205:6;18202:89;;;-1:-1:-1;18257:19:1;;;18251:26;18202:89;-1:-1:-1;;11373:1:1;11369:11;;;11365:24;11361:29;11351:40;11397:1;11393:11;;;11348:57;18304:81;;17451:944;;17481:663;10642:1;10635:14;;;10679:4;10666:18;;-1:-1:-1;;17517:20:1;;;17635:236;17649:7;17646:1;17643:14;17635:236;;;17738:19;;;17732:26;17717:42;;17830:27;;;;17798:1;17786:14;;;;17665:19;;17635:236;;;17639:3;17899:6;17890:7;17887:19;17884:201;;;17960:19;;;17954:26;-1:-1:-1;;18043:1:1;18039:14;;;18055:3;18035:24;18031:37;18027:42;18012:58;17997:74;;17884:201;-1:-1:-1;;;;;18131:1:1;18115:14;;;18111:22;18098:36;;-1:-1:-1;17049:1352:1:o;18406:722::-;18456:3;18497:5;18491:12;18526:36;18552:9;18526:36;:::i;:::-;18581:1;18598:18;;;18625:133;;;;18772:1;18767:355;;;;18591:531;;18625:133;-1:-1:-1;;18658:24:1;;18646:37;;18731:14;;18724:22;18712:35;;18703:45;;;-1:-1:-1;18625:133:1;;18767:355;18798:5;18795:1;18788:16;18827:4;18872:2;18869:1;18859:16;18897:1;18911:165;18925:6;18922:1;18919:13;18911:165;;;19003:14;;18990:11;;;18983:35;19046:16;;;;18940:10;;18911:165;;;18915:3;;;19105:6;19100:3;19096:16;19089:23;;18591:531;;;;;18406:722;;;;:::o;19133:469::-;19354:3;19382:38;19416:3;19408:6;19382:38;:::i;:::-;19449:6;19443:13;19465:65;19523:6;19519:2;19512:4;19504:6;19500:17;19465:65;:::i;:::-;19546:50;19588:6;19584:2;19580:15;19572:6;19546:50;:::i;:::-;19539:57;19133:469;-1:-1:-1;;;;;;;19133:469:1:o;19607:175::-;19675:10;19718;;;19706;;;19702:27;;19741:12;;;19738:38;;;19756:18;;:::i;:::-;19738:38;19607:175;;;;:::o;22882:136::-;22921:3;22949:5;22939:39;;22958:18;;:::i;:::-;-1:-1:-1;;;22994:18:1;;22882:136::o;23023:112::-;23055:1;23081;23071:35;;23086:18;;:::i;:::-;-1:-1:-1;23120:9:1;;23023:112::o;23968:172::-;24035:10;24065;;;24077;;;24061:27;;24100:11;;;24097:37;;;24114:18;;:::i
Swarm Source
ipfs://ab836cfdf9236d9101c72fc7d0bf8ed1bac03fc39310067dc2c7088fe7922edd
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.