ETH Price: $3,238.21 (-0.50%)
Gas: 2 Gwei

Token

ArmorNFT (arNFT)
 

Overview

Max Total Supply

827 arNFT

Holders

141

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
9000001000009.eth
Balance
3 arNFT
0xFCFA4369EAa965AC4e36f1Dd9fd2852C6542b0F7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Armor is a smart insurance aggregator for DeFi, built on trustless and decentralized financial infrastructure. arNFT allows users to tokenize Nexus Mutual coverage.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
arNFT

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license, Audited

Contract Source Code (Solidity)Audit Report

/**
 *Submitted for verification at Etherscan.io on 2020-11-10
*/

pragma solidity ^0.5.0;




contract Context {
    constructor () internal { }
    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }
    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}



interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

contract ERC165 is IERC165 {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }
    function supportsInterface(bytes4 interfaceId) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }
    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}
library Address {
    function isContract(address account) internal view returns (bool) {
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }
    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-call-value
        (bool success, ) = recipient.call.value(amount)("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
}


contract 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) public view returns (uint256 balance);
    function ownerOf(uint256 tokenId) public view returns (address owner);
    function safeTransferFrom(address from, address to, uint256 tokenId) public;
    function transferFrom(address from, address to, uint256 tokenId) public;
    function approve(address to, uint256 tokenId) public;
    function getApproved(uint256 tokenId) public view returns (address operator);

    function setApprovalForAll(address operator, bool _approved) public;
    function isApprovedForAll(address owner, address operator) public view returns (bool);


    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public;
}

contract IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data)
    public returns (bytes4);
}

contract ERC721 is Context, ERC165, IERC721 {
    using SafeMath for uint256;
    using Address for address;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    mapping (uint256 => address) private _tokenOwner;
    mapping (uint256 => address) private _tokenApprovals;
    uint256 internal _totalSupply;

    /**
     * @dev Enumerable takes care of this.
    **/
    //mapping (address => Counters.Counter) private _ownedTokensCount;
    mapping (address => mapping (address => bool)) private _operatorApprovals;
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;

    constructor () public {
        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721);
    }

    function totalSupply() public view returns (uint256) {
      return _totalSupply;
    }
    
    function ownerOf(uint256 tokenId) public view returns (address) {
        address owner = _tokenOwner[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");

        return owner;
    }
    function approve(address to, uint256 tokenId) public {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(_msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }
    function getApproved(uint256 tokenId) public view returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

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

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

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

        _tokenOwner[tokenId] = to;
        _totalSupply = _totalSupply.add(1);

        emit Transfer(address(0), to, tokenId);
    }
    function _burn(address owner, uint256 tokenId) internal {
        require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own");

        _clearApproval(tokenId);

        _tokenOwner[tokenId] = address(0);
        _totalSupply = _totalSupply.sub(1);

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

        _clearApproval(tokenId);

        _tokenOwner[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        internal returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = to.call(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ));
        if (!success) {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert("ERC721: transfer to non ERC721Receiver implementer");
            }
        } else {
            bytes4 retval = abi.decode(returndata, (bytes4));
            return (retval == _ERC721_RECEIVED);
        }
    }
    function _clearApproval(uint256 tokenId) private {
        if (_tokenApprovals[tokenId] != address(0)) {
            _tokenApprovals[tokenId] = address(0);
        }
    }
}



contract IERC721Enumerable is IERC721 {
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId);
}

contract ERC721Enumerable is Context, ERC165, ERC721, IERC721Enumerable {
    mapping(address => uint256[]) private _ownedTokens;
    mapping(uint256 => uint256) private _ownedTokensIndex;
    /**
     * @dev We've removed allTokens functionality.
    **/
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;

    constructor () public {
        // register the supported interface to conform to ERC721Enumerable via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }
    
    /**
     * @dev Added for arNFT (removed from ERC721 basic).
    **/
    function balanceOf(address owner) public view returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");

        return _ownedTokens[owner].length;
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }
    function _transferFrom(address from, address to, uint256 tokenId) internal {
        super._transferFrom(from, to, tokenId);

        _removeTokenFromOwnerEnumeration(from, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }
    function _mint(address to, uint256 tokenId) internal {
        super._mint(to, tokenId);

        _addTokenToOwnerEnumeration(to, tokenId);
    }
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        _removeTokenFromOwnerEnumeration(owner, tokenId);
        // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund
        _ownedTokensIndex[tokenId] = 0;
    }
    function _tokensOfOwner(address owner) internal view returns (uint256[] storage) {
        return _ownedTokens[owner];
    }
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        _ownedTokensIndex[tokenId] = _ownedTokens[to].length;
        _ownedTokens[to].push(tokenId);
    }
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        uint256 lastTokenIndex = _ownedTokens[from].length.sub(1);
        uint256 tokenIndex = _ownedTokensIndex[tokenId];
        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
        }
        _ownedTokens[from].length--;
    }
}



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

contract ERC721Metadata is Context, ERC165, ERC721, IERC721Metadata {
    string private _name;
    string private _symbol;
    string private _baseURI;
    mapping(uint256 => string) private _tokenURIs;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;

    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
    }
    function name() external view returns (string memory) {
        return _name;
    }
    function symbol() external view returns (string memory) {
        return _symbol;
    }
    function tokenURI(uint256 tokenId) external view returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];

        // Even if there is a base URI, it is only appended to non-empty token-specific URIs
        if (bytes(_tokenURI).length == 0) {
            return "";
        } else {
            // abi.encodePacked is being used to concatenate strings
            return string(abi.encodePacked(_baseURI, _tokenURI));
        }
    }
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
    function _setBaseURI(string memory baseURI) internal {
        _baseURI = baseURI;
    }
    function baseURI() external view returns (string memory) {
        return _baseURI;
    }
    function _burn(address owner, uint256 tokenId) internal {
        super._burn(owner, tokenId);

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

contract ERC721Full is ERC721, ERC721Enumerable, ERC721Metadata {
    constructor (string memory name, string memory symbol) public ERC721Metadata(name, symbol) {
        // solhint-disable-previous-line no-empty-blocks
    }
}


contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ReentrancyGuard {
    bool private _notEntered;

    constructor () internal {
        _notEntered = true;
    }
    modifier nonReentrant() {
        require(_notEntered, "ReentrancyGuard: reentrant call");
        _notEntered = false;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _notEntered = true;
    }
}
// SPDX-License-Identifier: MIT



interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function decimals() external returns (uint8);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        // disabled require for making usages simple
        //require((value == 0) || (token.allowance(address(this), spender) == 0),
        //    "SafeERC20: approve from non-zero to non-zero allowance"
        //);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves.

        // A Solidity high level call has three parts:
        //  1. The target address is checked to verify it contains contract code
        //  2. The call itself is made, and success asserted
        //  3. The return value is decoded, which in turn checks the size of the returned data.
        // solhint-disable-next-line max-line-length
        require(address(token).isContract(), "SafeERC20: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = address(token).call(data);
        require(success, "SafeERC20: low-level call failed");

        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}


interface IClaims {
    function getClaimbyIndex(uint _claimId) external view returns (
        uint claimId,
        uint status,
        int8 finalVerdict,
        address claimOwner,
        uint coverId
    );
    function submitClaim(uint coverId) external;
}

interface IClaimsData {
    function actualClaimLength() external view returns(uint);
}

interface IDSValue {
    function peek() external view returns (bytes32, bool);
    function read() external view returns (bytes32);
}


interface INXMMaster {
    function tokenAddress() external view returns(address);
    function owner() external view returns(address);
    function pauseTime() external view returns(uint);
    function masterInitialized() external view returns(bool);
    function isPause() external view returns(bool check);
    function isMember(address _add) external view returns(bool);
    function getLatestAddress(bytes2 _contractName) external view returns(address payable contractAddress);
}

interface IMemberRoles {
    function switchMembership(address) external;
}

interface INXMToken {
    function balanceOf(address owner) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
}

interface IPool1  {
    function changeDependentContractAddress() external;
    function makeCoverBegin(
        address smartCAdd,
        bytes4 coverCurr,
        uint[] calldata coverDetails,
        uint16 coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        external
        payable;
    function makeCoverUsingCA(
        address smartCAdd,
        bytes4 coverCurr,
        uint[] calldata coverDetails,
        uint16 coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    )
        external;
    function getWei(uint amount) external view returns(uint);
    function sellNXMTokens(uint _amount) external  returns (bool);
}


interface IPoolData {

    struct ApiId {
        bytes4 typeOf;
        bytes4 currency;
        uint id;
        uint64 dateAdd;
        uint64 dateUpd;
    }

    struct CurrencyAssets {
        address currAddress;
        uint baseMin;
        uint varMin;
    }

    struct InvestmentAssets {
        address currAddress;
        bool status;
        uint64 minHoldingPercX100;
        uint64 maxHoldingPercX100;
        uint8 decimals;
    }

    struct IARankDetails {
        bytes4 maxIACurr;
        uint64 maxRate;
        bytes4 minIACurr;
        uint64 minRate;
    }

    struct McrData {
        uint mcrPercx100;
        uint mcrEther;
        uint vFull; //Pool funds
        uint64 date;
    }

    function setCapReached(uint val) external;
    function getInvestmentAssetDecimals(bytes4 curr) external returns(uint8 decimal);
    function getCurrencyAssetAddress(bytes4 curr) external view returns(address);
    function getInvestmentAssetAddress(bytes4 curr) external view returns(address);
    function getInvestmentAssetStatus(bytes4 curr) external view returns(bool status);
}

interface IQuotationData {

    enum HCIDStatus { NA, kycPending, kycPass, kycFailedOrRefunded, kycPassNoCover }
    enum CoverStatus { Active, ClaimAccepted, ClaimDenied, CoverExpired, ClaimSubmitted, Requested }

    struct Cover {
        address payable memberAddress;
        bytes4 currencyCode;
        uint sumAssured;
        uint16 coverPeriod;
        uint validUntil;
        address scAddress;
        uint premiumNXM;
    }

    struct HoldCover {
        uint holdCoverId;
        address payable userAddress;
        address scAddress;
        bytes4 coverCurr;
        uint[] coverDetails;
        uint16 coverPeriod;
    }

    function getCoverLength() external returns(uint len);
    function getAuthQuoteEngine() external returns(address _add);
    function getAllCoversOfUser(address _add) external returns(uint[] memory allCover);
    function getUserCoverLength(address _add) external returns(uint len);
    function getCoverStatusNo(uint _cid) external returns(uint8);
    function getCoverPeriod(uint _cid) external returns(uint32 cp);
    function getCoverSumAssured(uint _cid) external returns(uint sa);
    function getCurrencyOfCover(uint _cid) external returns(bytes4 curr);
    function getValidityOfCover(uint _cid) external returns(uint date);
    function getscAddressOfCover(uint _cid) external returns(uint, address);
    function getCoverMemberAddress(uint _cid) external returns(address payable _add);
    function getCoverPremiumNXM(uint _cid) external returns(uint _premiumNXM);
    function getCoverDetailsByCoverID1(
        uint _cid
    )
        external
        view
        returns (
            uint cid,
            address _memberAddress,
            address _scAddress,
            bytes4 _currencyCode,
            uint _sumAssured,
            uint premiumNXM
        );
    function getCoverDetailsByCoverID2(
        uint _cid
    )
        external
        view
        returns (
            uint cid,
            uint8 status,
            uint sumAssured,
            uint16 coverPeriod,
            uint validUntil
        );
    function getHoldedCoverDetailsByID1(
        uint _hcid
    )
        external
        view
        returns (
            uint hcid,
            address scAddress,
            bytes4 coverCurr,
            uint16 coverPeriod
        );
    function getUserHoldedCoverLength(address _add) external returns (uint);
    function getUserHoldedCoverByIndex(address _add, uint index) external returns (uint);
    function getHoldedCoverDetailsByID2(
        uint _hcid
    )
        external
        returns (
            uint hcid,
            address payable memberAddress,
            uint[] memory coverDetails
        );
    function getTotalSumAssuredSC(address _add, bytes4 _curr) external returns(uint amount);

}

interface ITokenData {
    function lockTokenTimeAfterCoverExp() external returns (uint);
}


interface IyInsure {
    struct Token {
        uint expirationTimestamp;
        bytes4 coverCurrency;
        uint coverAmount;
        uint coverPrice;
        uint coverPriceNXM;
        uint expireTime;
        uint generationTime;
        uint coverId;
        bool claimInProgress;
        uint claimId;
    }
    
    function transferFrom(address sender, address recipient, uint256 amount) external;
    function submitClaim(uint256 tokenId) external;
    function tokens(uint256 tokenId) external returns (uint, bytes4, uint, uint, uint, uint, uint, uint, bool, uint);
}

/** 
    @title Armor NFT
    @dev Armor NFT allows users to purchase Nexus Mutual cover and convert it into 
         a transferable token. It also allows users to swap their Yearn yNFT for Armor arNFT.
    @author ArmorFi -- Robert M.C. Forster, Taek Lee
**/
contract arNFT is
    ERC721Full("ArmorNFT", "arNFT"),
    Ownable,
    ReentrancyGuard {
    
    using SafeMath for uint;
    using SafeERC20 for IERC20;
    
    bytes4 internal constant ethCurrency = "ETH";
    
    // cover Id => claim Id
    mapping (uint256 => uint256) public claimIds;
    
    // cover Id => cover price
    mapping (uint256 => uint256) public coverPrices;
    
    // cover Id => yNFT token Id.
    // Used to route yNFT submits through their contract.
    // if zero, it is not swapped from yInsure
    mapping (uint256 => uint256) public swapIds;

    // Mapping ("NAME" => smart contract address) of allowed cover currencies.
    mapping (bytes4 => address) public coverCurrencies;

    // indicates if swap for yInsure is available
    // cannot go back to false
    bool public swapActivated;

    // Nexus Mutual master contract.
    INXMMaster public nxMaster;

    // yNFT contract that we're swapping tokens from.
    IyInsure public ynft;

    // NXM token.
    IERC20 public nxmToken;
    
    enum CoverStatus {
        Active,
        ClaimAccepted,
        ClaimDenied,
        CoverExpired,
        ClaimSubmitted,
        Requested
    }
    
    enum ClaimStatus {
        PendingClaimAssessorVote, // 0
        PendingClaimAssessorVoteDenied, // 1
        PendingClaimAssessorVoteThresholdNotReachedAccept, // 2
        PendingClaimAssessorVoteThresholdNotReachedDeny, // 3
        PendingClaimAssessorConsensusNotReachedAccept, // 4
        PendingClaimAssessorConsensusNotReachedDeny, // 5
        FinalClaimAssessorVoteDenied, // 6
        FinalClaimAssessorVoteAccepted, // 7
        FinalClaimAssessorVoteDeniedMVAccepted, // 8
        FinalClaimAssessorVoteDeniedMVDenied, // 9
        FinalClaimAssessorVotAcceptedMVNoDecision, // 10
        FinalClaimAssessorVoteDeniedMVNoDecision, // 11
        ClaimAcceptedPayoutPending, // 12
        ClaimAcceptedNoPayout, // 13
        ClaimAcceptedPayoutDone // 14
    }

    event SwappedYInsure (
        uint256 indexed yInsureTokenId,
        uint256 indexed coverId
    );

    event ClaimSubmitted (
        uint256 indexed coverId,
        uint256 indexed claimId
    );
    
    event ClaimRedeemed (
        address indexed receiver,
        bytes4 indexed currency,
        uint256 value
    );

    event BuyCover (
        uint indexed coverId,
        address indexed buyer,
        address indexed coveredContract,
        bytes4 currency,
        uint256 coverAmount,
        uint256 coverPrice,
        uint256 startTime,
        uint16 coverPeriod
    );

    
    /**
     * @dev Make sure only the owner of a token or someone approved to transfer it can call.
     * @param _tokenId Id of the token being checked.
    **/
    modifier onlyTokenApprovedOrOwner(uint256 _tokenId) {
        require(_isApprovedOrOwner(msg.sender, _tokenId), "Not approved or owner");
        _;
    }

    constructor(address _nxMaster, address _ynft, address _nxmToken) public {
        nxMaster = INXMMaster(_nxMaster);
        ynft = IyInsure(_ynft);
        nxmToken = IERC20(_nxmToken);
    }
    
    function () payable external {}
    
    // Arguments to be passed as coverDetails, from the quote api:
    //    coverDetails[0] = coverAmount;
    //    coverDetails[1] = coverPrice;
    //    coverDetails[2] = coverPriceNXM;
    //    coverDetails[3] = expireTime;
    //    coverDetails[4] = generationTime;
    /**
     * @dev Main function to buy a cover.
     * @param _coveredContractAddress Address of the protocol to buy cover for.
     * @param _coverCurrency bytes4 currency name to buy coverage for.
     * @param _coverPeriod Amount of time to buy cover for.
     * @param _v , _r, _s Signature of the Nexus Mutual API.
    **/
    function buyCover(
        address _coveredContractAddress,
        bytes4 _coverCurrency,
        uint[] calldata _coverDetails,
        uint16 _coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) external payable {
        uint256 coverPrice = _coverDetails[1];

        if (_coverCurrency == "ETH") {
            require(msg.value == coverPrice, "Incorrect value sent");
        } else {
            IERC20 erc20 = IERC20( coverCurrencies[_coverCurrency] );
            require(erc20 != IERC20( address(0) ), "Cover currency is not allowed.");

            require(msg.value == 0, "Eth not required when buying with erc20");
            erc20.safeTransferFrom(msg.sender, address(this), coverPrice);
        }
        
        uint256 coverId = _buyCover(_coveredContractAddress, _coverCurrency, _coverDetails, _coverPeriod, _v, _r, _s);
        _mint(msg.sender, coverId);
        
        emit BuyCover(coverId, msg.sender, _coveredContractAddress, _coverCurrency, _coverDetails[0], _coverDetails[1], 
                      block.timestamp, _coverPeriod);
    }
    
    /**
     * @dev Submit a claim for the NFT after a hack has happened on its protocol.
     * @param _tokenId ID of the token a claim is being submitted for.
    **/
    function submitClaim(uint256 _tokenId) external onlyTokenApprovedOrOwner(_tokenId) {
        // If this was a yNFT swap, we must route the submit through them.
        if (swapIds[_tokenId] != 0) {
            _submitYnftClaim(_tokenId);
            return;
        }
        
        (uint256 coverId, /*uint8 coverStatus*/, /*sumAssured*/, /*coverPeriod*/, /*uint256 validUntil*/) = _getCover2(_tokenId);

        uint256 claimId = _submitClaim(coverId);
        claimIds[_tokenId] = claimId;
        
        emit ClaimSubmitted(coverId, claimId);
    }
    
    /**
     * @dev Redeem a claim that has been accepted and paid out.
     * @param _tokenId Id of the token to redeem claim for.
    **/
    function redeemClaim(uint256 _tokenId) public onlyTokenApprovedOrOwner(_tokenId)  nonReentrant {
        require(claimIds[_tokenId] != 0, "No claim is in progress.");
        
        (/*cid*/, /*memberAddress*/, /*scAddress*/, bytes4 currencyCode, /*sumAssured*/, /*premiumNXM*/) = _getCover1(_tokenId);
        ( , /*uint8 coverStatus*/, uint256 sumAssured, , ) = _getCover2(_tokenId);
        
        require(_payoutIsCompleted(claimIds[_tokenId]), "Claim accepted but payout not completed");
       
        // this will prevent duplicate redeem 
        _burn(_tokenId);
        _sendAssuredSum(currencyCode, sumAssured);
        
        emit ClaimRedeemed(msg.sender, currencyCode, sumAssured);
    }
    
    function activateSwap()
      public
      onlyOwner
    {
        require(!swapActivated, "Already Activated");
        swapActivated = true;
    }

    /**
     * @dev External swap yNFT token for our own. Simple process because we do not need to create cover.
     * @param _ynftTokenId The ID of the token on yNFT's contract.
    **/
    function swapYnft(uint256 _ynftTokenId)
      public
    {
        require(swapActivated, "Swap is not activated yet");
        //this does not returns bool
        ynft.transferFrom(msg.sender, address(this), _ynftTokenId);
        
        (uint256 coverPrice, uint256 coverId, uint256 claimId) = _getCoverAndClaim(_ynftTokenId);

        _mint(msg.sender, coverId);

        swapIds[coverId] = _ynftTokenId;
        claimIds[coverId] = claimId;
        coverPrices[coverId] = coverPrice;
        
        emit SwappedYInsure(_ynftTokenId, coverId);
    }
    
    /**
     * @dev Swaps a batch of yNFT tokens for our own.
     * @param _tokenIds An array of the IDs of the tokens on yNFT's contract.
    **/
    function batchSwapYnft(uint256[] calldata _tokenIds)
      external
    {
        for (uint256 i = 0; i < _tokenIds.length; i++) {
            swapYnft(_tokenIds[i]);
        }
    }
    
   /**
     * @dev Owner can approve the contract for any new ERC20 (so we don't need to in every buy).
     * @param _tokenAddress Address of the ERC20 that we want approved.
    **/
    function approveToken(address _tokenAddress)
      external
    {
        IPool1 pool1 = IPool1(nxMaster.getLatestAddress("P1"));
        address payable pool1Address = address(uint160(address(pool1)));
        IERC20 erc20 = IERC20(_tokenAddress);
        erc20.safeApprove( pool1Address, uint256(-1) );
    }
    
    /**
     * @dev Getter for all token info from Nexus Mutual.
     * @param _tokenId of the token to get cover info for (also NXM cover ID).
     * @return All info from NXM about the cover.
    **/
    function getToken(uint256 _tokenId)
      external
      view
    returns (uint256 cid, 
             uint8 status, 
             uint256 sumAssured,
             uint16 coverPeriod, 
             uint256 validUntil, 
             address scAddress, 
             bytes4 currencyCode, 
             uint256 premiumNXM,
             uint256 coverPrice,
             uint256 claimId)
    {
        (/*cid*/, /*memberAddress*/, scAddress, currencyCode, /*sumAssured*/, premiumNXM) = _getCover1(_tokenId);
        (cid, status, sumAssured, coverPeriod, validUntil) = _getCover2(_tokenId);
        coverPrice = coverPrices[_tokenId];
        claimId = claimIds[_tokenId];
    }
    
    /**
     * @dev Get status of a cover claim.
     * @param _tokenId Id of the token we're checking.
     * @return Status of the claim being made on the token.
    **/
    function getCoverStatus(uint256 _tokenId) external view returns (uint8 coverStatus, bool payoutCompleted) {
        (, coverStatus, , , ) = _getCover2(_tokenId);
        payoutCompleted = _payoutIsCompleted(claimIds[_tokenId]);
    }
    
    /**
     * @dev Get address of the NXM Member Roles contract.
     * @return Address of the current Member Roles contract.
    **/
    function getMemberRoles() public view returns (address) {
        return nxMaster.getLatestAddress("MR");
    }
    
    /**
     * @dev Change membership to new address.
     * @param _newMembership Membership address to change to.
    **/
    function switchMembership(address _newMembership) external onlyOwner {
        nxmToken.safeApprove(getMemberRoles(),uint(-1));
        IMemberRoles(getMemberRoles()).switchMembership(_newMembership);
    }
    
    /**
     * @dev Internal function for buying cover--params are same as eponymous external function.
     * @return coverId ID of the new cover that has been bought.
    **/
    function _buyCover(
        address _coveredContractAddress,
        bytes4 _coverCurrency,
        uint[] memory _coverDetails,
        uint16 _coverPeriod,
        uint8 _v,
        bytes32 _r,
        bytes32 _s
    ) internal returns (uint256 coverId) {
    
        uint256 coverPrice = _coverDetails[1];
        IPool1 pool1 = IPool1(nxMaster.getLatestAddress("P1"));

        if (_coverCurrency == "ETH") {
            pool1.makeCoverBegin.value(coverPrice)(_coveredContractAddress, _coverCurrency, _coverDetails, _coverPeriod, _v, _r, _s);
        } else {
            pool1.makeCoverUsingCA(_coveredContractAddress, _coverCurrency, _coverDetails, _coverPeriod, _v, _r, _s);
        }
    
        IQuotationData quotationData = IQuotationData(nxMaster.getLatestAddress("QD"));
        // *assumes* the newly created claim is appended at the end of the list covers
        coverId = quotationData.getCoverLength().sub(1);
        
        // Keep track of how much was paid for this cover.
        coverPrices[coverId] = coverPrice;
    }
    
    /**
     * @dev Internal submit claim function.
     * @param _coverId on the NXM contract (same as our token ID).
     * @return claimId of the new claim.
    **/
    function _submitClaim(uint256 _coverId) internal returns (uint256) {
        IClaims claims = IClaims(nxMaster.getLatestAddress("CL"));
        claims.submitClaim(_coverId);
    
        IClaimsData claimsData = IClaimsData(nxMaster.getLatestAddress("CD"));
        uint256 claimId = claimsData.actualClaimLength() - 1;
        return claimId;
    }
    
    /**
     * Submits a claim through yNFT if this was a swapped token.
     * @param _tokenId ID of the token on the arNFT contract.
    **/
    function _submitYnftClaim(uint256 _tokenId)
      internal
    {
        uint256 ynftTokenId = swapIds[_tokenId];
        ynft.submitClaim(ynftTokenId);
        
        (/*coverPrice*/, /*coverId*/, uint256 claimId) = _getCoverAndClaim(ynftTokenId);
        claimIds[_tokenId] = claimId;
    }

    /**
     * @dev Check whether the payout of a claim has occurred.
     * @param _claimId ID of the claim we are checking.
     * @return True if claim has been paid out, false if not.
    **/
    function _payoutIsCompleted(uint256 _claimId) internal view returns (bool) {
        uint256 status;
        IClaims claims = IClaims(nxMaster.getLatestAddress("CL"));
        (, status, , , ) = claims.getClaimbyIndex(_claimId);
        return status == uint256(ClaimStatus.ClaimAcceptedPayoutDone);
    }

    /**
     * @dev Send tokens after a successful redeem claim.
     * @param _coverCurrency bytes4 of the currency being used.
     * @param _sumAssured The amount of the currency to send.
    **/
    function _sendAssuredSum(bytes4 _coverCurrency, uint256 _sumAssured) internal {
        uint256 claimReward;

        if (_coverCurrency == ethCurrency) {
            claimReward = _sumAssured * (10 ** 18);
            msg.sender.transfer(claimReward);
        } else {
            IERC20 erc20 = IERC20( coverCurrencies[_coverCurrency] );
            require (erc20 != IERC20( address(0) ), "Cover currency is not allowed.");

            uint256 decimals = uint256(erc20.decimals());
            claimReward = _sumAssured * (10 ** decimals);
            erc20.safeTransfer(msg.sender, claimReward);
        }
    }
    
    /**
     * @dev Get the cover Id and claim Id of the token from the ynft contract.
     * @param _ynftTokenId The Id of the token on the ynft contract.
    **/
    function _getCoverAndClaim(uint256 _ynftTokenId)
      internal
    returns (uint256 coverPrice, uint256 coverId, uint256 claimId)
    {
       ( , , , coverPrice, , , , coverId, , claimId) = ynft.tokens(_ynftTokenId);
    }
    
    /**
     * @dev Get (some) cover details from the NXM contracts.
     * @param _coverId ID of the cover to get--same as our token ID.
     * @return Details about the token.
    **/
    function _getCover1 (
        uint256 _coverId
    ) internal view returns (
        uint256 cid,
        address memberAddress,
        address scAddress,
        bytes4 currencyCode,
        uint256 sumAssured,
        uint256 premiumNXM
    ) {
        IQuotationData quotationData = IQuotationData(nxMaster.getLatestAddress("QD"));
        return quotationData.getCoverDetailsByCoverID1(_coverId);
    }
    
    /**
     * @dev Get the rest of the cover details from NXM contracts.
     * @param _coverId ID of the cover to get--same as our token ID.
     * @return 2nd set of details about the token.
    **/
    function _getCover2 (
        uint256 _coverId
    ) internal view returns (
        uint256 cid,
        uint8 status,
        uint256 sumAssured,
        uint16 coverPeriod,
        uint256 validUntil
    ) {
        IQuotationData quotationData = IQuotationData(nxMaster.getLatestAddress("QD"));
        return quotationData.getCoverDetailsByCoverID2(_coverId);
    }
    
    /**
     * @dev Approve an address to spend NXM tokens from the contract.
     * @param _spender Address to be approved.
     * @param _value The amount of NXM to be approved.
    **/
    function nxmTokenApprove(address _spender, uint256 _value) public onlyOwner {
        nxmToken.safeApprove(_spender, _value);
    }

    /**
     * @dev Add an allowed cover currency to the arNFT system if one is added to Nexus Mutual.
     * @param _coverCurrency Address of the cover currency to add.
    **/
    function addCurrency(bytes4 _coverCurrency, address _coverCurrencyAddress) public onlyOwner {
        require(coverCurrencies[_coverCurrency] == address(0), "Cover currency already exists.");
        coverCurrencies[_coverCurrency] = _coverCurrencyAddress;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_nxMaster","type":"address"},{"internalType":"address","name":"_ynft","type":"address"},{"internalType":"address","name":"_nxmToken","type":"address"}],"payable":false,"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":true,"internalType":"uint256","name":"coverId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"coveredContract","type":"address"},{"indexed":false,"internalType":"bytes4","name":"currency","type":"bytes4"},{"indexed":false,"internalType":"uint256","name":"coverAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"coverPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"coverPeriod","type":"uint16"}],"name":"BuyCover","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"bytes4","name":"currency","type":"bytes4"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"ClaimRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"coverId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"claimId","type":"uint256"}],"name":"ClaimSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"yInsureTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"coverId","type":"uint256"}],"name":"SwappedYInsure","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"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":false,"inputs":[],"name":"activateSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes4","name":"_coverCurrency","type":"bytes4"},{"internalType":"address","name":"_coverCurrencyAddress","type":"address"}],"name":"addCurrency","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"approveToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"batchSwapYnft","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_coveredContractAddress","type":"address"},{"internalType":"bytes4","name":"_coverCurrency","type":"bytes4"},{"internalType":"uint256[]","name":"_coverDetails","type":"uint256[]"},{"internalType":"uint16","name":"_coverPeriod","type":"uint16"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"buyCover","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"name":"coverCurrencies","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"coverPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCoverStatus","outputs":[{"internalType":"uint8","name":"coverStatus","type":"uint8"},{"internalType":"bool","name":"payoutCompleted","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMemberRoles","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getToken","outputs":[{"internalType":"uint256","name":"cid","type":"uint256"},{"internalType":"uint8","name":"status","type":"uint8"},{"internalType":"uint256","name":"sumAssured","type":"uint256"},{"internalType":"uint16","name":"coverPeriod","type":"uint16"},{"internalType":"uint256","name":"validUntil","type":"uint256"},{"internalType":"address","name":"scAddress","type":"address"},{"internalType":"bytes4","name":"currencyCode","type":"bytes4"},{"internalType":"uint256","name":"premiumNXM","type":"uint256"},{"internalType":"uint256","name":"coverPrice","type":"uint256"},{"internalType":"uint256","name":"claimId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nxMaster","outputs":[{"internalType":"contract INXMMaster","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"nxmToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"nxmTokenApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"redeemClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"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":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"submitClaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"swapActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_ynftTokenId","type":"uint256"}],"name":"swapYnft","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newMembership","type":"address"}],"name":"switchMembership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ynft","outputs":[{"internalType":"contract IyInsure","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506040516200404e3803806200404e833981810160405260608110156200003757600080fd5b508051602080830151604093840151845180860186526008815267105c9b5bdc93919560c21b8185015285518087019096526005865264185c93919560da1b938601939093529293909291908181620000a06301ffc9a760e01b6001600160e01b03620001e016565b620000bb6380ac58cd60e01b6001600160e01b03620001e016565b620000d663780e9d6360e01b6001600160e01b03620001e016565b8151620000eb9060079060208501906200026a565b508051620001019060089060208401906200026a565b506200011d635b5e139f60e01b6001600160e01b03620001e016565b505050506000620001336200026560201b60201c565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600b805460ff60a01b1916600160a01b179055601080546001600160a01b0394851661010002610100600160a81b0319909116179055601180549284166001600160a01b0319938416179055601280549190931691161790556200030c565b6001600160e01b0319808216141562000240576040805162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b335b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620002ad57805160ff1916838001178555620002dd565b82800160010185558215620002dd579182015b82811115620002dd578251825591602001919060010190620002c0565b50620002eb929150620002ef565b5090565b6200026791905b80821115620002eb5760008155600101620002f6565b613d32806200031c6000396000f3fe6080604052600436106102465760003560e01c80638e2eae4811610139578063b88d4fde116100b6578063e4b50cb81161007a578063e4b50cb8146109ed578063e967eb1a14610a7e578063e985e9c514610a93578063ed64240f14610ace578063f2fde38b14610b11578063f54e753e14610b4457610246565b8063b88d4fde1461086a578063c87b56dd1461093d578063d28b43be14610967578063dc4645c31461097c578063de96da35146109c357610246565b8063aad873fb116100fd578063aad873fb14610784578063b1893439146107ae578063b1f01e3e146107c3578063b35bd5a1146107d8578063b4634a5e1461085557610246565b80638e2eae48146106bc5780638f32d59b146106e657806391be3713146106fb57806395d89b4114610734578063a22cb4651461074957610246565b80634e170591116101c757806370a082311161018b57806370a0823114610584578063715018a6146105b75780637388614b146105cc57806380b2edd8146106745780638da5cb5b146106a757610246565b80634e170591146104d35780634ed75d47146104e85780636352211e1461051b5780636aa14a96146105455780636c0360eb1461056f57610246565b806323b872dd1161020e57806323b872dd146103c057806325401d8e146104035780632f745c591461042d5780633500e4a91461046657806342842e0e1461049057610246565b806301ffc9a71461024857806306fdde0314610290578063081812fc1461031a578063095ea7b31461036057806318160ddd14610399575b005b34801561025457600080fd5b5061027c6004803603602081101561026b57600080fd5b50356001600160e01b031916610b78565b604080519115158252519081900360200190f35b34801561029c57600080fd5b506102a5610b9b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102df5781810151838201526020016102c7565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561032657600080fd5b506103446004803603602081101561033d57600080fd5b5035610c32565b604080516001600160a01b039092168252519081900360200190f35b34801561036c57600080fd5b506102466004803603604081101561038357600080fd5b506001600160a01b038135169060200135610c94565b3480156103a557600080fd5b506103ae610dbc565b60408051918252519081900360200190f35b3480156103cc57600080fd5b50610246600480360360608110156103e357600080fd5b506001600160a01b03813581169160208101359091169060400135610dc2565b34801561040f57600080fd5b506103ae6004803603602081101561042657600080fd5b5035610e1e565b34801561043957600080fd5b506103ae6004803603604081101561045057600080fd5b506001600160a01b038135169060200135610e30565b34801561047257600080fd5b506102466004803603602081101561048957600080fd5b5035610eaf565b34801561049c57600080fd5b50610246600480360360608110156104b357600080fd5b506001600160a01b038135811691602081013590911690604001356110b3565b3480156104df57600080fd5b506103446110ce565b3480156104f457600080fd5b506102466004803603602081101561050b57600080fd5b50356001600160a01b0316611153565b34801561052757600080fd5b506103446004803603602081101561053e57600080fd5b503561123a565b34801561055157600080fd5b506102466004803603602081101561056857600080fd5b5035611294565b34801561057b57600080fd5b506102a561136a565b34801561059057600080fd5b506103ae600480360360208110156105a757600080fd5b50356001600160a01b03166113cb565b3480156105c357600080fd5b5061024661142e565b610246600480360360e08110156105e257600080fd5b6001600160a01b03823516916001600160e01b03196020820135169181019060608101604082013564010000000081111561061c57600080fd5b82018360208201111561062e57600080fd5b8035906020019184602083028401116401000000008311171561065057600080fd5b919350915061ffff8135169060ff60208201351690604081013590606001356114bf565b34801561068057600080fd5b506102466004803603602081101561069757600080fd5b50356001600160a01b03166116fa565b3480156106b357600080fd5b506103446117a0565b3480156106c857600080fd5b506103ae600480360360208110156106df57600080fd5b50356117af565b3480156106f257600080fd5b5061027c6117c1565b34801561070757600080fd5b506102466004803603604081101561071e57600080fd5b506001600160a01b0381351690602001356117e7565b34801561074057600080fd5b506102a561184b565b34801561075557600080fd5b506102466004803603604081101561076c57600080fd5b506001600160a01b03813516906020013515156118ac565b34801561079057600080fd5b50610246600480360360208110156107a757600080fd5b50356119b1565b3480156107ba57600080fd5b50610344611aef565b3480156107cf57600080fd5b50610246611afe565b3480156107e457600080fd5b50610246600480360360208110156107fb57600080fd5b81019060208101813564010000000081111561081657600080fd5b82018360208201111561082857600080fd5b8035906020019184602083028401116401000000008311171561084a57600080fd5b509092509050611ba0565b34801561086157600080fd5b50610344611bce565b34801561087657600080fd5b506102466004803603608081101561088d57600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156108c857600080fd5b8201836020820111156108da57600080fd5b803590602001918460018302840111640100000000831117156108fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611be2945050505050565b34801561094957600080fd5b506102a56004803603602081101561096057600080fd5b5035611c3a565b34801561097357600080fd5b5061027c611e06565b34801561098857600080fd5b506109a66004803603602081101561099f57600080fd5b5035611e0f565b6040805160ff909316835290151560208301528051918290030190f35b3480156109cf57600080fd5b506103ae600480360360208110156109e657600080fd5b5035611e41565b3480156109f957600080fd5b50610a1760048036036020811015610a1057600080fd5b5035611e53565b604080519a8b5260ff90991660208b01528989019790975261ffff909516606089015260808801939093526001600160a01b0390911660a08701526001600160e01b03191660c086015260e085015261010084015261012083015251908190036101400190f35b348015610a8a57600080fd5b50610344611ed0565b348015610a9f57600080fd5b5061027c60048036036040811015610ab657600080fd5b506001600160a01b0381358116916020013516611edf565b348015610ada57600080fd5b5061024660048036036040811015610af157600080fd5b5080356001600160e01b03191690602001356001600160a01b0316611f0d565b348015610b1d57600080fd5b5061024660048036036020811015610b3457600080fd5b50356001600160a01b0316612003565b348015610b5057600080fd5b5061034460048036036020811015610b6757600080fd5b50356001600160e01b031916612056565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b505050505090505b90565b6000610c3d82612071565b610c785760405162461bcd60e51b815260040180806020018281038252602c815260200180613b6b602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000610c9f8261123a565b9050806001600160a01b0316836001600160a01b03161415610cf25760405162461bcd60e51b8152600401808060200182810382526021815260200180613c0f6021913960400191505060405180910390fd5b806001600160a01b0316610d0461208e565b6001600160a01b03161480610d255750610d2581610d2061208e565b611edf565b610d605760405162461bcd60e51b8152600401808060200182810382526038815260200180613ae06038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60035490565b610dd3610dcd61208e565b82612092565b610e0e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613c306031913960400191505060405180910390fd5b610e19838383612136565b505050565b600c6020526000908152604090205481565b6000610e3b836113cb565b8210610e785760405162461bcd60e51b815260040180806020018281038252602b815260200180613a0d602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260409020805483908110610e9c57fe5b9060005260206000200154905092915050565b80610eba3382612092565b610f03576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b600b54600160a01b900460ff16610f61576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600b805460ff60a01b191690556000828152600c6020526040902054610fce576040805162461bcd60e51b815260206004820152601860248201527f4e6f20636c61696d20697320696e2070726f67726573732e0000000000000000604482015290519081900360640190fd5b6000610fd983612155565b505093505050506000610feb84612291565b50506000878152600c602052604090205490935061100b925090506123c3565b6110465760405162461bcd60e51b8152600401808060200182810382526027815260200180613cd76027913960400191505060405180910390fd5b61104f846124d7565b61105982826124e9565b6040805182815290516001600160e01b031984169133917fa3d1683ef352f1eac34dfdc12e69d7fc00e36c0048e677f498a8efb71deb3ba59181900360200190a35050600b805460ff60a01b1916600160a01b1790555050565b610e1983838360405180602001604052806000815250611be2565b601054604080516227050b60e31b81526126a960f11b6004820152905160009261010090046001600160a01b0316916301382858916024808301926020929190829003018186803b15801561112257600080fd5b505afa158015611136573d6000803e3d6000fd5b505050506040513d602081101561114c57600080fd5b5051905090565b61115b6117c1565b61119a576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b6111c06111a56110ce565b6012546001600160a01b03169060001963ffffffff61264916565b6111c86110ce565b6001600160a01b0316634ed75d47826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b5050505050565b6000818152600160205260408120546001600160a01b03168061128e5760405162461bcd60e51b8152600401808060200182810382526029815260200180613b426029913960400191505060405180910390fd5b92915050565b8061129f3382612092565b6112e8576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b6000828152600e60205260409020541561130a576113058261269b565b611366565b600061131583612291565b50505050905060006113268261272f565b6000858152600c602052604080822083905551919250829184917f675e9cd1ef5a9bb6971c9f1099eced3c6607be0407bc871bc50a8a7b36832e7491a350505b5050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c275780601f10610bfc57610100808354040283529160200191610c27565b60006001600160a01b0382166114125760405162461bcd60e51b815260040180806020018281038252602a815260200180613b18602a913960400191505060405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6114366117c1565b611475576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b6000868660018181106114ce57fe5b905060200201359050876001600160e01b0319166208aa8960eb1b141561153f5780341461153a576040805162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd081d985b1d59481cd95b9d60621b604482015290519081900360640190fd5b61160e565b6001600160e01b031988166000908152600f60205260409020546001600160a01b0316806115b4576040805162461bcd60e51b815260206004820152601e60248201527f436f7665722063757272656e6379206973206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b34156115f15760405162461bcd60e51b8152600401808060200182810382526027815260200180613c616027913960400191505060405180910390fd5b61160c6001600160a01b03821633308563ffffffff61292c16565b505b60006116548a8a8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c92508b91508a905089612986565b90506116603382612d5e565b6001600160a01b038a1633827f75d1b0ed8db2ddc759239c0ba70041d14ad98d912aa0b54e3ee044bf0da967198c8c8c60008161169957fe5b905060200201358d8d60018181106116ad57fe5b604080516001600160e01b0319909616865260208681019590955293029190910135838301525042606083015261ffff8c166080830152519081900360a00190a450505050505050505050565b601054604080516227050b60e31b815261503160f01b6004820152905160009261010090046001600160a01b0316916301382858916024808301926020929190829003018186803b15801561174e57600080fd5b505afa158015611762573d6000803e3d6000fd5b505050506040513d602081101561177857600080fd5b50519050808261179a6001600160a01b0382168360001963ffffffff61264916565b50505050565b600b546001600160a01b031690565b600e6020526000908152604090205481565b600b546000906001600160a01b03166117d861208e565b6001600160a01b031614905090565b6117ef6117c1565b61182e576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b601254611366906001600160a01b0316838363ffffffff61264916565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c275780601f10610bfc57610100808354040283529160200191610c27565b6118b461208e565b6001600160a01b0316826001600160a01b0316141561191a576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b806004600061192761208e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561196b61208e565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b60105460ff16611a08576040805162461bcd60e51b815260206004820152601960248201527f53776170206973206e6f74206163746976617465642079657400000000000000604482015290519081900360640190fd5b601154604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b505050506000806000611a8784612d72565b925092509250611a973383612d5e565b6000828152600e60209081526040808320879055600c8252808320849055600d90915280822085905551839186917fcadd753d34af01c155953459c29d3d46334ef736e1663d15c14b208f6e3a79ab9190a350505050565b6011546001600160a01b031681565b611b066117c1565b611b45576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b60105460ff1615611b91576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481058dd1a5d985d1959607a1b604482015290519081900360640190fd5b6010805460ff19166001179055565b60005b81811015610e1957611bc6838383818110611bba57fe5b905060200201356119b1565b600101611ba3565b60105461010090046001600160a01b031681565b611bf3611bed61208e565b83612092565b611c2e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613c306031913960400191505060405180910390fd5b61179a84848484612e10565b6060611c4582612071565b611c805760405162461bcd60e51b815260040180806020018281038252602f815260200180613be0602f913960400191505060405180910390fd5b6000828152600a602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015611d155780601f10611cea57610100808354040283529160200191611d15565b820191906000526020600020905b815481529060010190602001808311611cf857829003601f168201915b50505050509050805160001415611d3c575050604080516020810190915260008152610b96565b6009816040516020018083805460018160011615610100020316600290048015611d9d5780601f10611d7b576101008083540402835291820191611d9d565b820191906000526020600020905b815481529060010190602001808311611d89575b5050825160208401908083835b60208310611dc95780518252601f199092019160209182019101611daa565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050610b96565b60105460ff1681565b600080611e1b83612291565b5050506000858152600c6020526040902054909350611e3a91506123c3565b9050915091565b600d6020526000908152604090205481565b600080600080600080600080600080611e6b8b612155565b929950909750909550611e8392508d91506122919050565b809a50819b50829c50839d50849e505050505050600d60008c8152602001908152602001600020549150600c60008c81526020019081526020016000205490509193959799509193959799565b6012546001600160a01b031681565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b611f156117c1565b611f54576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b6001600160e01b031982166000908152600f60205260409020546001600160a01b031615611fc9576040805162461bcd60e51b815260206004820152601e60248201527f436f7665722063757272656e637920616c7265616479206578697374732e0000604482015290519081900360640190fd5b6001600160e01b0319919091166000908152600f6020526040902080546001600160a01b0319166001600160a01b03909216919091179055565b61200b6117c1565b61204a576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b61205381612e62565b50565b600f602052600090815260409020546001600160a01b031681565b6000908152600160205260409020546001600160a01b0316151590565b3390565b600061209d82612071565b6120d85760405162461bcd60e51b815260040180806020018281038252602c815260200180613ab4602c913960400191505060405180910390fd5b60006120e38361123a565b9050806001600160a01b0316846001600160a01b0316148061211e5750836001600160a01b031661211384610c32565b6001600160a01b0316145b8061212e575061212e8185611edf565b949350505050565b612141838383612f03565b61214b8382613005565b610e1982826130f3565b6000806000806000806000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b1580156121be57600080fd5b505afa1580156121d2573d6000803e3d6000fd5b505050506040513d60208110156121e857600080fd5b50516040805163df09fea760e01b8152600481018b905290519192506001600160a01b0383169163df09fea79160248082019260c092909190829003018186803b15801561223557600080fd5b505afa158015612249573d6000803e3d6000fd5b505050506040513d60c081101561225f57600080fd5b508051602082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b600080600080600080601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b1580156122f857600080fd5b505afa15801561230c573d6000803e3d6000fd5b505050506040513d602081101561232257600080fd5b505160408051631993d17d60e11b8152600481018a905290519192506001600160a01b03831691633327a2fa9160248082019260a092909190829003018186803b15801561236f57600080fd5b505afa158015612383573d6000803e3d6000fd5b505050506040513d60a081101561239957600080fd5b508051602082015160408301516060840151608090940151929b919a509850919650945092505050565b6000806000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b15801561242657600080fd5b505afa15801561243a573d6000803e3d6000fd5b505050506040513d602081101561245057600080fd5b505160408051631e41b72960e11b81526004810187905290519192506001600160a01b03831691633c836e529160248082019260a092909190829003018186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d60a08110156124c757600080fd5b5060200151600e14949350505050565b6120536124e38261123a565b82613131565b60006001600160e01b031983166208aa8960eb1b14156125435750604051670de0b6b3a7640000820290339082156108fc029083906000818181858888f1935050505015801561253d573d6000803e3d6000fd5b50610e19565b6001600160e01b031983166000908152600f60205260409020546001600160a01b0316806125b8576040805162461bcd60e51b815260206004820152601e60248201527f436f7665722063757272656e6379206973206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156125f557600080fd5b505af1158015612609573d6000803e3d6000fd5b505050506040513d602081101561261f57600080fd5b505160ff16600a81900a8502935090506112336001600160a01b038316338563ffffffff61317916565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610e199084906131c7565b6000818152600e6020526040808220546011548251633550a54b60e11b815260048101839052925191936001600160a01b0390911692636aa14a96926024808301939282900301818387803b1580156126f357600080fd5b505af1158015612707573d6000803e3d6000fd5b50505050600061271682612d72565b6000958652600c60205260409095209490945550505050565b600080601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b15801561279057600080fd5b505afa1580156127a4573d6000803e3d6000fd5b505050506040513d60208110156127ba57600080fd5b505160408051633550a54b60e11b81526004810186905290519192506001600160a01b03831691636aa14a969160248082019260009290919082900301818387803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b505050506000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d160f21b815250602001905060206040518083038186803b15801561288057600080fd5b505afa158015612894573d6000803e3d6000fd5b505050506040513d60208110156128aa57600080fd5b505160408051636235bbe160e11b815290519192506000916001916001600160a01b0385169163c46b77c291600480820192602092909190829003018186803b1580156128f657600080fd5b505afa15801561290a573d6000803e3d6000fd5b505050506040513d602081101561292057600080fd5b50510395945050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261179a9085906131c7565b6000808660018151811061299657fe5b602002602001015190506000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061503160f01b815250602001905060206040518083038186803b158015612a0057600080fd5b505afa158015612a14573d6000803e3d6000fd5b505050506040513d6020811015612a2a57600080fd5b505190506208aa8960eb1b6001600160e01b03198a161415612b4c57806001600160a01b03166368da80af838c8c8c8c8c8c8c6040518963ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160e01b0319166001600160e01b0319168152602001806020018661ffff1661ffff1681526020018560ff1660ff168152602001848152602001838152602001828103825287818151815260200191508051906020019060200280838360005b83811015612b04578181015183820152602001612aec565b50505050905001985050505050505050506000604051808303818588803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b5050505050612c38565b604051638076083d60e01b81526001600160a01b038b8116600483019081526001600160e01b03198c16602484015261ffff8a16606484015260ff8916608484015260a4830188905260c4830187905260e0604484019081528b5160e48501528b5192851693638076083d938f938f938f938f938f938f938f939192909161010401906020808a01910280838360005b83811015612bf4578181015183820152602001612bdc565b5050505090500198505050505050505050600060405180830381600087803b158015612c1f57600080fd5b505af1158015612c33573d6000803e3d6000fd5b505050505b601054604080516227050b60e31b815261145160f21b6004820152905160009261010090046001600160a01b0316916301382858916024808301926020929190829003018186803b158015612c8c57600080fd5b505afa158015612ca0573d6000803e3d6000fd5b505050506040513d6020811015612cb657600080fd5b50516040805163067157ff60e41b81529051919250612d3d916001916001600160a01b038516916367157ff0916004808201926020929091908290030181600087803b158015612d0557600080fd5b505af1158015612d19573d6000803e3d6000fd5b505050506040513d6020811015612d2f57600080fd5b50519063ffffffff61337f16565b6000818152600d602052604090209390935550909998505050505050505050565b612d6882826133c8565b61136682826130f3565b601154604080516327b2595f60e11b8152600481018490529051600092839283926001600160a01b0390921691634f64b2be916024808201926101409290919082900301818787803b158015612dc757600080fd5b505af1158015612ddb573d6000803e3d6000fd5b505050506040513d610140811015612df257600080fd5b50606081015160e08201516101209092015190969195509350915050565b612e1b848484612136565b612e27848484846134f3565b61179a5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a386032913960400191505060405180910390fd5b6001600160a01b038116612ea75760405162461bcd60e51b8152600401808060200182810382526026815260200180613a6a6026913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0316612f168261123a565b6001600160a01b031614612f5b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613bb76029913960400191505060405180910390fd5b6001600160a01b038216612fa05760405162461bcd60e51b8152600401808060200182810382526024815260200180613a906024913960400191505060405180910390fd5b612fa98161372e565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03821660009081526005602052604081205461302f90600163ffffffff61337f16565b6000838152600660205260409020549091508082146130ca576001600160a01b038416600090815260056020526040812080548490811061306c57fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b0316815260200190815260200160002083815481106130aa57fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b038416600090815260056020526040902080549061123390600019830161398a565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b61313b8282613769565b6000818152600a60205260409020546002600019610100600184161502019091160415611366576000818152600a60205260408120611366916139ae565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e199084905b6131d9826001600160a01b031661378f565b61322a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106132685780518252601f199092019160209182019101613249565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146132ca576040519150601f19603f3d011682016040523d82523d6000602084013e6132cf565b606091505b509150915081613326576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561179a5780806020019051602081101561334257600080fd5b505161179a5760405162461bcd60e51b815260040180806020018281038252602a815260200180613cad602a913960400191505060405180910390fd5b60006133c183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137c8565b9392505050565b6001600160a01b038216613423576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61342c81612071565b1561347e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020819052604090912080546001600160a01b0319166001600160a01b0385161790556003546134b49161385f565b60035560405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613507846001600160a01b031661378f565b6135135750600161212e565b600060606001600160a01b038616630a85bd0160e11b61353161208e565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156135aa578181015183820152602001613592565b50505050905090810190601f1680156135d75780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b6020831061363f5780518252601f199092019160209182019101613620565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136a1576040519150601f19603f3d011682016040523d82523d6000602084013e6136a6565b606091505b5091509150816136f7578051156136c05780518082602001fd5b60405162461bcd60e51b8152600401808060200182810382526032815260200180613a386032913960400191505060405180910390fd5b600081806020019051602081101561370e57600080fd5b50516001600160e01b031916630a85bd0160e11b14935061212e92505050565b6000818152600260205260409020546001600160a01b03161561205357600090815260026020526040902080546001600160a01b0319169055565b61377382826138b9565b61377d8282613005565b60009081526006602052604081205550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061212e575050151592915050565b600081848411156138575760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561381c578181015183820152602001613804565b50505050905090810190601f1680156138495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156133c1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b03166138cc8261123a565b6001600160a01b0316146139115760405162461bcd60e51b8152600401808060200182810382526025815260200180613c886025913960400191505060405180910390fd5b61391a8161372e565b600081815260016020819052604090912080546001600160a01b031916905560035461394b9163ffffffff61337f16565b60035560405181906000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b815481835581811115610e1957600083815260209020610e199181019083016139ee565b50805460018160011615610100020316600290046000825580601f106139d45750612053565b601f01602090049060005260206000209081019061205391905b610c2f91905b80821115613a0857600081556001016139f4565b509056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564457468206e6f74207265717569726564207768656e20627579696e6720776974682065726332304552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436c61696d20616363657074656420627574207061796f7574206e6f7420636f6d706c65746564a265627a7a7231582099c8a46cb0f302f3570910af47c029d0efa349edebae8f4da25ffe9a39a4028264736f6c6343000511003200000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e000000000000000000000000181aea6936b407514ebfc0754a37704eb8d98f91000000000000000000000000d7c49cee7e9188cca6ad8ff264c1da2e69d4cf3b

Deployed Bytecode

0x6080604052600436106102465760003560e01c80638e2eae4811610139578063b88d4fde116100b6578063e4b50cb81161007a578063e4b50cb8146109ed578063e967eb1a14610a7e578063e985e9c514610a93578063ed64240f14610ace578063f2fde38b14610b11578063f54e753e14610b4457610246565b8063b88d4fde1461086a578063c87b56dd1461093d578063d28b43be14610967578063dc4645c31461097c578063de96da35146109c357610246565b8063aad873fb116100fd578063aad873fb14610784578063b1893439146107ae578063b1f01e3e146107c3578063b35bd5a1146107d8578063b4634a5e1461085557610246565b80638e2eae48146106bc5780638f32d59b146106e657806391be3713146106fb57806395d89b4114610734578063a22cb4651461074957610246565b80634e170591116101c757806370a082311161018b57806370a0823114610584578063715018a6146105b75780637388614b146105cc57806380b2edd8146106745780638da5cb5b146106a757610246565b80634e170591146104d35780634ed75d47146104e85780636352211e1461051b5780636aa14a96146105455780636c0360eb1461056f57610246565b806323b872dd1161020e57806323b872dd146103c057806325401d8e146104035780632f745c591461042d5780633500e4a91461046657806342842e0e1461049057610246565b806301ffc9a71461024857806306fdde0314610290578063081812fc1461031a578063095ea7b31461036057806318160ddd14610399575b005b34801561025457600080fd5b5061027c6004803603602081101561026b57600080fd5b50356001600160e01b031916610b78565b604080519115158252519081900360200190f35b34801561029c57600080fd5b506102a5610b9b565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102df5781810151838201526020016102c7565b50505050905090810190601f16801561030c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561032657600080fd5b506103446004803603602081101561033d57600080fd5b5035610c32565b604080516001600160a01b039092168252519081900360200190f35b34801561036c57600080fd5b506102466004803603604081101561038357600080fd5b506001600160a01b038135169060200135610c94565b3480156103a557600080fd5b506103ae610dbc565b60408051918252519081900360200190f35b3480156103cc57600080fd5b50610246600480360360608110156103e357600080fd5b506001600160a01b03813581169160208101359091169060400135610dc2565b34801561040f57600080fd5b506103ae6004803603602081101561042657600080fd5b5035610e1e565b34801561043957600080fd5b506103ae6004803603604081101561045057600080fd5b506001600160a01b038135169060200135610e30565b34801561047257600080fd5b506102466004803603602081101561048957600080fd5b5035610eaf565b34801561049c57600080fd5b50610246600480360360608110156104b357600080fd5b506001600160a01b038135811691602081013590911690604001356110b3565b3480156104df57600080fd5b506103446110ce565b3480156104f457600080fd5b506102466004803603602081101561050b57600080fd5b50356001600160a01b0316611153565b34801561052757600080fd5b506103446004803603602081101561053e57600080fd5b503561123a565b34801561055157600080fd5b506102466004803603602081101561056857600080fd5b5035611294565b34801561057b57600080fd5b506102a561136a565b34801561059057600080fd5b506103ae600480360360208110156105a757600080fd5b50356001600160a01b03166113cb565b3480156105c357600080fd5b5061024661142e565b610246600480360360e08110156105e257600080fd5b6001600160a01b03823516916001600160e01b03196020820135169181019060608101604082013564010000000081111561061c57600080fd5b82018360208201111561062e57600080fd5b8035906020019184602083028401116401000000008311171561065057600080fd5b919350915061ffff8135169060ff60208201351690604081013590606001356114bf565b34801561068057600080fd5b506102466004803603602081101561069757600080fd5b50356001600160a01b03166116fa565b3480156106b357600080fd5b506103446117a0565b3480156106c857600080fd5b506103ae600480360360208110156106df57600080fd5b50356117af565b3480156106f257600080fd5b5061027c6117c1565b34801561070757600080fd5b506102466004803603604081101561071e57600080fd5b506001600160a01b0381351690602001356117e7565b34801561074057600080fd5b506102a561184b565b34801561075557600080fd5b506102466004803603604081101561076c57600080fd5b506001600160a01b03813516906020013515156118ac565b34801561079057600080fd5b50610246600480360360208110156107a757600080fd5b50356119b1565b3480156107ba57600080fd5b50610344611aef565b3480156107cf57600080fd5b50610246611afe565b3480156107e457600080fd5b50610246600480360360208110156107fb57600080fd5b81019060208101813564010000000081111561081657600080fd5b82018360208201111561082857600080fd5b8035906020019184602083028401116401000000008311171561084a57600080fd5b509092509050611ba0565b34801561086157600080fd5b50610344611bce565b34801561087657600080fd5b506102466004803603608081101561088d57600080fd5b6001600160a01b038235811692602081013590911691604082013591908101906080810160608201356401000000008111156108c857600080fd5b8201836020820111156108da57600080fd5b803590602001918460018302840111640100000000831117156108fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611be2945050505050565b34801561094957600080fd5b506102a56004803603602081101561096057600080fd5b5035611c3a565b34801561097357600080fd5b5061027c611e06565b34801561098857600080fd5b506109a66004803603602081101561099f57600080fd5b5035611e0f565b6040805160ff909316835290151560208301528051918290030190f35b3480156109cf57600080fd5b506103ae600480360360208110156109e657600080fd5b5035611e41565b3480156109f957600080fd5b50610a1760048036036020811015610a1057600080fd5b5035611e53565b604080519a8b5260ff90991660208b01528989019790975261ffff909516606089015260808801939093526001600160a01b0390911660a08701526001600160e01b03191660c086015260e085015261010084015261012083015251908190036101400190f35b348015610a8a57600080fd5b50610344611ed0565b348015610a9f57600080fd5b5061027c60048036036040811015610ab657600080fd5b506001600160a01b0381358116916020013516611edf565b348015610ada57600080fd5b5061024660048036036040811015610af157600080fd5b5080356001600160e01b03191690602001356001600160a01b0316611f0d565b348015610b1d57600080fd5b5061024660048036036020811015610b3457600080fd5b50356001600160a01b0316612003565b348015610b5057600080fd5b5061034460048036036020811015610b6757600080fd5b50356001600160e01b031916612056565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c275780601f10610bfc57610100808354040283529160200191610c27565b820191906000526020600020905b815481529060010190602001808311610c0a57829003601f168201915b505050505090505b90565b6000610c3d82612071565b610c785760405162461bcd60e51b815260040180806020018281038252602c815260200180613b6b602c913960400191505060405180910390fd5b506000908152600260205260409020546001600160a01b031690565b6000610c9f8261123a565b9050806001600160a01b0316836001600160a01b03161415610cf25760405162461bcd60e51b8152600401808060200182810382526021815260200180613c0f6021913960400191505060405180910390fd5b806001600160a01b0316610d0461208e565b6001600160a01b03161480610d255750610d2581610d2061208e565b611edf565b610d605760405162461bcd60e51b8152600401808060200182810382526038815260200180613ae06038913960400191505060405180910390fd5b60008281526002602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60035490565b610dd3610dcd61208e565b82612092565b610e0e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613c306031913960400191505060405180910390fd5b610e19838383612136565b505050565b600c6020526000908152604090205481565b6000610e3b836113cb565b8210610e785760405162461bcd60e51b815260040180806020018281038252602b815260200180613a0d602b913960400191505060405180910390fd5b6001600160a01b0383166000908152600560205260409020805483908110610e9c57fe5b9060005260206000200154905092915050565b80610eba3382612092565b610f03576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b600b54600160a01b900460ff16610f61576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b600b805460ff60a01b191690556000828152600c6020526040902054610fce576040805162461bcd60e51b815260206004820152601860248201527f4e6f20636c61696d20697320696e2070726f67726573732e0000000000000000604482015290519081900360640190fd5b6000610fd983612155565b505093505050506000610feb84612291565b50506000878152600c602052604090205490935061100b925090506123c3565b6110465760405162461bcd60e51b8152600401808060200182810382526027815260200180613cd76027913960400191505060405180910390fd5b61104f846124d7565b61105982826124e9565b6040805182815290516001600160e01b031984169133917fa3d1683ef352f1eac34dfdc12e69d7fc00e36c0048e677f498a8efb71deb3ba59181900360200190a35050600b805460ff60a01b1916600160a01b1790555050565b610e1983838360405180602001604052806000815250611be2565b601054604080516227050b60e31b81526126a960f11b6004820152905160009261010090046001600160a01b0316916301382858916024808301926020929190829003018186803b15801561112257600080fd5b505afa158015611136573d6000803e3d6000fd5b505050506040513d602081101561114c57600080fd5b5051905090565b61115b6117c1565b61119a576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b6111c06111a56110ce565b6012546001600160a01b03169060001963ffffffff61264916565b6111c86110ce565b6001600160a01b0316634ed75d47826040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050600060405180830381600087803b15801561121f57600080fd5b505af1158015611233573d6000803e3d6000fd5b5050505050565b6000818152600160205260408120546001600160a01b03168061128e5760405162461bcd60e51b8152600401808060200182810382526029815260200180613b426029913960400191505060405180910390fd5b92915050565b8061129f3382612092565b6112e8576040805162461bcd60e51b81526020600482015260156024820152742737ba1030b8383937bb32b21037b91037bbb732b960591b604482015290519081900360640190fd5b6000828152600e60205260409020541561130a576113058261269b565b611366565b600061131583612291565b50505050905060006113268261272f565b6000858152600c602052604080822083905551919250829184917f675e9cd1ef5a9bb6971c9f1099eced3c6607be0407bc871bc50a8a7b36832e7491a350505b5050565b60098054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c275780601f10610bfc57610100808354040283529160200191610c27565b60006001600160a01b0382166114125760405162461bcd60e51b815260040180806020018281038252602a815260200180613b18602a913960400191505060405180910390fd5b506001600160a01b031660009081526005602052604090205490565b6114366117c1565b611475576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b6000868660018181106114ce57fe5b905060200201359050876001600160e01b0319166208aa8960eb1b141561153f5780341461153a576040805162461bcd60e51b8152602060048201526014602482015273125b98dbdc9c9958dd081d985b1d59481cd95b9d60621b604482015290519081900360640190fd5b61160e565b6001600160e01b031988166000908152600f60205260409020546001600160a01b0316806115b4576040805162461bcd60e51b815260206004820152601e60248201527f436f7665722063757272656e6379206973206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b34156115f15760405162461bcd60e51b8152600401808060200182810382526027815260200180613c616027913960400191505060405180910390fd5b61160c6001600160a01b03821633308563ffffffff61292c16565b505b60006116548a8a8a8a808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152508c92508b91508a905089612986565b90506116603382612d5e565b6001600160a01b038a1633827f75d1b0ed8db2ddc759239c0ba70041d14ad98d912aa0b54e3ee044bf0da967198c8c8c60008161169957fe5b905060200201358d8d60018181106116ad57fe5b604080516001600160e01b0319909616865260208681019590955293029190910135838301525042606083015261ffff8c166080830152519081900360a00190a450505050505050505050565b601054604080516227050b60e31b815261503160f01b6004820152905160009261010090046001600160a01b0316916301382858916024808301926020929190829003018186803b15801561174e57600080fd5b505afa158015611762573d6000803e3d6000fd5b505050506040513d602081101561177857600080fd5b50519050808261179a6001600160a01b0382168360001963ffffffff61264916565b50505050565b600b546001600160a01b031690565b600e6020526000908152604090205481565b600b546000906001600160a01b03166117d861208e565b6001600160a01b031614905090565b6117ef6117c1565b61182e576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b601254611366906001600160a01b0316838363ffffffff61264916565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c275780601f10610bfc57610100808354040283529160200191610c27565b6118b461208e565b6001600160a01b0316826001600160a01b0316141561191a576040805162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015290519081900360640190fd5b806004600061192761208e565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561196b61208e565b60408051841515815290516001600160a01b0392909216917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b60105460ff16611a08576040805162461bcd60e51b815260206004820152601960248201527f53776170206973206e6f74206163746976617465642079657400000000000000604482015290519081900360640190fd5b601154604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd9160648082019260009290919082900301818387803b158015611a6157600080fd5b505af1158015611a75573d6000803e3d6000fd5b505050506000806000611a8784612d72565b925092509250611a973383612d5e565b6000828152600e60209081526040808320879055600c8252808320849055600d90915280822085905551839186917fcadd753d34af01c155953459c29d3d46334ef736e1663d15c14b208f6e3a79ab9190a350505050565b6011546001600160a01b031681565b611b066117c1565b611b45576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b60105460ff1615611b91576040805162461bcd60e51b8152602060048201526011602482015270105b1c9958591e481058dd1a5d985d1959607a1b604482015290519081900360640190fd5b6010805460ff19166001179055565b60005b81811015610e1957611bc6838383818110611bba57fe5b905060200201356119b1565b600101611ba3565b60105461010090046001600160a01b031681565b611bf3611bed61208e565b83612092565b611c2e5760405162461bcd60e51b8152600401808060200182810382526031815260200180613c306031913960400191505060405180910390fd5b61179a84848484612e10565b6060611c4582612071565b611c805760405162461bcd60e51b815260040180806020018281038252602f815260200180613be0602f913960400191505060405180910390fd5b6000828152600a602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015611d155780601f10611cea57610100808354040283529160200191611d15565b820191906000526020600020905b815481529060010190602001808311611cf857829003601f168201915b50505050509050805160001415611d3c575050604080516020810190915260008152610b96565b6009816040516020018083805460018160011615610100020316600290048015611d9d5780601f10611d7b576101008083540402835291820191611d9d565b820191906000526020600020905b815481529060010190602001808311611d89575b5050825160208401908083835b60208310611dc95780518252601f199092019160209182019101611daa565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052915050610b96565b60105460ff1681565b600080611e1b83612291565b5050506000858152600c6020526040902054909350611e3a91506123c3565b9050915091565b600d6020526000908152604090205481565b600080600080600080600080600080611e6b8b612155565b929950909750909550611e8392508d91506122919050565b809a50819b50829c50839d50849e505050505050600d60008c8152602001908152602001600020549150600c60008c81526020019081526020016000205490509193959799509193959799565b6012546001600160a01b031681565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b611f156117c1565b611f54576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b6001600160e01b031982166000908152600f60205260409020546001600160a01b031615611fc9576040805162461bcd60e51b815260206004820152601e60248201527f436f7665722063757272656e637920616c7265616479206578697374732e0000604482015290519081900360640190fd5b6001600160e01b0319919091166000908152600f6020526040902080546001600160a01b0319166001600160a01b03909216919091179055565b61200b6117c1565b61204a576040805162461bcd60e51b81526020600482018190526024820152600080516020613b97833981519152604482015290519081900360640190fd5b61205381612e62565b50565b600f602052600090815260409020546001600160a01b031681565b6000908152600160205260409020546001600160a01b0316151590565b3390565b600061209d82612071565b6120d85760405162461bcd60e51b815260040180806020018281038252602c815260200180613ab4602c913960400191505060405180910390fd5b60006120e38361123a565b9050806001600160a01b0316846001600160a01b0316148061211e5750836001600160a01b031661211384610c32565b6001600160a01b0316145b8061212e575061212e8185611edf565b949350505050565b612141838383612f03565b61214b8382613005565b610e1982826130f3565b6000806000806000806000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b1580156121be57600080fd5b505afa1580156121d2573d6000803e3d6000fd5b505050506040513d60208110156121e857600080fd5b50516040805163df09fea760e01b8152600481018b905290519192506001600160a01b0383169163df09fea79160248082019260c092909190829003018186803b15801561223557600080fd5b505afa158015612249573d6000803e3d6000fd5b505050506040513d60c081101561225f57600080fd5b508051602082015160408301516060840151608085015160a090950151939d929c50909a509850919650945092505050565b600080600080600080601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061145160f21b815250602001905060206040518083038186803b1580156122f857600080fd5b505afa15801561230c573d6000803e3d6000fd5b505050506040513d602081101561232257600080fd5b505160408051631993d17d60e11b8152600481018a905290519192506001600160a01b03831691633327a2fa9160248082019260a092909190829003018186803b15801561236f57600080fd5b505afa158015612383573d6000803e3d6000fd5b505050506040513d60a081101561239957600080fd5b508051602082015160408301516060840151608090940151929b919a509850919650945092505050565b6000806000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b15801561242657600080fd5b505afa15801561243a573d6000803e3d6000fd5b505050506040513d602081101561245057600080fd5b505160408051631e41b72960e11b81526004810187905290519192506001600160a01b03831691633c836e529160248082019260a092909190829003018186803b15801561249d57600080fd5b505afa1580156124b1573d6000803e3d6000fd5b505050506040513d60a08110156124c757600080fd5b5060200151600e14949350505050565b6120536124e38261123a565b82613131565b60006001600160e01b031983166208aa8960eb1b14156125435750604051670de0b6b3a7640000820290339082156108fc029083906000818181858888f1935050505015801561253d573d6000803e3d6000fd5b50610e19565b6001600160e01b031983166000908152600f60205260409020546001600160a01b0316806125b8576040805162461bcd60e51b815260206004820152601e60248201527f436f7665722063757272656e6379206973206e6f7420616c6c6f7765642e0000604482015290519081900360640190fd5b6000816001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156125f557600080fd5b505af1158015612609573d6000803e3d6000fd5b505050506040513d602081101561261f57600080fd5b505160ff16600a81900a8502935090506112336001600160a01b038316338563ffffffff61317916565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610e199084906131c7565b6000818152600e6020526040808220546011548251633550a54b60e11b815260048101839052925191936001600160a01b0390911692636aa14a96926024808301939282900301818387803b1580156126f357600080fd5b505af1158015612707573d6000803e3d6000fd5b50505050600061271682612d72565b6000958652600c60205260409095209490945550505050565b600080601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d360f21b815250602001905060206040518083038186803b15801561279057600080fd5b505afa1580156127a4573d6000803e3d6000fd5b505050506040513d60208110156127ba57600080fd5b505160408051633550a54b60e11b81526004810186905290519192506001600160a01b03831691636aa14a969160248082019260009290919082900301818387803b15801561280857600080fd5b505af115801561281c573d6000803e3d6000fd5b505050506000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b815260040180806110d160f21b815250602001905060206040518083038186803b15801561288057600080fd5b505afa158015612894573d6000803e3d6000fd5b505050506040513d60208110156128aa57600080fd5b505160408051636235bbe160e11b815290519192506000916001916001600160a01b0385169163c46b77c291600480820192602092909190829003018186803b1580156128f657600080fd5b505afa15801561290a573d6000803e3d6000fd5b505050506040513d602081101561292057600080fd5b50510395945050505050565b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261179a9085906131c7565b6000808660018151811061299657fe5b602002602001015190506000601060019054906101000a90046001600160a01b03166001600160a01b031663013828586040518163ffffffff1660e01b8152600401808061503160f01b815250602001905060206040518083038186803b158015612a0057600080fd5b505afa158015612a14573d6000803e3d6000fd5b505050506040513d6020811015612a2a57600080fd5b505190506208aa8960eb1b6001600160e01b03198a161415612b4c57806001600160a01b03166368da80af838c8c8c8c8c8c8c6040518963ffffffff1660e01b815260040180886001600160a01b03166001600160a01b03168152602001876001600160e01b0319166001600160e01b0319168152602001806020018661ffff1661ffff1681526020018560ff1660ff168152602001848152602001838152602001828103825287818151815260200191508051906020019060200280838360005b83811015612b04578181015183820152602001612aec565b50505050905001985050505050505050506000604051808303818588803b158015612b2e57600080fd5b505af1158015612b42573d6000803e3d6000fd5b5050505050612c38565b604051638076083d60e01b81526001600160a01b038b8116600483019081526001600160e01b03198c16602484015261ffff8a16606484015260ff8916608484015260a4830188905260c4830187905260e0604484019081528b5160e48501528b5192851693638076083d938f938f938f938f938f938f938f939192909161010401906020808a01910280838360005b83811015612bf4578181015183820152602001612bdc565b5050505090500198505050505050505050600060405180830381600087803b158015612c1f57600080fd5b505af1158015612c33573d6000803e3d6000fd5b505050505b601054604080516227050b60e31b815261145160f21b6004820152905160009261010090046001600160a01b0316916301382858916024808301926020929190829003018186803b158015612c8c57600080fd5b505afa158015612ca0573d6000803e3d6000fd5b505050506040513d6020811015612cb657600080fd5b50516040805163067157ff60e41b81529051919250612d3d916001916001600160a01b038516916367157ff0916004808201926020929091908290030181600087803b158015612d0557600080fd5b505af1158015612d19573d6000803e3d6000fd5b505050506040513d6020811015612d2f57600080fd5b50519063ffffffff61337f16565b6000818152600d602052604090209390935550909998505050505050505050565b612d6882826133c8565b61136682826130f3565b601154604080516327b2595f60e11b8152600481018490529051600092839283926001600160a01b0390921691634f64b2be916024808201926101409290919082900301818787803b158015612dc757600080fd5b505af1158015612ddb573d6000803e3d6000fd5b505050506040513d610140811015612df257600080fd5b50606081015160e08201516101209092015190969195509350915050565b612e1b848484612136565b612e27848484846134f3565b61179a5760405162461bcd60e51b8152600401808060200182810382526032815260200180613a386032913960400191505060405180910390fd5b6001600160a01b038116612ea75760405162461bcd60e51b8152600401808060200182810382526026815260200180613a6a6026913960400191505060405180910390fd5b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b826001600160a01b0316612f168261123a565b6001600160a01b031614612f5b5760405162461bcd60e51b8152600401808060200182810382526029815260200180613bb76029913960400191505060405180910390fd5b6001600160a01b038216612fa05760405162461bcd60e51b8152600401808060200182810382526024815260200180613a906024913960400191505060405180910390fd5b612fa98161372e565b60008181526001602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b03821660009081526005602052604081205461302f90600163ffffffff61337f16565b6000838152600660205260409020549091508082146130ca576001600160a01b038416600090815260056020526040812080548490811061306c57fe5b906000526020600020015490508060056000876001600160a01b03166001600160a01b0316815260200190815260200160002083815481106130aa57fe5b600091825260208083209091019290925591825260069052604090208190555b6001600160a01b038416600090815260056020526040902080549061123390600019830161398a565b6001600160a01b0390911660009081526005602081815260408084208054868652600684529185208290559282526001810183559183529091200155565b61313b8282613769565b6000818152600a60205260409020546002600019610100600184161502019091160415611366576000818152600a60205260408120611366916139ae565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e199084905b6131d9826001600160a01b031661378f565b61322a576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b602083106132685780518252601f199092019160209182019101613249565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146132ca576040519150601f19603f3d011682016040523d82523d6000602084013e6132cf565b606091505b509150915081613326576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b80511561179a5780806020019051602081101561334257600080fd5b505161179a5760405162461bcd60e51b815260040180806020018281038252602a815260200180613cad602a913960400191505060405180910390fd5b60006133c183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506137c8565b9392505050565b6001600160a01b038216613423576040805162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b61342c81612071565b1561347e576040805162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015290519081900360640190fd5b600081815260016020819052604090912080546001600160a01b0319166001600160a01b0385161790556003546134b49161385f565b60035560405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613507846001600160a01b031661378f565b6135135750600161212e565b600060606001600160a01b038616630a85bd0160e11b61353161208e565b89888860405160240180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156135aa578181015183820152602001613592565b50505050905090810190601f1680156135d75780820380516001836020036101000a031916815260200191505b5060408051601f198184030181529181526020820180516001600160e01b03166001600160e01b0319909a16999099178952518151919890975087965094509250829150849050835b6020831061363f5780518252601f199092019160209182019101613620565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146136a1576040519150601f19603f3d011682016040523d82523d6000602084013e6136a6565b606091505b5091509150816136f7578051156136c05780518082602001fd5b60405162461bcd60e51b8152600401808060200182810382526032815260200180613a386032913960400191505060405180910390fd5b600081806020019051602081101561370e57600080fd5b50516001600160e01b031916630a85bd0160e11b14935061212e92505050565b6000818152600260205260409020546001600160a01b03161561205357600090815260026020526040902080546001600160a01b0319169055565b61377382826138b9565b61377d8282613005565b60009081526006602052604081205550565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061212e575050151592915050565b600081848411156138575760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561381c578181015183820152602001613804565b50505050905090810190601f1680156138495780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156133c1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b816001600160a01b03166138cc8261123a565b6001600160a01b0316146139115760405162461bcd60e51b8152600401808060200182810382526025815260200180613c886025913960400191505060405180910390fd5b61391a8161372e565b600081815260016020819052604090912080546001600160a01b031916905560035461394b9163ffffffff61337f16565b60035560405181906000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b815481835581811115610e1957600083815260209020610e199181019083016139ee565b50805460018160011615610100020316600290046000825580601f106139d45750612053565b601f01602090049060005260206000209081019061205391905b610c2f91905b80821115613a0857600081556001016139f4565b509056fe455243373231456e756d657261626c653a206f776e657220696e646578206f7574206f6620626f756e64734552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573734552433732313a207472616e7366657220746f20746865207a65726f20616464726573734552433732313a206f70657261746f7220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76652063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f76656420666f7220616c6c4552433732313a2062616c616e636520717565727920666f7220746865207a65726f20616464726573734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76656420717565727920666f72206e6f6e6578697374656e7420746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65724552433732313a207472616e73666572206f6620746f6b656e2074686174206973206e6f74206f776e4552433732314d657461646174613a2055524920717565727920666f72206e6f6e6578697374656e7420746f6b656e4552433732313a20617070726f76616c20746f2063757272656e74206f776e65724552433732313a207472616e736665722063616c6c6572206973206e6f74206f776e6572206e6f7220617070726f766564457468206e6f74207265717569726564207768656e20627579696e6720776974682065726332304552433732313a206275726e206f6620746f6b656e2074686174206973206e6f74206f776e5361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436c61696d20616363657074656420627574207061796f7574206e6f7420636f6d706c65746564a265627a7a7231582099c8a46cb0f302f3570910af47c029d0efa349edebae8f4da25ffe9a39a4028264736f6c63430005110032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e000000000000000000000000181aea6936b407514ebfc0754a37704eb8d98f91000000000000000000000000d7c49cee7e9188cca6ad8ff264c1da2e69d4cf3b

-----Decoded View---------------
Arg [0] : _nxMaster (address): 0x01BFd82675DBCc7762C84019cA518e701C0cD07e
Arg [1] : _ynft (address): 0x181Aea6936B407514ebFC0754A37704eB8d98F91
Arg [2] : _nxmToken (address): 0xd7c49CEE7E9188cCa6AD8FF264C1DA2e69D4Cf3B

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000001bfd82675dbcc7762c84019ca518e701c0cd07e
Arg [1] : 000000000000000000000000181aea6936b407514ebfc0754a37704eb8d98f91
Arg [2] : 000000000000000000000000d7c49cee7e9188cca6ad8ff264c1da2e69d4cf3b


Deployed Bytecode Sourcemap

29909:16426:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;786:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;786:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;786:135:0;-1:-1:-1;;;;;;786:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;15162:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15162:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;15162:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6611:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6611:204:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6611:204:0;;:::i;:::-;;;;-1:-1:-1;;;;;6611:204:0;;;;;;;;;;;;;;6180:425;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6180:425:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6180:425:0;;;;;;;;:::i;5845:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5845:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;7234:292;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7234:292:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7234:292:0;;;;;;;;;;;;;;;;;:::i;30168:44::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30168:44:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30168:44:0;;:::i;12473:232::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12473:232:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12473:232:0;;;;;;;;:::i;35803:721::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35803:721:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35803:721:0;;:::i;7532:134::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7532:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7532:134:0;;;;;;;;;;;;;;;;;:::i;39817:113::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39817:113:0;;;:::i;40070:209::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40070:209:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40070:209:0;-1:-1:-1;;;;;40070:209:0;;:::i;5946:228::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5946:228:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5946:228:0;;:::i;35078:569::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35078:569:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35078:569:0;;:::i;16220:91::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16220:91:0;;;:::i;12264:203::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12264:203:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;12264:203:0;-1:-1:-1;;;;;12264:203:0;;:::i;17430:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17430:140:0;;;:::i;33777:1116::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;33777:1116:0;;;;-1:-1:-1;;;;;;33777:1116:0;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;33777:1116:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;33777:1116:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;33777:1116:0;;-1:-1:-1;33777:1116:0;-1:-1:-1;33777:1116:0;;;;;;;;;;;;;;;;;;;;;:::i;38015:317::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38015:317:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38015:317:0;-1:-1:-1;;;;;38015:317:0;;:::i;17133:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17133:79:0;;;:::i;30459:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30459:43:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30459:43:0;;:::i;17330:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17330:94:0;;;:::i;45742:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45742:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;45742:133:0;;;;;;;;:::i;15253:89::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15253:89:0;;;:::i;6821:254::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6821:254:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;6821:254:0;;;;;;;;;;:::i;36890:573::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36890:573:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36890:573:0;;:::i;30895:20::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30895:20:0;;;:::i;36536:154::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36536:154:0;;;:::i;37627:188::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37627:188:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37627:188:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;37627:188:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;37627:188:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;37627:188:0;;-1:-1:-1;37627:188:0;-1:-1:-1;37627:188:0;:::i;30805:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30805:26:0;;;:::i;7672:272::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7672:272:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;7672:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;7672:272:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;7672:272:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;7672:272:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;7672:272:0;;-1:-1:-1;7672:272:0;;-1:-1:-1;;;;;7672:272:0:i;15348:557::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15348:557:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15348:557:0;;:::i;30733:25::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30733:25:0;;;:::i;39430:236::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39430:236:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39430:236:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;30257:47;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30257:47:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30257:47:0;;:::i;38551:690::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38551:690:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38551:690:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38551:690:0;;;;;;;-1:-1:-1;;;;;;38551:690:0;;;;;;;;;;;;;;;;;;;;;;;;;;30943:22;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30943:22:0;;;:::i;7081:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7081:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;7081:147:0;;;;;;;;;;:::i;46065:265::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46065:265:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46065:265:0;;-1:-1:-1;;;;;;46065:265:0;;;;;-1:-1:-1;;;;;46065:265:0;;:::i;17576:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17576:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17576:109:0;-1:-1:-1;;;;;17576:109:0;;:::i;30591:50::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30591:50:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30591:50:0;-1:-1:-1;;;;;;30591:50:0;;:::i;786:135::-;-1:-1:-1;;;;;;880:33:0;;856:4;880:33;;;;;;;;;;;;;786:135;;;;:::o;15162:85::-;15234:5;15227:12;;;;;;;;-1:-1:-1;;15227:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15201:13;;15227:12;;15234:5;;15227:12;;15234:5;15227:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15162:85;;:::o;6611:204::-;6670:7;6698:16;6706:7;6698;:16::i;:::-;6690:73;;;;-1:-1:-1;;;6690:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6783:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;6783:24:0;;6611:204::o;6180:425::-;6244:13;6260:16;6268:7;6260;:16::i;:::-;6244:32;;6301:5;-1:-1:-1;;;;;6295:11:0;:2;-1:-1:-1;;;;;6295:11:0;;;6287:57;;;;-1:-1:-1;;;6287:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6381:5;-1:-1:-1;;;;;6365:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;6365:21:0;;:62;;;;6390:37;6407:5;6414:12;:10;:12::i;:::-;6390:16;:37::i;:::-;6357:154;;;;-1:-1:-1;;;6357:154:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6524:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;6524:29:0;-1:-1:-1;;;;;6524:29:0;;;;;;;;;6569:28;;6524:24;;6569:28;;;;;;;6180:425;;;:::o;5845:89::-;5914:12;;5845:89;:::o;7234:292::-;7378:41;7397:12;:10;:12::i;:::-;7411:7;7378:18;:41::i;:::-;7370:103;;;;-1:-1:-1;;;7370:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7486:32;7500:4;7506:2;7510:7;7486:13;:32::i;:::-;7234:292;;;:::o;30168:44::-;;;;;;;;;;;;;:::o;12473:232::-;12553:7;12589:16;12599:5;12589:9;:16::i;:::-;12581:5;:24;12573:80;;;;-1:-1:-1;;;12573:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;12671:19:0;;;;;;:12;:19;;;;;:26;;12691:5;;12671:26;;;;;;;;;;;;;;12664:33;;12473:232;;;;:::o;35803:721::-;35874:8;32815:40;32834:10;32846:8;32815:18;:40::i;:::-;32807:74;;;;;-1:-1:-1;;;32807:74:0;;;;;;;;;;;;-1:-1:-1;;;32807:74:0;;;;;;;;;;;;;;;18102:11;;-1:-1:-1;;;18102:11:0;;;;18094:55;;;;;-1:-1:-1;;;18094:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18160:11;:19;;-1:-1:-1;;;;18160:19:0;;;18174:5;35917:18;;;:8;:18;;;;;;35909:60;;;;;-1:-1:-1;;;35909:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36034:19;36089:20;36100:8;36089:10;:20::i;:::-;35990:119;;;;;;;36147:18;36173:20;36184:8;36173:10;:20::i;:::-;-1:-1:-1;;36241:18:0;;;;:8;:18;;;;;;36120:73;;-1:-1:-1;36222:38:0;;-1:-1:-1;36241:18:0;-1:-1:-1;36222:18:0;:38::i;:::-;36214:90;;;;-1:-1:-1;;;36214:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36372:15;36378:8;36372:5;:15::i;:::-;36398:41;36414:12;36428:10;36398:15;:41::i;:::-;36465:51;;;;;;;;-1:-1:-1;;;;;;36465:51:0;;;36479:10;;36465:51;;;;;;;;;-1:-1:-1;;18340:11:0;:18;;-1:-1:-1;;;;18340:18:0;-1:-1:-1;;;18340:18:0;;;-1:-1:-1;;35803:721:0:o;7532:134::-;7619:39;7636:4;7642:2;7646:7;7619:39;;;;;;;;;;;;:16;:39::i;39817:113::-;39891:8;;:31;;;-1:-1:-1;;;39891:31:0;;-1:-1:-1;;;39891:31:0;;;;;;-1:-1:-1;;39891:8:0;;;-1:-1:-1;;;;;39891:8:0;;:25;;:31;;;;;;;;;;;;;;:8;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;39891:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39891:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39891:31:0;;-1:-1:-1;39817:113:0;:::o;40070:209::-;17258:9;:7;:9::i;:::-;17250:54;;;;;-1:-1:-1;;;17250:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17250:54:0;;;;;;;;;;;;;;;40150:47;40171:16;:14;:16::i;:::-;40150:8;;-1:-1:-1;;;;;40150:8:0;;-1:-1:-1;;40150:47:0;:20;:47;:::i;:::-;40221:16;:14;:16::i;:::-;-1:-1:-1;;;;;40208:47:0;;40256:14;40208:63;;;;;;;;;;;;;-1:-1:-1;;;;;40208:63:0;-1:-1:-1;;;;;40208:63:0;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40208:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40208:63:0;;;;40070:209;:::o;5946:228::-;6001:7;6037:20;;;:11;:20;;;;;;-1:-1:-1;;;;;6037:20:0;6076:19;6068:73;;;;-1:-1:-1;;;6068:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6161:5;5946:228;-1:-1:-1;;5946:228:0:o;35078:569::-;35151:8;32815:40;32834:10;32846:8;32815:18;:40::i;:::-;32807:74;;;;;-1:-1:-1;;;32807:74:0;;;;;;;;;;;;-1:-1:-1;;;32807:74:0;;;;;;;;;;;;;;;35252:17;;;;:7;:17;;;;;;:22;35248:102;;35291:26;35308:8;35291:16;:26::i;:::-;35332:7;;35248:102;35371:15;35470:20;35481:8;35470:10;:20::i;:::-;35370:120;;;;;;35503:15;35521:21;35534:7;35521:12;:21::i;:::-;35553:18;;;;:8;:18;;;;;;:28;;;35607:32;35503:39;;-1:-1:-1;35503:39:0;;35622:7;;35607:32;;;32892:1;;;35078:569;;:::o;16220:91::-;16295:8;16288:15;;;;;;;;-1:-1:-1;;16288:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16262:13;;16288:15;;16295:8;;16288:15;;16295:8;16288:15;;;;;;;;;;;;;;;;;;;;;;;;12264:203;12319:7;-1:-1:-1;;;;;12347:19:0;;12339:74;;;;-1:-1:-1;;;12339:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;12433:19:0;;;;;:12;:19;;;;;:26;;12264:203::o;17430:140::-;17258:9;:7;:9::i;:::-;17250:54;;;;;-1:-1:-1;;;17250:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17250:54:0;;;;;;;;;;;;;;;17513:6;;17492:40;;17529:1;;-1:-1:-1;;;;;17513:6:0;;17492:40;;17529:1;;17492:40;17543:6;:19;;-1:-1:-1;;;;;;17543:19:0;;;17430:140::o;33777:1116::-;34035:18;34056:13;;34070:1;34056:16;;;;;;;;;;;;;34035:37;;34089:14;-1:-1:-1;;;;;34089:23:0;;-1:-1:-1;;;34089:23:0;34085:447;;;34150:10;34137:9;:23;34129:56;;;;;-1:-1:-1;;;34129:56:0;;;;;;;;;;;;-1:-1:-1;;;34129:56:0;;;;;;;;;;;;;;;34085:447;;;-1:-1:-1;;;;;;34241:31:0;;34218:12;34241:31;;;:15;:31;;;;;;-1:-1:-1;;;;;34241:31:0;34297:29;34289:72;;;;;-1:-1:-1;;;34289:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34386:9;:14;34378:66;;;;-1:-1:-1;;;34378:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34459:61;-1:-1:-1;;;;;34459:22:0;;34482:10;34502:4;34509:10;34459:61;:22;:61;:::i;:::-;34085:447;;34552:15;34570:91;34580:23;34605:14;34621:13;;34570:91;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;34636:12:0;;-1:-1:-1;34650:2:0;;-1:-1:-1;34654:2:0;;-1:-1:-1;34658:2:0;34570:9;:91::i;:::-;34552:109;;34672:26;34678:10;34690:7;34672:5;:26::i;:::-;-1:-1:-1;;;;;34724:161:0;;34742:10;34733:7;34724:161;34779:14;34795:13;;34809:1;34795:16;;;;;;;;;;;34813:13;;34827:1;34813:16;;;;;;;34724:161;;;-1:-1:-1;;;;;;34724:161:0;;;;;34813:16;34724:161;;;;;;;34813:16;;;;;;;34724:161;;;;-1:-1:-1;34855:15:0;34724:161;;;;;;;;;;;;;;;;;;;;33777:1116;;;;;;;;;;:::o;38015:317::-;38114:8;;:31;;;-1:-1:-1;;;38114:31:0;;-1:-1:-1;;;38114:31:0;;;;;;-1:-1:-1;;38114:8:0;;;-1:-1:-1;;;;;38114:8:0;;:25;;:31;;;;;;;;;;;;;;:8;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;38114:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38114:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38114:31:0;;-1:-1:-1;38114:31:0;38253:13;38278:46;-1:-1:-1;;;;;38278:17:0;;38114:31;-1:-1:-1;;38278:46:0;:17;:46;:::i;:::-;38015:317;;;;:::o;17133:79::-;17198:6;;-1:-1:-1;;;;;17198:6:0;17133:79;:::o;30459:43::-;;;;;;;;;;;;;:::o;17330:94::-;17410:6;;17370:4;;-1:-1:-1;;;;;17410:6:0;17394:12;:10;:12::i;:::-;-1:-1:-1;;;;;17394:22:0;;17387:29;;17330:94;:::o;45742:133::-;17258:9;:7;:9::i;:::-;17250:54;;;;;-1:-1:-1;;;17250:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17250:54:0;;;;;;;;;;;;;;;45829:8;;:38;;-1:-1:-1;;;;;45829:8:0;45850;45860:6;45829:38;:20;:38;:::i;15253:89::-;15327:7;15320:14;;;;;;;;-1:-1:-1;;15320:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15294:13;;15320:14;;15327:7;;15320:14;;15327:7;15320:14;;;;;;;;;;;;;;;;;;;;;;;;6821:254;6907:12;:10;:12::i;:::-;-1:-1:-1;;;;;6901:18:0;:2;-1:-1:-1;;;;;6901:18:0;;;6893:56;;;;;-1:-1:-1;;;6893:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7001:8;6962:18;:32;6981:12;:10;:12::i;:::-;-1:-1:-1;;;;;6962:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;6962:32:0;;;:36;;;;;;;;;;;;:47;;-1:-1:-1;;6962:47:0;;;;;;;;;;;7040:12;:10;:12::i;:::-;7025:42;;;;;;;;;;-1:-1:-1;;;;;7025:42:0;;;;;;;;;;;;;;6821:254;;:::o;36890:573::-;36968:13;;;;36960:51;;;;;-1:-1:-1;;;36960:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37060:4;;:58;;;-1:-1:-1;;;37060:58:0;;37078:10;37060:58;;;;37098:4;37060:58;;;;;;;;;;;;-1:-1:-1;;;;;37060:4:0;;;;:17;;:58;;;;;:4;;:58;;;;;;;;:4;;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;37060:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37060:58:0;;;;37140:18;37160:15;37177;37196:31;37214:12;37196:17;:31::i;:::-;37139:88;;;;;;37240:26;37246:10;37258:7;37240:5;:26::i;:::-;37279:16;;;;:7;:16;;;;;;;;:31;;;37321:8;:17;;;;;:27;;;37359:11;:20;;;;;;:33;;;37418:37;37287:7;;37298:12;;37418:37;;37279:16;37418:37;36890:573;;;;:::o;30895:20::-;;;-1:-1:-1;;;;;30895:20:0;;:::o;36536:154::-;17258:9;:7;:9::i;:::-;17250:54;;;;;-1:-1:-1;;;17250:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17250:54:0;;;;;;;;;;;;;;;36616:13;;;;36615:14;36607:44;;;;;-1:-1:-1;;;36607:44:0;;;;;;;;;;;;-1:-1:-1;;;36607:44:0;;;;;;;;;;;;;;;36662:13;:20;;-1:-1:-1;;36662:20:0;36678:4;36662:20;;;36536:154::o;37627:188::-;37717:9;37712:96;37732:20;;;37712:96;;;37774:22;37783:9;;37793:1;37783:12;;;;;;;;;;;;;37774:8;:22::i;:::-;37754:3;;37712:96;;30805:26;;;;;;-1:-1:-1;;;;;30805:26:0;;:::o;7672:272::-;7787:41;7806:12;:10;:12::i;:::-;7820:7;7787:18;:41::i;:::-;7779:103;;;;-1:-1:-1;;;7779:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7893:43;7911:4;7917:2;7921:7;7930:5;7893:17;:43::i;15348:557::-;15406:13;15440:16;15448:7;15440;:16::i;:::-;15432:76;;;;-1:-1:-1;;;15432:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15547:19;;;;:10;:19;;;;;;;;;15521:45;;;;;;-1:-1:-1;;15521:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:23;;:45;;;15547:19;15521:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15683:9;15677:23;15704:1;15677:28;15673:225;;;-1:-1:-1;;15722:9:0;;;;;;;;;-1:-1:-1;15722:9:0;;;;15673:225;15865:8;15875:9;15848:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15848:37:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;15848:37:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;15848:37:0;;;15834:52;;;;;30733:25;;;;;;:::o;39430:236::-;39495:17;39514:20;39571;39582:8;39571:10;:20::i;:::-;-1:-1:-1;;;39639:18:0;;;;:8;:18;;;;;;39547:44;;-1:-1:-1;39620:38:0;;-1:-1:-1;39620:18:0;:38::i;:::-;39602:56;;39430:236;;;:::o;30257:47::-;;;;;;;;;;;;;:::o;38551:690::-;38629:11;38657:12;38686:18;38720;38755;38790:17;38824:19;38860:18;38894;38928:15;39045:20;39056:8;39045:10;:20::i;:::-;38961:104;;-1:-1:-1;38961:104:0;;-1:-1:-1;38961:104:0;;-1:-1:-1;39129:20:0;;-1:-1:-1;39140:8:0;;-1:-1:-1;39129:10:0;;-1:-1:-1;39129:20:0:i;:::-;39076:73;;;;;;;;;;;;;;;;;;;;39173:11;:21;39185:8;39173:21;;;;;;;;;;;;39160:34;;39215:8;:18;39224:8;39215:18;;;;;;;;;;;;39205:28;;38551:690;;;;;;;;;;;:::o;30943:22::-;;;-1:-1:-1;;;;;30943:22:0;;:::o;7081:147::-;-1:-1:-1;;;;;7185:25:0;;;7161:4;7185:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;7081:147::o;46065:265::-;17258:9;:7;:9::i;:::-;17250:54;;;;;-1:-1:-1;;;17250:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17250:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46176:31:0;;46219:1;46176:31;;;:15;:31;;;;;;-1:-1:-1;;;;;46176:31:0;:45;46168:88;;;;;-1:-1:-1;;;46168:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46267:31:0;;;;;;;;:15;:31;;;;;:55;;-1:-1:-1;;;;;;46267:55:0;-1:-1:-1;;;;;46267:55:0;;;;;;;;;46065:265::o;17576:109::-;17258:9;:7;:9::i;:::-;17250:54;;;;;-1:-1:-1;;;17250:54:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17250:54:0;;;;;;;;;;;;;;;17649:28;17668:8;17649:18;:28::i;:::-;17576:109;:::o;30591:50::-;;;;;;;;;;;;-1:-1:-1;;;;;30591:50:0;;:::o;8228:155::-;8285:4;8318:20;;;:11;:20;;;;;;-1:-1:-1;;;;;8318:20:0;8356:19;;;8228:155::o;90:98::-;170:10;90:98;:::o;8389:333::-;8474:4;8499:16;8507:7;8499;:16::i;:::-;8491:73;;;;-1:-1:-1;;;8491:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8575:13;8591:16;8599:7;8591;:16::i;:::-;8575:32;;8637:5;-1:-1:-1;;;;;8626:16:0;:7;-1:-1:-1;;;;;8626:16:0;;:51;;;;8670:7;-1:-1:-1;;;;;8646:31:0;:20;8658:7;8646:11;:20::i;:::-;-1:-1:-1;;;;;8646:31:0;;8626:51;:87;;;;8681:32;8698:5;8705:7;8681:16;:32::i;:::-;8618:96;8389:333;-1:-1:-1;;;;8389:333:0:o;12711:245::-;12797:38;12817:4;12823:2;12827:7;12797:19;:38::i;:::-;12848:47;12881:4;12887:7;12848:32;:47::i;:::-;12908:40;12936:2;12940:7;12908:27;:40::i;44518:419::-;44606:11;44628:21;44660:17;44688:19;44718:18;44747;44784:28;44830:8;;;;;;;;;-1:-1:-1;;;;;44830:8:0;-1:-1:-1;;;;;44830:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;44830:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44830:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44830:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44830:31:0;44880:49;;;-1:-1:-1;;;44880:49:0;;;;;;;;;;44830:31;;-1:-1:-1;;;;;;44880:39:0;;;;;:49;;;;;;;;;;;;;;;:39;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;44880:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44880:49:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;44880:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44880:49:0;;-1:-1:-1;44880:49:0;-1:-1:-1;44880:49:0;;-1:-1:-1;44880:49:0;-1:-1:-1;44518:419:0;-1:-1:-1;;;44518:419:0:o;45156:381::-;45244:11;45266:12;45289:18;45318;45347;45384:28;45430:8;;;;;;;;;-1:-1:-1;;;;;45430:8:0;-1:-1:-1;;;;;45430:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;45430:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45430:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45430:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45430:31:0;45480:49;;;-1:-1:-1;;;45480:49:0;;;;;;;;;;45430:31;;-1:-1:-1;;;;;;45480:39:0;;;;;:49;;;;;;;;;;;;;;;:39;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;45480:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45480:49:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;45480:49:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45480:49:0;-1:-1:-1;45480:49:0;;-1:-1:-1;45480:49:0;-1:-1:-1;45156:381:0;-1:-1:-1;;;45156:381:0:o;42754:310::-;42823:4;42840:14;42865;42890:8;;;;;;;;;-1:-1:-1;;;;;42890:8:0;-1:-1:-1;;;;;42890:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;42890:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42890:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42890:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42890:31:0;42952:32;;;-1:-1:-1;;;42952:32:0;;;;;;;;;;42890:31;;-1:-1:-1;;;;;;42952:22:0;;;;;:32;;;;;;;;;;;;;;;:22;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;42952:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42952:32:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;42952:32:0;;;43020:35;43002:54;;;-1:-1:-1;;;;42754:310:0:o;9763:92::-;9815:32;9821:16;9829:7;9821;:16::i;:::-;9839:7;9815:5;:32::i;43276:630::-;43365:19;-1:-1:-1;;;;;;43401:29:0;;-1:-1:-1;;;43401:29:0;43397:502;;;-1:-1:-1;43500:32:0;;43476:8;43461:24;;;43500:10;;:32;;;;;43461:24;;43500:32;;;;43461:24;43500:10;:32;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43500:32:0;43397:502;;;-1:-1:-1;;;;;;43588:31:0;;43565:12;43588:31;;;:15;:31;;;;;;-1:-1:-1;;;;;43588:31:0;43645:29;43636:73;;;;;-1:-1:-1;;;43636:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;43726:16;43753:5;-1:-1:-1;;;;;43753:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43753:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43753:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43753:16:0;43745:25;;43814:2;:14;;;43799:30;;;-1:-1:-1;43745:25:0;-1:-1:-1;43844:43:0;-1:-1:-1;;;;;43844:18:0;;43863:10;43799:30;43844:43;:18;:43;:::i;20092:681::-;20702:62;;;-1:-1:-1;;;;;20702:62:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20702:62:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;20676:89:0;;20695:5;;20676:18;:89::i;42243:302::-;42319:19;42341:17;;;:7;:17;;;;;;;42369:4;;:29;;-1:-1:-1;;;42369:29:0;;;;;;;;;;42341:17;;-1:-1:-1;;;;;42369:4:0;;;;:16;;:29;;;;;42319:19;42369:29;;;;;42319:19;42369:4;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;42369:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42369:29:0;;;;42449:15;42468:30;42486:11;42468:17;:30::i;:::-;42509:18;;;;:8;:18;;;;;;:28;;;;-1:-1:-1;;;;42243:302:0:o;41728:356::-;41786:7;41806:14;41831:8;;;;;;;;;-1:-1:-1;;;;;41831:8:0;-1:-1:-1;;;;;41831:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;41831:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41831:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41831:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41831:31:0;41874:28;;;-1:-1:-1;;;41874:28:0;;;;;;;;;;41831:31;;-1:-1:-1;;;;;;41874:18:0;;;;;:28;;;;;-1:-1:-1;;41874:28:0;;;;;;;;-1:-1:-1;41874:18:0;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;41874:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41874:28:0;;;;41919:22;41956:8;;;;;;;;;-1:-1:-1;;;;;41956:8:0;-1:-1:-1;;;;;41956:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;41956:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41956:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41956:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41956:31:0;42017:30;;;-1:-1:-1;;;42017:30:0;;;;41956:31;;-1:-1:-1;41999:15:0;;42050:1;;-1:-1:-1;;;;;42017:28:0;;;;;:30;;;;;41956:31;;42017:30;;;;;;;;:28;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;42017:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42017:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42017:30:0;:34;;41728:356;-1:-1:-1;;;;;41728:356:0:o;19880:204::-;20007:68;;;-1:-1:-1;;;;;20007:68:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;20007:68:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;19981:95:0;;20000:5;;19981:18;:95::i;40472:1071::-;40719:15;40753:18;40774:13;40788:1;40774:16;;;;;;;;;;;;;;40753:37;;40801:12;40823:8;;;;;;;;;-1:-1:-1;;;;;40823:8:0;-1:-1:-1;;;;;40823:25:0;;:31;;;;;;;;;;;;;-1:-1:-1;;;40823:31:0;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40823:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40823:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40823:31:0;;-1:-1:-1;;;;;;;;;;40872:23:0;;;40868:313;;;40912:5;-1:-1:-1;;;;;40912:20:0;;40939:10;40951:23;40976:14;40992:13;41007:12;41021:2;41025;41029;40912:120;;;;;;;;;;;;;-1:-1:-1;;;;;40912:120:0;-1:-1:-1;;;;;40912:120:0;;;;;;-1:-1:-1;;;;;40912:120:0;;-1:-1:-1;;;;;40912:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40912:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40912:120:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40912:120:0;;;;;40868:313;;;41065:104;;-1:-1:-1;;;41065:104:0;;-1:-1:-1;;;;;41065:104:0;;;;;;;;;-1:-1:-1;;;;;;41065:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:22;;;;;;41088:23;;41113:14;;41129:13;;41144:12;;41158:2;;41162;;41166;;41065:104;;;;;;;;;;;;;;;;-1:-1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;41065:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41065:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41065:104:0;;;;40868:313;41243:8;;:31;;;-1:-1:-1;;;41243:31:0;;-1:-1:-1;;;41243:31:0;;;;;;-1:-1:-1;;41243:8:0;;;-1:-1:-1;;;;;41243:8:0;;:25;;:31;;;;;;;;;;;;;;:8;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;41243:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41243:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41243:31:0;41384:30;;;-1:-1:-1;;;41384:30:0;;;;41243:31;;-1:-1:-1;41384:37:0;;41419:1;;-1:-1:-1;;;;;41384:28:0;;;;;:30;;;;;41243:31;;41384:30;;;;;;;;;:28;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;41384:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41384:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41384:30:0;;:37;:34;:37;:::i;:::-;41502:20;;;;:11;:20;;;;;:33;;;;-1:-1:-1;41374:47:0;;40472:1071;-1:-1:-1;;;;;;;;;40472:1071:0:o;12962:149::-;13026:24;13038:2;13042:7;13026:11;:24::i;:::-;13063:40;13091:2;13095:7;13063:27;:40::i;44086:229::-;44282:4;;:25;;;-1:-1:-1;;;44282:25:0;;;;;;;;;;44165:18;;;;;;-1:-1:-1;;;;;44282:4:0;;;;:11;;:25;;;;;;;;;;;;;;;44165:18;44282:4;:25;;;5:2:-1;;;;30:1;27;20:12;5:2;44282:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44282:25:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;44282:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;44282:25:0;-1:-1:-1;44086:229:0;-1:-1:-1;;44086:229:0:o;7950:272::-;8060:32;8074:4;8080:2;8084:7;8060:13;:32::i;:::-;8111:48;8134:4;8140:2;8144:7;8153:5;8111:22;:48::i;:::-;8103:111;;;;-1:-1:-1;;;8103:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17691:229;-1:-1:-1;;;;;17765:22:0;;17757:73;;;;-1:-1:-1;;;17757:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17867:6;;17846:38;;-1:-1:-1;;;;;17846:38:0;;;;17867:6;;17846:38;;17867:6;;17846:38;17895:6;:17;;-1:-1:-1;;;;;;17895:17:0;-1:-1:-1;;;;;17895:17:0;;;;;;;;;;17691:229::o;9861:367::-;9975:4;-1:-1:-1;;;;;9955:24:0;:16;9963:7;9955;:16::i;:::-;-1:-1:-1;;;;;9955:24:0;;9947:78;;;;-1:-1:-1;;;9947:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10044:16:0;;10036:65;;;;-1:-1:-1;;;10036:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10114:23;10129:7;10114:14;:23::i;:::-;10150:20;;;;:11;:20;;;;;;:25;;-1:-1:-1;;;;;;10150:25:0;-1:-1:-1;;;;;10150:25:0;;;;;;;;;10193:27;;10150:20;;10193:27;;;;;;;9861:367;;;:::o;13761:591::-;-1:-1:-1;;;;;13878:18:0;;13853:22;13878:18;;;:12;:18;;;;;:25;:32;;13908:1;13878:32;:29;:32;:::i;:::-;13921:18;13942:26;;;:17;:26;;;;;;13853:57;;-1:-1:-1;13983:28:0;;;13979:328;;-1:-1:-1;;;;;14050:18:0;;14028:19;14050:18;;;:12;:18;;;;;:34;;14069:14;;14050:34;;;;;;;;;;;;;;14028:56;;14134:11;14101:12;:18;14114:4;-1:-1:-1;;;;;14101:18:0;-1:-1:-1;;;;;14101:18:0;;;;;;;;;;;;14120:10;14101:30;;;;;;;;;;;;;;;;;;;:44;;;;14218:30;;;:17;:30;;;;;:43;;;13979:328;-1:-1:-1;;;;;14317:18:0;;;;;;:12;:18;;;;;:27;;;;;-1:-1:-1;;14317:27:0;;;:::i;13569:186::-;-1:-1:-1;;;;;13683:16:0;;;;;;;:12;:16;;;;;;;;:23;;13654:26;;;:17;:26;;;;;:52;;;13717:16;;;39:1:-1;23:18;;45:23;;13717:30:0;;;;;;;;13569:186::o;16317:247::-;16384:27;16396:5;16403:7;16384:11;:27::i;:::-;16470:19;;;;:10;:19;;;;;16464:33;;-1:-1:-1;;16464:33:0;;;;;;;;;;;:38;16460:97;;16526:19;;;;:10;:19;;;;;16519:26;;;:::i;19696:176::-;19805:58;;;-1:-1:-1;;;;;19805:58:0;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19805:58:0;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;19779:85:0;;19798:5;;21795:1114;22399:27;22407:5;-1:-1:-1;;;;;22399:25:0;;:27::i;:::-;22391:71;;;;;-1:-1:-1;;;22391:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22536:12;22550:23;22585:5;-1:-1:-1;;;;;22577:19:0;22597:4;22577:25;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;22577:25:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;22535:67:0;;;;22621:7;22613:52;;;;;-1:-1:-1;;;22613:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22682:17;;:21;22678:224;;22824:10;22813:30;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22813:30:0;22805:85;;;;-1:-1:-1;;;22805:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1338:136;1396:7;1423:43;1427:1;1430;1423:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1416:50;1338:136;-1:-1:-1;;;1338:136:0:o;9084:336::-;-1:-1:-1;;;;;9156:16:0;;9148:61;;;;;-1:-1:-1;;;9148:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9229:16;9237:7;9229;:16::i;:::-;9228:17;9220:58;;;;;-1:-1:-1;;;9220:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9291:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;9291:25:0;-1:-1:-1;;;;;9291:25:0;;;;;9342:12;;:19;;:16;:19::i;:::-;9327:12;:34;9379:33;;9404:7;;-1:-1:-1;;;;;9379:33:0;;;9396:1;;9379:33;;9396:1;;9379:33;9084:336;;:::o;10234:1079::-;10356:4;10383:15;:2;-1:-1:-1;;;;;10383:13:0;;:15::i;:::-;10378:60;;-1:-1:-1;10422:4:0;10415:11;;10378:60;10509:12;10523:23;-1:-1:-1;;;;;10550:7:0;;-1:-1:-1;;;10655:12:0;:10;:12::i;:::-;10682:4;10701:7;10723:5;10558:181;;;;;;-1:-1:-1;;;;;10558:181:0;-1:-1:-1;;;;;10558:181:0;;;;;;-1:-1:-1;;;;;10558:181:0;-1:-1:-1;;;;;10558:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;10558:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10558:181:0;;;-1:-1:-1;;26:21;;;22:32;6:49;;10558:181:0;;;49:4:-1;25:18;;61:17;;-1:-1;;;;;182:15;-1:-1;;;;;;10558:181:0;;;179:29:-1;;;;160:49;;10550:190:0;;;10558:181;;10550:190;;-1:-1:-1;10550:190:0;;-1:-1:-1;25:18;-1:-1;10550:190:0;-1:-1:-1;10550:190:0;;-1:-1:-1;10550:190:0;;-1:-1:-1;25:18;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;10550:190:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;10508:232:0;;;;10756:7;10751:555;;10784:17;;:21;10780:384;;10952:10;10946:17;11013:15;11000:10;10996:2;10992:19;10985:44;10900:148;11088:60;;-1:-1:-1;;;11088:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10751:555;11196:13;11223:10;11212:32;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11212:32:0;-1:-1:-1;;;;;;11267:26:0;-1:-1:-1;;;11267:26:0;;-1:-1:-1;11259:35:0;;-1:-1:-1;;;11259:35:0;11319:175;11419:1;11383:24;;;:15;:24;;;;;;-1:-1:-1;;;;;11383:24:0;:38;11379:108;;11473:1;11438:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;11438:37:0;;;11319:175::o;13117:314::-;13184:27;13196:5;13203:7;13184:11;:27::i;:::-;13224:48;13257:5;13264:7;13224:32;:48::i;:::-;13422:1;13393:26;;;:17;:26;;;;;:30;-1:-1:-1;13117:314:0:o;2974:374::-;3034:4;3257:20;;3100:66;3297:23;;;;;;:42;;-1:-1:-1;;3324:15:0;;;3289:51;-1:-1:-1;;2974:374:0:o;1480:192::-;1566:7;1602:12;1594:6;;;;1586:29;;;;-1:-1:-1;;;1586:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1586:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1638:5:0;;;1480:192::o;1151:181::-;1209:7;1241:5;;;1265:6;;;;1257:46;;;;;-1:-1:-1;;;1257:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;9426:331;9521:5;-1:-1:-1;;;;;9501:25:0;:16;9509:7;9501;:16::i;:::-;-1:-1:-1;;;;;9501:25:0;;9493:75;;;;-1:-1:-1;;;9493:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9581:23;9596:7;9581:14;:23::i;:::-;9648:1;9617:20;;;:11;:20;;;;;;;;:33;;-1:-1:-1;;;;;;9617:33:0;;;9676:12;;:19;;;:16;:19;:::i;:::-;9661:12;:34;9713:36;;9741:7;;9737:1;;-1:-1:-1;;;;;9713:36:0;;;;;9737:1;;9713:36;9426:331;;:::o;29909:16426::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://99c8a46cb0f302f3570910af47c029d0efa349edebae8f4da25ffe9a39a40282
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.