ETH Price: $2,642.91 (+1.04%)

Contract

0x58a95009eDBF6FE17c5E6C97B58C42D6AcECee1e
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60c06040210725092024-10-29 16:32:5912 hrs ago1730219579IN
 Create: GAS2P2_20241029_1
0 ETH0.0540303817.86643913

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GAS2P2_20241029_1

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-10-29
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.16;

interface IGASEVO {
    function transferFrom(address from_, address to_, uint256 id_) external;
    function balanceOf(address owner) external view returns (uint256);
    function ownerOf(uint256 id_) external view returns (address);
    function mintAsController(address to_, uint256 id_) external;
}

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

        // GAS2 Upgrade
        uint32 lastUnboxTimestamp; // stores the last unbox timestamp in compressed time

        // 160 free bits -- 20 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 GAS2P2_20241029_1 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;

    // GAS2P2_20241029_1 we no longer need to initialize
    // function proxyInitialize(address newOwner) external {
    //     require(!proxyIsInitialized);
    //     proxyIsInitialized = true;
        
    //     // Hardcode
    //     owner = newOwner;
    //     name = "Gangster All Star: Evolution";
    //     symbol = "GAS:EVO";
    //     tokenIndex = 1;
    // }

    // GAS2P2_20241029_1 set new name and symbol for GAS2
    function O_setNameAndSymbol(string calldata name_, string calldata symbol_) 
    external onlyOwner {
        name = name_;
        symbol = symbol_;
    }

    // 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));
    }

    ///// Additional Helper Functions /////
    function isOwnerOfAll(address owner, uint256[] calldata tokenIds_) 
    external view returns (bool) {
        // Patch 2.1
        uint256 i;
        uint256 l = tokenIds_.length;
        unchecked { do {
            if (ownerOf(tokenIds_[i]) != owner) return false;
        } while (++i < l); }
        return true;
    }
    function isTrueOwnerOfAll(address owner, uint256[] calldata tokenIds_) 
    external view returns (bool) {
        // Patch 2.1
        uint256 i;
        uint256 l = tokenIds_.length;
        unchecked { do {
            if (_trueOwnerOf(tokenIds_[i]) != owner) return false;
        } while (++i < l); }
        return true;
    }

    ////////////////////////////////////////////////////////
    ///// GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 /////
    ///// GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 /////
    ///// GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 GAS2 /////
    ////////////////////////////////////////////////////////

    // For path 2, we are reusing the SSTORE for all early 1-7777 and repacking
    // them from box to GAS2 by using 0x...dead retransfer
    // For this, we have the issue of users able to unbox/reveal and accept bids immediately
    // For that, we will remedy it by locking user's transfers for 1h after revealing
    // Also, we need to figure out a way to indicate the packed-token is a box or a GAS2
    // Initial ideas include checking the GASEVO contract if the EVO counterpart has been minted

    // Initialize the connection to GASEVO
    IGASEVO public constant GASEVO = IGASEVO(0x0f926Df0DDB33A1dB95088964E09Fa8Fb47E490E); // GAS EVO

    // Initialize a constant BURN_ADDRESS 
    address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD;

    // Packed ID claim
    function _claimGAS2Internal(address user_, uint256[] memory tokenIds_) internal {
        // All-or-nothing check
        uint256 _amount = tokenIds_.length;
        uint256 _balance = GASEVO.balanceOf(user_);
        require(_amount == _balance, "INVALID_UPGRADE_AMOUNT");

        // Resurrection Claim on packed 1-7777
        for (uint256 i; i < _amount;) {
            // Load current ID into memory
            uint256 _currId = tokenIds_[i];

            // Make sure the current ID is owned by the user
            require(GASEVO.ownerOf(_currId) == user_, "NOT_OWNER_OF_TOKEN");

            // Make sure that the token hasn't been claimed yet
            // Note: there is a edge case where the user can transfer "burn" and reclaim
            require(ownerOf(_currId) == BURN_ADDRESS, "TOKEN_EXISTS");

            // If both conditions are met, packed-resurrect mint the GAS2
            _transfer(BURN_ADDRESS, user_, _currId);

            // Increment the loop tracker
            unchecked { ++i; }
        }
    }

    // // Public msg.sender initiated claiming of GAS2
    // function claimGAS2(uint256[] calldata tokenIds_) external {
    //     _claimGAS2Internal(msg.sender, tokenIds_);
    // }

    // Priviledged claiming GAS2 for other users by onlyMinter
    function C_claimGAS2For(address user_, uint256[] calldata tokenIds_) external 
    onlyMinter {
        _claimGAS2Internal(user_, tokenIds_);
    }

    // Now, we must create a function for the new reveal mechanic. 
    // Here, we will reuse the SSTORE of GASEVO to indicate revealed / non revealed
    // The conditions are as following:
    // GAS2 - MINTED && GASEVO - NOT_MINTED     => BOX / EQUIPMENT
    // GAS2 - MINTED && GASEVO - MINTED         => CLAIMED & REVEALED
    // GAS2 - BURNED && GASEVO - MINTED         => UNCLAIMED & UNREVEALED
    // GAS2 - BURNED && GASEVO - NOT_MINTED     => EXCEPTION / ERROR
    // Additionally, after revealing, we lock the user's tokens transfer for 2H

    // This is the equivalent of an UNBOX
    function _unboxGAS2Internal(address user_, uint256[] memory tokenIds_) internal {
        for (uint256 i; i < tokenIds_.length;) {
            // Load current ID into memory
            uint256 _currId = tokenIds_[i];

            // Make sure the user owns the token (BOX)
            require(ownerOf(_currId) == user_, "NOT_OWNER");
            
            // Make sure the GASEVO counterpart hasn't been minted
            require(GASEVO.ownerOf(_currId) == address(0), "TOKEN_UNBOXED");
            
            // Mint the GASEVO counterpart as a measure of unboxing
            GASEVO.mintAsController(user_, _currId); 

            // Now, GAS2 will reveal through CDN. To prevent gaming the system
            // We lock the users tokens for 2H
            _balanceData[user_].lastUnboxTimestamp = _getBlockTimestampCompressed();

            unchecked { ++i; }
        }
    }

    // // Public msg.sender GAS2 Unbox
    // function unbox(uint256[] calldata tokenIds_) external {
    //     _unboxGAS2Internal(msg.sender, tokenIds_);
    // }

    // Priviledged GAS2 Unbox by onlyMinter
    function C_unboxFor(address user_, uint256[] calldata tokenIds_) external onlyMinter {
        _unboxGAS2Internal(user_, tokenIds_);
    }

    // The new _transfer which blocks transfers after unboxing
    uint32 public constant UNBOX_TRANSFER_DELAY = 720; // 720 * 10 (compressed);

    function _transfer(address from_, address to_, uint256 tokenId_) internal virtual 
    override(ERC721G) {
        // Compare the unboxTimestamp to the current time
        uint32 _currTimeCompressed = _getBlockTimestampCompressed();
        uint32 _lastUnboxTimestamp = _balanceData[from_].lastUnboxTimestamp;

        // UNBOX_TRANSFER_DELAY amount of delay
        require(_currTimeCompressed >= _lastUnboxTimestamp + UNBOX_TRANSFER_DELAY, 
                "UNBOX_LOCKED_TEMPORARILY");
        
        // Otherwise conduct normal transfer
        ERC721G._transfer(from_, to_, tokenId_);
    }

    // Proxy Padding
    bytes32[50] private proxyPadding;

}

Contract Security Audit

Contract ABI

[{"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":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"C_claimGAS2For","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"C_unboxFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"GASEVO","outputs":[{"internalType":"contract IGASEVO","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"}],"name":"O_setNameAndSymbol","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":[],"name":"UNBOX_TRANSFER_DELAY","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balanceData","outputs":[{"internalType":"uint32","name":"balance","type":"uint32"},{"internalType":"uint32","name":"mintedAmount","type":"uint32"},{"internalType":"uint32","name":"lastUnboxTimestamp","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":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"isOwnerOfAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256[]","name":"tokenIds_","type":"uint256[]"}],"name":"isTrueOwnerOfAll","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":[],"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"}]

60c060405234801561000f575f80fd5b506040518060400160405280601c81526020017f47616e677374657220416c6c20537461723a2045766f6c7574696f6e00000000815250604051806040016040528060078152602001664741533a45564f60c81b81525060016014835f90816100789190610134565b5060016100858482610134565b50600282905560809190915260a052506101ee9050565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806100c457607f821691505b6020821081036100e257634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561012f57805f5260205f20601f840160051c8101602085101561010d5750805b601f840160051c820191505b8181101561012c575f8155600101610119565b50505b505050565b81516001600160401b0381111561014d5761014d61009c565b6101618161015b84546100b0565b846100e8565b6020601f821160018114610193575f831561017c5750848201515b5f19600385901b1c1916600184901b17845561012c565b5f84815260208120601f198516915b828110156101c257878501518255602094850194600190920191016101a2565b50848210156101df57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05161345e61024e5f395f81816104c1015281816123e10152818161240c01528181612439015261292b01525f818161093301528181610ca801528181610de701528181610f170152818161116b01526115ca015261345e5ff3fe608060405234801561000f575f80fd5b506004361061039e575f3560e01c806384dd453c116101ea578063c87b56dd11610114578063e6798baa116100a9578063f2fde38b11610079578063f2fde38b1461099d578063f46eccc4146109b0578063f6598295146109d2578063fccc2813146109da575f80fd5b8063e6798baa1461092e578063e985e9c514610955578063f0e56f0d14610982578063f16dc57d14610995575f80fd5b8063d55f9273116100e4578063d55f927314610903578063d5abeb011461090c578063d7b4be2414610915578063e449f3411461091b575f80fd5b8063c87b56dd146108b7578063c969a5ab146108ca578063ced74b50146108dd578063cf456ae7146108f0575f80fd5b80639b10b7711161018a578063b0b50ed51161015a578063b0b50ed5146107e9578063b4bd7c3214610835578063b88d4fde14610847578063ba745f2e1461085a575f80fd5b80639b10b771146107a35780639ee0bcbc146107b0578063a22cb465146107c3578063a713e45b146107d6575f80fd5b80638da5cb5b116101c55780638da5cb5b1461076257806395d89b4114610775578063972bb0c01461077d578063993568c114610790575f80fd5b806384dd453c1461071e57806385a6c2141461073c578063888957671461074f575f80fd5b80633455f41e116102cb5780635266069d1161026b5780636352211e1161023b5780636352211e146106c157806370a08231146106d45780637b2cbd2d14610702578063840234541461070b575f80fd5b80635266069d146106255780635a17ef3f146106885780635aea7ec11461069b5780635e7676e1146106ae575f80fd5b8063438b6300116102a6578063438b6300146105cc578063470f2c1f146105ec5780634749900a146105ff5780634b0ee02a14610612575f80fd5b80633455f41e14610593578063403082f2146105a657806342842e0e146105b9575f80fd5b8063153db98a116103415780632913daa0116103115780632913daa0146104bc5780632c2cdd60146104e357806332e30f511461056557806332f89e5b14610578575f80fd5b8063153db98a1461046d57806318160ddd146104805780631c08c6b71461049657806323b872dd146104a9575f80fd5b8063081812fc1161037c578063081812fc146103f4578063095ea7b3146104345780630fbf0a93146104475780630ffdf2681461045a575f80fd5b806301ffc9a7146103a2578063021bcdcf146103ca57806306fdde03146103df575b5f80fd5b6103b56103b0366004612b52565b6109e3565b60405190151581526020015b60405180910390f35b6103dd6103d8366004612bb1565b610a4f565b005b6103e7610a94565b6040516103c19190612c1d565b61041c610402366004612c2f565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103c1565b6103dd610442366004612c5a565b610b1f565b6103dd610455366004612cc4565b610bba565b6103dd610468366004612d05565b610c29565b6103dd61047b366004612c5a565b610c6d565b610488610ca5565b6040519081526020016103c1565b6103dd6104a4366004612bb1565b610cd9565b6103dd6104b7366004612d1e565b610d10565b6104887f000000000000000000000000000000000000000000000000000000000000000081565b61052f6104f1366004612c2f565b60036020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff9384166020860152918316918401919091521660608201526080016103c1565b6103b5610573366004612d5c565b610d7c565b61041c730f926df0ddb33a1db95088964e09fa8fb47e490e81565b6104886105a1366004612dac565b610dde565b6104886105b4366004612dc7565b610e7a565b6103dd6105c7366004612d1e565b610e8c565b6105df6105da366004612dac565b610ea6565b6040516103c19190612dea565b6103dd6105fa366004612e2c565b610f9d565b6103dd61060d366004612d05565b61103c565b610488610620366004612dac565b611079565b610661610633366004612dac565b60046020525f908152604090205463ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff948516815292841660208401529216918101919091526060016103c1565b6103dd610696366004612d5c565b6110ab565b6105df6106a9366004612dac565b611115565b61041c6106bc366004612c2f565b61120e565b61041c6106cf366004612c2f565b61121f565b6104886106e2366004612dac565b6001600160a01b03165f9081526004602052604090205463ffffffff1690565b610488603d5481565b6105df610719366004612cc4565b611243565b6107276102d081565b60405163ffffffff90911681526020016103c1565b6103dd61074a366004612e96565b6112e8565b61072761075d366004612c2f565b611333565b603a5461041c906001600160a01b031681565b6103e761133f565b6103dd61078b366004612d5c565b61134c565b61048861079e366004612c2f565b6113b6565b603e546103b59060ff1681565b6104886107be366004612c2f565b6113cc565b6103dd6107d1366004612ef4565b6113e2565b6103b56107e4366004612d5c565b6113ed565b61052f6107f7366004612c2f565b60056020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e546103b590610100900460ff1681565b6103dd610855366004612f3b565b61144d565b61086d610868366004612c2f565b6115a5565b6040516103c1919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103e76108c5366004612c2f565b61174b565b6103dd6108d8366004613019565b61179c565b6104886108eb366004612c2f565b61180a565b6103dd6108fe366004612ef4565b611865565b61048860025481565b610488611e6181565b3061041c565b6103dd610929366004612cc4565b6118f1565b6104887f000000000000000000000000000000000000000000000000000000000000000081565b6103b5610963366004613019565b600760209081525f928352604080842090915290825290205460ff1681565b610488610990366004612c2f565b611963565b610727611979565b6103dd6109ab366004612dac565b611985565b6103b56109be366004612dac565b603b6020525f908152604090205460ff1681565b6103dd611a00565b61041c61dead81565b5f6301ffc9a760e01b6001600160e01b031983161480610a1357506380ac58cd60e01b6001600160e01b03198316145b80610a2e5750635b5e139f60e01b6001600160e01b03198316145b80610a4957506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990613050565b60405180910390fd5b603f610a8f8284836130f0565b505050565b5f8054610aa090613074565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90613074565b8015610b175780601f10610aee57610100808354040283529160200191610b17565b820191905f5260205f20905b815481529060010190602001808311610afa57829003601f168201915b505050505081565b5f610b298261121f565b90506001600160a01b038116331480610b6457506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff165b610bb05760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a6564006044820152606401610a79565b610a8f8383611a89565b603e5460ff16610c1b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b6064820152608401610a79565b610c258282611af6565b5050565b603a546001600160a01b03163314610c535760405162461bcd60e51b8152600401610a7990613050565b603e80549115156101000261ff0019909216919091179055565b335f908152603b602052604090205460ff16610c9b5760405162461bcd60e51b8152600401610a79906131a9565b610c258282611b82565b5f7f0000000000000000000000000000000000000000000000000000000000000000600254610cd491906131e2565b905090565b603a546001600160a01b03163314610d035760405162461bcd60e51b8152600401610a7990613050565b6040610a8f8284836130f0565b610d1a3382611bfc565b610d715760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b6064820152608401610a79565b610a8f838383611c78565b5f80825b856001600160a01b0316610dab868685818110610d9f57610d9f6131f5565b9050602002013561120e565b6001600160a01b031614610dc3575f92505050610dd7565b808260010192508210610d80576001925050505b9392505050565b6002545f9081907f0000000000000000000000000000000000000000000000000000000000000000905b80821015610e7157846001600160a01b0316610e238361121f565b6001600160a01b031614158015610e535750846001600160a01b0316610e488361120e565b6001600160a01b0316145b15610e665782610e6281613209565b9350505b816001019150610e08565b50909392505050565b5f610a4963ffffffff8316600a613221565b610a8f83838360405180602001604052805f81525061144d565b60605f610ecd836001600160a01b03165f9081526004602052604090205463ffffffff1690565b90505f816001600160401b03811115610ee857610ee8612f27565b604051908082528060200260200182016040528015610f11578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000005b83821015610f9357856001600160a01b0316610f528261121f565b6001600160a01b031603610f8b57808383610f6c81613209565b945081518110610f7e57610f7e6131f5565b6020026020010181815250505b600101610f37565b5090949350505050565b335f908152603b602052604090205460ff16610fcb5760405162461bcd60e51b8152600401610a79906131a9565b6110368484808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040805160208088028281018201909352878252909350879250869182918501908490808284375f92019190915250611d1b92505050565b50505050565b603a546001600160a01b031633146110665760405162461bcd60e51b8152600401610a7990613050565b603e805460ff1916911515919091179055565b5f61108382610dde565b6001600160a01b0383165f9081526004602052604090205463ffffffff16610a499190613238565b335f908152603b602052604090205460ff166110d95760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611dbb92505050565b60605f61112183610dde565b90505f816001600160401b0381111561113c5761113c612f27565b604051908082528060200260200182016040528015611165578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000005b83821015610f9357856001600160a01b03166111a68261121f565b6001600160a01b0316141580156111d65750856001600160a01b03166111cb8261120e565b6001600160a01b0316145b15611206578083836111e781613209565b9450815181106111f9576111f96131f5565b6020026020010181815250505b60010161118b565b5f611218826115a5565b5192915050565b5f8061122a836115a5565b9050806040015163ffffffff165f146112185730610dd7565b60605f8281816001600160401b0381111561126057611260612f27565b604051908082528060200260200182016040528015611289578160200160208202803683370190505b5090505b818310156112df576112b68686858181106112aa576112aa6131f5565b9050602002013561180a565b8184815181106112c8576112c86131f5565b60200260200101818152505082600101925061128d565b95945050505050565b603a546001600160a01b031633146113125760405162461bcd60e51b8152600401610a7990613050565b5f61131e8486836130f0565b50600161132c8284836130f0565b5050505050565b5f610a49600a8361325f565b60018054610aa090613074565b335f908152603b602052604090205460ff1661137a5760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611fe792505050565b5f610a496113c3836115a5565b60600151610e7a565b5f610a496113d9836115a5565b60400151610e7a565b610c253383836121dd565b5f80825b856001600160a01b031661141c868685818110611410576114106131f5565b9050602002013561121f565b6001600160a01b031614611434575f92505050610dd7565b8082600101925082106113f15750600195945050505050565b611458848484610d10565b6001600160a01b0383163b15611036575f836001600160a01b031663150b7a023387868660405160240161148f9493929190613272565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516114c891906132c5565b5f604051808303815f865af19150503d805f8114611501576040519150601f19603f3d011682016040523d82523d5f602084013e611506565b606091505b509150505f8180602001905181019061151f91906132d0565b9050630a85bd0160e11b6001600160e01b031982161461159d5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b6064820152608401610a79565b505050505050565b604080516080810182525f8082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000008210156116385760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e67204964210000000000006044820152606401610a79565b5f828152600360205260409020546001600160a01b031615158061165e57506002548210155b156116c157505f90815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b5f818152600560205260409020546001600160a01b03166116e6575f19016116c3565b5f90815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b60604660011461176857505060408051602081019091525f815290565b603f61177383612249565b6040805160200161178693929190613359565b6040516020818303038152906040529050919050565b603a546001600160a01b031633146117c65760405162461bcd60e51b8152600401610a7990613050565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80611815836115a5565b90505f6118258260600151610e7a565b90505f80836040015163ffffffff161161183f575f611859565b611859836040015161184f611979565b6105b49190613376565b90506112df8183613238565b603a546001600160a01b0316331461188f5760405162461bcd60e51b8152600401610a7990613050565b6001600160a01b0382165f818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166119595760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b6064820152608401610a79565b610c258282612346565b5f610a49611970836115a5565b60200151610e7a565b5f610cd4600a4261325f565b603a546001600160a01b031633146119af5760405162461bcd60e51b8152600401610a7990613050565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b603a546001600160a01b03163314611a2a5760405162461bcd60e51b8152600401610a7990613050565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b5f81815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611abd8261121f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f815b80821015611036575f611b23858585818110611b1757611b176131f5565b905060200201356123d2565b9050336001600160a01b03821614611b765760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050611af9565b80611b8b610ca5565b611b959190613238565b611e611015611bf25760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b6064820152608401610a79565b610c2582826123dd565b5f80611c078361121f565b9050836001600160a01b0316816001600160a01b03161480611c4157505f838152600660205260409020546001600160a01b038581169116145b80611c7057506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b949350505050565b5f611c81611979565b6001600160a01b0385165f90815260046020526040902054909150600160401b900463ffffffff16611cb56102d082613392565b63ffffffff168263ffffffff161015611d105760405162461bcd60e51b815260206004820152601860248201527f554e424f585f4c4f434b45445f54454d504f524152494c5900000000000000006044820152606401610a79565b61132c85858561246c565b8051825114611d6c5760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610a79565b5f5b8251811015610a8f57611db3838281518110611d8c57611d8c6131f5565b6020026020010151838381518110611da657611da66131f5565b6020026020010151611b82565b600101611d6e565b80516040516370a0823160e01b81526001600160a01b03841660048201525f90730f926df0ddb33a1db95088964e09fa8fb47e490e906370a0823190602401602060405180830381865afa158015611e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3991906133ae565b9050808214611e835760405162461bcd60e51b81526020600482015260166024820152751253959053125117d55411d490511157d05353d5539560521b6044820152606401610a79565b5f5b8281101561132c575f848281518110611ea057611ea06131f5565b60200260200101519050856001600160a01b0316730f926df0ddb33a1db95088964e09fa8fb47e490e6001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401611ef691815260200190565b602060405180830381865afa158015611f11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3591906133c5565b6001600160a01b031614611f805760405162461bcd60e51b81526020600482015260126024820152712727aa2fa7aba722a92fa7a32faa27a5a2a760711b6044820152606401610a79565b61dead611f8c8261121f565b6001600160a01b031614611fd15760405162461bcd60e51b815260206004820152600c60248201526b544f4b454e5f45584953545360a01b6044820152606401610a79565b611fde61dead8783611c78565b50600101611e85565b5f5b8151811015610a8f575f828281518110612005576120056131f5565b60200260200101519050836001600160a01b03166120228261121f565b6001600160a01b0316146120645760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610a79565b6040516331a9108f60e11b8152600481018290525f90730f926df0ddb33a1db95088964e09fa8fb47e490e90636352211e90602401602060405180830381865afa1580156120b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d891906133c5565b6001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600d60248201526c1513d2d15397d5539093d61151609a1b6044820152606401610a79565b604051630a9edcc560e11b81526001600160a01b038516600482015260248101829052730f926df0ddb33a1db95088964e09fa8fb47e490e9063153db98a906044015f604051808303815f87803b158015612177575f80fd5b505af1158015612189573d5f803e3d5ffd5b50505050612195611979565b6001600160a01b0385165f908152600460205260409020805463ffffffff92909216600160401b026bffffffff00000000000000001990921691909117905550600101611fe9565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060815f0361226f5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115612298578061228281613209565b91506122919050600a8361325f565b9150612272565b5f816001600160401b038111156122b1576122b1612f27565b6040519080825280601f01601f1916602001820160405280156122db576020820181803683370190505b5090505b8415611c7057816122ef816133e0565b92506122fe9050600a866133f5565b612309906030613238565b60f81b81838151811061231e5761231e6131f5565b60200101906001600160f81b03191690815f1a90535061233f600a8661325f565b94506122df565b5f815b80821015611036575f612373858585818110612367576123676131f5565b90506020020135612601565b9050336001600160a01b038216146123c65760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050612349565b5f610a498242612608565b805b7f0000000000000000000000000000000000000000000000000000000000000000811115612462576124317f0000000000000000000000000000000000000000000000000000000000000000826131e2565b905061245d837f00000000000000000000000000000000000000000000000000000000000000006128d3565b6123df565b610a8f83826128d3565b6124758161121f565b6001600160a01b0316836001600160a01b0316146124d55760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f660000006044820152606401610a79565b6001600160a01b03821661252b5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f20307830000000000000006044820152606401610a79565b5f81815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b03841617905561256e611979565b5f828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b03808816808552600490935281842080545f1981881601871663ffffffff1991821617909155908716808552828520805480881660010190971696909216959095179055518493925f8051602061340983398151915291a4505050565b5f610a49825f5b5f80612613846115a5565b80516040820151919250906126288684612a9d565b5f86815260066020526040902080546001600160a01b0319169055841561271e5763ffffffff8116156126b25760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b6064820152608401610a79565b6001600160a01b0382165f81815260046020526040808220805463ffffffff1980821663ffffffff9283165f190183161790925530808552838520805480841660010190931692909316919091179091559051899391925f8051602061340983398151915291a4612890565b8063ffffffff165f0361278a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b6064820152608401610a79565b6001600160a01b0382165f9081526004602081905260408220805463ffffffff8082166001011663ffffffff19909116179055906127c53090565b6001600160a01b0316815260208101919091526040015f908120805463ffffffff19811663ffffffff9182165f190190911617905581612803611979565b61280d9190613376565b5f88815260036020526040902080549192508291601c9061283c908490600160e01b900463ffffffff16613392565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b031661286c3090565b6001600160a01b03165f8051602061340983398151915260405160405180910390a4505b61289985611333565b5f878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166129295760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f203078300000006044820152606401610a79565b7f00000000000000000000000000000000000000000000000000000000000000008111156129aa5760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b6064820152608401610a79565b6002545f6129b88383613238565b5f83815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506129e8611979565b5f838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b038616905f905f80516020613409833981519152908290a4808260010192508210612a6457600255505050565b5f828152600360205260409020546001600160a01b0316610c25575f82815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b031981168114612b4f575f80fd5b50565b5f60208284031215612b62575f80fd5b8135610dd781612b3a565b5f8083601f840112612b7d575f80fd5b5081356001600160401b03811115612b93575f80fd5b602083019150836020828501011115612baa575f80fd5b9250929050565b5f8060208385031215612bc2575f80fd5b82356001600160401b03811115612bd7575f80fd5b612be385828601612b6d565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dd76020830184612bef565b5f60208284031215612c3f575f80fd5b5035919050565b6001600160a01b0381168114612b4f575f80fd5b5f8060408385031215612c6b575f80fd5b8235612c7681612c46565b946020939093013593505050565b5f8083601f840112612c94575f80fd5b5081356001600160401b03811115612caa575f80fd5b6020830191508360208260051b8501011115612baa575f80fd5b5f8060208385031215612cd5575f80fd5b82356001600160401b03811115612cea575f80fd5b612be385828601612c84565b80358015158114611746575f80fd5b5f60208284031215612d15575f80fd5b610dd782612cf6565b5f805f60608486031215612d30575f80fd5b8335612d3b81612c46565b92506020840135612d4b81612c46565b929592945050506040919091013590565b5f805f60408486031215612d6e575f80fd5b8335612d7981612c46565b925060208401356001600160401b03811115612d93575f80fd5b612d9f86828701612c84565b9497909650939450505050565b5f60208284031215612dbc575f80fd5b8135610dd781612c46565b5f60208284031215612dd7575f80fd5b813563ffffffff81168114610dd7575f80fd5b602080825282518282018190525f918401906040840190835b81811015612e21578351835260209384019390920191600101612e03565b509095945050505050565b5f805f8060408587031215612e3f575f80fd5b84356001600160401b03811115612e54575f80fd5b612e6087828801612c84565b90955093505060208501356001600160401b03811115612e7e575f80fd5b612e8a87828801612c84565b95989497509550505050565b5f805f8060408587031215612ea9575f80fd5b84356001600160401b03811115612ebe575f80fd5b612eca87828801612b6d565b90955093505060208501356001600160401b03811115612ee8575f80fd5b612e8a87828801612b6d565b5f8060408385031215612f05575f80fd5b8235612f1081612c46565b9150612f1e60208401612cf6565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612f4e575f80fd5b8435612f5981612c46565b93506020850135612f6981612c46565b92506040850135915060608501356001600160401b03811115612f8a575f80fd5b8501601f81018713612f9a575f80fd5b80356001600160401b03811115612fb357612fb3612f27565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612fe157612fe1612f27565b604052818152828201602001891015612ff8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561302a575f80fd5b823561303581612c46565b9150602083013561304581612c46565b809150509250929050565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c9082168061308857607f821691505b6020821081036130a657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a8f57805f5260205f20601f840160051c810160208510156130d15750805b601f840160051c820191505b8181101561132c575f81556001016130dd565b6001600160401b0383111561310757613107612f27565b61311b836131158354613074565b836130ac565b5f601f84116001811461314c575f85156131355750838201355b5f19600387901b1c1916600186901b17835561132c565b5f83815260208120601f198716915b8281101561317b578685013582556020948501946001909201910161315b565b5086821015613197575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252600b908201526a4e6f74204d696e7465722160a81b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a4957610a496131ce565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161321a5761321a6131ce565b5060010190565b8082028115828204841417610a4957610a496131ce565b80820180821115610a4957610a496131ce565b634e487b7160e01b5f52601260045260245ffd5b5f8261326d5761326d61324b565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906132a490830184612bef565b9695505050505050565b5f81518060208401855e5f93019283525090919050565b5f610dd782846132ae565b5f602082840312156132e0575f80fd5b8151610dd781612b3a565b5f81546132f781613074565b60018216801561330e576001811461332357613350565b60ff1983168652811515820286019350613350565b845f5260205f205f5b838110156133485781548882015260019091019060200161332c565b505081860193505b50505092915050565b5f6112df61337061336a84886132eb565b866132ae565b846132eb565b63ffffffff8281168282160390811115610a4957610a496131ce565b63ffffffff8181168382160190811115610a4957610a496131ce565b5f602082840312156133be575f80fd5b5051919050565b5f602082840312156133d5575f80fd5b8151610dd781612c46565b5f816133ee576133ee6131ce565b505f190190565b5f826134035761340361324b565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202c3b544381d0b73764f0829dfb41e63ba9234de900cbb9d16cd167765706aba064736f6c634300081a0033

Deployed Bytecode

0x608060405234801561000f575f80fd5b506004361061039e575f3560e01c806384dd453c116101ea578063c87b56dd11610114578063e6798baa116100a9578063f2fde38b11610079578063f2fde38b1461099d578063f46eccc4146109b0578063f6598295146109d2578063fccc2813146109da575f80fd5b8063e6798baa1461092e578063e985e9c514610955578063f0e56f0d14610982578063f16dc57d14610995575f80fd5b8063d55f9273116100e4578063d55f927314610903578063d5abeb011461090c578063d7b4be2414610915578063e449f3411461091b575f80fd5b8063c87b56dd146108b7578063c969a5ab146108ca578063ced74b50146108dd578063cf456ae7146108f0575f80fd5b80639b10b7711161018a578063b0b50ed51161015a578063b0b50ed5146107e9578063b4bd7c3214610835578063b88d4fde14610847578063ba745f2e1461085a575f80fd5b80639b10b771146107a35780639ee0bcbc146107b0578063a22cb465146107c3578063a713e45b146107d6575f80fd5b80638da5cb5b116101c55780638da5cb5b1461076257806395d89b4114610775578063972bb0c01461077d578063993568c114610790575f80fd5b806384dd453c1461071e57806385a6c2141461073c578063888957671461074f575f80fd5b80633455f41e116102cb5780635266069d1161026b5780636352211e1161023b5780636352211e146106c157806370a08231146106d45780637b2cbd2d14610702578063840234541461070b575f80fd5b80635266069d146106255780635a17ef3f146106885780635aea7ec11461069b5780635e7676e1146106ae575f80fd5b8063438b6300116102a6578063438b6300146105cc578063470f2c1f146105ec5780634749900a146105ff5780634b0ee02a14610612575f80fd5b80633455f41e14610593578063403082f2146105a657806342842e0e146105b9575f80fd5b8063153db98a116103415780632913daa0116103115780632913daa0146104bc5780632c2cdd60146104e357806332e30f511461056557806332f89e5b14610578575f80fd5b8063153db98a1461046d57806318160ddd146104805780631c08c6b71461049657806323b872dd146104a9575f80fd5b8063081812fc1161037c578063081812fc146103f4578063095ea7b3146104345780630fbf0a93146104475780630ffdf2681461045a575f80fd5b806301ffc9a7146103a2578063021bcdcf146103ca57806306fdde03146103df575b5f80fd5b6103b56103b0366004612b52565b6109e3565b60405190151581526020015b60405180910390f35b6103dd6103d8366004612bb1565b610a4f565b005b6103e7610a94565b6040516103c19190612c1d565b61041c610402366004612c2f565b60066020525f90815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016103c1565b6103dd610442366004612c5a565b610b1f565b6103dd610455366004612cc4565b610bba565b6103dd610468366004612d05565b610c29565b6103dd61047b366004612c5a565b610c6d565b610488610ca5565b6040519081526020016103c1565b6103dd6104a4366004612bb1565b610cd9565b6103dd6104b7366004612d1e565b610d10565b6104887f000000000000000000000000000000000000000000000000000000000000001481565b61052f6104f1366004612c2f565b60036020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b604080516001600160a01b03909516855263ffffffff9384166020860152918316918401919091521660608201526080016103c1565b6103b5610573366004612d5c565b610d7c565b61041c730f926df0ddb33a1db95088964e09fa8fb47e490e81565b6104886105a1366004612dac565b610dde565b6104886105b4366004612dc7565b610e7a565b6103dd6105c7366004612d1e565b610e8c565b6105df6105da366004612dac565b610ea6565b6040516103c19190612dea565b6103dd6105fa366004612e2c565b610f9d565b6103dd61060d366004612d05565b61103c565b610488610620366004612dac565b611079565b610661610633366004612dac565b60046020525f908152604090205463ffffffff808216916401000000008104821691600160401b9091041683565b6040805163ffffffff948516815292841660208401529216918101919091526060016103c1565b6103dd610696366004612d5c565b6110ab565b6105df6106a9366004612dac565b611115565b61041c6106bc366004612c2f565b61120e565b61041c6106cf366004612c2f565b61121f565b6104886106e2366004612dac565b6001600160a01b03165f9081526004602052604090205463ffffffff1690565b610488603d5481565b6105df610719366004612cc4565b611243565b6107276102d081565b60405163ffffffff90911681526020016103c1565b6103dd61074a366004612e96565b6112e8565b61072761075d366004612c2f565b611333565b603a5461041c906001600160a01b031681565b6103e761133f565b6103dd61078b366004612d5c565b61134c565b61048861079e366004612c2f565b6113b6565b603e546103b59060ff1681565b6104886107be366004612c2f565b6113cc565b6103dd6107d1366004612ef4565b6113e2565b6103b56107e4366004612d5c565b6113ed565b61052f6107f7366004612c2f565b60056020525f90815260409020546001600160a01b0381169063ffffffff600160a01b8204811691600160c01b8104821691600160e01b9091041684565b603e546103b590610100900460ff1681565b6103dd610855366004612f3b565b61144d565b61086d610868366004612c2f565b6115a5565b6040516103c1919081516001600160a01b0316815260208083015163ffffffff90811691830191909152604080840151821690830152606092830151169181019190915260800190565b6103e76108c5366004612c2f565b61174b565b6103dd6108d8366004613019565b61179c565b6104886108eb366004612c2f565b61180a565b6103dd6108fe366004612ef4565b611865565b61048860025481565b610488611e6181565b3061041c565b6103dd610929366004612cc4565b6118f1565b6104887f000000000000000000000000000000000000000000000000000000000000000181565b6103b5610963366004613019565b600760209081525f928352604080842090915290825290205460ff1681565b610488610990366004612c2f565b611963565b610727611979565b6103dd6109ab366004612dac565b611985565b6103b56109be366004612dac565b603b6020525f908152604090205460ff1681565b6103dd611a00565b61041c61dead81565b5f6301ffc9a760e01b6001600160e01b031983161480610a1357506380ac58cd60e01b6001600160e01b03198316145b80610a2e5750635b5e139f60e01b6001600160e01b03198316145b80610a4957506307f5828d60e41b6001600160e01b03198316145b92915050565b603a546001600160a01b03163314610a825760405162461bcd60e51b8152600401610a7990613050565b60405180910390fd5b603f610a8f8284836130f0565b505050565b5f8054610aa090613074565b80601f0160208091040260200160405190810160405280929190818152602001828054610acc90613074565b8015610b175780601f10610aee57610100808354040283529160200191610b17565b820191905f5260205f20905b815481529060010190602001808311610afa57829003601f168201915b505050505081565b5f610b298261121f565b90506001600160a01b038116331480610b6457506001600160a01b0381165f90815260076020908152604080832033845290915290205460ff165b610bb05760405162461bcd60e51b815260206004820152601f60248201527f455243373231473a20617070726f7665206e6f7420617574686f72697a6564006044820152606401610a79565b610a8f8383611a89565b603e5460ff16610c1b5760405162461bcd60e51b815260206004820152602660248201527f5374616b696e672066756e6374696f6e616c697479206e6f7420656e61626c6560448201526564207965742160d01b6064820152608401610a79565b610c258282611af6565b5050565b603a546001600160a01b03163314610c535760405162461bcd60e51b8152600401610a7990613050565b603e80549115156101000261ff0019909216919091179055565b335f908152603b602052604090205460ff16610c9b5760405162461bcd60e51b8152600401610a79906131a9565b610c258282611b82565b5f7f0000000000000000000000000000000000000000000000000000000000000001600254610cd491906131e2565b905090565b603a546001600160a01b03163314610d035760405162461bcd60e51b8152600401610a7990613050565b6040610a8f8284836130f0565b610d1a3382611bfc565b610d715760405162461bcd60e51b815260206004820152602260248201527f455243373231473a207472616e7366657246726f6d20756e617574686f72697a604482015261195960f21b6064820152608401610a79565b610a8f838383611c78565b5f80825b856001600160a01b0316610dab868685818110610d9f57610d9f6131f5565b9050602002013561120e565b6001600160a01b031614610dc3575f92505050610dd7565b808260010192508210610d80576001925050505b9392505050565b6002545f9081907f0000000000000000000000000000000000000000000000000000000000000001905b80821015610e7157846001600160a01b0316610e238361121f565b6001600160a01b031614158015610e535750846001600160a01b0316610e488361120e565b6001600160a01b0316145b15610e665782610e6281613209565b9350505b816001019150610e08565b50909392505050565b5f610a4963ffffffff8316600a613221565b610a8f83838360405180602001604052805f81525061144d565b60605f610ecd836001600160a01b03165f9081526004602052604090205463ffffffff1690565b90505f816001600160401b03811115610ee857610ee8612f27565b604051908082528060200260200182016040528015610f11578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000015b83821015610f9357856001600160a01b0316610f528261121f565b6001600160a01b031603610f8b57808383610f6c81613209565b945081518110610f7e57610f7e6131f5565b6020026020010181815250505b600101610f37565b5090949350505050565b335f908152603b602052604090205460ff16610fcb5760405162461bcd60e51b8152600401610a79906131a9565b6110368484808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250506040805160208088028281018201909352878252909350879250869182918501908490808284375f92019190915250611d1b92505050565b50505050565b603a546001600160a01b031633146110665760405162461bcd60e51b8152600401610a7990613050565b603e805460ff1916911515919091179055565b5f61108382610dde565b6001600160a01b0383165f9081526004602052604090205463ffffffff16610a499190613238565b335f908152603b602052604090205460ff166110d95760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611dbb92505050565b60605f61112183610dde565b90505f816001600160401b0381111561113c5761113c612f27565b604051908082528060200260200182016040528015611165578160200160208202803683370190505b5090505f7f00000000000000000000000000000000000000000000000000000000000000015b83821015610f9357856001600160a01b03166111a68261121f565b6001600160a01b0316141580156111d65750856001600160a01b03166111cb8261120e565b6001600160a01b0316145b15611206578083836111e781613209565b9450815181106111f9576111f96131f5565b6020026020010181815250505b60010161118b565b5f611218826115a5565b5192915050565b5f8061122a836115a5565b9050806040015163ffffffff165f146112185730610dd7565b60605f8281816001600160401b0381111561126057611260612f27565b604051908082528060200260200182016040528015611289578160200160208202803683370190505b5090505b818310156112df576112b68686858181106112aa576112aa6131f5565b9050602002013561180a565b8184815181106112c8576112c86131f5565b60200260200101818152505082600101925061128d565b95945050505050565b603a546001600160a01b031633146113125760405162461bcd60e51b8152600401610a7990613050565b5f61131e8486836130f0565b50600161132c8284836130f0565b5050505050565b5f610a49600a8361325f565b60018054610aa090613074565b335f908152603b602052604090205460ff1661137a5760405162461bcd60e51b8152600401610a79906131a9565b610a8f838383808060200260200160405190810160405280939291908181526020018383602002808284375f92019190915250611fe792505050565b5f610a496113c3836115a5565b60600151610e7a565b5f610a496113d9836115a5565b60400151610e7a565b610c253383836121dd565b5f80825b856001600160a01b031661141c868685818110611410576114106131f5565b9050602002013561121f565b6001600160a01b031614611434575f92505050610dd7565b8082600101925082106113f15750600195945050505050565b611458848484610d10565b6001600160a01b0383163b15611036575f836001600160a01b031663150b7a023387868660405160240161148f9493929190613272565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516114c891906132c5565b5f604051808303815f865af19150503d805f8114611501576040519150601f19603f3d011682016040523d82523d5f602084013e611506565b606091505b509150505f8180602001905181019061151f91906132d0565b9050630a85bd0160e11b6001600160e01b031982161461159d5760405162461bcd60e51b815260206004820152603360248201527f455243373231473a20736166655472616e7366657246726f6d20746f5f206e6f6044820152726e2d45524337323152656365697661626c652160681b6064820152608401610a79565b505050505050565b604080516080810182525f8082526020820181905291810182905260608101919091527f00000000000000000000000000000000000000000000000000000000000000018210156116385760405162461bcd60e51b815260206004820152601a60248201527f546f6b656e49642062656c6f77207374617274696e67204964210000000000006044820152606401610a79565b5f828152600360205260409020546001600160a01b031615158061165e57506002548210155b156116c157505f90815260036020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015290565b815b5f818152600560205260409020546001600160a01b03166116e6575f19016116c3565b5f90815260056020908152604091829020825160808101845290546001600160a01b038116825263ffffffff600160a01b8204811693830193909352600160c01b8104831693820193909352600160e01b90920416606082015292915050565b919050565b60604660011461176857505060408051602081019091525f815290565b603f61177383612249565b6040805160200161178693929190613359565b6040516020818303038152906040529050919050565b603a546001600160a01b031633146117c65760405162461bcd60e51b8152600401610a7990613050565b806001600160a01b0316826001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f80611815836115a5565b90505f6118258260600151610e7a565b90505f80836040015163ffffffff161161183f575f611859565b611859836040015161184f611979565b6105b49190613376565b90506112df8183613238565b603a546001600160a01b0316331461188f5760405162461bcd60e51b8152600401610a7990613050565b6001600160a01b0382165f818152603b6020908152604091829020805460ff19168515159081179091558251938452908301527f583b0aa0e528532caf4b907c11d7a8158a122fe2a6fb80cd9b09776ebea8d92d910160405180910390a15050565b603e54610100900460ff166119595760405162461bcd60e51b815260206004820152602860248201527f556e7374616b696e672066756e6374696f6e616c697479206e6f7420656e61626044820152676c6564207965742160c01b6064820152608401610a79565b610c258282612346565b5f610a49611970836115a5565b60200151610e7a565b5f610cd4600a4261325f565b603a546001600160a01b031633146119af5760405162461bcd60e51b8152600401610a7990613050565b603a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b603a546001600160a01b03163314611a2a5760405162461bcd60e51b8152600401610a7990613050565b60408051426020820152439181018290524460608083019190915241901b6bffffffffffffffffffffffff19166080820152456094820152904060b482015260d40160408051601f198184030181529190528051602090910120603d55565b5f81815260066020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611abd8261121f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f815b80821015611036575f611b23858585818110611b1757611b176131f5565b905060200201356123d2565b9050336001600160a01b03821614611b765760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050611af9565b80611b8b610ca5565b611b959190613238565b611e611015611bf25760405162461bcd60e51b815260206004820152602360248201527f455243373231473a205f6d696e7428293a2065786365656473206d6178537570604482015262706c7960e81b6064820152608401610a79565b610c2582826123dd565b5f80611c078361121f565b9050836001600160a01b0316816001600160a01b03161480611c4157505f838152600660205260409020546001600160a01b038581169116145b80611c7057506001600160a01b038082165f9081526007602090815260408083209388168352929052205460ff165b949350505050565b5f611c81611979565b6001600160a01b0385165f90815260046020526040902054909150600160401b900463ffffffff16611cb56102d082613392565b63ffffffff168263ffffffff161015611d105760405162461bcd60e51b815260206004820152601860248201527f554e424f585f4c4f434b45445f54454d504f524152494c5900000000000000006044820152606401610a79565b61132c85858561246c565b8051825114611d6c5760405162461bcd60e51b815260206004820152601760248201527f4172726179206c656e67746873206d69736d61746368210000000000000000006044820152606401610a79565b5f5b8251811015610a8f57611db3838281518110611d8c57611d8c6131f5565b6020026020010151838381518110611da657611da66131f5565b6020026020010151611b82565b600101611d6e565b80516040516370a0823160e01b81526001600160a01b03841660048201525f90730f926df0ddb33a1db95088964e09fa8fb47e490e906370a0823190602401602060405180830381865afa158015611e15573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e3991906133ae565b9050808214611e835760405162461bcd60e51b81526020600482015260166024820152751253959053125117d55411d490511157d05353d5539560521b6044820152606401610a79565b5f5b8281101561132c575f848281518110611ea057611ea06131f5565b60200260200101519050856001600160a01b0316730f926df0ddb33a1db95088964e09fa8fb47e490e6001600160a01b0316636352211e836040518263ffffffff1660e01b8152600401611ef691815260200190565b602060405180830381865afa158015611f11573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f3591906133c5565b6001600160a01b031614611f805760405162461bcd60e51b81526020600482015260126024820152712727aa2fa7aba722a92fa7a32faa27a5a2a760711b6044820152606401610a79565b61dead611f8c8261121f565b6001600160a01b031614611fd15760405162461bcd60e51b815260206004820152600c60248201526b544f4b454e5f45584953545360a01b6044820152606401610a79565b611fde61dead8783611c78565b50600101611e85565b5f5b8151811015610a8f575f828281518110612005576120056131f5565b60200260200101519050836001600160a01b03166120228261121f565b6001600160a01b0316146120645760405162461bcd60e51b81526020600482015260096024820152682727aa2fa7aba722a960b91b6044820152606401610a79565b6040516331a9108f60e11b8152600481018290525f90730f926df0ddb33a1db95088964e09fa8fb47e490e90636352211e90602401602060405180830381865afa1580156120b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120d891906133c5565b6001600160a01b03161461211e5760405162461bcd60e51b815260206004820152600d60248201526c1513d2d15397d5539093d61151609a1b6044820152606401610a79565b604051630a9edcc560e11b81526001600160a01b038516600482015260248101829052730f926df0ddb33a1db95088964e09fa8fb47e490e9063153db98a906044015f604051808303815f87803b158015612177575f80fd5b505af1158015612189573d5f803e3d5ffd5b50505050612195611979565b6001600160a01b0385165f908152600460205260409020805463ffffffff92909216600160401b026bffffffff00000000000000001990921691909117905550600101611fe9565b6001600160a01b038381165f81815260076020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060815f0361226f5750506040805180820190915260018152600360fc1b602082015290565b815f5b8115612298578061228281613209565b91506122919050600a8361325f565b9150612272565b5f816001600160401b038111156122b1576122b1612f27565b6040519080825280601f01601f1916602001820160405280156122db576020820181803683370190505b5090505b8415611c7057816122ef816133e0565b92506122fe9050600a866133f5565b612309906030613238565b60f81b81838151811061231e5761231e6131f5565b60200101906001600160f81b03191690815f1a90535061233f600a8661325f565b94506122df565b5f815b80821015611036575f612373858585818110612367576123676131f5565b90506020020135612601565b9050336001600160a01b038216146123c65760405162461bcd60e51b8152602060048201526016602482015275596f7520617265206e6f7420746865206f776e65722160501b6044820152606401610a79565b82600101925050612349565b5f610a498242612608565b805b7f0000000000000000000000000000000000000000000000000000000000000014811115612462576124317f0000000000000000000000000000000000000000000000000000000000000014826131e2565b905061245d837f00000000000000000000000000000000000000000000000000000000000000146128d3565b6123df565b610a8f83826128d3565b6124758161121f565b6001600160a01b0316836001600160a01b0316146124d55760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f7472616e7366657220213d206f776e65724f660000006044820152606401610a79565b6001600160a01b03821661252b5760405162461bcd60e51b815260206004820152601960248201527f455243373231473a205f7472616e7366657220746f20307830000000000000006044820152606401610a79565b5f81815260066020908152604080832080546001600160a01b0319908116909155600390925290912080549091166001600160a01b03841617905561256e611979565b5f828152600360209081526040808320805463ffffffff958616600160a01b0263ffffffff60a01b199091161790556001600160a01b03808816808552600490935281842080545f1981881601871663ffffffff1991821617909155908716808552828520805480881660010190971696909216959095179055518493925f8051602061340983398151915291a4505050565b5f610a49825f5b5f80612613846115a5565b80516040820151919250906126288684612a9d565b5f86815260066020526040902080546001600160a01b0319169055841561271e5763ffffffff8116156126b25760405162461bcd60e51b815260206004820152602c60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526b1c9958591e481cdd185ad95960a21b6064820152608401610a79565b6001600160a01b0382165f81815260046020526040808220805463ffffffff1980821663ffffffff9283165f190183161790925530808552838520805480841660010190931692909316919091179091559051899391925f8051602061340983398151915291a4612890565b8063ffffffff165f0361278a5760405162461bcd60e51b815260206004820152602e60248201527f455243373231473a205f7365745374616b6554696d657374616d70282920616c60448201526d1c9958591e481d5b9cdd185ad95960921b6064820152608401610a79565b6001600160a01b0382165f9081526004602081905260408220805463ffffffff8082166001011663ffffffff19909116179055906127c53090565b6001600160a01b0316815260208101919091526040015f908120805463ffffffff19811663ffffffff9182165f190190911617905581612803611979565b61280d9190613376565b5f88815260036020526040902080549192508291601c9061283c908490600160e01b900463ffffffff16613392565b92506101000a81548163ffffffff021916908363ffffffff16021790555086836001600160a01b031661286c3090565b6001600160a01b03165f8051602061340983398151915260405160405180910390a4505b61289985611333565b5f878152600360205260409020805463ffffffff92909216600160c01b0263ffffffff60c01b199092169190911790555091505092915050565b6001600160a01b0382166129295760405162461bcd60e51b815260206004820152601d60248201527f455243373231473a205f6d696e74496e7465726e616c20746f203078300000006044820152606401610a79565b7f00000000000000000000000000000000000000000000000000000000000000148111156129aa5760405162461bcd60e51b815260206004820152602860248201527f455243373231473a205f6d696e74496e7465726e616c206f766572206d6178426044820152676174636853697a6560c01b6064820152608401610a79565b6002545f6129b88383613238565b5f83815260056020526040902080546001600160a01b0319166001600160a01b03871617905590506129e8611979565b5f838152600560209081526040808320805463ffffffff60a01b1916600160a01b63ffffffff968716021790556001600160a01b038816835260049091529020805467ffffffffffffffff1981168184168701841690811764010000000063ffffffff1990931690911782900484168701909316029190911790555b60405182906001600160a01b038616905f905f80516020613409833981519152908290a4808260010192508210612a6457600255505050565b5f828152600360205260409020546001600160a01b0316610c25575f82815260036020908152604091829020835181549285015193850151606086015163ffffffff908116600160e01b026001600160e01b03928216600160c01b02929092166001600160c01b0391909616600160a01b026001600160c01b03199095166001600160a01b03909316929092179390931716929092171790555050565b6001600160e01b031981168114612b4f575f80fd5b50565b5f60208284031215612b62575f80fd5b8135610dd781612b3a565b5f8083601f840112612b7d575f80fd5b5081356001600160401b03811115612b93575f80fd5b602083019150836020828501011115612baa575f80fd5b9250929050565b5f8060208385031215612bc2575f80fd5b82356001600160401b03811115612bd7575f80fd5b612be385828601612b6d565b90969095509350505050565b5f81518084528060208401602086015e5f602082860101526020601f19601f83011685010191505092915050565b602081525f610dd76020830184612bef565b5f60208284031215612c3f575f80fd5b5035919050565b6001600160a01b0381168114612b4f575f80fd5b5f8060408385031215612c6b575f80fd5b8235612c7681612c46565b946020939093013593505050565b5f8083601f840112612c94575f80fd5b5081356001600160401b03811115612caa575f80fd5b6020830191508360208260051b8501011115612baa575f80fd5b5f8060208385031215612cd5575f80fd5b82356001600160401b03811115612cea575f80fd5b612be385828601612c84565b80358015158114611746575f80fd5b5f60208284031215612d15575f80fd5b610dd782612cf6565b5f805f60608486031215612d30575f80fd5b8335612d3b81612c46565b92506020840135612d4b81612c46565b929592945050506040919091013590565b5f805f60408486031215612d6e575f80fd5b8335612d7981612c46565b925060208401356001600160401b03811115612d93575f80fd5b612d9f86828701612c84565b9497909650939450505050565b5f60208284031215612dbc575f80fd5b8135610dd781612c46565b5f60208284031215612dd7575f80fd5b813563ffffffff81168114610dd7575f80fd5b602080825282518282018190525f918401906040840190835b81811015612e21578351835260209384019390920191600101612e03565b509095945050505050565b5f805f8060408587031215612e3f575f80fd5b84356001600160401b03811115612e54575f80fd5b612e6087828801612c84565b90955093505060208501356001600160401b03811115612e7e575f80fd5b612e8a87828801612c84565b95989497509550505050565b5f805f8060408587031215612ea9575f80fd5b84356001600160401b03811115612ebe575f80fd5b612eca87828801612b6d565b90955093505060208501356001600160401b03811115612ee8575f80fd5b612e8a87828801612b6d565b5f8060408385031215612f05575f80fd5b8235612f1081612c46565b9150612f1e60208401612cf6565b90509250929050565b634e487b7160e01b5f52604160045260245ffd5b5f805f8060808587031215612f4e575f80fd5b8435612f5981612c46565b93506020850135612f6981612c46565b92506040850135915060608501356001600160401b03811115612f8a575f80fd5b8501601f81018713612f9a575f80fd5b80356001600160401b03811115612fb357612fb3612f27565b604051601f8201601f19908116603f011681016001600160401b0381118282101715612fe157612fe1612f27565b604052818152828201602001891015612ff8575f80fd5b816020840160208301375f6020838301015280935050505092959194509250565b5f806040838503121561302a575f80fd5b823561303581612c46565b9150602083013561304581612c46565b809150509250929050565b6020808252600a90820152694e6f74204f776e65722160b01b604082015260600190565b600181811c9082168061308857607f821691505b6020821081036130a657634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115610a8f57805f5260205f20601f840160051c810160208510156130d15750805b601f840160051c820191505b8181101561132c575f81556001016130dd565b6001600160401b0383111561310757613107612f27565b61311b836131158354613074565b836130ac565b5f601f84116001811461314c575f85156131355750838201355b5f19600387901b1c1916600186901b17835561132c565b5f83815260208120601f198716915b8281101561317b578685013582556020948501946001909201910161315b565b5086821015613197575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6020808252600b908201526a4e6f74204d696e7465722160a81b604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610a4957610a496131ce565b634e487b7160e01b5f52603260045260245ffd5b5f6001820161321a5761321a6131ce565b5060010190565b8082028115828204841417610a4957610a496131ce565b80820180821115610a4957610a496131ce565b634e487b7160e01b5f52601260045260245ffd5b5f8261326d5761326d61324b565b500490565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906132a490830184612bef565b9695505050505050565b5f81518060208401855e5f93019283525090919050565b5f610dd782846132ae565b5f602082840312156132e0575f80fd5b8151610dd781612b3a565b5f81546132f781613074565b60018216801561330e576001811461332357613350565b60ff1983168652811515820286019350613350565b845f5260205f205f5b838110156133485781548882015260019091019060200161332c565b505081860193505b50505092915050565b5f6112df61337061336a84886132eb565b866132ae565b846132eb565b63ffffffff8281168282160390811115610a4957610a496131ce565b63ffffffff8181168382160190811115610a4957610a496131ce565b5f602082840312156133be575f80fd5b5051919050565b5f602082840312156133d5575f80fd5b8151610dd781612c46565b5f816133ee576133ee6131ce565b505f190190565b5f826134035761340361324b565b50069056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202c3b544381d0b73764f0829dfb41e63ba9234de900cbb9d16cd167765706aba064736f6c634300081a0033

Deployed Bytecode Sourcemap

29161:10154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27953:186;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27953:186:0;;;;;;;;32339:97;;;;;;:::i;:::-;;:::i;:::-;;1753:18;;;:::i;:::-;;;;;;;:::i;4035:46::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;4035:46:0;;;;;;-1:-1:-1;;;;;2275:32:1;;;2257:51;;2245:2;2230:18;4035:46:0;2111:203:1;25934:447:0;;;;;;:::i;:::-;;:::i;31180:182::-;;;;;;:::i;:::-;;:::i;30745:104::-;;;;;;:::i;:::-;;:::i;31958:114::-;;;;;;:::i;:::-;;:::i;5262:112::-;;;:::i;:::-;;;4137:25:1;;;4125:2;4110:18;5262:112:0;3991:177:1;32442:105:0;;;;;;:::i;:::-;;:::i;26995:244::-;;;;;;:::i;:::-;;:::i;2164:37::-;;;;;3757:49;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3757:49:0;;;;-1:-1:-1;;;3757:49:0;;;;;-1:-1:-1;;;3757:49:0;;;;;-1:-1:-1;;;3757:49:0;;;;;;;;;;-1:-1:-1;;;;;4929:32:1;;;4911:51;;5010:10;4998:23;;;4993:2;4978:18;;4971:51;5058:23;;;5038:18;;;5031:51;;;;5118:23;5113:2;5098:18;;5091:51;4898:3;4883:19;3757:49:0;4686:462:1;33653:341:0;;;;;;:::i;:::-;;:::i;34870:84::-;;34911:42;34870:84;;21083:406;;;;;;:::i;:::-;;:::i;4520:138::-;;;;;;:::i;:::-;;:::i;27791:154::-;;;;;;:::i;:::-;;:::i;28147:467::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;32078:153::-;;;;;;:::i;:::-;;:::i;30639:100::-;;;;;;:::i;:::-;;:::i;22810:153::-;;;;;;:::i;:::-;;:::i;3836:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;3836:53:0;;;;;;;;;;8100:10:1;8088:23;;;8070:42;;8148:23;;;8143:2;8128:18;;8121:51;8208:23;;8188:18;;;8181:51;;;;8058:2;8043:18;3836:53:0;7874:364:1;36449:150:0;;;;;;:::i;:::-;;:::i;21915:539::-;;;;;;:::i;:::-;;:::i;7602:135::-;;;;;;:::i;:::-;;:::i;7069:241::-;;;;;;:::i;:::-;;:::i;5380:131::-;;;;;;:::i;:::-;-1:-1:-1;;;;;5473:22:0;5446:7;5473:22;;;:12;:22;;;;;:30;;;;5380:131;30147:29;;;;;;24338:424;;;;;;:::i;:::-;;:::i;38554:49::-;;38600:3;38554:49;;;;;8599:10:1;8587:23;;;8569:42;;8557:2;8542:18;38554:49:0;8425:192:1;29917:159:0;;;;;;:::i;:::-;;:::i;4375:139::-;;;;;;:::i;:::-;;:::i;405:20::-;;;;;-1:-1:-1;;;;;405:20:0;;;1792;;;:::i;38342:140::-;;;;;;:::i;:::-;;:::i;5022:174::-;;;;;;:::i;:::-;;:::i;30567:28::-;;;;;;;;;4844:172;;;;;;:::i;:::-;;:::i;26623:227::-;;;;;;:::i;:::-;;:::i;33315:332::-;;;;;;:::i;:::-;;:::i;3921:48::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;3921:48:0;;;;-1:-1:-1;;;3921:48:0;;;;;-1:-1:-1;;;3921:48:0;;;;;-1:-1:-1;;;3921:48:0;;;;;;30602:30;;;;;;;;;;;;27245:540;;;;;;:::i;:::-;;:::i;5968:773::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;11366:13:1;;-1:-1:-1;;;;;11362:39:1;11344:58;;11462:4;11450:17;;;11444:24;11470:10;11440:41;;;11418:20;;;11411:71;;;;11542:4;11530:17;;;11524:24;11520:41;;11498:20;;;11491:71;11622:4;11610:17;;;11604:24;11600:41;11578:20;;;11571:71;;;;11331:3;11316:19;;11141:507;33017:245:0;;;;;;:::i;:::-;;:::i;894:173::-;;;;;;:::i;:::-;;:::i;23380:556::-;;;;;;:::i;:::-;;:::i;29000:154::-;;;;;;:::i;:::-;;:::i;1870:25::-;;;;;;30485:40;;30521:4;30485:40;;2337:95;2419:4;2337:95;;31368:190;;;;;;:::i;:::-;;:::i;2011:37::-;;;;;4118:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;4670:168;;;;;;:::i;:::-;;:::i;4238:131::-;;;:::i;709:179::-;;;;;;:::i;:::-;;:::i;28823:39::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;30183:255;;;:::i;35018:81::-;;35057:42;35018:81;;27953:186;28022:4;-1:-1:-1;;;;;;;;;28046:18:0;;;;:40;;-1:-1:-1;;;;;;;;;;28068:18:0;;;28046:40;:62;;;-1:-1:-1;;;;;;;;;;28090:18:0;;;28046:62;:84;;;-1:-1:-1;;;;;;;;;;28112:18:0;;;28046:84;28039:91;27953:186;-1:-1:-1;;27953:186:0:o;32339:97::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;;;;;;;;;32413:7:::1;:14;32423:4:::0;;32413:7;:14:::1;:::i;:::-;;32339:97:::0;;:::o;1753:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25934:447::-;26008:14;26025:17;26033:8;26025:7;:17::i;:::-;26008:34;-1:-1:-1;;;;;;26140:20:0;;26150:10;26140:20;;:148;;-1:-1:-1;;;;;;26252:24:0;;;;;;:16;:24;;;;;;;;26277:10;26252:36;;;;;;;;;;26140:148;26053:284;;;;-1:-1:-1;;;26053:284:0;;14995:2:1;26053:284:0;;;14977:21:1;15034:2;15014:18;;;15007:30;15073:33;15053:18;;;15046:61;15124:18;;26053:284:0;14793:355:1;26053:284:0;26350:23;26359:3;26364:8;26350;:23::i;31180:182::-;31260:16;;;;31252:67;;;;-1:-1:-1;;;31252:67:0;;15355:2:1;31252:67:0;;;15337:21:1;15394:2;15374:18;;;15367:30;15433:34;15413:18;;;15406:62;-1:-1:-1;;;15484:18:1;;;15477:36;15530:19;;31252:67:0;15153:402:1;31252:67:0;31330:24;31344:9;;31330:13;:24::i;:::-;31180:182;;:::o;30745:104::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30820:18:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;30820:26:0;;::::1;::::0;;;::::1;::::0;;30745:104::o;31958:114::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;32045:19:::1;32051:3;32056:7;32045:5;:19::i;5262:112::-:0;5314:7;5354:12;5341:10;;:25;;;;:::i;:::-;5334:32;;5262:112;:::o;32442:105::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;32520:11:::1;:18;32534:4:::0;;32520:11;:18:::1;:::i;26995:244::-:0;27097:40;27116:10;27128:8;27097:18;:40::i;:::-;27089:100;;;;-1:-1:-1;;;27089:100:0;;16367:2:1;27089:100:0;;;16349:21:1;16406:2;16386:18;;;16379:30;16445:34;16425:18;;;16418:62;-1:-1:-1;;;16496:18:1;;;16489:32;16538:19;;27089:100:0;16165:398:1;27089:100:0;27200:31;27210:5;27217:3;27222:8;27200:9;:31::i;33653:341::-;33753:4;;33824:9;33863:100;33915:5;-1:-1:-1;;;;;33885:35:0;:26;33898:9;;33908:1;33898:12;;;;;;;:::i;:::-;;;;;;;33885;:26::i;:::-;-1:-1:-1;;;;;33885:35:0;;33881:53;;33929:5;33922:12;;;;;;33881:53;33960:1;33954:3;;;;;;:7;33863:100;;33982:4;33975:11;;;;33653:341;;;;;;:::o;21083:406::-;21257:10;;21161:7;;;;21220:12;;21278:178;21289:3;21285:1;:7;21278:178;;;21327:8;-1:-1:-1;;;;;21313:22:0;:10;21321:1;21313:7;:10::i;:::-;-1:-1:-1;;;;;21313:22:0;;;:53;;;;;21358:8;-1:-1:-1;;;;;21339:27:0;:15;21352:1;21339:12;:15::i;:::-;-1:-1:-1;;;;;21339:27:0;;21313:53;21309:104;;;21387:10;;;;:::i;:::-;;;;21309:104;21439:3;;;;;21278:178;;;-1:-1:-1;21473:8:0;;21083:406;-1:-1:-1;;;21083:406:0:o;4520:138::-;4599:7;4626:24;:19;;;4648:2;4626:24;:::i;27791:154::-;27895:42;27912:5;27919:3;27924:8;27895:42;;;;;;;;;;;;:16;:42::i;28147:467::-;28223:16;28252;28271:19;28281:8;-1:-1:-1;;;;;5473:22:0;5446:7;5473:22;;;:12;:22;;;;;:30;;;;5380:131;28271:19;28252:38;;28301:24;28343:8;-1:-1:-1;;;;;28328:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28328:24:0;-1:-1:-1;28301:51:0;-1:-1:-1;28363:21:0;28407:12;28430:152;28453:8;28437:13;:24;28430:152;;;28496:8;-1:-1:-1;;;;;28482:22:0;:10;28490:1;28482:7;:10::i;:::-;-1:-1:-1;;;;;28482:22:0;;28478:61;;28535:1;28508:7;28516:15;;;;:::i;:::-;;;28508:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;28478:61;28565:3;;28430:152;;;-1:-1:-1;28599:7:0;;28147:467;-1:-1:-1;;;;28147:467:0:o;32078:153::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;32198:25:::1;32208:4;;32198:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;32198:25:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;;;-1:-1:-1;32214:8:0;;-1:-1:-1;32214:8:0;;;;32198:25;::::1;::::0;32214:8;;32198:25;32214:8;32198:25;::::1;;::::0;::::1;::::0;;;;-1:-1:-1;32198:9:0::1;::::0;-1:-1:-1;;;32198:25:0:i:1;:::-;32078:153:::0;;;;:::o;30639:100::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30712:16:::1;:24:::0;;-1:-1:-1;;30712:24:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30639:100::o;22810:153::-;22881:7;22930:25;22946:8;22930:15;:25::i;:::-;-1:-1:-1;;;;;5473:22:0;;5446:7;5473:22;;;:12;:22;;;;;:30;;;22908:47;;;;:::i;36449:150::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;36555:36:::1;36574:5;36581:9;;36555:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;36555:18:0::1;::::0;-1:-1:-1;;;36555:36:0:i:1;21915:539::-:0;21996:16;22025;22044:25;22060:8;22044:15;:25::i;:::-;22025:44;;22080:24;22122:8;-1:-1:-1;;;;;22107:24:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22107:24:0;-1:-1:-1;22080:51:0;-1:-1:-1;22142:21:0;22186:12;22209:213;22232:8;22216:13;:24;22209:213;;;22275:8;-1:-1:-1;;;;;22261:22:0;:10;22269:1;22261:7;:10::i;:::-;-1:-1:-1;;;;;22261:22:0;;;:53;;;;;22306:8;-1:-1:-1;;;;;22287:27:0;:15;22300:1;22287:12;:15::i;:::-;-1:-1:-1;;;;;22287:27:0;;22261:53;22257:122;;;22362:1;22335:7;22343:15;;;;:::i;:::-;;;22335:24;;;;;;;;:::i;:::-;;;;;;:28;;;;;22257:122;22405:3;;22209:213;;7602:135;7671:7;7698:25;7714:8;7698:15;:25::i;:::-;:31;;7602:135;-1:-1:-1;;7602:135:0:o;7069:241::-;7133:7;7153:31;7187:25;7203:8;7187:15;:25::i;:::-;7153:59;;7230:12;:27;;;:32;;7261:1;7230:32;:72;;2419:4;7230:72;;24338:424;24435:16;24464:9;24496;24464;24496;-1:-1:-1;;;;;24560:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24560:17:0;;24523:54;;24588:132;24599:1;24595;:5;24588:132;;;24640:36;24663:9;;24673:1;24663:12;;;;;;;:::i;:::-;;;;;;;24640:22;:36::i;:::-;24617:17;24635:1;24617:20;;;;;;;;:::i;:::-;;;;;;:59;;;;;24703:3;;;;;24588:132;;;24737:17;24338:424;-1:-1:-1;;;;;24338:424:0:o;29917:159::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30029:4:::1;:12;30036:5:::0;;30029:4;:12:::1;:::i;:::-;-1:-1:-1::0;30052:6:0::1;:16;30061:7:::0;;30052:6;:16:::1;:::i;:::-;;29917:159:::0;;;;:::o;4375:139::-;4457:6;4490:15;4503:2;4490:10;:15;:::i;1792:20::-;;;;;;;:::i;38342:140::-;28907:10;28899:19;;;;:7;:19;;;;;;;;28891:43;;;;-1:-1:-1;;;28891:43:0;;;;;;;:::i;:::-;38438:36:::1;38457:5;38464:9;;38438:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;38438:18:0::1;::::0;-1:-1:-1;;;38438:36:0:i:1;5022:174::-:0;5102:7;5129:59;5146:25;5162:8;5146:15;:25::i;:::-;:41;;;5129:16;:59::i;4844:172::-;4923:7;4950:58;4967:25;4983:8;4967:15;:25::i;:::-;:40;;;4950:16;:58::i;26623:227::-;26790:52;26809:10;26821:9;26832;26790:18;:52::i;33315:332::-;33411:4;;33482:9;33521:95;33568:5;-1:-1:-1;;;;;33543:30:0;:21;33551:9;;33561:1;33551:12;;;;;;;:::i;:::-;;;;;;;33543:7;:21::i;:::-;-1:-1:-1;;;;;33543:30:0;;33539:48;;33582:5;33575:12;;;;;;33539:48;33613:1;33607:3;;;;;;:7;33521:95;;-1:-1:-1;33635:4:0;;33315:332;-1:-1:-1;;;;;33315:332:0:o;27245:540::-;27368:34;27381:5;27388:3;27393:8;27368:12;:34::i;:::-;-1:-1:-1;;;;;27417:15:0;;;:20;27413:365;;27457:22;27483:3;-1:-1:-1;;;;;27483:8:0;27533:10;27545;27557:5;27564:8;27574:5;27492:88;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27492:88:0;;;;;;;;;;;27483:98;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27454:127;;;27596:16;27626:9;27615:31;;;;;;;;;;;;:::i;:::-;27596:50;-1:-1:-1;;;;;;;;;;27669:23:0;;;27661:105;;;;-1:-1:-1;;;27661:105:0;;18756:2:1;27661:105:0;;;18738:21:1;18795:2;18775:18;;;18768:30;18834:34;18814:18;;;18807:62;-1:-1:-1;;;18885:18:1;;;18878:49;18944:19;;27661:105:0;18554:415:1;27661:105:0;27439:339;;27245:540;;;;:::o;5968:773::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6152:12:0;6140:8;:24;;6132:63;;;;-1:-1:-1;;;6132:63:0;;19176:2:1;6132:63:0;;;19158:21:1;19215:2;19195:18;;;19188:30;19254:28;19234:18;;;19227:56;19300:18;;6132:63:0;18974:350:1;6132:63:0;6336:1;6298:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;6298:26:0;:40;;;:79;;;6367:10;;6355:8;:22;;6298:79;6294:440;;;-1:-1:-1;6401:20:0;;;;:10;:20;;;;;;;;;6394:27;;;;;;;;;-1:-1:-1;;;;;6394:27:0;;;;;-1:-1:-1;;;6394:27:0;;;;;;;;;;;-1:-1:-1;;;6394:27:0;;;;;;;;;;;-1:-1:-1;;;6394:27:0;;;;;;;;;5968:773::o;6294:440::-;6586:8;6609:69;6656:1;6616:22;;;:9;:22;;;;;:28;-1:-1:-1;;;;;6616:28:0;6609:69;;-1:-1:-1;;6662:13:0;6609:69;;;6699:22;;;;:9;:22;;;;;;;;;6692:29;;;;;;;;;-1:-1:-1;;;;;6692:29:0;;;;;-1:-1:-1;;;6692:29:0;;;;;;;;;;;-1:-1:-1;;;6692:29:0;;;;;;;;;;;-1:-1:-1;;;6692:29:0;;;;;;;;;5968:773;-1:-1:-1;;5968:773:0:o;6294:440::-;5968:773;;;:::o;33017:245::-;33083:13;33140;33157:1;33140:18;33136:33;;-1:-1:-1;;33160:9:0;;;;;;;;;-1:-1:-1;33160:9:0;;;33017:245::o;33136:33::-;33211:7;33220:19;33230:8;33220:9;:19::i;:::-;33241:11;33194:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33180:74;;33017:245;;;:::o;894:173::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;1054:4:::1;-1:-1:-1::0;;;;;1027:32:0::1;1048:4;-1:-1:-1::0;;;;;1027:32:0::1;;;;;;;;;;;894:173:::0;;:::o;23380:556::-;23465:7;23485:31;23519:25;23535:8;23519:15;:25::i;:::-;23485:59;;23555:31;23589:46;23606:12;:28;;;23589:16;:46::i;:::-;23555:80;;23646:31;23724:1;23694:12;:27;;;:31;;;:165;;23858:1;23694:165;;;23741:96;23809:12;:27;;;23776:30;:28;:30::i;:::-;:60;;;;:::i;23741:96::-;23646:213;-1:-1:-1;23879:49:0;23646:213;23879:23;:49;:::i;29000:154::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29079:17:0;::::1;;::::0;;;:7:::1;:17;::::0;;;;;;;;:25;;-1:-1:-1;;29079:25:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29120:26;;20710:51:1;;;20777:18;;;20770:50;29120:26:0::1;::::0;20683:18:1;29120:26:0::1;;;;;;;29000:154:::0;;:::o;31368:190::-;31450:18;;;;;;;31442:71;;;;-1:-1:-1;;;31442:71:0;;21033:2:1;31442:71:0;;;21015:21:1;21072:2;21052:18;;;21045:30;21111:34;21091:18;;;21084:62;-1:-1:-1;;;21162:18:1;;;21155:38;21210:19;;31442:71:0;20831:404:1;31442:71:0;31524:26;31540:9;;31524:15;:26::i;4670:168::-;4747:7;4774:56;4791:25;4807:8;4791:15;:25::i;:::-;:38;;;4774:16;:56::i;4238:131::-;4307:6;4340:20;4358:2;4340:15;:20;:::i;709:179::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;800:5:::1;::::0;;-1:-1:-1;;;;;816:12:0;;::::1;-1:-1:-1::0;;;;;;816:12:0;::::1;::::0;::::1;::::0;;;844:36:::1;::::0;800:5;::::1;::::0;816:12;800:5;;844:36:::1;::::0;781:16:::1;::::0;844:36:::1;769:119;709:179:::0;:::o;30183:255::-;663:5;;-1:-1:-1;;;;;663:5:0;672:10;663:19;655:42;;;;-1:-1:-1;;;655:42:0;;;;;;;:::i;:::-;30270:159:::1;::::0;;30301:15:::1;30270:159;::::0;::::1;21525:19:1::0;30318:12:0::1;21560::1::0;;;21553:28;;;30332:16:0::1;21597:12:1::0;;;;21590:28;;;;30363:14:0::1;21652:15:1::0;;-1:-1:-1;;21648:53:1;21634:12;;;21627:75;30379:14:0::1;21718:13:1::0;;;21711:29;30395:23:0;::::1;21756:13:1::0;;;21749:29;21794:13;;30270:159:0::1;::::0;;-1:-1:-1;;30270:159:0;;::::1;::::0;;;;;;30260:170;;30270:159:::1;30260:170:::0;;::::1;::::0;30243:14:::1;:187:::0;30183:255::o;25756:170::-;25833:21;;;;:11;:21;;;;;:27;;-1:-1:-1;;;;;;25833:27:0;-1:-1:-1;;;;;25833:27:0;;;;;;;;:21;;25885:17;25833:21;25885:7;:17::i;:::-;-1:-1:-1;;;;;25876:42:0;;;;;;;;;;;25756:170;;:::o;19303:424::-;19374:9;19406;19433:287;19444:1;19440;:5;19433:287;;;19516:14;19533:20;19540:9;;19550:1;19540:12;;;;;;;:::i;:::-;;;;;;;19533:6;:20::i;:::-;19516:37;-1:-1:-1;19631:10:0;-1:-1:-1;;;;;19631:20:0;;;19623:55;;;;-1:-1:-1;;;19623:55:0;;22020:2:1;19623:55:0;;;22002:21:1;22059:2;22039:18;;;22032:30;-1:-1:-1;;;22078:18:1;;;22071:52;22140:18;;19623:55:0;21818:346:1;19623:55:0;19704:3;;;;;19447:273;19433:287;;30884:229;31001:7;30985:13;:11;:13::i;:::-;:23;;;;:::i;:::-;30521:4;30971:38;;30963:99;;;;-1:-1:-1;;;30963:99:0;;22371:2:1;30963:99:0;;;22353:21:1;22410:2;22390:18;;;22383:30;22449:34;22429:18;;;22422:62;-1:-1:-1;;;22500:18:1;;;22493:33;22543:19;;30963:99:0;22169:399:1;30963:99:0;31073:32;31087:8;31097:7;31073:13;:32::i;25129:506::-;25230:4;25247:14;25264:17;25272:8;25264:7;:17::i;:::-;25247:34;;25396:8;-1:-1:-1;;;;;25386:18:0;:6;-1:-1:-1;;;;;25386:18:0;;:121;;;-1:-1:-1;25474:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;25474:33:0;;;:21;;:33;25386:121;:240;;;-1:-1:-1;;;;;;25592:24:0;;;;;;;:16;:24;;;;;;;;:34;;;;;;;;;;;;25386:240;25292:335;25129:506;-1:-1:-1;;;;25129:506:0:o;38638:609::-;38814:26;38843:30;:28;:30::i;:::-;-1:-1:-1;;;;;38913:19:0;;38884:26;38913:19;;;:12;:19;;;;;:38;38814:59;;-1:-1:-1;;;;38913:38:0;;;;39044:42;38600:3;38913:38;39044:42;:::i;:::-;39021:65;;:19;:65;;;;39013:120;;;;-1:-1:-1;;;39013:120:0;;22947:2:1;39013:120:0;;;22929:21:1;22986:2;22966:18;;;22959:30;23025:26;23005:18;;;22998:54;23069:18;;39013:120:0;22745:348:1;39013:120:0;39200:39;39218:5;39225:3;39230:8;39200:17;:39::i;31593:326::-;31722:8;:15;31701:10;:17;:36;31693:72;;;;-1:-1:-1;;;31693:72:0;;23300:2:1;31693:72:0;;;23282:21:1;23339:2;23319:18;;;23312:30;23378:25;23358:18;;;23351:53;23421:18;;31693:72:0;23098:347:1;31693:72:0;31781:9;31776:136;31800:10;:17;31796:1;:21;31776:136;;;31835:33;31841:10;31852:1;31841:13;;;;;;;;:::i;:::-;;;;;;;31856:8;31865:1;31856:11;;;;;;;;:::i;:::-;;;;;;;31835:5;:33::i;:::-;31895:3;;31776:136;;35132:1054;35274:16;;35320:23;;-1:-1:-1;;;35320:23:0;;-1:-1:-1;;;;;2275:32:1;;35320:23:0;;;2257:51:1;35256:15:0;;34911:42;;35320:16;;2230:18:1;;35320:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35301:42;;35373:8;35362:7;:19;35354:54;;;;-1:-1:-1;;;35354:54:0;;23841:2:1;35354:54:0;;;23823:21:1;23880:2;23860:18;;;23853:30;-1:-1:-1;;;23899:18:1;;;23892:52;23961:18;;35354:54:0;23639:346:1;35354:54:0;35474:9;35469:710;35489:7;35485:1;:11;35469:710;;;35558:15;35576:9;35586:1;35576:12;;;;;;;;:::i;:::-;;;;;;;35558:30;;35702:5;-1:-1:-1;;;;;35675:32:0;34911:42;-1:-1:-1;;;;;35675:14:0;;35690:7;35675:23;;;;;;;;;;;;;4137:25:1;;4125:2;4110:18;;3991:177;35675:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35675:32:0;;35667:63;;;;-1:-1:-1;;;35667:63:0;;24448:2:1;35667:63:0;;;24430:21:1;24487:2;24467:18;;;24460:30;-1:-1:-1;;;24506:18:1;;;24499:48;24564:18;;35667:63:0;24246:342:1;35667:63:0;35057:42;35910:16;35918:7;35910;:16::i;:::-;-1:-1:-1;;;;;35910:32:0;;35902:57;;;;-1:-1:-1;;;35902:57:0;;24795:2:1;35902:57:0;;;24777:21:1;24834:2;24814:18;;;24807:30;-1:-1:-1;;;24853:18:1;;;24846:42;24905:18;;35902:57:0;24593:336:1;35902:57:0;36051:39;35057:42;36075:5;36082:7;36051:9;:39::i;:::-;-1:-1:-1;36162:3:0;;35469:710;;37212:906;37308:9;37303:808;37323:9;:16;37319:1;:20;37303:808;;;37401:15;37419:9;37429:1;37419:12;;;;;;;;:::i;:::-;;;;;;;37401:30;;37532:5;-1:-1:-1;;;;;37512:25:0;:16;37520:7;37512;:16::i;:::-;-1:-1:-1;;;;;37512:25:0;;37504:47;;;;-1:-1:-1;;;37504:47:0;;25136:2:1;37504:47:0;;;25118:21:1;25175:1;25155:18;;;25148:29;-1:-1:-1;;;25193:18:1;;;25186:39;25242:18;;37504:47:0;24934:332:1;37504:47:0;37656:23;;-1:-1:-1;;;37656:23:0;;;;;4137:25:1;;;37691:1:0;;34911:42;;37656:14;;4110:18:1;;37656:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;37656:37:0;;37648:63;;;;-1:-1:-1;;;37648:63:0;;25473:2:1;37648:63:0;;;25455:21:1;25512:2;25492:18;;;25485:30;-1:-1:-1;;;25531:18:1;;;25524:43;25584:18;;37648:63:0;25271:337:1;37648:63:0;37809:39;;-1:-1:-1;;;37809:39:0;;-1:-1:-1;;;;;25805:32:1;;37809:39:0;;;25787:51:1;25854:18;;;25847:34;;;34911:42:0;;37809:23;;25760:18:1;;37809:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38035:30;:28;:30::i;:::-;-1:-1:-1;;;;;37994:19:0;;;;;;:12;:19;;;;;:71;;;;;;;-1:-1:-1;;;37994:71:0;-1:-1:-1;;37994:71:0;;;;;;;;;-1:-1:-1;;38094:3:0;37303:808;;26389:228;-1:-1:-1;;;;;26502:24:0;;;;;;;:16;:24;;;;;;;;:35;;;;;;;;;;;;;:47;;-1:-1:-1;;26502:47:0;;;;;;;;;;26565:44;;540:41:1;;;26565:44:0;;513:18:1;26565:44:0;;;;;;;26389:228;;;:::o;32553:458::-;32611:13;32641:6;32651:1;32641:11;32637:32;;-1:-1:-1;;32656:10:0;;;;;;;;;;;;-1:-1:-1;;;32656:10:0;;;;;32553:458::o;32637:32::-;32698:6;32679:16;32732:52;32739:13;;32732:52;;32756:9;;;;:::i;:::-;;-1:-1:-1;32767:14:0;;-1:-1:-1;32779:2:0;32767:14;;:::i;:::-;;;32732:52;;;32794:20;32827:7;-1:-1:-1;;;;;32817:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32817:18:0;;32794:41;;32846:124;32853:11;;32846:124;;32868:9;;;;:::i;:::-;;-1:-1:-1;32938:11:0;;-1:-1:-1;32947:2:0;32938:6;:11;:::i;:::-;32925:26;;:2;:26;:::i;:::-;32898:55;;32879:7;32887;32879:16;;;;;;;;:::i;:::-;;;;:74;-1:-1:-1;;;;;32879:74:0;;;;;;;;-1:-1:-1;32955:12:0;32965:2;32955:12;;:::i;:::-;;;32846:124;;19961:430;20034:9;20066;20093:291;20104:1;20100;:5;20093:291;;;20178:14;20195:22;20204:9;;20214:1;20204:12;;;;;;;:::i;:::-;;;;;;;20195:8;:22::i;:::-;20178:39;-1:-1:-1;20295:10:0;-1:-1:-1;;;;;20295:20:0;;;20287:55;;;;-1:-1:-1;;;20287:55:0;;22020:2:1;20287:55:0;;;22002:21:1;22059:2;22039:18;;;22032:30;-1:-1:-1;;;22078:18:1;;;22071:52;22140:18;;20287:55:0;21818:346:1;20287:55:0;20368:3;;;;;20107:277;20093:291;;11636:215;11696:7;11798:45;11817:8;11827:15;11798:18;:45::i;16932:306::-;17029:7;17047:140;17070:12;17054:13;:28;17047:140;;;17099:29;17116:12;17099:29;;:::i;:::-;;;17143:32;17157:3;17162:12;17143:13;:32::i;:::-;17047:140;;;17197:33;17211:3;17216:13;17197;:33::i;17699:792::-;17859:17;17867:8;17859:7;:17::i;:::-;-1:-1:-1;;;;;17850:26:0;:5;-1:-1:-1;;;;;17850:26:0;;17842:68;;;;-1:-1:-1;;;17842:68:0;;26352:2:1;17842:68:0;;;26334:21:1;26391:2;26371:18;;;26364:30;26430:31;26410:18;;;26403:59;26479:18;;17842:68:0;26150:353:1;17842:68:0;-1:-1:-1;;;;;17964:17:0;;17956:55;;;;-1:-1:-1;;;17956:55:0;;26710:2:1;17956:55:0;;;26692:21:1;26749:2;26729:18;;;26722:30;26788:27;26768:18;;;26761:55;26833:18;;17956:55:0;26508:349:1;17956:55:0;18064:21;;;;:11;:21;;;;;;;;18057:28;;-1:-1:-1;;;;;;18057:28:0;;;;;;18132:10;:20;;;;;;:32;;;;;-1:-1:-1;;;;;18132:32:0;;;;;18211:30;:28;:30::i;:::-;18175:20;;;;:10;:20;;;;;;;;:66;;;;;;-1:-1:-1;;;18175:66:0;-1:-1:-1;;;;18175:66:0;;;;;;-1:-1:-1;;;;;18316:19:0;;;;;;:12;:19;;;;;;:29;;-1:-1:-1;;18316:29:0;;;;;;-1:-1:-1;;18316:29:0;;;;;;;18360:17;;;;;;;;;:27;;;;;-1:-1:-1;18360:27:0;;;;;;;;;;;;;;18453:30;18186:8;;18360:17;-1:-1:-1;;;;;;;;;;;18453:30:0;;17699:792;;;:::o;12239:188::-;12300:7;12388:31;12407:8;12417:1;9019:2231;9116:7;9208:31;9242:25;9258:8;9242:15;:25::i;:::-;9295:18;;9349:27;;;;9208:59;;-1:-1:-1;9295:18:0;9444:42;9463:8;9208:59;9444:18;:42::i;:::-;9544:21;;;;:11;:21;;;;;9537:28;;-1:-1:-1;;;;;;9537:28:0;;;9635:14;;9631:1375;;9737:20;;;;9729:94;;;;-1:-1:-1;;;9729:94:0;;27064:2:1;9729:94:0;;;27046:21:1;27103:2;27083:18;;;27076:30;27142:34;27122:18;;;27115:62;-1:-1:-1;;;27193:18:1;;;27186:42;27245:19;;9729:94:0;26862:408:1;9729:94:0;-1:-1:-1;;;;;9951:20:0;;;;;;:12;:20;;;;;;:30;;-1:-1:-1;;9951:30:0;;;;;;;-1:-1:-1;;9951:30:0;;;;;;;2419:4;10000:30;;;;;;:40;;;;;-1:-1:-1;10000:40:0;;;;;;;;;;;;;;;10128:44;;10163:8;;2419:4;;-1:-1:-1;;;;;;;;;;;10128:44:0;;9631:1375;;;10330:15;:20;;10349:1;10330:20;10322:96;;;;-1:-1:-1;;;10322:96:0;;27477:2:1;10322:96:0;;;27459:21:1;27516:2;27496:18;;;27489:30;27555:34;27535:18;;;27528:62;-1:-1:-1;;;27606:18:1;;;27599:44;27660:19;;10322:96:0;27275:410:1;10322:96:0;-1:-1:-1;;;;;10546:20:0;;;;;;:12;:20;;;;;;;:30;;;;;;;;;-1:-1:-1;;10546:30:0;;;;;;:12;10608:16;2419:4;;2337:95;10608:16;-1:-1:-1;;;;;10595:30:0;;;;;;;;;;;;-1:-1:-1;10595:30:0;;;:40;;-1:-1:-1;;10595:40:0;;;;;;-1:-1:-1;;10595:40:0;;;;;;;10798:15;10765:30;:28;:30::i;:::-;:48;;;;:::i;:::-;10828:20;;;;:10;:20;;;;;:51;;10744:69;;-1:-1:-1;10744:69:0;;10828:36;;:51;;10744:69;;-1:-1:-1;;;10828:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;10985:8;10977:6;-1:-1:-1;;;;;10950:44:0;10959:16;2419:4;;2337:95;10959:16;-1:-1:-1;;;;;10950:44:0;-1:-1:-1;;;;;;;;;;;10950:44:0;;;;;;;;;10257:749;9631:1375;11105:30;11124:10;11105:18;:30::i;:::-;11067:20;;;;:10;:20;;;;;:68;;;;;;;-1:-1:-1;;;11067:68:0;-1:-1:-1;;;;11067:68:0;;;;;;;;;-1:-1:-1;11236:6:0;-1:-1:-1;;9019:2231:0;;;;:::o;15694:1059::-;-1:-1:-1;;;;;15814:17:0;;15806:59;;;;-1:-1:-1;;;15806:59:0;;27892:2:1;15806:59:0;;;27874:21:1;27931:2;27911:18;;;27904:30;27970:31;27950:18;;;27943:59;28019:18;;15806:59:0;27690:353:1;15806:59:0;15960:12;15949:7;:23;;15941:90;;;;-1:-1:-1;;;15941:90:0;;28250:2:1;15941:90:0;;;28232:21:1;28289:2;28269:18;;;28262:30;28328:34;28308:18;;;28301:62;-1:-1:-1;;;28379:18:1;;;28372:38;28427:19;;15941:90:0;28048:404:1;15941:90:0;16101:10;;16082:16;16139:18;16150:7;16101:10;16139:18;:::i;:::-;16231:19;;;;:9;:19;;;;;:31;;-1:-1:-1;;;;;;16231:31:0;-1:-1:-1;;;;;16231:31:0;;;;;16122:35;-1:-1:-1;16308:30:0;:28;:30::i;:::-;16273:19;;;;:9;:19;;;;;;;;:65;;-1:-1:-1;;;;16273:65:0;-1:-1:-1;;;16273:65:0;;;;;;;;-1:-1:-1;;;;;16465:17:0;;;;:12;:17;;;;;:44;;-1:-1:-1;;16524:49:0;;16465:44;;;;;;;16524:49;;;;-1:-1:-1;;16465:44:0;;;;;;16524:49;;;;;;;;;;;;;;;;;16590:77;16600:35;;16626:8;;-1:-1:-1;;;;;16600:35:0;;;16617:1;;-1:-1:-1;;;;;;;;;;;16600:35:0;16617:1;;16600:35;16659:6;16646:10;;;;;;:19;16590:77;;16726:10;:19;-1:-1:-1;;;15694:1059:0:o;8186:300::-;8413:1;8375:20;;;:10;:20;;;;;:26;-1:-1:-1;;;;;8375:26:0;8371:108;;8432:20;;;;:10;:20;;;;;;;;;:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8432:35:0;-1:-1:-1;;;;;8432:35:0;;;-1:-1:-1;;;8432:35:0;;;;;-1:-1:-1;;;;;8432:35:0;;;;-1:-1:-1;;;8432:35:0;-1:-1:-1;;;;;;8432:35:0;;;-1:-1:-1;;;;;8432:35:0;;;;;;;;;;;;;;;;;;;8186: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:348::-;644:8;654:6;708:3;701:4;693:6;689:17;685:27;675:55;;726:1;723;716:12;675:55;-1:-1:-1;749:20:1;;-1:-1:-1;;;;;781:30:1;;778:50;;;824:1;821;814:12;778:50;861:4;853:6;849:17;837:29;;913:3;906:4;897:6;889;885:19;881:30;878:39;875:59;;;930:1;927;920:12;875:59;592:348;;;;;:::o;945:411::-;1016:6;1024;1077:2;1065:9;1056:7;1052:23;1048:32;1045:52;;;1093:1;1090;1083:12;1045:52;1133:9;1120:23;-1:-1:-1;;;;;1158:6:1;1155:30;1152:50;;;1198:1;1195;1188:12;1152:50;1237:59;1288:7;1279:6;1268:9;1264:22;1237:59;:::i;:::-;1315:8;;1211:85;;-1:-1:-1;945:411:1;-1:-1:-1;;;;945:411:1:o;1361:289::-;1403:3;1441:5;1435:12;1468:6;1463:3;1456:19;1524:6;1517:4;1510:5;1506:16;1499:4;1494:3;1490:14;1484:47;1576:1;1569:4;1560:6;1555:3;1551:16;1547:27;1540:38;1639:4;1632:2;1628:7;1623:2;1615:6;1611:15;1607:29;1602:3;1598:39;1594:50;1587:57;;;1361:289;;;;:::o;1655:220::-;1804:2;1793:9;1786:21;1767:4;1824:45;1865:2;1854:9;1850:18;1842:6;1824:45;:::i;1880:226::-;1939:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:52;;;2008:1;2005;1998:12;1960:52;-1:-1:-1;2053:23:1;;1880:226;-1:-1:-1;1880:226:1:o;2319:131::-;-1:-1:-1;;;;;2394:31:1;;2384:42;;2374:70;;2440:1;2437;2430:12;2455:367;2523:6;2531;2584:2;2572:9;2563:7;2559:23;2555:32;2552:52;;;2600:1;2597;2590:12;2552:52;2639:9;2626:23;2658:31;2683:5;2658:31;:::i;:::-;2708:5;2786:2;2771:18;;;;2758:32;;-1:-1:-1;;;2455:367:1:o;2827:::-;2890:8;2900:6;2954:3;2947:4;2939:6;2935:17;2931:27;2921:55;;2972:1;2969;2962:12;2921:55;-1:-1:-1;2995:20:1;;-1:-1:-1;;;;;3027:30:1;;3024:50;;;3070:1;3067;3060:12;3024:50;3107:4;3099:6;3095:17;3083:29;;3167:3;3160:4;3150:6;3147:1;3143:14;3135:6;3131:27;3127:38;3124:47;3121:67;;;3184:1;3181;3174:12;3199:437;3285:6;3293;3346:2;3334:9;3325:7;3321:23;3317:32;3314:52;;;3362:1;3359;3352:12;3314:52;3402:9;3389:23;-1:-1:-1;;;;;3427:6:1;3424:30;3421:50;;;3467:1;3464;3457:12;3421:50;3506:70;3568:7;3559:6;3548:9;3544:22;3506:70;:::i;3641:160::-;3706:20;;3762:13;;3755:21;3745:32;;3735:60;;3791:1;3788;3781:12;3806:180;3862:6;3915:2;3903:9;3894:7;3890:23;3886:32;3883:52;;;3931:1;3928;3921:12;3883:52;3954:26;3970:9;3954:26;:::i;4173:508::-;4250:6;4258;4266;4319:2;4307:9;4298:7;4294:23;4290:32;4287:52;;;4335:1;4332;4325:12;4287:52;4374:9;4361:23;4393:31;4418:5;4393:31;:::i;:::-;4443:5;-1:-1:-1;4500:2:1;4485:18;;4472:32;4513:33;4472:32;4513:33;:::i;:::-;4173:508;;4565:7;;-1:-1:-1;;;4645:2:1;4630:18;;;;4617:32;;4173:508::o;5153:572::-;5248:6;5256;5264;5317:2;5305:9;5296:7;5292:23;5288:32;5285:52;;;5333:1;5330;5323:12;5285:52;5372:9;5359:23;5391:31;5416:5;5391:31;:::i;:::-;5441:5;-1:-1:-1;5497:2:1;5482:18;;5469:32;-1:-1:-1;;;;;5513:30:1;;5510:50;;;5556:1;5553;5546:12;5510:50;5595:70;5657:7;5648:6;5637:9;5633:22;5595:70;:::i;:::-;5153:572;;5684:8;;-1:-1:-1;5569:96:1;;-1:-1:-1;;;;5153:572:1:o;5952:247::-;6011:6;6064:2;6052:9;6043:7;6039:23;6035:32;6032:52;;;6080:1;6077;6070:12;6032:52;6119:9;6106:23;6138:31;6163:5;6138:31;:::i;6204:276::-;6262:6;6315:2;6303:9;6294:7;6290:23;6286:32;6283:52;;;6331:1;6328;6321:12;6283:52;6370:9;6357:23;6420:10;6413:5;6409:22;6402:5;6399:33;6389:61;;6446:1;6443;6436:12;6485:611;6675:2;6687:21;;;6757:13;;6660:18;;;6779:22;;;6627:4;;6858:15;;;6832:2;6817:18;;;6627:4;6901:169;6915:6;6912:1;6909:13;6901:169;;;6976:13;;6964:26;;7019:2;7045:15;;;;7010:12;;;;6937:1;6930:9;6901:169;;;-1:-1:-1;7087:3:1;;6485:611;-1:-1:-1;;;;;6485:611:1:o;7101:768::-;7223:6;7231;7239;7247;7300:2;7288:9;7279:7;7275:23;7271:32;7268:52;;;7316:1;7313;7306:12;7268:52;7356:9;7343:23;-1:-1:-1;;;;;7381:6:1;7378:30;7375:50;;;7421:1;7418;7411:12;7375:50;7460:70;7522:7;7513:6;7502:9;7498:22;7460:70;:::i;:::-;7549:8;;-1:-1:-1;7434:96:1;-1:-1:-1;;7637:2:1;7622:18;;7609:32;-1:-1:-1;;;;;7653:32:1;;7650:52;;;7698:1;7695;7688:12;7650:52;7737:72;7801:7;7790:8;7779:9;7775:24;7737:72;:::i;:::-;7101:768;;;;-1:-1:-1;7828:8:1;-1:-1:-1;;;;7101:768:1:o;8622:716::-;8714:6;8722;8730;8738;8791:2;8779:9;8770:7;8766:23;8762:32;8759:52;;;8807:1;8804;8797:12;8759:52;8847:9;8834:23;-1:-1:-1;;;;;8872:6:1;8869:30;8866:50;;;8912:1;8909;8902:12;8866:50;8951:59;9002:7;8993:6;8982:9;8978:22;8951:59;:::i;:::-;9029:8;;-1:-1:-1;8925:85:1;-1:-1:-1;;9117:2:1;9102:18;;9089:32;-1:-1:-1;;;;;9133:32:1;;9130:52;;;9178:1;9175;9168:12;9130:52;9217:61;9270:7;9259:8;9248:9;9244:24;9217:61;:::i;9343:315::-;9408:6;9416;9469:2;9457:9;9448:7;9444:23;9440:32;9437:52;;;9485:1;9482;9475:12;9437:52;9524:9;9511:23;9543:31;9568:5;9543:31;:::i;:::-;9593:5;-1:-1:-1;9617:35:1;9648:2;9633:18;;9617:35;:::i;:::-;9607:45;;9343:315;;;;;:::o;9663:127::-;9724:10;9719:3;9715:20;9712:1;9705:31;9755:4;9752:1;9745:15;9779:4;9776:1;9769:15;9795:1341;9890:6;9898;9906;9914;9967:3;9955:9;9946:7;9942:23;9938:33;9935:53;;;9984:1;9981;9974:12;9935:53;10023:9;10010:23;10042:31;10067:5;10042:31;:::i;:::-;10092:5;-1:-1:-1;10149:2:1;10134:18;;10121:32;10162:33;10121:32;10162:33;:::i;:::-;10214:7;-1:-1:-1;10294:2:1;10279:18;;10266:32;;-1:-1:-1;10375:2:1;10360:18;;10347:32;-1:-1:-1;;;;;10391:30:1;;10388:50;;;10434:1;10431;10424:12;10388:50;10457:22;;10510:4;10502:13;;10498:27;-1:-1:-1;10488:55:1;;10539:1;10536;10529:12;10488:55;10579:2;10566:16;-1:-1:-1;;;;;10597:6:1;10594:30;10591:56;;;10627:18;;:::i;:::-;10676:2;10670:9;10768:2;10730:17;;-1:-1:-1;;10726:31:1;;;10759:2;10722:40;10718:54;10706:67;;-1:-1:-1;;;;;10788:34:1;;10824:22;;;10785:62;10782:88;;;10850:18;;:::i;:::-;10886:2;10879:22;10910;;;10951:15;;;10968:2;10947:24;10944:37;-1:-1:-1;10941:57:1;;;10994:1;10991;10984:12;10941:57;11050:6;11045:2;11041;11037:11;11032:2;11024:6;11020:15;11007:50;11103:1;11098:2;11089:6;11081;11077:19;11073:28;11066:39;11124:6;11114:16;;;;;9795:1341;;;;;;;:::o;11653:388::-;11721:6;11729;11782:2;11770:9;11761:7;11757:23;11753:32;11750:52;;;11798:1;11795;11788:12;11750:52;11837:9;11824:23;11856:31;11881:5;11856:31;:::i;:::-;11906:5;-1:-1:-1;11963:2:1;11948:18;;11935:32;11976:33;11935:32;11976:33;:::i;:::-;12028:7;12018:17;;;11653:388;;;;;:::o;12046:334::-;12248:2;12230:21;;;12287:2;12267:18;;;12260:30;-1:-1:-1;;;12321:2:1;12306:18;;12299:40;12371:2;12356:18;;12046:334::o;12385:380::-;12464:1;12460:12;;;;12507;;;12528:61;;12582:4;12574:6;12570:17;12560:27;;12528:61;12635:2;12627:6;12624:14;12604:18;12601:38;12598:161;;12681:10;12676:3;12672:20;12669:1;12662:31;12716:4;12713:1;12706:15;12744:4;12741:1;12734:15;12598:161;;12385:380;;;:::o;12896:518::-;12998:2;12993:3;12990:11;12987:421;;;13034:5;13031:1;13024:16;13078:4;13075:1;13065:18;13148:2;13136:10;13132:19;13129:1;13125:27;13119:4;13115:38;13184:4;13172:10;13169:20;13166:47;;;-1:-1:-1;13207:4:1;13166:47;13262:2;13257:3;13253:12;13250:1;13246:20;13240:4;13236:31;13226:41;;13317:81;13335:2;13328:5;13325:13;13317:81;;;13394:1;13380:16;;13361:1;13350:13;13317:81;;13590:1198;-1:-1:-1;;;;;13709:3:1;13706:27;13703:53;;;13736:18;;:::i;:::-;13765:94;13855:3;13815:38;13847:4;13841:11;13815:38;:::i;:::-;13809:4;13765:94;:::i;:::-;13885:1;13910:2;13905:3;13902:11;13927:1;13922:608;;;;14574:1;14591:3;14588:93;;;-1:-1:-1;14647:19:1;;;14634:33;14588:93;-1:-1:-1;;13547:1:1;13543:11;;;13539:24;13535:29;13525:40;13571:1;13567:11;;;13522:57;14694:78;;13895:887;;13922:608;12843:1;12836:14;;;12880:4;12867:18;;-1:-1:-1;;13958:17:1;;;14073:229;14087:7;14084:1;14081:14;14073:229;;;14176:19;;;14163:33;14148:49;;14283:4;14268:20;;;;14236:1;14224:14;;;;14103:12;14073:229;;;14077:3;14330;14321:7;14318:16;14315:159;;;14454:1;14450:6;14444:3;14438;14435:1;14431:11;14427:21;14423:34;14419:39;14406:9;14401:3;14397:19;14384:33;14380:79;14372:6;14365:95;14315:159;;;14517:1;14511:3;14508:1;14504:11;14500:19;14494:4;14487:33;13895:887;;13590:1198;;;:::o;15560:335::-;15762:2;15744:21;;;15801:2;15781:18;;;15774:30;-1:-1:-1;;;15835:2:1;15820:18;;15813:41;15886:2;15871:18;;15560:335::o;15900:127::-;15961:10;15956:3;15952:20;15949:1;15942:31;15992:4;15989:1;15982:15;16016:4;16013:1;16006:15;16032:128;16099:9;;;16120:11;;;16117:37;;;16134:18;;:::i;16568:127::-;16629:10;16624:3;16620:20;16617:1;16610:31;16660:4;16657:1;16650:15;16684:4;16681:1;16674:15;16700:135;16739:3;16760:17;;;16757:43;;16780:18;;:::i;:::-;-1:-1:-1;16827:1:1;16816:13;;16700:135::o;16840:168::-;16913:9;;;16944;;16961:15;;;16955:22;;16941:37;16931:71;;16982:18;;:::i;17013:125::-;17078:9;;;17099:10;;;17096:36;;;17112:18;;:::i;17143:127::-;17204:10;17199:3;17195:20;17192:1;17185:31;17235:4;17232:1;17225:15;17259:4;17256:1;17249:15;17275:120;17315:1;17341;17331:35;;17346:18;;:::i;:::-;-1:-1:-1;17380:9:1;;17275:120::o;17400:485::-;-1:-1:-1;;;;;17631:32:1;;;17613:51;;17700:32;;17695:2;17680:18;;17673:60;17764:2;17749:18;;17742:34;;;17812:3;17807:2;17792:18;;17785:31;;;-1:-1:-1;;17833:46:1;;17859:19;;17851:6;17833:46;:::i;:::-;17825:54;17400:485;-1:-1:-1;;;;;;17400:485:1:o;17890:211::-;17931:3;17969:5;17963:12;18013:6;18006:4;17999:5;17995:16;17990:3;17984:36;18075:1;18039:16;;18064:13;;;-1:-1:-1;18039:16:1;;17890:211;-1:-1:-1;17890:211:1:o;18106:189::-;18235:3;18260:29;18285:3;18277:6;18260:29;:::i;18300:249::-;18369:6;18422:2;18410:9;18401:7;18397:23;18393:32;18390:52;;;18438:1;18435;18428:12;18390:52;18470:9;18464:16;18489:30;18513:5;18489:30;:::i;19329:677::-;19379:3;19420:5;19414:12;19449:36;19475:9;19449:36;:::i;:::-;19516:1;19501:17;;19527:133;;;;19674:1;19669:331;;;;19494:506;;19527:133;-1:-1:-1;;19560:24:1;;19548:37;;19633:14;;19626:22;19614:35;;19605:45;;;-1:-1:-1;19527:133:1;;19669:331;19700:5;19697:1;19690:16;19747:4;19744:1;19734:18;19774:1;19788:166;19802:6;19799:1;19796:13;19788:166;;;19882:14;;19869:11;;;19862:35;19938:1;19925:15;;;;19824:4;19817:12;19788:166;;;19792:3;;19983:6;19978:3;19974:16;19967:23;;19494:506;;;;19329:677;;;;:::o;20011:351::-;20232:3;20257:99;20291:64;20316:38;20350:3;20342:6;20316:38;:::i;:::-;20308:6;20291:64;:::i;:::-;20283:6;20257:99;:::i;20367:170::-;20464:10;20457:18;;;20437;;;20433:43;;20488:20;;20485:46;;;20511:18;;:::i;22573:167::-;22668:10;22641:18;;;22661;;;22637:43;;22692:19;;22689:45;;;22714:18;;:::i;23450:184::-;23520:6;23573:2;23561:9;23552:7;23548:23;23544:32;23541:52;;;23589:1;23586;23579:12;23541:52;-1:-1:-1;23612:16:1;;23450:184;-1:-1:-1;23450:184:1:o;23990:251::-;24060:6;24113:2;24101:9;24092:7;24088:23;24084:32;24081:52;;;24129:1;24126;24119:12;24081:52;24161:9;24155:16;24180:31;24205:5;24180:31;:::i;25892:136::-;25931:3;25959:5;25949:39;;25968:18;;:::i;:::-;-1:-1:-1;;;26004:18:1;;25892:136::o;26033:112::-;26065:1;26091;26081:35;;26096:18;;:::i;:::-;-1:-1:-1;26130:9:1;;26033:112::o

Swarm Source

ipfs://2c3b544381d0b73764f0829dfb41e63ba9234de900cbb9d16cd167765706aba0

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.