ETH Price: $2,425.77 (-1.66%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim147496462022-05-10 16:39:51909 days ago1652200791IN
0x64bdF0A2...7EeF99072
0 ETH0.0152642465.22819657
Claim146869812022-04-30 17:46:13919 days ago1651340773IN
0x64bdF0A2...7EeF99072
0 ETH0.0112982148.28030638
Claim146795762022-04-29 13:54:35920 days ago1651240475IN
0x64bdF0A2...7EeF99072
0 ETH0.0095107740.64206876
Claim146791222022-04-29 12:12:52920 days ago1651234372IN
0x64bdF0A2...7EeF99072
0 ETH0.0075237932.1511802
Claim146786752022-04-29 10:35:30920 days ago1651228530IN
0x64bdF0A2...7EeF99072
0 ETH0.0079889634.13895903
Claim146786352022-04-29 10:24:33920 days ago1651227873IN
0x64bdF0A2...7EeF99072
0 ETH0.0071768730.6687078
Claim146759332022-04-29 0:05:04920 days ago1651190704IN
0x64bdF0A2...7EeF99072
0 ETH0.0077929833.30151671
Claim146740372022-04-28 17:04:56921 days ago1651165496IN
0x64bdF0A2...7EeF99072
0 ETH0.0173063173.95450823
Claim146737032022-04-28 15:46:23921 days ago1651160783IN
0x64bdF0A2...7EeF99072
0 ETH0.0203967387.16962948
Claim146735232022-04-28 15:04:16921 days ago1651158256IN
0x64bdF0A2...7EeF99072
0 ETH0.0145362662.11735836
Claim146731782022-04-28 13:40:49921 days ago1651153249IN
0x64bdF0A2...7EeF99072
0 ETH0.0098574942.1237273
Claim146721462022-04-28 9:42:55921 days ago1651138975IN
0x64bdF0A2...7EeF99072
0 ETH0.00697129.78896504
Claim146721242022-04-28 9:37:39921 days ago1651138659IN
0x64bdF0A2...7EeF99072
0 ETH0.0080902834.57194796
Claim146721142022-04-28 9:34:27921 days ago1651138467IN
0x64bdF0A2...7EeF99072
0 ETH0.0073975731.61180814
Claim146720412022-04-28 9:16:15921 days ago1651137375IN
0x64bdF0A2...7EeF99072
0 ETH0.0056329824.07123253
Claim146720072022-04-28 9:09:40921 days ago1651136980IN
0x64bdF0A2...7EeF99072
0 ETH0.0067760628.95592204
Claim146709272022-04-28 5:10:07921 days ago1651122607IN
0x64bdF0A2...7EeF99072
0 ETH0.00738931.57519132
Claim146699712022-04-28 1:32:37921 days ago1651109557IN
0x64bdF0A2...7EeF99072
0 ETH0.012785754.6395509
Claim146699712022-04-28 1:32:37921 days ago1651109557IN
0x64bdF0A2...7EeF99072
0 ETH0.0127850554.6395509
Claim146693152022-04-27 23:08:51921 days ago1651100931IN
0x64bdF0A2...7EeF99072
0 ETH0.0105405245.04476807
Claim146692482022-04-27 22:54:06921 days ago1651100046IN
0x64bdF0A2...7EeF99072
0 ETH0.0104099144.48663539
Transfer From146670612022-04-27 14:39:31922 days ago1651070371IN
0x64bdF0A2...7EeF99072
0 ETH0.0036351743.41284017
Set Base Token U...146668432022-04-27 13:52:44922 days ago1651067564IN
0x64bdF0A2...7EeF99072
0 ETH0.0053861855.34570472
Claim146666522022-04-27 13:03:59922 days ago1651064639IN
0x64bdF0A2...7EeF99072
0 ETH0.0097488139.26397131
0x61044c60146660542022-04-27 10:53:03922 days ago1651056783IN
 Create: ApeUloanClaimer
0 ETH0.0704418628.0459857

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ApeUloanClaimer

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-27
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

struct TWalletApeInfo
{
    address     wallet;
    uint256     apeCoinBalance;
    uint256     theoricBoxCount;
    uint256     allowedBoxCount;
    uint256     claimedBoxCount;
}
//================================================================================
interface IERC20
{
    function balanceOf(address owner) external view returns(uint256 amount);
}
//================================================================================
interface IERC165
{
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
//================================================================================
interface IERC721 is IERC165
{
    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);

    function balanceOf(        address owner)                                   external view returns (uint256 balance);
    function ownerOf(          uint256 tokenId)                                 external view returns (address owner);
    function safeTransferFrom( address from,     address to, uint256 tokenId)   external;
    function transferFrom(     address from,     address to, uint256 tokenId)   external;
    function approve(          address to,       uint256 tokenId)               external;
    function getApproved(      uint256 tokenId)                                 external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved)                external;
    function isApprovedForAll( address owner,    address operator)              external view returns (bool);
    function safeTransferFrom( address from,     address to, uint256 tokenId, bytes calldata data) external;
}
//================================================================================
interface IERC721Metadata is IERC721
{
    function name()                     external view returns (string memory);
    function symbol()                   external view returns (string memory);
    function tokenURI(uint256 tokenId)  external view returns (string memory);
}
//================================================================================
interface IERC721Enumerable is IERC721
{
    function totalSupply()                                      external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index)  external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index)                        external view returns (uint256);
}
//================================================================================
interface IERC721Receiver
{
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
//================================================================================
abstract contract ERC165 is IERC165
{
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool)
    {
        return (interfaceId == type(IERC165).interfaceId);
    }
}
//================================================================================
abstract contract Context
{
    function _msgSender() internal view virtual returns (address)
    {
        return msg.sender;
    }
   
   
    function _msgData() internal view virtual returns (bytes calldata)
    {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}
//================================================================================
abstract contract Ownable is Context
{
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

   
    constructor ()
    {
        address msgSender = _msgSender();
                   _owner = msgSender;
                   
        emit OwnershipTransferred(address(0), msgSender);
    }
   
   
    function owner() public view virtual returns (address)
    {
        return _owner;
    }
   
   
    modifier onlyOwner()
    {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
   
   
    function renounceOwnership() public virtual onlyOwner
    {
        emit OwnershipTransferred(_owner, address(0));
       
        _owner = address(0);
    }
   
   
    function transferOwnership(address newOwner) public virtual onlyOwner
    {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
       
        emit OwnershipTransferred(_owner, newOwner);
       
        _owner = newOwner;
    }
}
//================================================================================
abstract contract ReentrancyGuard 
{
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED     = 2;

    uint256 private _status;

    constructor() 
    {       
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant()         // Prevents a contract from calling itself, directly or indirectly.
    {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");    // On the first call to nonReentrant, _notEntered will be true
        _status = _ENTERED;                                                 // Any calls to nonReentrant after this point will fail
        _;
        _status = _NOT_ENTERED;                                             // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200)
    }
}
//================================================================================
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, Ownable, ReentrancyGuard
{
    using Address for address;
    using Strings for uint256;

    string private _name;   // Token name
    string private _symbol; // Token symbol

    mapping(uint256 => address)                  internal _owners;              // Mapping from token ID to owner address
    mapping(address => uint256)                  internal _balances;            // Mapping owner address to token count
    mapping(uint256 => address)                  private  _tokenApprovals;      // Mapping from token ID to approved address
    mapping(address => mapping(address => bool)) private  _operatorApprovals;   // Mapping from owner to operator approvals

   
    constructor(string memory name_, string memory symbol_)
    {
        _name   = name_;
        _symbol = symbol_;
    }
   
   
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool)
    {
        return  interfaceId == type(IERC721).interfaceId         ||
                interfaceId == type(IERC721Metadata).interfaceId ||
                super.supportsInterface(interfaceId);
    }
   
   
    function balanceOf(address owner) public view virtual override returns (uint256)
    {
        require(owner != address(0), "ERC721: balance query for the zero address");
       
        return _balances[owner];
    }
   
   
    function ownerOf(uint256 tokenId) public view virtual override returns (address)
    {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }
   
   
    function name() public view virtual override returns (string memory)
    {
        return _name;
    }
   
   
    function symbol() public view virtual override returns (string memory)
    {
        return _symbol;
    }
   
   
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
       
        return (bytes(baseURI).length>0) ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }
   
   
    function _baseURI() internal view virtual returns (string memory)
    {
        return "";
    }
   
   
    function approve(address to, uint256 tokenId) public virtual override
    {
        address owner = ERC721.ownerOf(tokenId);
   
        require(to!=owner, "ERC721: approval to current owner");
        require(_msgSender()==owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all");

        _approve(to, tokenId);
    }
   
   
    function getApproved(uint256 tokenId) public view virtual override returns (address)
    {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
   
   
    function setApprovalForAll(address operator, bool approved) public virtual override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
   
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
   
   
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }
   
   
    function transferFrom(address from, address to, uint256 tokenId) public virtual override
    {
        //----- solhint-disable-next-line max-line-length
       
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }
   
   
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override
    {
        safeTransferFrom(from, to, tokenId, "");
    }
   
   
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override
    {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
       
        _safeTransfer(from, to, tokenId, _data);
    }
   
   
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual
    {
        _transfer(from, to, tokenId);
   
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
   
   
    function _exists(uint256 tokenId) internal view virtual returns (bool)
    {
        return _owners[tokenId] != address(0);
    }
   
   
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool)
    {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
       
        address owner = ERC721.ownerOf(tokenId);
       
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }
   
   
    function _safeMint(address to, uint256 tokenId) internal virtual
    {
        _safeMint(to, tokenId, "");
    }
   
   
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual
    {
        _mint(to, tokenId);
   
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
   
   
    function _mint(address to, uint256 tokenId) internal virtual
    {
        require(to != address(0),  "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to]   += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }
   
   
    function _batchMint(address to, uint256[] memory tokenIds) internal virtual
    {
        require(to != address(0), "ERC721: mint to the zero address");
       
        _balances[to] += tokenIds.length;

        for (uint256 i=0; i < tokenIds.length; i++)
        {
            require(!_exists(tokenIds[i]), "ERC721: token already minted");

            _beforeTokenTransfer(address(0), to, tokenIds[i]);

            _owners[tokenIds[i]] = to;

            emit Transfer(address(0), to, tokenIds[i]);
        }
    }
   
   
    function _burn(uint256 tokenId) internal virtual
    {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        _approve(address(0), tokenId);      // Clear approvals

        _balances[owner] -= 1;

        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }
   
   
    function _transfer(address from, address to, uint256 tokenId) internal virtual
    {
        require(ERC721.ownerOf(tokenId)==from,  "ERC721: transfer of token that is not own");
        require(to != address(0),               "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        _approve(address(0), tokenId);      // Clear approvals from the previous owner

        _balances[from] -= 1;
        _balances[to]   += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
   
   
    function _approve(address to, uint256 tokenId) internal virtual
    {
        _tokenApprovals[tokenId] = to;
   
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }
   
   
    function _checkOnERC721Received(address from,address to,uint256 tokenId,bytes memory _data) private returns (bool)
    {
        if (to.isContract())
        {
            try
           
                IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
           
            returns (bytes4 retval)
            {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            }
            catch (bytes memory reason)
            {
                if (reason.length==0)
                {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                }
                else
                {
                    assembly { revert(add(32, reason), mload(reason)) }     //// solhint-disable-next-line no-inline-assembly
                }
            }
        }
        else
        {
            return true;
        }
    }
   
   
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual
    {
        //
    }
}
//================================================================================
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable
{
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;           // Mapping from owner to list of owned token IDs
    mapping(uint256 => uint256)                     private _ownedTokensIndex;      // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256)                     private _allTokensIndex;        // Mapping from token id to position in the allTokens array

    uint256[] private _allTokens;                                                   // Array with all token ids, used for enumeration

    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool)
    {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    function totalSupply() public view virtual override returns (uint256)
    {
        return _allTokens.length;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256)
    {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
   
        return _ownedTokens[owner][index];
    }

    function tokenByIndex(uint256 index) public view virtual override returns (uint256)
    {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
   
        return _allTokens[index];
    }

    function _beforeTokenTransfer(address from,address to,uint256 tokenId) internal virtual override
    {
        super._beforeTokenTransfer(from, to, tokenId);

             if (from == address(0))     _addTokenToAllTokensEnumeration(tokenId);
        else if (from != to)             _removeTokenFromOwnerEnumeration(from, tokenId);
       
             if (to == address(0))       _removeTokenFromAllTokensEnumeration(tokenId);
        else if (to != from)             _addTokenToOwnerEnumeration(to, tokenId);
    }

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private
    {
        uint256 length = ERC721.balanceOf(to);
   
        _ownedTokens[to][length]   = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private
    {
        _allTokensIndex[tokenId] = _allTokens.length;
   
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private
    {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}
//================================================================================
library Strings
{
    bytes16 private constant alphabet = "0123456789abcdef";

   
    function toString(uint256 value) internal pure returns (string memory)
    {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value==0)       return "0";
   
        uint256 temp = value;
        uint256 digits;
   
        while (temp!=0)
        {
            digits++;
            temp /= 10;
        }
       
        bytes memory buffer = new bytes(digits);
       
        while (value != 0)
        {
            digits        -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value         /= 10;
        }
       
        return string(buffer);
    }
   
   
    function toHexString(uint256 value) internal pure returns (string memory)
    {
        if (value==0)       return "0x00";
       
        uint256 temp   = value;
        uint256 length = 0;
       
        while (temp != 0)
        {
            length++;
            temp >>= 8;
        }
       
        return toHexString(value, length);
    }
   
   
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
       
        buffer[0] = "0";
        buffer[1] = "x";
       
        for (uint256 i=2*length+1; i>1; --i)
        {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
       
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
//================================================================================
library Address
{
    function isContract(address account) internal view returns (bool)
    {
        uint256 size;
       
        assembly { size := extcodesize(account) }   // solhint-disable-next-line no-inline-assembly
        return size > 0;
    }
   
   
    function sendValue(address payable recipient, uint256 amount) internal
    {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }(""); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value

        require(success, "Address: unable to send value, recipient may have reverted");
    }
   
   
    function functionCall(address target, bytes memory data) internal returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }
   
   
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory)
    {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
   
   
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory)
    {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
   
   
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory)
    {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target),             "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: value }(data);    // solhint-disable-next-line avoid-low-level-calls

        return _verifyCallResult(success, returndata, errorMessage);
    }
   
   
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory)
    {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
   
   
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory)
    {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);  // solhint-disable-next-line avoid-low-level-calls

        return _verifyCallResult(success, returndata, errorMessage);
    }
   
   
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory)
    {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
   
   
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory)
    {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);    // solhint-disable-next-line avoid-low-level-calls
       
        return _verifyCallResult(success, returndata, errorMessage);
    }
   
   
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory)
    {
        if (success)
        {
            return returndata;
        }
        else
        {
            if (returndata.length > 0)      // Look for revert reason and bubble it up if present
            {
                // The easiest way to bubble the revert reason is using memory via assembly
                // solhint-disable-next-line no-inline-assembly
                assembly
                {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            }
            else
            {
                revert(errorMessage);
            }
        }
    }
}
//==============================================================================
contract ApeUloanClaimer     is  ERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    modifier callerIsUser()    {  require(tx.origin == msg.sender, "The caller is another contract");  _;  }

    event   ClaimedNftsWithApeCoin(address wallet, uint256 boxCount);
    event   Reserved(address wallet, uint256 amount);

    uint256 private     totalTokens      = 1100;       // 1000+100 NFT to be created => 1000 Mysteryboxes + draws( email + twitter + discord ) 
    uint256 private     leftTokenCount   = totalTokens;
    uint256 private     mintedTokenCount = 0;

    mapping(address => uint256) private     totalClaimedBoxes;
    mapping(bytes32 => bool)    private     proposedHashes;

    string                      private     signHeader = "\x19Ethereum Signed Message:\n32";

    address                     private     admin = 0x738C30758b22bCe4EE64d4dd2dc9f0dcCd097229;

    string                      private     baseURI = '/';

    address                     private     ownerWallet;

    mapping(address => uint256) private     walletMintCounts;
    mapping(address => uint256) private     walletMintedTokenIds;
    
    mapping(uint256 => uint256) private     mintedTokenTimestamps;

    constructor() ERC721("ULoanMysteryBoxxx", "ULMBOXXX")   // temporary Symbol and title
    {
        ownerWallet = msg.sender;
    }
    //------------------------------------------------------------------------
    function    isERC721ReceivedCheck(address from,address to,uint256 tokenId,bytes memory _data) private returns (bool)
    {
        if (to.isContract())
        {
            try
               
                IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
               
            returns (bytes4 retval)
            {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            }
            catch (bytes memory reason)
            {
                if (reason.length==0)
                {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                }
                else
                {
                    assembly { revert(add(32, reason), mload(reason)) }     //// solhint-disable-next-line no-inline-assembly
                }
            }
        }
        else
        {
            return true;
        }
    }
    //------------------------------------------------------------------------
    function    setBaseTokenURI(string memory newUri) external onlyOwner
    {
        baseURI = newUri;
    }
    //------------------------------------------------------------------------
    function    addAvailableTokens(uint256 extraAmount) external onlyOwner
    {
        totalTokens    += extraAmount;
        leftTokenCount += extraAmount;
    }
    //------------------------------------------------------------------------
    function    subAvailableTokens(uint256 subAmount) external onlyOwner
    {
        require(subAmount < totalTokens,    "Invalid subAmount for totalTokens");
        require(subAmount < leftTokenCount, "Invalid subAmount for leftTokenCount");

        totalTokens    -= subAmount;
        leftTokenCount -= subAmount;
    }
    //------------------------------------------------------------------------
    function    baseTokenURI() external view returns (string memory)
    {
        return baseURI;
    }
    //------------------------------------------------------------------------
    function    getAvailableTokens() external view returns (uint256)
    {
        return leftTokenCount;
    }
    //------------------------------------------------------------------------
    function    _baseURI() internal view virtual override returns (string memory)
    {
        return baseURI;
    }
    //------------------------------------------------------------------------
    function    getTokenIdsByWallet(address walletAddress) external view returns(uint256[] memory)
    {
        require(walletAddress!=address(0), "BlackHole wallet is not a real owner");
       
        uint256          count  = balanceOf(walletAddress);
        uint256[] memory result = new uint256[](count);
       
        for (uint256 i=0; i<count; i++)
        {
            result[i] = tokenOfOwnerByIndex(walletAddress, i);
        }
       
        return result;
    }
    //---------------------------------------------------------------------------
    function    claim(uint boxCount,   bytes32 proposedHash, uint8 v, bytes32 r, bytes32 s)
            external
            callerIsUser
            nonReentrant
    {
                //----- signed function checker

        bool isProposedHashedUsed = proposedHashes[proposedHash];

        require(isProposedHashedUsed==false, "This hash was already used");

        proposedHashes[proposedHash] = true;

        bytes32 messageDigest = keccak256(abi.encodePacked(signHeader, proposedHash));
        address caller        = ecrecover(messageDigest, v, r, s);
        bool    isFromAdmin   = (caller==admin);

        require(isFromAdmin==true, "Unallowed call");

        require(boxCount<=5, "Too many boxes asked");

                //-----

        require(leftTokenCount > 0, "No more MysteryBox available");

        uint256 claimedBoxCount = totalClaimedBoxes[ msg.sender ] ;

        require(claimedBoxCount==0, "Wallet already claimed!");

                //-----

        uint256 nMinted=0;

        for (uint i; i<boxCount; i++)
        {
            walletMintCounts[msg.sender]++;
            mintedTokenCount++;
            leftTokenCount--;
        
            _safeMint(msg.sender, mintedTokenCount);

            nMinted++;

            if (leftTokenCount==0)          break;              // No more Mysteryboxes to share  
        }

        totalClaimedBoxes[msg.sender] = boxCount;               // Already recived boxes, don't allow again

        emit ClaimedNftsWithApeCoin(msg.sender, boxCount);
    }
    //---------------------------------------------------------------------------
    function    getClaimedBoxCount(address wallet) external view returns(uint256 claimedBoxCount)
    {
        return totalClaimedBoxes[ wallet ];
    }
    //---------------------------------------------------------------------------
    function    reserve(uint256 amount)  external onlyOwner
    {
        require(amount         <= 200,    "Reserve is limited to 200 per call at max");
        require(leftTokenCount >= amount, "Not enough tokens left to reserve anymore");

        walletMintCounts[msg.sender] += amount;

        for (uint256 i=0; i < amount; i++)
        {
            mintedTokenCount++;
           
            mintedTokenTimestamps[mintedTokenCount] = block.timestamp;
            
            _safeMint(msg.sender, mintedTokenCount);
        }

        leftTokenCount = totalTokens - mintedTokenCount;

        emit Reserved(msg.sender, amount);
    }
    //---------------------------------------------------------------------------
    function    massSend(address[] memory recipients, uint256[] memory tokenIds) external 
    {
        uint256 l1 = recipients.length;
        uint256 l2 = tokenIds.length;

        require(l1==l2, "recipients count doesn't match tokens");

        for (uint i; i<l1; i++)
        {
            address to = recipients[i];

            if (to==address(0x0))       continue;
            if (to==msg.sender)         continue;

            uint256 tokenId = tokenIds[i];

            transferFrom(msg.sender, to, tokenId);
        }
    }
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
}

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":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"boxCount","type":"uint256"}],"name":"ClaimedNftsWithApeCoin","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":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"extraAmount","type":"uint256"}],"name":"addAvailableTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boxCount","type":"uint256"},{"internalType":"bytes32","name":"proposedHash","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getClaimedBoxCount","outputs":[{"internalType":"uint256","name":"claimedBoxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"getTokenIdsByWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"massSend","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","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":"string","name":"newUri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"subAmount","type":"uint256"}],"name":"subAvailableTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61044c600c819055600d556000600e5560c0604052601c60808190527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a0908152620000509160119190620001a5565b50601280546001600160a01b03191673738c30758b22bce4ee64d4dd2dc9f0dccd097229179055604080518082019091526001808252602f60f81b6020909201918252620000a191601391620001a5565b50348015620000af57600080fd5b50604051806040016040528060118152602001700aa98dec2dc9af2e6e8cae4f284def0f0f607b1b815250604051806040016040528060088152602001670aa989a849eb0b0b60c31b81525060006200010d620001a160201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055815162000170906002906020850190620001a5565b50805162000186906003906020840190620001a5565b5050601480546001600160a01b031916331790555062000287565b3390565b828054620001b3906200024b565b90600052602060002090601f016020900481019282620001d7576000855562000222565b82601f10620001f257805160ff191683800117855562000222565b8280016001018555821562000222579182015b828111156200022257825182559160200191906001019062000205565b506200023092915062000234565b5090565b5b8082111562000230576000815560010162000235565b600181811c908216806200026057607f821691505b6020821081036200028157634e487b7160e01b600052602260045260246000fd5b50919050565b61283280620002976000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063b88d4fde116100a2578063e35568cb11610071578063e35568cb146103df578063e6b36012146103e7578063e985e9c5146103fa578063f2fde38b1461043657600080fd5b8063b88d4fde14610388578063c87b56dd1461039b578063d547cfb7146103ae578063e2ad13a9146103b657600080fd5b80638da5cb5b116100de5780638da5cb5b1461034957806395d89b411461035a578063a22cb46514610362578063b12af2cb1461037557600080fd5b8063715018a61461031b578063819b25ba146103235780638640cffa1461033657600080fd5b80632f745c591161017157806342842e0e1161014b57806342842e0e146102cf5780634f6ccce7146102e25780636352211e146102f557806370a082311461030857600080fd5b80632f745c591461029657806330176e13146102a95780633c1aa170146102bc57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780631660b7321461025157806318160ddd1461027157806323b872dd1461028357600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611ff1565b610449565b60405190151581526020015b60405180910390f35b610204610474565b6040516101f39190612066565b61022461021f366004612079565b610506565b6040516001600160a01b0390911681526020016101f3565b61024f61024a3660046120ae565b6105a0565b005b61026461025f3660046120d8565b6106b5565b6040516101f391906120f3565b600b545b6040519081526020016101f3565b61024f610291366004612137565b6107b9565b6102756102a43660046120ae565b6107ea565b61024f6102b7366004612212565b610880565b61024f6102ca366004612079565b6108c1565b61024f6102dd366004612137565b6109d6565b6102756102f0366004612079565b6109f1565b610224610303366004612079565b610a84565b6102756103163660046120d8565b610afb565b61024f610b82565b61024f610331366004612079565b610bf6565b61024f61034436600461225b565b610daf565b6000546001600160a01b0316610224565b61020461118e565b61024f6103703660046122aa565b61119d565b61024f610383366004612375565b611261565b61024f610396366004612435565b611366565b6102046103a9366004612079565b61139e565b610204611479565b6102756103c43660046120d8565b6001600160a01b03166000908152600f602052604090205490565b600d54610275565b61024f6103f5366004612079565b611488565b6101e76104083660046124b1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024f6104443660046120d8565b6114dd565b60006001600160e01b0319821663780e9d6360e01b148061046e575061046e826115c7565b92915050565b606060028054610483906124e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104af906124e4565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b03166105845760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105ab82610a84565b9050806001600160a01b0316836001600160a01b0316036106185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161057b565b336001600160a01b038216148061063457506106348133610408565b6106a65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161057b565b6106b08383611617565b505050565b60606001600160a01b0382166107195760405162461bcd60e51b8152602060048201526024808201527f426c61636b486f6c652077616c6c6574206973206e6f742061207265616c206f6044820152633bb732b960e11b606482015260840161057b565b600061072483610afb565b905060008167ffffffffffffffff81111561074157610741612173565b60405190808252806020026020018201604052801561076a578160200160208202803683370190505b50905060005b828110156107b15761078285826107ea565b8282815181106107945761079461251e565b6020908102919091010152806107a98161254a565b915050610770565b509392505050565b6107c33382611685565b6107df5760405162461bcd60e51b815260040161057b90612563565b6106b083838361177c565b60006107f583610afb565b82106108575760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161057b565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6000546001600160a01b031633146108aa5760405162461bcd60e51b815260040161057b906125b4565b80516108bd906013906020840190611f3f565b5050565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161057b906125b4565b600c5481106109465760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420737562416d6f756e7420666f7220746f74616c546f6b656e6044820152607360f81b606482015260840161057b565b600d5481106109a35760405162461bcd60e51b8152602060048201526024808201527f496e76616c696420737562416d6f756e7420666f72206c656674546f6b656e436044820152631bdd5b9d60e21b606482015260840161057b565b80600c60008282546109b591906125e9565b9250508190555080600d60008282546109ce91906125e9565b909155505050565b6106b083838360405180602001604052806000815250611366565b60006109fc600b5490565b8210610a5f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161057b565b600b8281548110610a7257610a7261251e565b90600052602060002001549050919050565b6000818152600460205260408120546001600160a01b03168061046e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161057b565b60006001600160a01b038216610b665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161057b565b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610bac5760405162461bcd60e51b815260040161057b906125b4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610c205760405162461bcd60e51b815260040161057b906125b4565b60c8811115610c835760405162461bcd60e51b815260206004820152602960248201527f52657365727665206973206c696d6974656420746f20323030207065722063616044820152680d8d840c2e840dac2f60bb1b606482015260840161057b565b80600d541015610ce75760405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766044820152686520616e796d6f726560b81b606482015260840161057b565b3360009081526015602052604081208054839290610d06908490612600565b90915550600090505b81811015610d5f57600e8054906000610d278361254a565b9091555050600e8054600090815260176020526040902042905554610d4d903390611927565b80610d578161254a565b915050610d0f565b50600e54600c54610d7091906125e9565b600d5560408051338152602081018390527f904dcdc411e931497b95b06ddf8f8184815dd3bedc3c7c7cd4aed3ccd30783d8910160405180910390a150565b323314610dfe5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161057b565b600260015403610e505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161057b565b600260015560008481526010602052604090205460ff168015610eb55760405162461bcd60e51b815260206004820152601a60248201527f5468697320686173682077617320616c72656164792075736564000000000000604482015260640161057b565b6000858152601060209081526040808320805460ff1916600117905551610ee191601191899101612618565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610f4c573d6000803e3d6000fd5b5050604051601f1901516012549092506001600160a01b03808416911614905060018114610fad5760405162461bcd60e51b815260206004820152600e60248201526d155b985b1b1bddd9590818d85b1b60921b604482015260640161057b565b6005891115610ff55760405162461bcd60e51b8152602060048201526014602482015273151bdbc81b585b9e48189bde195cc8185cdad95960621b604482015260640161057b565b6000600d54116110475760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265204d797374657279426f7820617661696c61626c6500000000604482015260640161057b565b336000908152600f602052604090205480156110a55760405162461bcd60e51b815260206004820152601760248201527f57616c6c657420616c726561647920636c61696d656421000000000000000000604482015260640161057b565b6000805b8b811015611131573360009081526015602052604081208054916110cc8361254a565b9091555050600e80549060006110e18361254a565b9091555050600d80549060006110f6836126b6565b919050555061110733600e54611927565b816111118161254a565b925050600d546000031561113157806111298161254a565b9150506110a9565b50336000818152600f60209081526040918290208e9055815192835282018d90527f5950f8f847391657e6cce7c70212227aaa283c49f5ad0f3e6a3b841d3d7c75ac910160405180910390a1505060018055505050505050505050565b606060038054610483906124e4565b336001600160a01b038316036111f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161057b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b815181518082146112c25760405162461bcd60e51b815260206004820152602560248201527f726563697069656e747320636f756e7420646f65736e2774206d6174636820746044820152646f6b656e7360d81b606482015260840161057b565b60005b8281101561135f5760008582815181106112e1576112e161251e565b6020026020010151905060006001600160a01b0316816001600160a01b03160361130b575061134d565b336001600160a01b03821603611321575061134d565b60008583815181106113355761133561251e565b6020026020010151905061134a3383836107b9565b50505b806113578161254a565b9150506112c5565b5050505050565b6113703383611685565b61138c5760405162461bcd60e51b815260040161057b90612563565b61139884848484611941565b50505050565b6000818152600460205260409020546060906001600160a01b031661141d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161057b565b6000611427611479565b905060008151116114475760405180602001604052806000815250611472565b8061145184611974565b6040516020016114629291906126cd565b6040516020818303038152906040525b9392505050565b606060138054610483906124e4565b6000546001600160a01b031633146114b25760405162461bcd60e51b815260040161057b906125b4565b80600c60008282546114c49190612600565b9250508190555080600d60008282546109ce9190612600565b6000546001600160a01b031633146115075760405162461bcd60e51b815260040161057b906125b4565b6001600160a01b03811661156c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806115f857506001600160e01b03198216635b5e139f60e01b145b8061046e57506301ffc9a760e01b6001600160e01b031983161461046e565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061164c82610a84565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166116fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161057b565b600061170983610a84565b9050806001600160a01b0316846001600160a01b031614806117445750836001600160a01b031661173984610506565b6001600160a01b0316145b8061177457506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661178f82610a84565b6001600160a01b0316146117f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161057b565b6001600160a01b0382166118595760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161057b565b611864838383611a75565b61186f600082611617565b6001600160a01b03831660009081526005602052604081208054600192906118989084906125e9565b90915550506001600160a01b03821660009081526005602052604081208054600192906118c6908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6108bd828260405180602001604052806000815250611b2d565b61194c84848461177c565b61195884848484611b60565b6113985760405162461bcd60e51b815260040161057b906126fc565b60608160000361199b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119c557806119af8161254a565b91506119be9050600a83612764565b915061199f565b60008167ffffffffffffffff8111156119e0576119e0612173565b6040519080825280601f01601f191660200182016040528015611a0a576020820181803683370190505b5090505b841561177457611a1f6001836125e9565b9150611a2c600a86612778565b611a37906030612600565b60f81b818381518110611a4c57611a4c61251e565b60200101906001600160f81b031916908160001a905350611a6e600a86612764565b9450611a0e565b6001600160a01b038316611ad057611acb81600b80546000838152600a60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b611af3565b816001600160a01b0316836001600160a01b031614611af357611af38382611c61565b6001600160a01b038216611b0a576106b081611cfe565b826001600160a01b0316826001600160a01b0316146106b0576106b08282611dad565b611b378383611df1565b611b446000848484611b60565b6106b05760405162461bcd60e51b815260040161057b906126fc565b60006001600160a01b0384163b15611c5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ba490339089908890889060040161278c565b6020604051808303816000875af1925050508015611bdf575060408051601f3d908101601f19168201909252611bdc918101906127c9565b60015b611c3c573d808015611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b508051600003611c345760405162461bcd60e51b815260040161057b906126fc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611774565b506001949350505050565b60006001611c6e84610afb565b611c7891906125e9565b600083815260096020526040902054909150808214611ccb576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600b54600090611d10906001906125e9565b6000838152600a6020526040812054600b8054939450909284908110611d3857611d3861251e565b9060005260206000200154905080600b8381548110611d5957611d5961251e565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600b805480611d9157611d916127e6565b6001900381819060005260206000200160009055905550505050565b6000611db883610afb565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160a01b038216611e475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161057b565b6000818152600460205260409020546001600160a01b031615611eac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057b565b611eb860008383611a75565b6001600160a01b0382166000908152600560205260408120805460019290611ee1908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f4b906124e4565b90600052602060002090601f016020900481019282611f6d5760008555611fb3565b82601f10611f8657805160ff1916838001178555611fb3565b82800160010185558215611fb3579182015b82811115611fb3578251825591602001919060010190611f98565b50611fbf929150611fc3565b5090565b5b80821115611fbf5760008155600101611fc4565b6001600160e01b031981168114611fee57600080fd5b50565b60006020828403121561200357600080fd5b813561147281611fd8565b60005b83811015612029578181015183820152602001612011565b838111156113985750506000910152565b6000815180845261205281602086016020860161200e565b601f01601f19169290920160200192915050565b602081526000611472602083018461203a565b60006020828403121561208b57600080fd5b5035919050565b80356001600160a01b03811681146120a957600080fd5b919050565b600080604083850312156120c157600080fd5b6120ca83612092565b946020939093013593505050565b6000602082840312156120ea57600080fd5b61147282612092565b6020808252825182820181905260009190848201906040850190845b8181101561212b5783518352928401929184019160010161210f565b50909695505050505050565b60008060006060848603121561214c57600080fd5b61215584612092565b925061216360208501612092565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121b2576121b2612173565b604052919050565b600067ffffffffffffffff8311156121d4576121d4612173565b6121e7601f8401601f1916602001612189565b90508281528383830111156121fb57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561222457600080fd5b813567ffffffffffffffff81111561223b57600080fd5b8201601f8101841361224c57600080fd5b611774848235602084016121ba565b600080600080600060a0868803121561227357600080fd5b8535945060208601359350604086013560ff8116811461229257600080fd5b94979396509394606081013594506080013592915050565b600080604083850312156122bd57600080fd5b6122c683612092565b9150602083013580151581146122db57600080fd5b809150509250929050565b600067ffffffffffffffff82111561230057612300612173565b5060051b60200190565b600082601f83011261231b57600080fd5b8135602061233061232b836122e6565b612189565b82815260059290921b8401810191818101908684111561234f57600080fd5b8286015b8481101561236a5780358352918301918301612353565b509695505050505050565b6000806040838503121561238857600080fd5b823567ffffffffffffffff808211156123a057600080fd5b818501915085601f8301126123b457600080fd5b813560206123c461232b836122e6565b82815260059290921b840181019181810190898411156123e357600080fd5b948201945b83861015612408576123f986612092565b825294820194908201906123e8565b9650508601359250508082111561241e57600080fd5b5061242b8582860161230a565b9150509250929050565b6000806000806080858703121561244b57600080fd5b61245485612092565b935061246260208601612092565b925060408501359150606085013567ffffffffffffffff81111561248557600080fd5b8501601f8101871361249657600080fd5b6124a5878235602084016121ba565b91505092959194509250565b600080604083850312156124c457600080fd5b6124cd83612092565b91506124db60208401612092565b90509250929050565b600181811c908216806124f857607f821691505b60208210810361251857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161255c5761255c612534565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000828210156125fb576125fb612534565b500390565b6000821982111561261357612613612534565b500190565b600080845481600182811c91508083168061263457607f831692505b6020808410820361265357634e487b7160e01b86526022600452602486fd5b8180156126675760018114612678576126a5565b60ff198616895284890196506126a5565b60008b81526020902060005b8681101561269d5781548b820152908501908301612684565b505084890196505b509785525050509301949350505050565b6000816126c5576126c5612534565b506000190190565b600083516126df81846020880161200e565b8351908301906126f381836020880161200e565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826127735761277361274e565b500490565b6000826127875761278761274e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127bf9083018461203a565b9695505050505050565b6000602082840312156127db57600080fd5b815161147281611fd8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220264d48447c84110bdb343ef4166320e8431bdf864cd6c817014f6697038631ea64736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063b88d4fde116100a2578063e35568cb11610071578063e35568cb146103df578063e6b36012146103e7578063e985e9c5146103fa578063f2fde38b1461043657600080fd5b8063b88d4fde14610388578063c87b56dd1461039b578063d547cfb7146103ae578063e2ad13a9146103b657600080fd5b80638da5cb5b116100de5780638da5cb5b1461034957806395d89b411461035a578063a22cb46514610362578063b12af2cb1461037557600080fd5b8063715018a61461031b578063819b25ba146103235780638640cffa1461033657600080fd5b80632f745c591161017157806342842e0e1161014b57806342842e0e146102cf5780634f6ccce7146102e25780636352211e146102f557806370a082311461030857600080fd5b80632f745c591461029657806330176e13146102a95780633c1aa170146102bc57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780631660b7321461025157806318160ddd1461027157806323b872dd1461028357600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611ff1565b610449565b60405190151581526020015b60405180910390f35b610204610474565b6040516101f39190612066565b61022461021f366004612079565b610506565b6040516001600160a01b0390911681526020016101f3565b61024f61024a3660046120ae565b6105a0565b005b61026461025f3660046120d8565b6106b5565b6040516101f391906120f3565b600b545b6040519081526020016101f3565b61024f610291366004612137565b6107b9565b6102756102a43660046120ae565b6107ea565b61024f6102b7366004612212565b610880565b61024f6102ca366004612079565b6108c1565b61024f6102dd366004612137565b6109d6565b6102756102f0366004612079565b6109f1565b610224610303366004612079565b610a84565b6102756103163660046120d8565b610afb565b61024f610b82565b61024f610331366004612079565b610bf6565b61024f61034436600461225b565b610daf565b6000546001600160a01b0316610224565b61020461118e565b61024f6103703660046122aa565b61119d565b61024f610383366004612375565b611261565b61024f610396366004612435565b611366565b6102046103a9366004612079565b61139e565b610204611479565b6102756103c43660046120d8565b6001600160a01b03166000908152600f602052604090205490565b600d54610275565b61024f6103f5366004612079565b611488565b6101e76104083660046124b1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024f6104443660046120d8565b6114dd565b60006001600160e01b0319821663780e9d6360e01b148061046e575061046e826115c7565b92915050565b606060028054610483906124e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104af906124e4565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b03166105845760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105ab82610a84565b9050806001600160a01b0316836001600160a01b0316036106185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161057b565b336001600160a01b038216148061063457506106348133610408565b6106a65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161057b565b6106b08383611617565b505050565b60606001600160a01b0382166107195760405162461bcd60e51b8152602060048201526024808201527f426c61636b486f6c652077616c6c6574206973206e6f742061207265616c206f6044820152633bb732b960e11b606482015260840161057b565b600061072483610afb565b905060008167ffffffffffffffff81111561074157610741612173565b60405190808252806020026020018201604052801561076a578160200160208202803683370190505b50905060005b828110156107b15761078285826107ea565b8282815181106107945761079461251e565b6020908102919091010152806107a98161254a565b915050610770565b509392505050565b6107c33382611685565b6107df5760405162461bcd60e51b815260040161057b90612563565b6106b083838361177c565b60006107f583610afb565b82106108575760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161057b565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6000546001600160a01b031633146108aa5760405162461bcd60e51b815260040161057b906125b4565b80516108bd906013906020840190611f3f565b5050565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161057b906125b4565b600c5481106109465760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420737562416d6f756e7420666f7220746f74616c546f6b656e6044820152607360f81b606482015260840161057b565b600d5481106109a35760405162461bcd60e51b8152602060048201526024808201527f496e76616c696420737562416d6f756e7420666f72206c656674546f6b656e436044820152631bdd5b9d60e21b606482015260840161057b565b80600c60008282546109b591906125e9565b9250508190555080600d60008282546109ce91906125e9565b909155505050565b6106b083838360405180602001604052806000815250611366565b60006109fc600b5490565b8210610a5f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161057b565b600b8281548110610a7257610a7261251e565b90600052602060002001549050919050565b6000818152600460205260408120546001600160a01b03168061046e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161057b565b60006001600160a01b038216610b665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161057b565b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610bac5760405162461bcd60e51b815260040161057b906125b4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610c205760405162461bcd60e51b815260040161057b906125b4565b60c8811115610c835760405162461bcd60e51b815260206004820152602960248201527f52657365727665206973206c696d6974656420746f20323030207065722063616044820152680d8d840c2e840dac2f60bb1b606482015260840161057b565b80600d541015610ce75760405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766044820152686520616e796d6f726560b81b606482015260840161057b565b3360009081526015602052604081208054839290610d06908490612600565b90915550600090505b81811015610d5f57600e8054906000610d278361254a565b9091555050600e8054600090815260176020526040902042905554610d4d903390611927565b80610d578161254a565b915050610d0f565b50600e54600c54610d7091906125e9565b600d5560408051338152602081018390527f904dcdc411e931497b95b06ddf8f8184815dd3bedc3c7c7cd4aed3ccd30783d8910160405180910390a150565b323314610dfe5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161057b565b600260015403610e505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161057b565b600260015560008481526010602052604090205460ff168015610eb55760405162461bcd60e51b815260206004820152601a60248201527f5468697320686173682077617320616c72656164792075736564000000000000604482015260640161057b565b6000858152601060209081526040808320805460ff1916600117905551610ee191601191899101612618565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610f4c573d6000803e3d6000fd5b5050604051601f1901516012549092506001600160a01b03808416911614905060018114610fad5760405162461bcd60e51b815260206004820152600e60248201526d155b985b1b1bddd9590818d85b1b60921b604482015260640161057b565b6005891115610ff55760405162461bcd60e51b8152602060048201526014602482015273151bdbc81b585b9e48189bde195cc8185cdad95960621b604482015260640161057b565b6000600d54116110475760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265204d797374657279426f7820617661696c61626c6500000000604482015260640161057b565b336000908152600f602052604090205480156110a55760405162461bcd60e51b815260206004820152601760248201527f57616c6c657420616c726561647920636c61696d656421000000000000000000604482015260640161057b565b6000805b8b811015611131573360009081526015602052604081208054916110cc8361254a565b9091555050600e80549060006110e18361254a565b9091555050600d80549060006110f6836126b6565b919050555061110733600e54611927565b816111118161254a565b925050600d546000031561113157806111298161254a565b9150506110a9565b50336000818152600f60209081526040918290208e9055815192835282018d90527f5950f8f847391657e6cce7c70212227aaa283c49f5ad0f3e6a3b841d3d7c75ac910160405180910390a1505060018055505050505050505050565b606060038054610483906124e4565b336001600160a01b038316036111f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161057b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b815181518082146112c25760405162461bcd60e51b815260206004820152602560248201527f726563697069656e747320636f756e7420646f65736e2774206d6174636820746044820152646f6b656e7360d81b606482015260840161057b565b60005b8281101561135f5760008582815181106112e1576112e161251e565b6020026020010151905060006001600160a01b0316816001600160a01b03160361130b575061134d565b336001600160a01b03821603611321575061134d565b60008583815181106113355761133561251e565b6020026020010151905061134a3383836107b9565b50505b806113578161254a565b9150506112c5565b5050505050565b6113703383611685565b61138c5760405162461bcd60e51b815260040161057b90612563565b61139884848484611941565b50505050565b6000818152600460205260409020546060906001600160a01b031661141d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161057b565b6000611427611479565b905060008151116114475760405180602001604052806000815250611472565b8061145184611974565b6040516020016114629291906126cd565b6040516020818303038152906040525b9392505050565b606060138054610483906124e4565b6000546001600160a01b031633146114b25760405162461bcd60e51b815260040161057b906125b4565b80600c60008282546114c49190612600565b9250508190555080600d60008282546109ce9190612600565b6000546001600160a01b031633146115075760405162461bcd60e51b815260040161057b906125b4565b6001600160a01b03811661156c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806115f857506001600160e01b03198216635b5e139f60e01b145b8061046e57506301ffc9a760e01b6001600160e01b031983161461046e565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061164c82610a84565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166116fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161057b565b600061170983610a84565b9050806001600160a01b0316846001600160a01b031614806117445750836001600160a01b031661173984610506565b6001600160a01b0316145b8061177457506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661178f82610a84565b6001600160a01b0316146117f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161057b565b6001600160a01b0382166118595760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161057b565b611864838383611a75565b61186f600082611617565b6001600160a01b03831660009081526005602052604081208054600192906118989084906125e9565b90915550506001600160a01b03821660009081526005602052604081208054600192906118c6908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6108bd828260405180602001604052806000815250611b2d565b61194c84848461177c565b61195884848484611b60565b6113985760405162461bcd60e51b815260040161057b906126fc565b60608160000361199b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119c557806119af8161254a565b91506119be9050600a83612764565b915061199f565b60008167ffffffffffffffff8111156119e0576119e0612173565b6040519080825280601f01601f191660200182016040528015611a0a576020820181803683370190505b5090505b841561177457611a1f6001836125e9565b9150611a2c600a86612778565b611a37906030612600565b60f81b818381518110611a4c57611a4c61251e565b60200101906001600160f81b031916908160001a905350611a6e600a86612764565b9450611a0e565b6001600160a01b038316611ad057611acb81600b80546000838152600a60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b611af3565b816001600160a01b0316836001600160a01b031614611af357611af38382611c61565b6001600160a01b038216611b0a576106b081611cfe565b826001600160a01b0316826001600160a01b0316146106b0576106b08282611dad565b611b378383611df1565b611b446000848484611b60565b6106b05760405162461bcd60e51b815260040161057b906126fc565b60006001600160a01b0384163b15611c5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ba490339089908890889060040161278c565b6020604051808303816000875af1925050508015611bdf575060408051601f3d908101601f19168201909252611bdc918101906127c9565b60015b611c3c573d808015611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b508051600003611c345760405162461bcd60e51b815260040161057b906126fc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611774565b506001949350505050565b60006001611c6e84610afb565b611c7891906125e9565b600083815260096020526040902054909150808214611ccb576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600b54600090611d10906001906125e9565b6000838152600a6020526040812054600b8054939450909284908110611d3857611d3861251e565b9060005260206000200154905080600b8381548110611d5957611d5961251e565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600b805480611d9157611d916127e6565b6001900381819060005260206000200160009055905550505050565b6000611db883610afb565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160a01b038216611e475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161057b565b6000818152600460205260409020546001600160a01b031615611eac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057b565b611eb860008383611a75565b6001600160a01b0382166000908152600560205260408120805460019290611ee1908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f4b906124e4565b90600052602060002090601f016020900481019282611f6d5760008555611fb3565b82601f10611f8657805160ff1916838001178555611fb3565b82800160010185558215611fb3579182015b82811115611fb3578251825591602001919060010190611f98565b50611fbf929150611fc3565b5090565b5b80821115611fbf5760008155600101611fc4565b6001600160e01b031981168114611fee57600080fd5b50565b60006020828403121561200357600080fd5b813561147281611fd8565b60005b83811015612029578181015183820152602001612011565b838111156113985750506000910152565b6000815180845261205281602086016020860161200e565b601f01601f19169290920160200192915050565b602081526000611472602083018461203a565b60006020828403121561208b57600080fd5b5035919050565b80356001600160a01b03811681146120a957600080fd5b919050565b600080604083850312156120c157600080fd5b6120ca83612092565b946020939093013593505050565b6000602082840312156120ea57600080fd5b61147282612092565b6020808252825182820181905260009190848201906040850190845b8181101561212b5783518352928401929184019160010161210f565b50909695505050505050565b60008060006060848603121561214c57600080fd5b61215584612092565b925061216360208501612092565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121b2576121b2612173565b604052919050565b600067ffffffffffffffff8311156121d4576121d4612173565b6121e7601f8401601f1916602001612189565b90508281528383830111156121fb57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561222457600080fd5b813567ffffffffffffffff81111561223b57600080fd5b8201601f8101841361224c57600080fd5b611774848235602084016121ba565b600080600080600060a0868803121561227357600080fd5b8535945060208601359350604086013560ff8116811461229257600080fd5b94979396509394606081013594506080013592915050565b600080604083850312156122bd57600080fd5b6122c683612092565b9150602083013580151581146122db57600080fd5b809150509250929050565b600067ffffffffffffffff82111561230057612300612173565b5060051b60200190565b600082601f83011261231b57600080fd5b8135602061233061232b836122e6565b612189565b82815260059290921b8401810191818101908684111561234f57600080fd5b8286015b8481101561236a5780358352918301918301612353565b509695505050505050565b6000806040838503121561238857600080fd5b823567ffffffffffffffff808211156123a057600080fd5b818501915085601f8301126123b457600080fd5b813560206123c461232b836122e6565b82815260059290921b840181019181810190898411156123e357600080fd5b948201945b83861015612408576123f986612092565b825294820194908201906123e8565b9650508601359250508082111561241e57600080fd5b5061242b8582860161230a565b9150509250929050565b6000806000806080858703121561244b57600080fd5b61245485612092565b935061246260208601612092565b925060408501359150606085013567ffffffffffffffff81111561248557600080fd5b8501601f8101871361249657600080fd5b6124a5878235602084016121ba565b91505092959194509250565b600080604083850312156124c457600080fd5b6124cd83612092565b91506124db60208401612092565b90509250929050565b600181811c908216806124f857607f821691505b60208210810361251857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161255c5761255c612534565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000828210156125fb576125fb612534565b500390565b6000821982111561261357612613612534565b500190565b600080845481600182811c91508083168061263457607f831692505b6020808410820361265357634e487b7160e01b86526022600452602486fd5b8180156126675760018114612678576126a5565b60ff198616895284890196506126a5565b60008b81526020902060005b8681101561269d5781548b820152908501908301612684565b505084890196505b509785525050509301949350505050565b6000816126c5576126c5612534565b506000190190565b600083516126df81846020880161200e565b8351908301906126f381836020880161200e565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826127735761277361274e565b500490565b6000826127875761278761274e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127bf9083018461203a565b9695505050505050565b6000602082840312156127db57600080fd5b815161147281611fd8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220264d48447c84110bdb343ef4166320e8431bdf864cd6c817014f6697038631ea64736f6c634300080d0033

Deployed Bytecode Sourcemap

25574:7917:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15589:229;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;15589:229:0;;;;;;;;7734:105;;;:::i;:::-;;;;;;;:::i;8860:226::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;8860:226:0;1528:203:1;8459:385:0;;;;;;:::i;:::-;;:::i;:::-;;29543:489;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15826:118::-;15919:10;:17;15826:118;;;3147:25:1;;;3135:2;3120:18;15826:118:0;3001:177:1;9608:325:0;;;;;;:::i;:::-;;:::i;15952:266::-;;;;;;:::i;:::-;;:::i;28096:109::-;;;;;;:::i;:::-;;:::i;28541:329::-;;;;;;:::i;:::-;;:::i;9949:156::-;;;;;;:::i;:::-;;:::i;16226:243::-;;;;;;:::i;:::-;;:::i;7474:244::-;;;;;;:::i;:::-;;:::i;7236:222::-;;;;;;:::i;:::-;;:::i;4551:162::-;;;:::i;32024:658::-;;;;;;:::i;:::-;;:::i;30121:1573::-;;;;;;:::i;:::-;;:::i;4302:92::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;4302:92;;7855:109;;;:::i;9102:305::-;;;;;;:::i;:::-;;:::i;32771:551::-;;;;;;:::i;:::-;;:::i;10121:299::-;;;;;;:::i;:::-;;:::i;7980:348::-;;;;;;:::i;:::-;;:::i;28956:103::-;;;:::i;31783:152::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31900:27:0;31852:23;31900:27;;;:17;:27;;;;;;;31783:152;29145:110;29233:14;;29145:110;;28291:164;;;;;;:::i;:::-;;:::i;9423:169::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9549:25:0;;;9520:4;9549:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9423:169;4729:267;;;;;;:::i;:::-;;:::i;15589:229::-;15691:4;-1:-1:-1;;;;;;15720:50:0;;-1:-1:-1;;;15720:50:0;;:90;;;15774:36;15798:11;15774:23;:36::i;:::-;15713:97;15589:229;-1:-1:-1;;15589:229:0:o;7734:105::-;7788:13;7826:5;7819:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7734:105;:::o;8860:226::-;8936:7;10828:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10828:16:0;8961:73;;;;-1:-1:-1;;;8961:73:0;;9226:2:1;8961:73:0;;;9208:21:1;9265:2;9245:18;;;9238:30;9304:34;9284:18;;;9277:62;-1:-1:-1;;;9355:18:1;;;9348:42;9407:19;;8961:73:0;;;;;;;;;-1:-1:-1;9054:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;9054:24:0;;8860:226::o;8459:385::-;8545:13;8561:23;8576:7;8561:14;:23::i;:::-;8545:39;;8612:5;-1:-1:-1;;;;;8608:9:0;:2;-1:-1:-1;;;;;8608:9:0;;8600:55;;;;-1:-1:-1;;;8600:55:0;;9639:2:1;8600:55:0;;;9621:21:1;9678:2;9658:18;;;9651:30;9717:34;9697:18;;;9690:62;-1:-1:-1;;;9768:18:1;;;9761:31;9809:19;;8600:55:0;9437:397:1;8600:55:0;3559:10;-1:-1:-1;;;;;8674:19:0;;;;:67;;-1:-1:-1;8697:44:0;8721:5;3559:10;9423:169;:::i;8697:44::-;8666:136;;;;-1:-1:-1;;;8666:136:0;;10041:2:1;8666:136:0;;;10023:21:1;10080:2;10060:18;;;10053:30;10119:34;10099:18;;;10092:62;10190:26;10170:18;;;10163:54;10234:19;;8666:136:0;9839:420:1;8666:136:0;8815:21;8824:2;8828:7;8815:8;:21::i;:::-;8534:310;8459:385;;:::o;29543:489::-;29620:16;-1:-1:-1;;;;;29662:25:0;;29654:74;;;;-1:-1:-1;;;29654:74:0;;10466:2:1;29654:74:0;;;10448:21:1;10505:2;10485:18;;;10478:30;10544:34;10524:18;;;10517:62;-1:-1:-1;;;10595:18:1;;;10588:34;10639:19;;29654:74:0;10264:400:1;29654:74:0;29748:22;29774:24;29784:13;29774:9;:24::i;:::-;29748:50;;29809:23;29849:5;29835:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29835:20:0;;29809:46;;29880:9;29875:117;29895:5;29893:1;:7;29875:117;;;29943:37;29963:13;29978:1;29943:19;:37::i;:::-;29931:6;29938:1;29931:9;;;;;;;;:::i;:::-;;;;;;;;;;:49;29902:3;;;;:::i;:::-;;;;29875:117;;;-1:-1:-1;30018:6:0;29543:489;-1:-1:-1;;;29543:489:0:o;9608:325::-;9789:41;3559:10;9822:7;9789:18;:41::i;:::-;9781:103;;;;-1:-1:-1;;;9781:103:0;;;;;;;:::i;:::-;9897:28;9907:4;9913:2;9917:7;9897:9;:28::i;15952:266::-;16049:7;16090:23;16107:5;16090:16;:23::i;:::-;16082:5;:31;16074:87;;;;-1:-1:-1;;;16074:87:0;;11693:2:1;16074:87:0;;;11675:21:1;11732:2;11712:18;;;11705:30;11771:34;11751:18;;;11744:62;-1:-1:-1;;;11822:18:1;;;11815:41;11873:19;;16074:87:0;11491:407:1;16074:87:0;-1:-1:-1;;;;;;16184:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;15952:266::o;28096:109::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;28181:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;28096:109:::0;:::o;28541:329::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;28646:11:::1;;28634:9;:23;28626:72;;;::::0;-1:-1:-1;;;28626:72:0;;12466:2:1;28626:72:0::1;::::0;::::1;12448:21:1::0;12505:2;12485:18;;;12478:30;12544:34;12524:18;;;12517:62;-1:-1:-1;;;12595:18:1;;;12588:31;12636:19;;28626:72:0::1;12264:397:1::0;28626:72:0::1;28729:14;;28717:9;:26;28709:75;;;::::0;-1:-1:-1;;;28709:75:0;;12868:2:1;28709:75:0::1;::::0;::::1;12850:21:1::0;12907:2;12887:18;;;12880:30;12946:34;12926:18;;;12919:62;-1:-1:-1;;;12997:18:1;;;12990:34;13041:19;;28709:75:0::1;12666:400:1::0;28709:75:0::1;28815:9;28797:11;;:27;;;;;;;:::i;:::-;;;;;;;;28853:9;28835:14;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;28541:329:0:o;9949:156::-;10058:39;10075:4;10081:2;10085:7;10058:39;;;;;;;;;;;;:16;:39::i;16226:243::-;16301:7;16342:30;15919:10;:17;;15826:118;16342:30;16334:5;:38;16326:95;;;;-1:-1:-1;;;16326:95:0;;13403:2:1;16326:95:0;;;13385:21:1;13442:2;13422:18;;;13415:30;13481:34;13461:18;;;13454:62;-1:-1:-1;;;13532:18:1;;;13525:42;13584:19;;16326:95:0;13201:408:1;16326:95:0;16444:10;16455:5;16444:17;;;;;;;;:::i;:::-;;;;;;;;;16437:24;;16226:243;;;:::o;7474:244::-;7546:7;7587:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7587:16:0;;7614:73;;;;-1:-1:-1;;;7614:73:0;;13816:2:1;7614:73:0;;;13798:21:1;13855:2;13835:18;;;13828:30;13894:34;13874:18;;;13867:62;-1:-1:-1;;;13945:18:1;;;13938:39;13994:19;;7614:73:0;13614:405:1;7236:222:0;7308:7;-1:-1:-1;;;;;7341:19:0;;7333:74;;;;-1:-1:-1;;;7333:74:0;;14226:2:1;7333:74:0;;;14208:21:1;14265:2;14245:18;;;14238:30;14304:34;14284:18;;;14277:62;-1:-1:-1;;;14355:18:1;;;14348:40;14405:19;;7333:74:0;14024:406:1;7333:74:0;-1:-1:-1;;;;;;7434:16:0;;;;;:9;:16;;;;;;;7236:222::o;4551:162::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;4663:1:::1;4647:6:::0;;4626:40:::1;::::0;-1:-1:-1;;;;;4647:6:0;;::::1;::::0;4626:40:::1;::::0;4663:1;;4626:40:::1;4703:1;4686:19:::0;;-1:-1:-1;;;;;;4686:19:0::1;::::0;;4551:162::o;32024:658::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;32122:3:::1;32104:6;:21;;32096:78;;;::::0;-1:-1:-1;;;32096:78:0;;14637:2:1;32096:78:0::1;::::0;::::1;14619:21:1::0;14676:2;14656:18;;;14649:30;14715:34;14695:18;;;14688:62;-1:-1:-1;;;14766:18:1;;;14759:39;14815:19;;32096:78:0::1;14435:405:1::0;32096:78:0::1;32211:6;32193:14;;:24;;32185:78;;;::::0;-1:-1:-1;;;32185:78:0;;15047:2:1;32185:78:0::1;::::0;::::1;15029:21:1::0;15086:2;15066:18;;;15059:30;15125:34;15105:18;;;15098:62;-1:-1:-1;;;15176:18:1;;;15169:39;15225:19;;32185:78:0::1;14845:405:1::0;32185:78:0::1;32293:10;32276:28;::::0;;;:16:::1;:28;::::0;;;;:38;;32308:6;;32276:28;:38:::1;::::0;32308:6;;32276:38:::1;:::i;:::-;::::0;;;-1:-1:-1;32332:9:0::1;::::0;-1:-1:-1;32327:242:0::1;32349:6;32345:1;:10;32327:242;;;32386:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;32454:16:0::1;::::0;;32432:39:::1;::::0;;;:21:::1;:39;::::0;;;;32474:15:::1;32432:57:::0;;32540:16;32518:39:::1;::::0;32528:10:::1;::::0;32518:9:::1;:39::i;:::-;32357:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32327:242;;;;32612:16;;32598:11;;:30;;;;:::i;:::-;32581:14;:47:::0;32646:28:::1;::::0;;32655:10:::1;15562:51:1::0;;15644:2;15629:18;;15622:34;;;32646:28:0::1;::::0;15535:18:1;32646:28:0::1;;;;;;;32024:658:::0;:::o;30121:1573::-;25736:9;25749:10;25736:23;25728:66;;;;-1:-1:-1;;;25728:66:0;;15869:2:1;25728:66:0;;;15851:21:1;15908:2;15888:18;;;15881:30;15947:32;15927:18;;;15920:60;15997:18;;25728:66:0;15667:354:1;25728:66:0;5216:1:::1;5458:7;;:19:::0;5450:63:::1;;;::::0;-1:-1:-1;;;5450:63:0;;16228:2:1;5450:63:0::1;::::0;::::1;16210:21:1::0;16267:2;16247:18;;;16240:30;16306:33;16286:18;;;16279:61;16357:18;;5450:63:0::1;16026:355:1::0;5450:63:0::1;5216:1;5590:7;:18:::0;30350:25:::2;30378:28:::0;;;:14:::2;:28;::::0;;;;;::::2;;30427:27:::0;::::2;30419:66;;;::::0;-1:-1:-1;;;30419:66:0;;16588:2:1;30419:66:0::2;::::0;::::2;16570:21:1::0;16627:2;16607:18;;;16600:30;16666:28;16646:18;;;16639:56;16712:18;;30419:66:0::2;16386:350:1::0;30419:66:0::2;30498:28;::::0;;;:14:::2;:28;::::0;;;;;;;:35;;-1:-1:-1;;30498:35:0::2;30529:4;30498:35;::::0;;30580:42;::::2;::::0;30597:10:::2;::::0;30513:12;;30580:42:::2;;:::i;:::-;;::::0;;-1:-1:-1;;30580:42:0;;::::2;::::0;;;;;;30570:53;;30580:42:::2;30570:53:::0;;::::2;::::0;30634:14:::2;30658:33:::0;;;;;::::2;::::0;;;18263:25:1;;;18336:4;18324:17;;18304:18;;;18297:45;;;;18358:18;;;18351:34;;;18401:18;;;18394:34;;;30570:53:0;;-1:-1:-1;30634:14:0;30658:33:::2;::::0;18235:19:1;;30658:33:0::2;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;30658:33:0::2;::::0;-1:-1:-1;;30658:33:0;;30735:5:::2;::::0;30658:33;;-1:-1:-1;;;;;;30727:13:0;;::::2;30735:5:::0;::::2;30727:13;::::0;-1:-1:-1;30735:5:0;30762:17;::::2;30754:44;;;::::0;-1:-1:-1;;;30754:44:0;;18641:2:1;30754:44:0::2;::::0;::::2;18623:21:1::0;18680:2;18660:18;;;18653:30;-1:-1:-1;;;18699:18:1;;;18692:44;18753:18;;30754:44:0::2;18439:338:1::0;30754:44:0::2;30829:1;30819:8;:11;;30811:44;;;::::0;-1:-1:-1;;;30811:44:0;;18984:2:1;30811:44:0::2;::::0;::::2;18966:21:1::0;19023:2;19003:18;;;18996:30;-1:-1:-1;;;19042:18:1;;;19035:50;19102:18;;30811:44:0::2;18782:344:1::0;30811:44:0::2;30920:1;30903:14;;:18;30895:59;;;::::0;-1:-1:-1;;;30895:59:0;;19333:2:1;30895:59:0::2;::::0;::::2;19315:21:1::0;19372:2;19352:18;;;19345:30;19411;19391:18;;;19384:58;19459:18;;30895:59:0::2;19131:352:1::0;30895:59:0::2;31012:10;30967:23;30993:31:::0;;;:17:::2;:31;::::0;;;;;31046:18;;31038:54:::2;;;::::0;-1:-1:-1;;;31038:54:0;;19690:2:1;31038:54:0::2;::::0;::::2;19672:21:1::0;19729:2;19709:18;;;19702:30;19768:25;19748:18;;;19741:53;19811:18;;31038:54:0::2;19488:347:1::0;31038:54:0::2;31132:15;31167:6:::0;31162:352:::2;31177:8;31175:1;:10;31162:352;;;31233:10;31216:28;::::0;;;:16:::2;:28;::::0;;;;:30;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31261:16:0::2;:18:::0;;;:16:::2;:18;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31294:14:0::2;:16:::0;;;:14:::2;:16;::::0;::::2;:::i;:::-;;;;;;31335:39;31345:10;31357:16;;31335:9;:39::i;:::-;31391:9:::0;::::2;::::0;::::2;:::i;:::-;;;;31421:14;;31437:1;31421:17:::0;31417:37;31449:5:::2;31417:37;31187:3:::0;::::2;::::0;::::2;:::i;:::-;;;;31162:352;;;-1:-1:-1::0;31544:10:0::2;31526:29;::::0;;;:17:::2;:29;::::0;;;;;;;;:40;;;31642:44;;15562:51:1;;;15629:18;;15622:34;;;31642:44:0::2;::::0;15535:18:1;31642:44:0::2;;;;;;;-1:-1:-1::0;;5168:1:0::1;5735:22:::0;;-1:-1:-1;;;;;;;;;30121:1573:0:o;7855:109::-;7911:13;7949:7;7942:14;;;;;:::i;9102:305::-;3559:10;-1:-1:-1;;;;;9210:24:0;;;9202:62;;;;-1:-1:-1;;;9202:62:0;;20183:2:1;9202:62:0;;;20165:21:1;20222:2;20202:18;;;20195:30;20261:27;20241:18;;;20234:55;20306:18;;9202:62:0;19981:349:1;9202:62:0;3559:10;9277:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9277:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;9277:53:0;;;;;;;;;;9351:48;;540:41:1;;;9277:42:0;;3559:10;9351:48;;513:18:1;9351:48:0;;;;;;;9102:305;;:::o;32771:551::-;32887:17;;32928:15;;32964:6;;;32956:56;;;;-1:-1:-1;;;32956:56:0;;20537:2:1;32956:56:0;;;20519:21:1;20576:2;20556:18;;;20549:30;20615:34;20595:18;;;20588:62;-1:-1:-1;;;20666:18:1;;;20659:35;20711:19;;32956:56:0;20335:401:1;32956:56:0;33030:6;33025:290;33040:2;33038:1;:4;33025:290;;;33073:10;33086;33097:1;33086:13;;;;;;;;:::i;:::-;;;;;;;33073:26;;33132:3;-1:-1:-1;;;;;33120:16:0;:2;-1:-1:-1;;;;;33120:16:0;;33116:36;;33144:8;;;33116:36;33175:10;-1:-1:-1;;;;;33171:14:0;;;33167:36;;33195:8;;;33167:36;33220:15;33238:8;33247:1;33238:11;;;;;;;;:::i;:::-;;;;;;;33220:29;;33266:37;33279:10;33291:2;33295:7;33266:12;:37::i;:::-;33058:257;;33025:290;33044:3;;;;:::i;:::-;;;;33025:290;;;;32863:459;;32771:551;;:::o;10121:299::-;10258:41;3559:10;10291:7;10258:18;:41::i;:::-;10250:103;;;;-1:-1:-1;;;10250:103:0;;;;;;;:::i;:::-;10373:39;10387:4;10393:2;10397:7;10406:5;10373:13;:39::i;:::-;10121:299;;;;:::o;7980:348::-;10799:4;10828:16;;;:7;:16;;;;;;8053:13;;-1:-1:-1;;;;;10828:16:0;8084:76;;;;-1:-1:-1;;;8084:76:0;;20943:2:1;8084:76:0;;;20925:21:1;20982:2;20962:18;;;20955:30;21021:34;21001:18;;;20994:62;-1:-1:-1;;;21072:18:1;;;21065:45;21127:19;;8084:76:0;20741:411:1;8084:76:0;8173:21;8197:10;:8;:10::i;:::-;8173:34;;8257:1;8241:7;8235:21;:23;8234:86;;;;;;;;;;;;;;;;;8286:7;8295:18;:7;:16;:18::i;:::-;8269:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8234:86;8227:93;7980:348;-1:-1:-1;;;7980:348:0:o;28956:103::-;29006:13;29044:7;29037:14;;;;;:::i;28291:164::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;28396:11:::1;28378;;:29;;;;;;;:::i;:::-;;;;;;;;28436:11;28418:14;;:29;;;;;;;:::i;4729:267::-:0;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4823:22:0;::::1;4815:73;;;::::0;-1:-1:-1;;;4815:73:0;;21834:2:1;4815:73:0::1;::::0;::::1;21816:21:1::0;21873:2;21853:18;;;21846:30;21912:34;21892:18;;;21885:62;-1:-1:-1;;;21963:18:1;;;21956:36;22009:19;;4815:73:0::1;21632:402:1::0;4815:73:0::1;4934:6;::::0;;4913:38:::1;::::0;-1:-1:-1;;;;;4913:38:0;;::::1;::::0;4934:6;::::1;::::0;4913:38:::1;::::0;::::1;4971:6;:17:::0;;-1:-1:-1;;;;;;4971:17:0::1;-1:-1:-1::0;;;;;4971:17:0;;;::::1;::::0;;;::::1;::::0;;4729:267::o;6906:314::-;7008:4;-1:-1:-1;;;;;;7038:40:0;;-1:-1:-1;;;7038:40:0;;:117;;-1:-1:-1;;;;;;;7107:48:0;;-1:-1:-1;;;7107:48:0;7038:117;:174;;;-1:-1:-1;;;;;;;;;;3302:40:0;;;7176:36;3187:164;13594:184;13674:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;13674:29:0;-1:-1:-1;;;;;13674:29:0;;;;;;;;:24;;13733:23;13674:24;13733:14;:23::i;:::-;-1:-1:-1;;;;;13724:46:0;;;;;;;;;;;13594:184;;:::o;10882:378::-;10975:4;10828:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10828:16:0;10997:73;;;;-1:-1:-1;;;10997:73:0;;22241:2:1;10997:73:0;;;22223:21:1;22280:2;22260:18;;;22253:30;22319:34;22299:18;;;22292:62;-1:-1:-1;;;22370:18:1;;;22363:42;22422:19;;10997:73:0;22039:408:1;10997:73:0;11090:13;11106:23;11121:7;11106:14;:23::i;:::-;11090:39;;11168:5;-1:-1:-1;;;;;11157:16:0;:7;-1:-1:-1;;;;;11157:16:0;;:51;;;;11201:7;-1:-1:-1;;;;;11177:31:0;:20;11189:7;11177:11;:20::i;:::-;-1:-1:-1;;;;;11177:31:0;;11157:51;:94;;;-1:-1:-1;;;;;;9549:25:0;;;9520:4;9549:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;11212:39;11149:103;10882:378;-1:-1:-1;;;;10882:378:0:o;13018:560::-;13146:4;-1:-1:-1;;;;;13121:29:0;:23;13136:7;13121:14;:23::i;:::-;-1:-1:-1;;;;;13121:29:0;;13113:84;;;;-1:-1:-1;;;13113:84:0;;22654:2:1;13113:84:0;;;22636:21:1;22693:2;22673:18;;;22666:30;22732:34;22712:18;;;22705:62;-1:-1:-1;;;22783:18:1;;;22776:39;22832:19;;13113:84:0;22452:405:1;13113:84:0;-1:-1:-1;;;;;13216:16:0;;13208:79;;;;-1:-1:-1;;;13208:79:0;;23064:2:1;13208:79:0;;;23046:21:1;23103:2;23083:18;;;23076:30;23142:34;23122:18;;;23115:62;-1:-1:-1;;;23193:18:1;;;23186:34;23237:19;;13208:79:0;22862:400:1;13208:79:0;13300:39;13321:4;13327:2;13331:7;13300:20;:39::i;:::-;13352:29;13369:1;13373:7;13352:8;:29::i;:::-;-1:-1:-1;;;;;13442:15:0;;;;;;:9;:15;;;;;:20;;13461:1;;13442:15;:20;;13461:1;;13442:20;:::i;:::-;;;;-1:-1:-1;;;;;;;13473:13:0;;;;;;:9;:13;;;;;:20;;13492:1;;13473:13;:20;;13492:1;;13473:20;:::i;:::-;;;;-1:-1:-1;;13504:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;13504:21:0;-1:-1:-1;;;;;13504:21:0;;;;;;;;;13543:27;;13504:16;;13543:27;;;;;;;13018:560;;;:::o;11276:115::-;11357:26;11367:2;11371:7;11357:26;;;;;;;;;;;;:9;:26::i;10436:282::-;10555:28;10565:4;10571:2;10575:7;10555:9;:28::i;:::-;10607:48;10630:4;10636:2;10640:7;10649:5;10607:22;:48::i;:::-;10599:111;;;;-1:-1:-1;;;10599:111:0;;;;;;;:::i;19699:774::-;19755:13;19981:5;19988:1;19981:8;19977:30;;-1:-1:-1;;19997:10:0;;;;;;;;;;;;-1:-1:-1;;;19997:10:0;;;;;19699:774::o;19977:30::-;20038:5;20023:12;20084:85;20091:7;;20084:85;;20124:8;;;;:::i;:::-;;-1:-1:-1;20147:10:0;;-1:-1:-1;20155:2:0;20147:10;;:::i;:::-;;;20084:85;;;20188:19;20220:6;20210:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20210:17:0;;20188:39;;20247:178;20254:10;;20247:178;;20290:18;20307:1;20290:18;;:::i;:::-;;-1:-1:-1;20366:10:0;20374:2;20366:5;:10;:::i;:::-;20353:24;;:2;:24;:::i;:::-;20340:39;;20323:6;20330;20323:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20323:56:0;;;;;;;;-1:-1:-1;20394:19:0;20411:2;20394:19;;:::i;:::-;;;20247:178;;16477:525;-1:-1:-1;;;;;16657:18:0;;16653:159;;16681:40;16713:7;17360:10;:17;;17333:24;;;;:15;:24;;;;;:44;;;17393:24;;;;;;;;;;;;17251:174;16681:40;16653:159;;;16749:2;-1:-1:-1;;;;;16741:10:0;:4;-1:-1:-1;;;;;16741:10:0;;16737:75;;16765:47;16798:4;16804:7;16765:32;:47::i;:::-;-1:-1:-1;;;;;16841:16:0;;16837:157;;16865:45;16902:7;16865:36;:45::i;16837:157::-;16936:4;-1:-1:-1;;;;;16930:10:0;:2;-1:-1:-1;;;;;16930:10:0;;16926:68;;16954:40;16982:2;16986:7;16954:27;:40::i;11407:260::-;11508:18;11514:2;11518:7;11508:5;:18::i;:::-;11550:54;11581:1;11585:2;11589:7;11598:5;11550:22;:54::i;:::-;11542:117;;;;-1:-1:-1;;;11542:117:0;;;;;;;:::i;13794:941::-;13903:4;-1:-1:-1;;;;;13929:13:0;;21592:20;21681:8;13925:803;;14004:72;;-1:-1:-1;;;14004:72:0;;-1:-1:-1;;;;;14004:36:0;;;;;:72;;3559:10;;14055:4;;14061:7;;14070:5;;14004:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14004:72:0;;;;;;;;-1:-1:-1;;14004:72:0;;;;;;;;;;;;:::i;:::-;;;13970:685;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14315:6;:13;14330:1;14315:16;14311:329;;14373:60;;-1:-1:-1;;;14373:60:0;;;;;;;:::i;14311:329::-;14557:6;14551:13;14542:6;14538:2;14534:15;14527:38;13970:685;-1:-1:-1;;;;;;14166:55:0;-1:-1:-1;;;14166:55:0;;-1:-1:-1;14159:62:0;;13925:803;-1:-1:-1;14712:4:0;13794:941;;;;;;:::o;17433:993::-;17704:22;17754:1;17729:22;17746:4;17729:16;:22::i;:::-;:26;;;;:::i;:::-;17766:18;17787:26;;;:17;:26;;;;;;17704:51;;-1:-1:-1;17920:28:0;;;17916:328;;-1:-1:-1;;;;;17987:18:0;;17965:19;17987:18;;;:12;:18;;;;;;;;:34;;;;;;;;;18038:30;;;;;;:44;;;18155:30;;:17;:30;;;;;:43;;;17916:328;-1:-1:-1;18340:26:0;;;;:17;:26;;;;;;;;18333:33;;;-1:-1:-1;;;;;18384:18:0;;;;;:12;:18;;;;;:34;;;;;;;18377:41;17433:993::o;18434:1084::-;18717:10;:17;18692:22;;18717:21;;18737:1;;18717:21;:::i;:::-;18749:18;18770:24;;;:15;:24;;;;;;19143:10;:26;;18692:46;;-1:-1:-1;18770:24:0;;18692:46;;19143:26;;;;;;:::i;:::-;;;;;;;;;19121:48;;19207:11;19182:10;19193;19182:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;19287:28;;;:15;:28;;;;;;;:41;;;19459:24;;;;;19452:31;19494:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18510:1008;;;18434:1084;:::o;17010:233::-;17100:14;17117:20;17134:2;17117:16;:20::i;:::-;-1:-1:-1;;;;;17153:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:36;;;17200:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;17010:233:0:o;11683:390::-;-1:-1:-1;;;;;11768:16:0;;11760:62;;;;-1:-1:-1;;;11760:62:0;;25142:2:1;11760:62:0;;;25124:21:1;;;25161:18;;;25154:30;25220:34;25200:18;;;25193:62;25272:18;;11760:62:0;24940:356:1;11760:62:0;10799:4;10828:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10828:16:0;:30;11833:58;;;;-1:-1:-1;;;11833:58:0;;25503:2:1;11833:58:0;;;25485:21:1;25542:2;25522:18;;;25515:30;25581;25561:18;;;25554:58;25629:18;;11833:58:0;25301:352:1;11833:58:0;11904:45;11933:1;11937:2;11941:7;11904:20;:45::i;:::-;-1:-1:-1;;;;;11962:13:0;;;;;;:9;:13;;;;;:20;;11981:1;;11962:13;:20;;11981:1;;11962:20;:::i;:::-;;;;-1:-1:-1;;11993:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11993:21:0;-1:-1:-1;;;;;11993:21:0;;;;;;;;12032:33;;11993:16;;;12032:33;;11993:16;;12032:33;11683:390;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:186::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;2364:632::-;2535:2;2587:21;;;2657:13;;2560:18;;;2679:22;;;2506:4;;2535:2;2758:15;;;;2732:2;2717:18;;;2506:4;2801:169;2815:6;2812:1;2809:13;2801:169;;;2876:13;;2864:26;;2945:15;;;;2910:12;;;;2837:1;2830:9;2801:169;;;-1:-1:-1;2987:3:1;;2364:632;-1:-1:-1;;;;;;2364:632:1:o;3183:328::-;3260:6;3268;3276;3329:2;3317:9;3308:7;3304:23;3300:32;3297:52;;;3345:1;3342;3335:12;3297:52;3368:29;3387:9;3368:29;:::i;:::-;3358:39;;3416:38;3450:2;3439:9;3435:18;3416:38;:::i;:::-;3406:48;;3501:2;3490:9;3486:18;3473:32;3463:42;;3183:328;;;;;:::o;3516:127::-;3577:10;3572:3;3568:20;3565:1;3558:31;3608:4;3605:1;3598:15;3632:4;3629:1;3622:15;3648:275;3719:2;3713:9;3784:2;3765:13;;-1:-1:-1;;3761:27:1;3749:40;;3819:18;3804:34;;3840:22;;;3801:62;3798:88;;;3866:18;;:::i;:::-;3902:2;3895:22;3648:275;;-1:-1:-1;3648:275:1:o;3928:407::-;3993:5;4027:18;4019:6;4016:30;4013:56;;;4049:18;;:::i;:::-;4087:57;4132:2;4111:15;;-1:-1:-1;;4107:29:1;4138:4;4103:40;4087:57;:::i;:::-;4078:66;;4167:6;4160:5;4153:21;4207:3;4198:6;4193:3;4189:16;4186:25;4183:45;;;4224:1;4221;4214:12;4183:45;4273:6;4268:3;4261:4;4254:5;4250:16;4237:43;4327:1;4320:4;4311:6;4304:5;4300:18;4296:29;4289:40;3928:407;;;;;:::o;4340:451::-;4409:6;4462:2;4450:9;4441:7;4437:23;4433:32;4430:52;;;4478:1;4475;4468:12;4430:52;4518:9;4505:23;4551:18;4543:6;4540:30;4537:50;;;4583:1;4580;4573:12;4537:50;4606:22;;4659:4;4651:13;;4647:27;-1:-1:-1;4637:55:1;;4688:1;4685;4678:12;4637:55;4711:74;4777:7;4772:2;4759:16;4754:2;4750;4746:11;4711:74;:::i;4796:543::-;4889:6;4897;4905;4913;4921;4974:3;4962:9;4953:7;4949:23;4945:33;4942:53;;;4991:1;4988;4981:12;4942:53;5027:9;5014:23;5004:33;;5084:2;5073:9;5069:18;5056:32;5046:42;;5138:2;5127:9;5123:18;5110:32;5182:4;5175:5;5171:16;5164:5;5161:27;5151:55;;5202:1;5199;5192:12;5151:55;4796:543;;;;-1:-1:-1;5225:5:1;;5277:2;5262:18;;5249:32;;-1:-1:-1;5328:3:1;5313:19;5300:33;;4796:543;-1:-1:-1;;4796:543:1:o;5344:347::-;5409:6;5417;5470:2;5458:9;5449:7;5445:23;5441:32;5438:52;;;5486:1;5483;5476:12;5438:52;5509:29;5528:9;5509:29;:::i;:::-;5499:39;;5588:2;5577:9;5573:18;5560:32;5635:5;5628:13;5621:21;5614:5;5611:32;5601:60;;5657:1;5654;5647:12;5601:60;5680:5;5670:15;;;5344:347;;;;;:::o;5696:183::-;5756:4;5789:18;5781:6;5778:30;5775:56;;;5811:18;;:::i;:::-;-1:-1:-1;5856:1:1;5852:14;5868:4;5848:25;;5696:183::o;5884:662::-;5938:5;5991:3;5984:4;5976:6;5972:17;5968:27;5958:55;;6009:1;6006;5999:12;5958:55;6045:6;6032:20;6071:4;6095:60;6111:43;6151:2;6111:43;:::i;:::-;6095:60;:::i;:::-;6189:15;;;6275:1;6271:10;;;;6259:23;;6255:32;;;6220:12;;;;6299:15;;;6296:35;;;6327:1;6324;6317:12;6296:35;6363:2;6355:6;6351:15;6375:142;6391:6;6386:3;6383:15;6375:142;;;6457:17;;6445:30;;6495:12;;;;6408;;6375:142;;;-1:-1:-1;6535:5:1;5884:662;-1:-1:-1;;;;;;5884:662:1:o;6551:1146::-;6669:6;6677;6730:2;6718:9;6709:7;6705:23;6701:32;6698:52;;;6746:1;6743;6736:12;6698:52;6786:9;6773:23;6815:18;6856:2;6848:6;6845:14;6842:34;;;6872:1;6869;6862:12;6842:34;6910:6;6899:9;6895:22;6885:32;;6955:7;6948:4;6944:2;6940:13;6936:27;6926:55;;6977:1;6974;6967:12;6926:55;7013:2;7000:16;7035:4;7059:60;7075:43;7115:2;7075:43;:::i;7059:60::-;7153:15;;;7235:1;7231:10;;;;7223:19;;7219:28;;;7184:12;;;;7259:19;;;7256:39;;;7291:1;7288;7281:12;7256:39;7315:11;;;;7335:148;7351:6;7346:3;7343:15;7335:148;;;7417:23;7436:3;7417:23;:::i;:::-;7405:36;;7368:12;;;;7461;;;;7335:148;;;7502:5;-1:-1:-1;;7545:18:1;;7532:32;;-1:-1:-1;;7576:16:1;;;7573:36;;;7605:1;7602;7595:12;7573:36;;7628:63;7683:7;7672:8;7661:9;7657:24;7628:63;:::i;:::-;7618:73;;;6551:1146;;;;;:::o;7702:667::-;7797:6;7805;7813;7821;7874:3;7862:9;7853:7;7849:23;7845:33;7842:53;;;7891:1;7888;7881:12;7842:53;7914:29;7933:9;7914:29;:::i;:::-;7904:39;;7962:38;7996:2;7985:9;7981:18;7962:38;:::i;:::-;7952:48;;8047:2;8036:9;8032:18;8019:32;8009:42;;8102:2;8091:9;8087:18;8074:32;8129:18;8121:6;8118:30;8115:50;;;8161:1;8158;8151:12;8115:50;8184:22;;8237:4;8229:13;;8225:27;-1:-1:-1;8215:55:1;;8266:1;8263;8256:12;8215:55;8289:74;8355:7;8350:2;8337:16;8332:2;8328;8324:11;8289:74;:::i;:::-;8279:84;;;7702:667;;;;;;;:::o;8374:260::-;8442:6;8450;8503:2;8491:9;8482:7;8478:23;8474:32;8471:52;;;8519:1;8516;8509:12;8471:52;8542:29;8561:9;8542:29;:::i;:::-;8532:39;;8590:38;8624:2;8613:9;8609:18;8590:38;:::i;:::-;8580:48;;8374:260;;;;;:::o;8639:380::-;8718:1;8714:12;;;;8761;;;8782:61;;8836:4;8828:6;8824:17;8814:27;;8782:61;8889:2;8881:6;8878:14;8858:18;8855:38;8852:161;;8935:10;8930:3;8926:20;8923:1;8916:31;8970:4;8967:1;8960:15;8998:4;8995:1;8988:15;8852:161;;8639:380;;;:::o;10669:127::-;10730:10;10725:3;10721:20;10718:1;10711:31;10761:4;10758:1;10751:15;10785:4;10782:1;10775:15;10801:127;10862:10;10857:3;10853:20;10850:1;10843:31;10893:4;10890:1;10883:15;10917:4;10914:1;10907:15;10933:135;10972:3;10993:17;;;10990:43;;11013:18;;:::i;:::-;-1:-1:-1;11060:1:1;11049:13;;10933:135::o;11073:413::-;11275:2;11257:21;;;11314:2;11294:18;;;11287:30;11353:34;11348:2;11333:18;;11326:62;-1:-1:-1;;;11419:2:1;11404:18;;11397:47;11476:3;11461:19;;11073:413::o;11903:356::-;12105:2;12087:21;;;12124:18;;;12117:30;12183:34;12178:2;12163:18;;12156:62;12250:2;12235:18;;11903:356::o;13071:125::-;13111:4;13139:1;13136;13133:8;13130:34;;;13144:18;;:::i;:::-;-1:-1:-1;13181:9:1;;13071:125::o;15255:128::-;15295:3;15326:1;15322:6;15319:1;15316:13;15313:39;;;15332:18;;:::i;:::-;-1:-1:-1;15368:9:1;;15255:128::o;16867:1164::-;17023:3;17052:1;17085:6;17079:13;17115:3;17137:1;17165:9;17161:2;17157:18;17147:28;;17225:2;17214:9;17210:18;17247;17237:61;;17291:4;17283:6;17279:17;17269:27;;17237:61;17317:2;17365;17357:6;17354:14;17334:18;17331:38;17328:165;;-1:-1:-1;;;17392:33:1;;17448:4;17445:1;17438:15;17478:4;17399:3;17466:17;17328:165;17509:18;17536:104;;;;17654:1;17649:320;;;;17502:467;;17536:104;-1:-1:-1;;17569:24:1;;17557:37;;17614:16;;;;-1:-1:-1;17536:104:1;;17649:320;16814:1;16807:14;;;16851:4;16838:18;;17744:1;17758:165;17772:6;17769:1;17766:13;17758:165;;;17850:14;;17837:11;;;17830:35;17893:16;;;;17787:10;;17758:165;;;17762:3;;17952:6;17947:3;17943:16;17936:23;;17502:467;-1:-1:-1;17978:19:1;;;-1:-1:-1;;;18013:12:1;;;16867:1164;-1:-1:-1;;;;16867:1164:1:o;19840:136::-;19879:3;19907:5;19897:39;;19916:18;;:::i;:::-;-1:-1:-1;;;19952:18:1;;19840:136::o;21157:470::-;21336:3;21374:6;21368:13;21390:53;21436:6;21431:3;21424:4;21416:6;21412:17;21390:53;:::i;:::-;21506:13;;21465:16;;;;21528:57;21506:13;21465:16;21562:4;21550:17;;21528:57;:::i;:::-;21601:20;;21157:470;-1:-1:-1;;;;21157:470:1:o;23267:414::-;23469:2;23451:21;;;23508:2;23488:18;;;23481:30;23547:34;23542:2;23527:18;;23520:62;-1:-1:-1;;;23613:2:1;23598:18;;23591:48;23671:3;23656:19;;23267:414::o;23686:127::-;23747:10;23742:3;23738:20;23735:1;23728:31;23778:4;23775:1;23768:15;23802:4;23799:1;23792:15;23818:120;23858:1;23884;23874:35;;23889:18;;:::i;:::-;-1:-1:-1;23923:9:1;;23818:120::o;23943:112::-;23975:1;24001;23991:35;;24006:18;;:::i;:::-;-1:-1:-1;24040:9:1;;23943:112::o;24060:489::-;-1:-1:-1;;;;;24329:15:1;;;24311:34;;24381:15;;24376:2;24361:18;;24354:43;24428:2;24413:18;;24406:34;;;24476:3;24471:2;24456:18;;24449:31;;;24254:4;;24497:46;;24523:19;;24515:6;24497:46;:::i;:::-;24489:54;24060:489;-1:-1:-1;;;;;;24060:489:1:o;24554:249::-;24623:6;24676:2;24664:9;24655:7;24651:23;24647:32;24644:52;;;24692:1;24689;24682:12;24644:52;24724:9;24718:16;24743:30;24767:5;24743:30;:::i;24808:127::-;24869:10;24864:3;24860:20;24857:1;24850:31;24900:4;24897:1;24890:15;24924:4;24921:1;24914:15

Swarm Source

ipfs://264d48447c84110bdb343ef4166320e8431bdf864cd6c817014f6697038631ea

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.