ETH Price: $2,586.71 (-3.67%)
Gas: 5 Gwei

Token

hex.bet (HXB)
 

Overview

Max Total Supply

101,536,143,228.26571217 HXB

Holders

276

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Filtered by Token Holder
Uniswap V2: Router 2
Balance
0 HXB

Value
$0.00
0x7a250d5630b4cf539739df2c5dacb4c659f2488d
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
HEXBET

Compiler Version
v0.6.4+commit.1dca32f3

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 3 of 5: HEXBET.sol
//HEXBET.sol
//
//

pragma solidity 0.6.4;

import "./SafeMath.sol";
import "./IERC20.sol";
import "./HEX.sol";
import "./Address.sol";

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

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

//Uniswap factory interface
interface UniswapFactoryInterface {
    // Create Exchange
    function createExchange(address token) external returns (address exchange);
    // Get Exchange and Token Info
    function getExchange(address token) external view returns (address exchange);
    function getToken(address exchange) external view returns (address token);
    function getTokenWithId(uint256 tokenId) external view returns (address token);
    // Never use
    function initializeFactory(address template) external;
}

//Uniswap Interface
interface UniswapExchangeInterface {
    // Address of ERC20 token sold on this exchange
    function tokenAddress() external view returns (address token);
    // Address of Uniswap Factory
    function factoryAddress() external view returns (address factory);
    // Provide Liquidity
    function addLiquidity(uint256 min_liquidity, uint256 max_tokens, uint256 deadline) external payable returns (uint256);
    function removeLiquidity(uint256 amount, uint256 min_eth, uint256 min_tokens, uint256 deadline) external returns (uint256, uint256);
    // Get Prices
    function getEthToTokenInputPrice(uint256 eth_sold) external view returns (uint256 tokens_bought);
    function getEthToTokenOutputPrice(uint256 tokens_bought) external view returns (uint256 eth_sold);
    function getTokenToEthInputPrice(uint256 tokens_sold) external view returns (uint256 eth_bought);
    function getTokenToEthOutputPrice(uint256 eth_bought) external view returns (uint256 tokens_sold);
    // Trade ETH to ERC20
    function ethToTokenSwapInput(uint256 min_tokens, uint256 deadline) external payable returns (uint256  tokens_bought);
    function ethToTokenTransferInput(uint256 min_tokens, uint256 deadline, address recipient) external payable returns (uint256  tokens_bought);
    function ethToTokenSwapOutput(uint256 tokens_bought, uint256 deadline) external payable returns (uint256  eth_sold);
    function ethToTokenTransferOutput(uint256 tokens_bought, uint256 deadline, address recipient) external payable returns (uint256  eth_sold);
    // Trade ERC20 to ETH
    function tokenToEthSwapInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline) external returns (uint256  eth_bought);
    function tokenToEthTransferInput(uint256 tokens_sold, uint256 min_eth, uint256 deadline, address recipient) external returns (uint256  eth_bought);
    function tokenToEthSwapOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline) external returns (uint256  tokens_sold);
    function tokenToEthTransferOutput(uint256 eth_bought, uint256 max_tokens, uint256 deadline, address recipient) external returns (uint256  tokens_sold);
    // Trade ERC20 to ERC20
    function tokenToTokenSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_bought);
    function tokenToTokenSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address token_addr) external returns (uint256  tokens_sold);
    function tokenToTokenTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address token_addr) external returns (uint256  tokens_sold);
    // Trade ERC20 to Custom Pool
    function tokenToExchangeSwapInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeTransferInput(uint256 tokens_sold, uint256 min_tokens_bought, uint256 min_eth_bought, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_bought);
    function tokenToExchangeSwapOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address exchange_addr) external returns (uint256  tokens_sold);
    function tokenToExchangeTransferOutput(uint256 tokens_bought, uint256 max_tokens_sold, uint256 max_eth_sold, uint256 deadline, address recipient, address exchange_addr) external returns (uint256  tokens_sold);
}

////////////////////////////////////////////////
////////////////////EVENTS/////////////////////
//////////////////////////////////////////////

contract TokenEvents {

    //when a user locks tokens
    event TokenLock(
        address indexed user,
        uint value
    );

    //when a user unlocks tokens
    event TokenUnlock(
        address indexed user,
        uint value
    );

    //when founder tokens are locked
    event FounderLock (
        uint hxbAmt,
        uint timestamp
    );

    //when founder tokens are unlocked
    event FounderUnlock (
        uint hxbAmt,
        uint timestamp
    );
}

//////////////////////////////////////
//////////HEXBET TOKEN CONTRACT////////
////////////////////////////////////
contract HEXBET is IERC20, TokenEvents {

    using SafeMath for uint256;
    using SafeERC20 for HEXBET;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    //uniswap setup (used in setup only)
    address internal uniFactory = 0xc0a47dFe034B400B47bDaD5FecDa2621de6c4d95;
    address internal uniETHHEX = 0x05cDe89cCfa0adA8C88D5A23caaa79Ef129E7883;
    address public uniETHHXB = address(0);
    UniswapExchangeInterface internal uniHEXInterface = UniswapExchangeInterface(uniETHHEX);
    UniswapExchangeInterface internal uniHXBInterface;
    UniswapFactoryInterface internal uniFactoryInterface = UniswapFactoryInterface(uniFactory);
    //hex contract setup
    address internal hexAddress = 0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39;
    HEX internal hexInterface = HEX(hexAddress);
    //mint / lock
    uint public unlockLvl = 0;
    uint public founderLockStartTimestamp = 0;
    uint public founderLockDayLength = 3650;//10 years (10% released every year)
    uint public founderLockedTokens = 0;
    uint private allFounderLocked = 0;

    bool public mintBlock;//disables any more tokens ever being minted once _totalSupply reaches _maxSupply
    uint public mintRatio = 1000; //inital @ 1000, raises 
    uint public minLockDayLength = 7; // min days to lock
    uint internal daySeconds = 86400; // seconds in a day
    uint public totalLocked = 0;
    mapping (address => uint) public tokenLockedBalances;//balance of HXB locked mapped by user

    //tokenomics
    uint256 public _maxSupply = 50000000000000000000;// max supply @ 500B
    uint256 internal _totalSupply;
    string public constant name = "hex.bet";
    string public constant symbol = "HXB";
    uint public constant decimals = 8;

    //multisig
    address payable internal MULTISIG = 0x35C7a87EbC3E9fBfd2a31579c70f0A2A8D4De4c5;
    //admin
    address payable internal _p1 = 0xD64FF89558Cd0EA20Ae7aA032873d290801865f3;
    address payable internal _p2 = 0xbf1984B12878c6A25f0921535c76C05a60bdEf39;
    bool private sync;
    //minters
    address[] public minterAddresses;// future contracts to enable minting of HXB relative to HEX

    mapping(address => bool) admins;
    mapping(address => bool) minters;
    mapping (address => Locked) public locked;

    struct Locked{
        uint256 lockStartTimestamp;
        uint256 totalEarnedInterest;
    }
    
    modifier onlyMultisig(){
        require(msg.sender == MULTISIG, "not authorized");
        _;
    }

    modifier onlyAdmins(){
        require(admins[msg.sender], "not an admin");
        _;
    }

    modifier onlyMinters(){
        require(minters[msg.sender], "not a minter");
        _;
    }
    
    //protects against potential reentrancy
    modifier synchronized {
        require(!sync, "Sync lock");
        sync = true;
        _;
        sync = false;
    }

    constructor() public {
        admins[_p1] = true;
        admins[_p2] = true;
        //mint founder tokens
        mintFounderTokens(_maxSupply.mul(20).div(100));//20% of max supply
        //create uni exchange
        uniETHHXB = uniFactoryInterface.createExchange(address(this));
        uniHXBInterface = UniswapExchangeInterface(uniETHHXB);
    }

    //fallback for eth sent to contract - auto distribute as donation
    receive() external payable{
        donate();
    }

    function _initialLiquidity()
        public
        payable
        onlyAdmins
        synchronized
    {
        require(msg.value >= 0.001 ether, "eth value too low");
        //add liquidity
        uint heartsForEth = uniHEXInterface.getEthToTokenInputPrice(msg.value);//price of eth value in hex
        uint hxb = heartsForEth / mintRatio;
        _mint(address(this), hxb);//mint tokens to this contract
        this.safeApprove(uniETHHXB, hxb);//approve uni exchange contract
        uniHXBInterface.addLiquidity{value:msg.value}(0, hxb, (now + 15 minutes)); //send tokens and eth to uni as liquidity*/
    }
    
    
    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        _transfer(msg.sender, recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply unless mintBLock is true
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        uint256 amt = amount;
        require(account != address(0), "ERC20: mint to the zero address");
        if(!mintBlock){
            if(_totalSupply < _maxSupply){
                if(_totalSupply.add(amt) > _maxSupply){
                    amt = _maxSupply.sub(_totalSupply);
                    _totalSupply = _maxSupply;
                    mintBlock = true;
                }
                else{
                    _totalSupply = _totalSupply.add(amt);
                    if(_totalSupply >= _maxSupply.mul(30).div(100)){
                        mintRatio = 2000;
                        if(_totalSupply >= _maxSupply.mul(40).div(100)){
                            mintRatio = 3000;
                            if(_totalSupply >= _maxSupply.mul(50).div(100)){
                                mintRatio = 4000;
                                if(_totalSupply >= _maxSupply.mul(60).div(100)){
                                    mintRatio = 5000;
                                    if(_totalSupply >= _maxSupply.mul(70).div(100)){
                                        mintRatio = 6000;
                                        if(_totalSupply >= _maxSupply.mul(80).div(100)){
                                            mintRatio = 8000;
                                            if(_totalSupply >= _maxSupply.mul(90).div(100)){
                                                mintRatio = 10000;
                                            }
                                        }
                                    }
                                 }
                            }
                        }
                    }
                }
                _balances[account] = _balances[account].add(amt);
                emit Transfer(address(0), account, amt);
            }
        }
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount, "ERC20: burn amount exceeds allowance"));
    }

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    //mint HXB  to founders (only ever called in constructor)
    function mintFounderTokens(uint tokens)
        internal
        synchronized
        returns(bool)
    {
        require(tokens <= _maxSupply.mul(20).div(100), "founder tokens cannot be over 20%");
        _mint(_p1, tokens/4);//mint HXB
        _mint(_p2, tokens/4);//mint HXB
        _mint(address(this), tokens/2);//mint HXB to be locked for 10 years, 10% unlocked every year
        founderLock(tokens/2);
        return true;
    }

    function founderLock(uint tokens)
        internal
    {
        founderLockStartTimestamp = now;
        founderLockedTokens = tokens;
        allFounderLocked = tokens;
        emit FounderLock(tokens, founderLockStartTimestamp);
    }

    function unlock()
        public
        onlyAdmins
        synchronized
    {
        uint sixMonths = founderLockDayLength/10;
        require(unlockLvl < 10, "token unlock complete");
        require(founderLockStartTimestamp.add(sixMonths.mul(daySeconds)) <= now, "tokens cannot be unlocked yet");//must be at least over 6 months
        uint value = allFounderLocked/10;
        if(founderLockStartTimestamp.add((sixMonths).mul(daySeconds)) <= now && unlockLvl == 0){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 2).mul(daySeconds)) <= now && unlockLvl == 1){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 3).mul(daySeconds)) <= now && unlockLvl == 2){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 4).mul(daySeconds)) <= now && unlockLvl == 3){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 5).mul(daySeconds)) <= now && unlockLvl == 4){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 6).mul(daySeconds)) <= now && unlockLvl == 5){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 7).mul(daySeconds)) <= now && unlockLvl == 6){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 8).mul(daySeconds)) <= now && unlockLvl == 7)
        {
            unlockLvl++;     
            founderLockedTokens = founderLockedTokens.sub(value);      
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 9).mul(daySeconds)) <= now && unlockLvl == 8){
            unlockLvl++;
            founderLockedTokens = founderLockedTokens.sub(value);
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else if(founderLockStartTimestamp.add((sixMonths * 10).mul(daySeconds)) <= now && unlockLvl == 9){
            unlockLvl++;
            if(founderLockedTokens >= value){
                founderLockedTokens = founderLockedTokens.sub(value);
            }
            else{
                value = founderLockedTokens;
                founderLockedTokens = 0;
            }
            transfer(_p1, value.div(2));
            transfer(_p2, value.div(2));
        }
        else{
            revert();
        }
        emit FounderUnlock(value, now);
    }
    ////////////////////////////////////////////////////////
    /////////////////PUBLIC FACING - HXB CONTROL//////////
    //////////////////////////////////////////////////////

    //lock HXB tokens to contract
    function LockTokens(uint amt)
        public
    {
        require(amt > 0, "zero input");
        require(tokenBalance() >= amt, "Error: insufficient balance");//ensure user has enough funds
        if(isLockFinished(msg.sender)){
            UnlockTokens();//unlocks all currently locked tokens + profit
        }
        //update balances
        tokenLockedBalances[msg.sender] = tokenLockedBalances[msg.sender].add(amt);
        totalLocked = totalLocked.add(amt);
        locked[msg.sender].lockStartTimestamp = now;
        _transfer(msg.sender, address(this), amt);//make transfer
        emit TokenLock(msg.sender, amt);
    }

    //unlock HXB tokens from contract
    function UnlockTokens()
        public
        synchronized
    {
        require(tokenLockedBalances[msg.sender] > 0,"Error: unsufficient locked balance");//ensure user has enough locked funds
        require(isLockFinished(msg.sender), "tokens cannot be unlocked yet. min 7 day lock");
        uint amt = tokenLockedBalances[msg.sender];
        uint256 interest = calcLockingRewards(msg.sender);
        _mint(msg.sender, interest);//mint HXB - total unlocked / 1000 * (minLockDayLength + days past)
        locked[msg.sender].totalEarnedInterest += interest;
        tokenLockedBalances[msg.sender] = 0;
        locked[msg.sender].lockStartTimestamp = 0;
        totalLocked = totalLocked.sub(amt);
        _transfer(address(this), msg.sender, amt);//make transfer
        emit TokenUnlock(msg.sender, amt);
    }

    //returns locking reward in hxb
    function calcLockingRewards(address _user)
        public
        view
        returns(uint)
    {
        return (tokenLockedBalances[_user].div(2500) * (minLockDayLength + daysPastMinLockTime()));
    }
    
    //returns amount of days locked past min lock time of 7 days
    function daysPastMinLockTime()
        public
        view
        returns(uint)
    {
        uint daysPast = now.sub(locked[msg.sender].lockStartTimestamp).div(daySeconds);
        if(daysPast >= minLockDayLength){
            return daysPast - minLockDayLength;// returns 0 if under 1 day passed
        }
        else{
            return 0;
        }
    }
    
    //mint HXB to address ( for use in external contracts within the ecosystem)
    function mintHXB(uint value, address receiver)
        public
        onlyMinters
        returns(bool)
    {
        uint amt = value.div(mintRatio);
        address minter = receiver;
        _mint(minter, amt);//mint HXB
        return true;
    }

    ///////////////////////////////
    ////////ADMIN ONLY//////////////
    ///////////////////////////////

    //allows addition of contract addresses that can call this contracts mint function.
    function addMinter(address minter)
        public
        onlyMultisig
        returns (bool)
    {        
        minters[minter] = true;
        minterAddresses.push(minter);
        return true;
    }


    ///////////////////////////////
    ////////VIEW ONLY//////////////
    ///////////////////////////////

    //total HXB locked in contract
    function totalLockedTokenBalance()
        public
        view
        returns (uint256)
    {
        return totalLocked;
    }

    //HXB balance of caller
    function tokenBalance()
        public
        view
        returns (uint256)
    {
        return balanceOf(msg.sender);
    }

    //
    function isLockFinished(address _user)
        public
        view
        returns(bool)
    {
        if(locked[_user].lockStartTimestamp == 0){
            return false;
        }
        else{
           return locked[_user].lockStartTimestamp.add((minLockDayLength).mul(daySeconds)) <= now;               
        }

    }
    
    
    function donate() public payable {
        require(msg.value > 0);
        bool success = false;
        uint256 balance = msg.value;
        //distribute
        uint256 share = balance.div(2);
        (success, ) =  _p1.call{value:share}{gas:21000}('');
        require(success, "Transfer failed");
        (success, ) =  _p2.call{value:share}{gas:21000}('');
        require(success, "Transfer failed");
    }

}

File 1 of 5: Address.sol
pragma solidity 0.6.4;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

File 2 of 5: HEX.sol
pragma solidity 0.6.4;

interface HEX {
   /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

   function stakeStart(uint256 newStakedHearts, uint256 newStakedDays) external;
   function stakeEnd(uint256 stakeIndex, uint40 stakeIdParam) external;
   function stakeCount(address stakerAddr) external view returns (uint256);
   function stakeLists(address owner, uint256 stakeIndex) external view returns (uint40, uint72, uint72, uint16, uint16, uint16, bool);
   function currentDay() external view returns (uint256);
   function dailyDataRange(uint256 beginDay, uint256 endDay) external view returns (uint256[] memory);
   function globalInfo() external view returns (uint256[13] memory);

}

File 4 of 5: IERC20.sol
pragma solidity 0.6.4;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);//from address(0) for minting

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 5 of 5: SafeMath.sol
pragma solidity 0.6.4;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    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;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    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;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"hxbAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FounderLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"hxbAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"FounderUnlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TokenUnlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"LockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UnlockTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_initialLiquidity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"addMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"calcLockingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"daysPastMinLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"founderLockDayLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderLockStartTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderLockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isLockFinished","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"locked","outputs":[{"internalType":"uint256","name":"lockStartTimestamp","type":"uint256"},{"internalType":"uint256","name":"totalEarnedInterest","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minLockDayLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"mintHXB","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"minterAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenLockedBalances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalLockedTokenBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniETHHXB","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockLvl","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600280546001600160a01b031990811673c0a47dfe034b400b47bdad5fecda2621de6c4d9517918290556003805482167305cde89ccfa0ada8c88d5a23caaa79ef129e7883179081905560048054831690556005805483166001600160a01b03928316179055600780548316938216939093178355600880548316732b591e99afe9f32eaa6214f7b7629768c40eeb391790819055600980548416919092161790556000600a819055600b819055610e42600c55600d819055600e8190556103e8601055601192909255620151806012556013919091556802b5e3af16b18800006015556017805482167335c7a87ebc3e9fbfd2a31579c70f0a2a8d4de4c517905560188054821673d64ff89558cd0ea20ae7aa032873d290801865f31790556019805490911673bf1984b12878c6a25f0921535c76c05a60bdef391790553480156200015057600080fd5b506018546001600160a01b039081166000908152601b602090815260408083208054600160ff199182168117909255601954909516845292208054909316909117909155601554620001df91620001d091606491620001bc91906014906200028f811b62001c0817901c565b620002f660201b620018861790919060201c565b6001600160e01b036200034016565b5060075460408051630b2479c760e11b815230600482015290516001600160a01b0390921691631648f38e916024808201926020929091908290030181600087803b1580156200022e57600080fd5b505af115801562000243573d6000803e3d6000fd5b505050506040513d60208110156200025a57600080fd5b5051600480546001600160a01b03199081166001600160a01b0393841617918290556006805492909316911617905562000966565b600082620002a057506000620002f0565b82820282848281620002ae57fe5b0414620002ed5760405162461bcd60e51b815260040180806020018281038252602181526020018062002e266021913960400191505060405180910390fd5b90505b92915050565b6000620002ed83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506200048060201b60201c565b601954600090600160a01b900460ff16156200038f576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b60198054600160a01b60ff60a01b19909116179055601554620003c890606490620001bc9060146200028f602090811b62001c0817901c565b821115620004085760405162461bcd60e51b815260040180806020018281038252602181526020018062002e056021913960400191505060405180910390fd5b6018546200042d906001600160a01b03166004845b046001600160e01b036200052716565b60195462000447906001600160a01b03166004846200041d565b62000455306002846200041d565b6200046c600283046001600160e01b036200081616565b50506019805460ff60a01b19169055600190565b60008183620005105760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620004d4578181015183820152602001620004ba565b50505050905090810190601f168015620005025780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200051d57fe5b0495945050505050565b806001600160a01b03831662000584576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600f5460ff16620008115760155460165410156200081157601554620005bb826016546200086460201b62001bae1790919060201c565b1115620005fb57620005e0601654601554620008bf60201b62001ed41790919060201c565b601554601655600f805460ff1916600117905590506200078e565b62000617816016546200086460201b62001bae1790919060201c565b601681905550620006406064620001bc601e6015546200028f60201b62001c081790919060201c565b601654106200078e576107d0601081905550620006756064620001bc60286015546200028f60201b62001c081790919060201c565b601654106200078e57610bb8601081905550620006aa6064620001bc60326015546200028f60201b62001c081790919060201c565b601654106200078e57610fa0601081905550620006df6064620001bc603c6015546200028f60201b62001c081790919060201c565b601654106200078e57611388601081905550620007146064620001bc60466015546200028f60201b62001c081790919060201c565b601654106200078e57611770601081905550620007496064620001bc60506015546200028f60201b62001c081790919060201c565b601654106200078e57611f406010819055506200077e6064620001bc605a6015546200028f60201b62001c081790919060201c565b601654106200078e576127106010555b6001600160a01b03831660009081526020818152604090912054620007be91839062001bae62000864821b17901c565b6001600160a01b0384166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35b505050565b42600b819055600d829055600e82905560408051838152602081019290925280517f3625b5dbaf49e9a7d78db4e7a4dfe7a45f4088a196185afc1a1a0d4d70db85ac9281900390910190a150565b600082820183811015620002ed576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6000620002ed83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506200090960201b60201c565b600081848411156200095e5760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315620004d4578181015183820152602001620004ba565b505050900390565b61248f80620009766000396000f3fe6080604052600436106102135760003560e01c806377e1ac6c11610118578063a9059cbb116100a0578063dd62ed3e1161006f578063dd62ed3e14610717578063e9f268b114610752578063ed88c68e14610767578063edcaa9821461076f578063f8b2dbe7146107a257610222565b8063a9059cbb14610668578063b0efb8a3146106a1578063cbf9fe5f146106b6578063d3bcca751461070257610222565b806395f44745116100e757806395f44745146105bd578063983b2d56146105d25780639e1a4d1914610605578063a457c2d71461061a578063a69df4b51461065357610222565b806377e1ac6c1461055257806383e6eed51461058b57806384a91db7146105a057806395d89b41146105a857610222565b8063400254c41161019b5780636a58901a1161016a5780636a58901a146104985780636e2d9c38146104c257806370a08231146104f5578063714a35fb1461052857806372783f6b1461053d57610222565b8063400254c4146104265780634b1e65c01461043b57806353cc26341461046e578063568914121461048357610222565b806322f4596f116101e257806322f4596f1461036b57806323b872dd14610380578063313ce567146103c357806339509351146103d85780633f9bcc6c1461041157610222565b8063028850971461022757806306fdde031461026d578063095ea7b3146102f757806318160ddd1461034457610222565b36610222576102206107b7565b005b600080fd5b34801561023357600080fd5b506102516004803603602081101561024a57600080fd5b5035610921565b604080516001600160a01b039092168252519081900360200190f35b34801561027957600080fd5b50610282610948565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bc5781810151838201526020016102a4565b50505050905090810190601f1680156102e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030357600080fd5b506103306004803603604081101561031a57600080fd5b506001600160a01b03813516906020013561096b565b604080519115158252519081900360200190f35b34801561035057600080fd5b50610359610982565b60408051918252519081900360200190f35b34801561037757600080fd5b50610359610989565b34801561038c57600080fd5b50610330600480360360608110156103a357600080fd5b506001600160a01b0381358116916020810135909116906040013561098f565b3480156103cf57600080fd5b506103596109fe565b3480156103e457600080fd5b50610330600480360360408110156103fb57600080fd5b506001600160a01b038135169060200135610a03565b34801561041d57600080fd5b50610359610a3f565b34801561043257600080fd5b50610359610a45565b34801561044757600080fd5b506103306004803603602081101561045e57600080fd5b50356001600160a01b0316610a4b565b34801561047a57600080fd5b50610220610aba565b34801561048f57600080fd5b50610359610c5f565b3480156104a457600080fd5b50610220600480360360208110156104bb57600080fd5b5035610c65565b3480156104ce57600080fd5b50610359600480360360208110156104e557600080fd5b50356001600160a01b0316610db5565b34801561050157600080fd5b506103596004803603602081101561051857600080fd5b50356001600160a01b0316610dc7565b34801561053457600080fd5b50610330610de2565b34801561054957600080fd5b50610251610deb565b34801561055e57600080fd5b506103306004803603604081101561057557600080fd5b50803590602001356001600160a01b0316610dfa565b34801561059757600080fd5b50610359610e7c565b610220610e82565b3480156105b457600080fd5b506102826110d3565b3480156105c957600080fd5b506103596110f2565b3480156105de57600080fd5b50610330600480360360208110156105f557600080fd5b50356001600160a01b03166110f8565b34801561061157600080fd5b506103596111b5565b34801561062657600080fd5b506103306004803603604081101561063d57600080fd5b506001600160a01b0381351690602001356111c5565b34801561065f57600080fd5b5061022061121a565b34801561067457600080fd5b506103306004803603604081101561068b57600080fd5b506001600160a01b038135169060200135611787565b3480156106ad57600080fd5b50610359611794565b3480156106c257600080fd5b506106e9600480360360208110156106d957600080fd5b50356001600160a01b031661179a565b6040805192835260208301919091528051918290030190f35b34801561070e57600080fd5b506103596117b3565b34801561072357600080fd5b506103596004803603604081101561073a57600080fd5b506001600160a01b03813581169160200135166117b9565b34801561075e57600080fd5b506103596117e4565b6102206107b7565b34801561077b57600080fd5b506103596004803603602081101561079257600080fd5b50356001600160a01b03166117ea565b3480156107ae57600080fd5b5061035961182c565b600034116107c457600080fd5b600034816107d982600263ffffffff61188616565b6018546040519192506001600160a01b0316906152089083906000818181858888f193505050503d806000811461082c576040519150601f19603f3d011682016040523d82523d6000602084013e610831565b606091505b5050809350508261087b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6019546040516001600160a01b03909116906152089083906000818181858888f193505050503d80600081146108cd576040519150601f19603f3d011682016040523d82523d6000602084013e6108d2565b606091505b5050809350508261091c576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505050565b601a818154811061092e57fe5b6000918252602090912001546001600160a01b0316905081565b604051806040016040528060078152602001661a195e0b98995d60ca1b81525081565b60006109783384846118cf565b5060015b92915050565b6016545b90565b60155481565b600061099c8484846119bb565b6109f484336109ef85604051806060016040528060288152602001612364602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919063ffffffff611b1716565b6118cf565b5060019392505050565b600881565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109789185906109ef908663ffffffff611bae16565b60105481565b60115481565b6001600160a01b0381166000908152601d6020526040812054610a7057506000610ab5565b42610ab0610a8b601254601154611c0890919063ffffffff16565b6001600160a01b0385166000908152601d60205260409020549063ffffffff611bae16565b111590505b919050565b601954600160a01b900460ff1615610b05576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6019805460ff60a01b1916600160a01b17905533600090815260146020526040902054610b635760405162461bcd60e51b81526004018080602001828103825260228152602001806123216022913960400191505060405180910390fd5b610b6c33610a4b565b610ba75760405162461bcd60e51b815260040180806020018281038252602d8152602001806122f4602d913960400191505060405180910390fd5b3360008181526014602052604081205491610bc1906117ea565b9050610bcd3382611c61565b336000908152601d60208181526040808420600181018054870190556014835290842084905591905255601354610c0a908363ffffffff611ed416565b601355610c183033846119bb565b60408051838152905133917f2915a1443c364019b989c945ec4373f0aede5d91cc533f70c3187c072c69047d919081900360200190a250506019805460ff60a01b19169055565b60135481565b60008111610ca7576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b80610cb06111b5565b1015610d03576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b610d0c33610a4b565b15610d1957610d19610aba565b33600090815260146020526040902054610d39908263ffffffff611bae16565b33600090815260146020526040902055601354610d5c908263ffffffff611bae16565b601355336000818152601d60205260409020429055610d7c9030836119bb565b60408051828152905133917fb28c000ac15ab34ecd2967bf80e42da8695d031d8ab47459e5b4f747607d63f6919081900360200190a250565b60146020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b600f5460ff1681565b6004546001600160a01b031681565b336000908152601c602052604081205460ff16610e4d576040805162461bcd60e51b815260206004820152600c60248201526b3737ba10309036b4b73a32b960a11b604482015290519081900360640190fd5b6000610e646010548561188690919063ffffffff16565b905082610e718183611c61565b506001949350505050565b60135490565b336000908152601b602052604090205460ff16610ed5576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1030b71030b236b4b760a11b604482015290519081900360640190fd5b601954600160a01b900460ff1615610f20576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6019805460ff60a01b1916600160a01b17905566038d7ea4c68000341015610f83576040805162461bcd60e51b81526020600482015260116024820152706574682076616c756520746f6f206c6f7760781b604482015290519081900360640190fd5b6005546040805163cd7724c360e01b815234600482015290516000926001600160a01b03169163cd7724c3916024808301926020929190829003018186803b158015610fce57600080fd5b505afa158015610fe2573d6000803e3d6000fd5b505050506040513d6020811015610ff857600080fd5b5051601054909150600090828161100b57fe5b0490506110183082611c61565b6004546110369030906001600160a01b03168363ffffffff611f1616565b6006546040805163422f104360e01b815260006004820152602481018490526103844201604482015290516001600160a01b039092169163422f1043913491606480830192602092919082900301818588803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b50505050506040513d60208110156110c057600080fd5b50506019805460ff60a01b191690555050565b60405180604001604052806003815260200162242c2160e91b81525081565b600b5481565b6017546000906001600160a01b0316331461114b576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b506001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601a8054808301825592527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e90910180546001600160a01b03191690921790915590565b60006111c033610dc7565b905090565b600061097833846109ef85604051806060016040528060258152602001612435602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919063ffffffff611b1716565b336000908152601b602052604090205460ff1661126d576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1030b71030b236b4b760a11b604482015290519081900360640190fd5b601954600160a01b900460ff16156112b8576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6019805460ff60a01b1916600160a01b179055600c54600090600a90049050600a805410611325576040805162461bcd60e51b8152602060048201526015602482015274746f6b656e20756e6c6f636b20636f6d706c65746560581b604482015290519081900360640190fd5b4261134d61133e60125484611c0890919063ffffffff16565b600b549063ffffffff611bae16565b11156113a0576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e732063616e6e6f7420626520756e6c6f636b656420796574000000604482015290519081900360640190fd5b6000600a600e54816113ae57fe5b049050426113ca61133e60125485611c0890919063ffffffff16565b111580156113d85750600a54155b1561144a57600a80546001019055600d546113f9908263ffffffff611ed416565b600d55601854611422906001600160a01b031661141d83600263ffffffff61188616565b611787565b50601954611444906001600160a01b031661141d83600263ffffffff61188616565b5061173c565b4261146661133e60125485600202611c0890919063ffffffff16565b111580156114765750600a546001145b1561149757600a80546001019055600d546113f9908263ffffffff611ed416565b426114b361133e60125485600302611c0890919063ffffffff16565b111580156114c35750600a546002145b156114e457600a80546001019055600d546113f9908263ffffffff611ed416565b4261150061133e60125485600402611c0890919063ffffffff16565b111580156115105750600a546003145b1561153157600a80546001019055600d546113f9908263ffffffff611ed416565b4261154d61133e60125485600502611c0890919063ffffffff16565b1115801561155d5750600a546004145b1561157e57600a80546001019055600d546113f9908263ffffffff611ed416565b4261159a61133e60125485600602611c0890919063ffffffff16565b111580156115aa5750600a546005145b156115cb57600a80546001019055600d546113f9908263ffffffff611ed416565b426115e761133e60125485600702611c0890919063ffffffff16565b111580156115f75750600a546006145b1561161857600a80546001019055600d546113f9908263ffffffff611ed416565b4261163461133e60125485600802611c0890919063ffffffff16565b111580156116445750600a546007145b1561166557600a80546001019055600d546113f9908263ffffffff611ed416565b4261168161133e60125485600902611c0890919063ffffffff16565b111580156116915750600a546008145b156116b257600a80546001019055600d546113f9908263ffffffff611ed416565b426116ce61133e60125485600a02611c0890919063ffffffff16565b111580156116de5750600a546009145b1561022257600a80546001019055600d54811161171057600d54611708908263ffffffff611ed416565b600d5561171b565b50600d805460009091555b601854611422906001600160a01b031661141d83600263ffffffff61188616565b6040805182815242602082015281517ff6742054252f94c182844c882646c1d954775ae04b2de8f83448d54154ddaf62929181900390910190a150506019805460ff60a01b19169055565b60006109783384846119bb565b600a5481565b601d602052600090815260409020805460019091015482565b600c5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600d5481565b60006117f461182c565b6011546001600160a01b038416600090815260146020526040902054910190611825906109c463ffffffff61188616565b0292915050565b601254336000908152601d602052604081205490918291611865919061185990429063ffffffff611ed416565b9063ffffffff61188616565b9050601154811061187c5760115490039050610986565b6000915050610986565b60006118c883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612029565b9392505050565b6001600160a01b0383166119145760405162461bcd60e51b81526004018080602001828103825260248152602001806123b16024913960400191505060405180910390fd5b6001600160a01b0382166119595760405162461bcd60e51b81526004018080602001828103825260228152602001806122ac6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611a005760405162461bcd60e51b815260040180806020018281038252602581526020018061238c6025913960400191505060405180910390fd5b6001600160a01b038216611a455760405162461bcd60e51b81526004018080602001828103825260238152602001806122896023913960400191505060405180910390fd5b611a88816040518060600160405280602681526020016122ce602691396001600160a01b038616600090815260208190526040902054919063ffffffff611b1716565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611abd908263ffffffff611bae16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611ba65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b6b578181015183820152602001611b53565b50505050905090810190601f168015611b985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156118c8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611c175750600061097c565b82820282848281611c2457fe5b04146118c85760405162461bcd60e51b81526004018080602001828103825260218152602001806123436021913960400191505060405180910390fd5b806001600160a01b038316611cbd576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600f5460ff1661091c57601554601654101561091c57601554601654611ce9908363ffffffff611bae16565b1115611d1e57601654601554611d049163ffffffff611ed416565b601554601655600f805460ff191660011790559050611e54565b601654611d31908263ffffffff611bae16565b601655601554611d4f9060649061185990601e63ffffffff611c0816565b60165410611e54576107d0601055601554611d789060649061185990602863ffffffff611c0816565b60165410611e5457610bb8601055601554611da19060649061185990603263ffffffff611c0816565b60165410611e5457610fa0601055601554611dca9060649061185990603c63ffffffff611c0816565b60165410611e5457611388601055601554611df39060649061185990604663ffffffff611c0816565b60165410611e5457611770601055601554611e1c9060649061185990605063ffffffff611c0816565b60165410611e5457611f40601055601554611e459060649061185990605a63ffffffff611c0816565b60165410611e54576127106010555b6001600160a01b038316600090815260208190526040902054611e7d908263ffffffff611bae16565b6001600160a01b0384166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505050565b60006118c883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b17565b801580611f9c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051155b611fd75760405162461bcd60e51b81526004018080602001828103825260368152602001806123ff6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261091c90849061208e565b600081836120785760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611b6b578181015183820152602001611b53565b50600083858161208457fe5b0495945050505050565b6120a0826001600160a01b031661224c565b6120f1576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061212f5780518252601f199092019160209182019101612110565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b5091509150816121ed576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156122465780806020019051602081101561220957600080fd5b50516122465760405162461bcd60e51b815260040180806020018281038252602a8152602001806123d5602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061228057508115155b94935050505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365746f6b656e732063616e6e6f7420626520756e6c6f636b6564207965742e206d696e203720646179206c6f636b4572726f723a20756e73756666696369656e74206c6f636b65642062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220005545448900d6ee922e705ddb74eaaf714880f81def8cde51acb2085b69d21764736f6c63430006040033666f756e64657220746f6b656e732063616e6e6f74206265206f76657220323025536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77

Deployed Bytecode

0x6080604052600436106102135760003560e01c806377e1ac6c11610118578063a9059cbb116100a0578063dd62ed3e1161006f578063dd62ed3e14610717578063e9f268b114610752578063ed88c68e14610767578063edcaa9821461076f578063f8b2dbe7146107a257610222565b8063a9059cbb14610668578063b0efb8a3146106a1578063cbf9fe5f146106b6578063d3bcca751461070257610222565b806395f44745116100e757806395f44745146105bd578063983b2d56146105d25780639e1a4d1914610605578063a457c2d71461061a578063a69df4b51461065357610222565b806377e1ac6c1461055257806383e6eed51461058b57806384a91db7146105a057806395d89b41146105a857610222565b8063400254c41161019b5780636a58901a1161016a5780636a58901a146104985780636e2d9c38146104c257806370a08231146104f5578063714a35fb1461052857806372783f6b1461053d57610222565b8063400254c4146104265780634b1e65c01461043b57806353cc26341461046e578063568914121461048357610222565b806322f4596f116101e257806322f4596f1461036b57806323b872dd14610380578063313ce567146103c357806339509351146103d85780633f9bcc6c1461041157610222565b8063028850971461022757806306fdde031461026d578063095ea7b3146102f757806318160ddd1461034457610222565b36610222576102206107b7565b005b600080fd5b34801561023357600080fd5b506102516004803603602081101561024a57600080fd5b5035610921565b604080516001600160a01b039092168252519081900360200190f35b34801561027957600080fd5b50610282610948565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102bc5781810151838201526020016102a4565b50505050905090810190601f1680156102e95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030357600080fd5b506103306004803603604081101561031a57600080fd5b506001600160a01b03813516906020013561096b565b604080519115158252519081900360200190f35b34801561035057600080fd5b50610359610982565b60408051918252519081900360200190f35b34801561037757600080fd5b50610359610989565b34801561038c57600080fd5b50610330600480360360608110156103a357600080fd5b506001600160a01b0381358116916020810135909116906040013561098f565b3480156103cf57600080fd5b506103596109fe565b3480156103e457600080fd5b50610330600480360360408110156103fb57600080fd5b506001600160a01b038135169060200135610a03565b34801561041d57600080fd5b50610359610a3f565b34801561043257600080fd5b50610359610a45565b34801561044757600080fd5b506103306004803603602081101561045e57600080fd5b50356001600160a01b0316610a4b565b34801561047a57600080fd5b50610220610aba565b34801561048f57600080fd5b50610359610c5f565b3480156104a457600080fd5b50610220600480360360208110156104bb57600080fd5b5035610c65565b3480156104ce57600080fd5b50610359600480360360208110156104e557600080fd5b50356001600160a01b0316610db5565b34801561050157600080fd5b506103596004803603602081101561051857600080fd5b50356001600160a01b0316610dc7565b34801561053457600080fd5b50610330610de2565b34801561054957600080fd5b50610251610deb565b34801561055e57600080fd5b506103306004803603604081101561057557600080fd5b50803590602001356001600160a01b0316610dfa565b34801561059757600080fd5b50610359610e7c565b610220610e82565b3480156105b457600080fd5b506102826110d3565b3480156105c957600080fd5b506103596110f2565b3480156105de57600080fd5b50610330600480360360208110156105f557600080fd5b50356001600160a01b03166110f8565b34801561061157600080fd5b506103596111b5565b34801561062657600080fd5b506103306004803603604081101561063d57600080fd5b506001600160a01b0381351690602001356111c5565b34801561065f57600080fd5b5061022061121a565b34801561067457600080fd5b506103306004803603604081101561068b57600080fd5b506001600160a01b038135169060200135611787565b3480156106ad57600080fd5b50610359611794565b3480156106c257600080fd5b506106e9600480360360208110156106d957600080fd5b50356001600160a01b031661179a565b6040805192835260208301919091528051918290030190f35b34801561070e57600080fd5b506103596117b3565b34801561072357600080fd5b506103596004803603604081101561073a57600080fd5b506001600160a01b03813581169160200135166117b9565b34801561075e57600080fd5b506103596117e4565b6102206107b7565b34801561077b57600080fd5b506103596004803603602081101561079257600080fd5b50356001600160a01b03166117ea565b3480156107ae57600080fd5b5061035961182c565b600034116107c457600080fd5b600034816107d982600263ffffffff61188616565b6018546040519192506001600160a01b0316906152089083906000818181858888f193505050503d806000811461082c576040519150601f19603f3d011682016040523d82523d6000602084013e610831565b606091505b5050809350508261087b576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b6019546040516001600160a01b03909116906152089083906000818181858888f193505050503d80600081146108cd576040519150601f19603f3d011682016040523d82523d6000602084013e6108d2565b606091505b5050809350508261091c576040805162461bcd60e51b815260206004820152600f60248201526e151c985b9cd9995c8819985a5b1959608a1b604482015290519081900360640190fd5b505050565b601a818154811061092e57fe5b6000918252602090912001546001600160a01b0316905081565b604051806040016040528060078152602001661a195e0b98995d60ca1b81525081565b60006109783384846118cf565b5060015b92915050565b6016545b90565b60155481565b600061099c8484846119bb565b6109f484336109ef85604051806060016040528060288152602001612364602891396001600160a01b038a166000908152600160209081526040808320338452909152902054919063ffffffff611b1716565b6118cf565b5060019392505050565b600881565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109789185906109ef908663ffffffff611bae16565b60105481565b60115481565b6001600160a01b0381166000908152601d6020526040812054610a7057506000610ab5565b42610ab0610a8b601254601154611c0890919063ffffffff16565b6001600160a01b0385166000908152601d60205260409020549063ffffffff611bae16565b111590505b919050565b601954600160a01b900460ff1615610b05576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6019805460ff60a01b1916600160a01b17905533600090815260146020526040902054610b635760405162461bcd60e51b81526004018080602001828103825260228152602001806123216022913960400191505060405180910390fd5b610b6c33610a4b565b610ba75760405162461bcd60e51b815260040180806020018281038252602d8152602001806122f4602d913960400191505060405180910390fd5b3360008181526014602052604081205491610bc1906117ea565b9050610bcd3382611c61565b336000908152601d60208181526040808420600181018054870190556014835290842084905591905255601354610c0a908363ffffffff611ed416565b601355610c183033846119bb565b60408051838152905133917f2915a1443c364019b989c945ec4373f0aede5d91cc533f70c3187c072c69047d919081900360200190a250506019805460ff60a01b19169055565b60135481565b60008111610ca7576040805162461bcd60e51b815260206004820152600a6024820152691e995c9bc81a5b9c1d5d60b21b604482015290519081900360640190fd5b80610cb06111b5565b1015610d03576040805162461bcd60e51b815260206004820152601b60248201527f4572726f723a20696e73756666696369656e742062616c616e63650000000000604482015290519081900360640190fd5b610d0c33610a4b565b15610d1957610d19610aba565b33600090815260146020526040902054610d39908263ffffffff611bae16565b33600090815260146020526040902055601354610d5c908263ffffffff611bae16565b601355336000818152601d60205260409020429055610d7c9030836119bb565b60408051828152905133917fb28c000ac15ab34ecd2967bf80e42da8695d031d8ab47459e5b4f747607d63f6919081900360200190a250565b60146020526000908152604090205481565b6001600160a01b031660009081526020819052604090205490565b600f5460ff1681565b6004546001600160a01b031681565b336000908152601c602052604081205460ff16610e4d576040805162461bcd60e51b815260206004820152600c60248201526b3737ba10309036b4b73a32b960a11b604482015290519081900360640190fd5b6000610e646010548561188690919063ffffffff16565b905082610e718183611c61565b506001949350505050565b60135490565b336000908152601b602052604090205460ff16610ed5576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1030b71030b236b4b760a11b604482015290519081900360640190fd5b601954600160a01b900460ff1615610f20576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6019805460ff60a01b1916600160a01b17905566038d7ea4c68000341015610f83576040805162461bcd60e51b81526020600482015260116024820152706574682076616c756520746f6f206c6f7760781b604482015290519081900360640190fd5b6005546040805163cd7724c360e01b815234600482015290516000926001600160a01b03169163cd7724c3916024808301926020929190829003018186803b158015610fce57600080fd5b505afa158015610fe2573d6000803e3d6000fd5b505050506040513d6020811015610ff857600080fd5b5051601054909150600090828161100b57fe5b0490506110183082611c61565b6004546110369030906001600160a01b03168363ffffffff611f1616565b6006546040805163422f104360e01b815260006004820152602481018490526103844201604482015290516001600160a01b039092169163422f1043913491606480830192602092919082900301818588803b15801561109557600080fd5b505af11580156110a9573d6000803e3d6000fd5b50505050506040513d60208110156110c057600080fd5b50506019805460ff60a01b191690555050565b60405180604001604052806003815260200162242c2160e91b81525081565b600b5481565b6017546000906001600160a01b0316331461114b576040805162461bcd60e51b815260206004820152600e60248201526d1b9bdd08185d5d1a1bdc9a5e995960921b604482015290519081900360640190fd5b506001600160a01b03166000818152601c60205260408120805460ff19166001908117909155601a8054808301825592527f057c384a7d1c54f3a1b2e5e67b2617b8224fdfd1ea7234eea573a6ff665ff63e90910180546001600160a01b03191690921790915590565b60006111c033610dc7565b905090565b600061097833846109ef85604051806060016040528060258152602001612435602591393360009081526001602090815260408083206001600160a01b038d168452909152902054919063ffffffff611b1716565b336000908152601b602052604090205460ff1661126d576040805162461bcd60e51b815260206004820152600c60248201526b3737ba1030b71030b236b4b760a11b604482015290519081900360640190fd5b601954600160a01b900460ff16156112b8576040805162461bcd60e51b815260206004820152600960248201526853796e63206c6f636b60b81b604482015290519081900360640190fd5b6019805460ff60a01b1916600160a01b179055600c54600090600a90049050600a805410611325576040805162461bcd60e51b8152602060048201526015602482015274746f6b656e20756e6c6f636b20636f6d706c65746560581b604482015290519081900360640190fd5b4261134d61133e60125484611c0890919063ffffffff16565b600b549063ffffffff611bae16565b11156113a0576040805162461bcd60e51b815260206004820152601d60248201527f746f6b656e732063616e6e6f7420626520756e6c6f636b656420796574000000604482015290519081900360640190fd5b6000600a600e54816113ae57fe5b049050426113ca61133e60125485611c0890919063ffffffff16565b111580156113d85750600a54155b1561144a57600a80546001019055600d546113f9908263ffffffff611ed416565b600d55601854611422906001600160a01b031661141d83600263ffffffff61188616565b611787565b50601954611444906001600160a01b031661141d83600263ffffffff61188616565b5061173c565b4261146661133e60125485600202611c0890919063ffffffff16565b111580156114765750600a546001145b1561149757600a80546001019055600d546113f9908263ffffffff611ed416565b426114b361133e60125485600302611c0890919063ffffffff16565b111580156114c35750600a546002145b156114e457600a80546001019055600d546113f9908263ffffffff611ed416565b4261150061133e60125485600402611c0890919063ffffffff16565b111580156115105750600a546003145b1561153157600a80546001019055600d546113f9908263ffffffff611ed416565b4261154d61133e60125485600502611c0890919063ffffffff16565b1115801561155d5750600a546004145b1561157e57600a80546001019055600d546113f9908263ffffffff611ed416565b4261159a61133e60125485600602611c0890919063ffffffff16565b111580156115aa5750600a546005145b156115cb57600a80546001019055600d546113f9908263ffffffff611ed416565b426115e761133e60125485600702611c0890919063ffffffff16565b111580156115f75750600a546006145b1561161857600a80546001019055600d546113f9908263ffffffff611ed416565b4261163461133e60125485600802611c0890919063ffffffff16565b111580156116445750600a546007145b1561166557600a80546001019055600d546113f9908263ffffffff611ed416565b4261168161133e60125485600902611c0890919063ffffffff16565b111580156116915750600a546008145b156116b257600a80546001019055600d546113f9908263ffffffff611ed416565b426116ce61133e60125485600a02611c0890919063ffffffff16565b111580156116de5750600a546009145b1561022257600a80546001019055600d54811161171057600d54611708908263ffffffff611ed416565b600d5561171b565b50600d805460009091555b601854611422906001600160a01b031661141d83600263ffffffff61188616565b6040805182815242602082015281517ff6742054252f94c182844c882646c1d954775ae04b2de8f83448d54154ddaf62929181900390910190a150506019805460ff60a01b19169055565b60006109783384846119bb565b600a5481565b601d602052600090815260409020805460019091015482565b600c5481565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b600d5481565b60006117f461182c565b6011546001600160a01b038416600090815260146020526040902054910190611825906109c463ffffffff61188616565b0292915050565b601254336000908152601d602052604081205490918291611865919061185990429063ffffffff611ed416565b9063ffffffff61188616565b9050601154811061187c5760115490039050610986565b6000915050610986565b60006118c883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612029565b9392505050565b6001600160a01b0383166119145760405162461bcd60e51b81526004018080602001828103825260248152602001806123b16024913960400191505060405180910390fd5b6001600160a01b0382166119595760405162461bcd60e51b81526004018080602001828103825260228152602001806122ac6022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316611a005760405162461bcd60e51b815260040180806020018281038252602581526020018061238c6025913960400191505060405180910390fd5b6001600160a01b038216611a455760405162461bcd60e51b81526004018080602001828103825260238152602001806122896023913960400191505060405180910390fd5b611a88816040518060600160405280602681526020016122ce602691396001600160a01b038616600090815260208190526040902054919063ffffffff611b1716565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611abd908263ffffffff611bae16565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115611ba65760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611b6b578181015183820152602001611b53565b50505050905090810190601f168015611b985780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6000828201838110156118c8576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082611c175750600061097c565b82820282848281611c2457fe5b04146118c85760405162461bcd60e51b81526004018080602001828103825260218152602001806123436021913960400191505060405180910390fd5b806001600160a01b038316611cbd576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600f5460ff1661091c57601554601654101561091c57601554601654611ce9908363ffffffff611bae16565b1115611d1e57601654601554611d049163ffffffff611ed416565b601554601655600f805460ff191660011790559050611e54565b601654611d31908263ffffffff611bae16565b601655601554611d4f9060649061185990601e63ffffffff611c0816565b60165410611e54576107d0601055601554611d789060649061185990602863ffffffff611c0816565b60165410611e5457610bb8601055601554611da19060649061185990603263ffffffff611c0816565b60165410611e5457610fa0601055601554611dca9060649061185990603c63ffffffff611c0816565b60165410611e5457611388601055601554611df39060649061185990604663ffffffff611c0816565b60165410611e5457611770601055601554611e1c9060649061185990605063ffffffff611c0816565b60165410611e5457611f40601055601554611e459060649061185990605a63ffffffff611c0816565b60165410611e54576127106010555b6001600160a01b038316600090815260208190526040902054611e7d908263ffffffff611bae16565b6001600160a01b0384166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a3505050565b60006118c883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611b17565b801580611f9c575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015611f6e57600080fd5b505afa158015611f82573d6000803e3d6000fd5b505050506040513d6020811015611f9857600080fd5b5051155b611fd75760405162461bcd60e51b81526004018080602001828103825260368152602001806123ff6036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b17905261091c90849061208e565b600081836120785760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611b6b578181015183820152602001611b53565b50600083858161208457fe5b0495945050505050565b6120a0826001600160a01b031661224c565b6120f1576040805162461bcd60e51b815260206004820152601f60248201527f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e747261637400604482015290519081900360640190fd5b60006060836001600160a01b0316836040518082805190602001908083835b6020831061212f5780518252601f199092019160209182019101612110565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612191576040519150601f19603f3d011682016040523d82523d6000602084013e612196565b606091505b5091509150816121ed576040805162461bcd60e51b815260206004820181905260248201527f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564604482015290519081900360640190fd5b8051156122465780806020019051602081101561220957600080fd5b50516122465760405162461bcd60e51b815260040180806020018281038252602a8152602001806123d5602a913960400191505060405180910390fd5b50505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061228057508115155b94935050505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365746f6b656e732063616e6e6f7420626520756e6c6f636b6564207965742e206d696e203720646179206c6f636b4572726f723a20756e73756666696369656e74206c6f636b65642062616c616e6365536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220005545448900d6ee922e705ddb74eaaf714880f81def8cde51acb2085b69d21764736f6c63430006040033

Deployed Bytecode Sourcemap

8009:22003:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11476:8;:6;:8::i;:::-;8009:22003;;12:1:-1;9;2:12;10162:32:2;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10162:32:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10162:32:2;;:::i;:::-;;;;-1:-1:-1;;;;;10162:32:2;;;;;;;;;;;;;;9717:39;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9717:39:2;;;:::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;9717:39:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13217:159;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13217:159:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;13217:159:2;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;12204:100;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12204:100:2;;;:::i;:::-;;;;;;;;;;;;;;;;9606:48;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9606:48:2;;;:::i;13848:309::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13848:309:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;13848:309:2;;;;;;;;;;;;;;;;;:::i;9807:33::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9807:33:2;;;:::i;14566:206::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;14566:206:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;14566:206:2;;;;;;;;:::i;9277:28::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9277:28:2;;;:::i;9337:32::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9337:32:2;;;:::i;29229:338::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29229:338:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29229:338:2;-1:-1:-1;;;;;29229:338:2;;:::i;26438:832::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;26438:832:2;;;:::i;9455:27::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9455:27:2;;;:::i;25742:649::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25742:649:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;25742:649:2;;:::i;9489:52::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9489:52:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9489:52:2;-1:-1:-1;;;;;9489:52:2;;:::i;12367:119::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12367:119:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12367:119:2;-1:-1:-1;;;;;12367:119:2;;:::i;9168:21::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9168:21:2;;;:::i;8457:37::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8457:37:2;;;:::i;28068:259::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28068:259:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28068:259:2;;;;;;-1:-1:-1;;;;;28068:259:2;;:::i;28909:134::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28909:134:2;;;:::i;11500:629::-;;;:::i;9763:37::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9763:37:2;;;:::i;8954:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8954:41:2;;;:::i;28538:212::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28538:212:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28538:212:2;-1:-1:-1;;;;;28538:212:2;;:::i;29080:133::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29080:133:2;;;:::i;15275:257::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15275:257:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;15275:257:2;;;;;;;;:::i;21886:3631::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;21886:3631:2;;;:::i;12699:165::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12699:165:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;12699:165:2;;;;;;;;:::i;8922:25::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8922:25:2;;;:::i;10340:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10340:41:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10340:41:2;-1:-1:-1;;;;;10340:41:2;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;9002:39;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9002:39:2;;;:::i;12927:143::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12927:143:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;12927:143:2;;;;;;;;;;:::i;9084:35::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9084:35:2;;;:::i;29585:422::-;;;:::i;27315:210::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27315:210:2;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27315:210:2;-1:-1:-1;;;;;27315:210:2;;:::i;27603:372::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27603:372:2;;;:::i;29585:422::-;29649:1;29637:9;:13;29629:22;;12:1:-1;9;2:12;29629:22:2;29662:12;29711:9;29662:12;29769:14;29711:9;29781:1;29769:14;:11;:14;:::i;:::-;29809:3;;:36;;29753:30;;-1:-1:-1;;;;;;29809:3:2;;29835:5;;29753:30;;29809:3;:36;:3;:36;29753:30;29809:3;29835:5;29809:36;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;29794:51:2;;;;;29864:7;29856:35;;;;;-1:-1:-1;;;29856:35:2;;;;;;;;;;;;-1:-1:-1;;;29856:35:2;;;;;;;;;;;;;;;29917:3;;:36;;-1:-1:-1;;;;;29917:3:2;;;;29943:5;;29932;;29917:3;:36;:3;:36;29932:5;29917:3;29943:5;29917:36;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;29902:51:2;;;;;29972:7;29964:35;;;;;-1:-1:-1;;;29964:35:2;;;;;;;;;;;;-1:-1:-1;;;29964:35:2;;;;;;;;;;;;;;;29585:422;;;:::o;10162:32::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10162:32:2;;-1:-1:-1;10162:32:2;:::o;9717:39::-;;;;;;;;;;;;;;-1:-1:-1;;;9717:39:2;;;;:::o;13217:159::-;13292:4;13309:37;13318:10;13330:7;13339:6;13309:8;:37::i;:::-;-1:-1:-1;13364:4:2;13217:159;;;;;:::o;12204:100::-;12284:12;;12204:100;;:::o;9606:48::-;;;;:::o;13848:309::-;13946:4;13963:36;13973:6;13981:9;13992:6;13963:9;:36::i;:::-;14010:117;14019:6;14027:10;14039:87;14075:6;14039:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14039:19:2;;;;;;:11;:19;;;;;;;;14059:10;14039:31;;;;;;;;;:87;;:35;:87;:::i;:::-;14010:8;:117::i;:::-;-1:-1:-1;14145:4:2;13848:309;;;;;:::o;9807:33::-;9839:1;9807:33;:::o;14566:206::-;14672:10;14646:4;14693:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;14693:32:2;;;;;;;;;;14646:4;;14663:79;;14684:7;;14693:48;;14730:10;14693:48;:36;:48;:::i;9277:28::-;;;;:::o;9337:32::-;;;;:::o;29229:338::-;-1:-1:-1;;;;;29340:13:2;;29315:4;29340:13;;;:6;:13;;;;;:32;29337:221;;-1:-1:-1;29400:5:2;29393:12;;29337:221;29528:3;29452:72;29489:34;29512:10;;29490:16;;29489:22;;:34;;;;:::i;:::-;-1:-1:-1;;;;;29452:13:2;;;;;;:6;:13;;;;;:32;;:72;:36;:72;:::i;:::-;:79;;29445:86;;29337:221;29229:338;;;:::o;26438:832::-;10908:4;;-1:-1:-1;;;10908:4:2;;;;10907:5;10899:27;;;;;-1:-1:-1;;;10899:27:2;;;;;;;;;;;;-1:-1:-1;;;10899:27:2;;;;;;;;;;;;;;;10937:4;:11;;-1:-1:-1;;;;10937:11:2;-1:-1:-1;;;10937:11:2;;;26544:10:::1;10937:11:::0;26524:31;;;10937:4;26524:31:::1;::::0;;;;;26516:81:::1;;;;-1:-1:-1::0;;;26516:81:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26653:26;26668:10;26653:14;:26::i;:::-;26645:84;;;;-1:-1:-1::0;;;26645:84:2::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26771:10;26740:8;26751:31:::0;;;:19:::1;:31;::::0;;;;;;26812:30:::1;::::0;:18:::1;:30::i;:::-;26793:49;;26853:27;26859:10;26871:8;26853:5;:27::i;:::-;26965:10;26958:18;::::0;;;:6:::1;:18;::::0;;;;;;;:38:::1;::::0;::::1;:50:::0;;;::::1;::::0;;27019:19:::1;:31:::0;;;;;:35;;;27065:18;;;:41;27131:11:::1;::::0;:20:::1;::::0;27147:3;27131:20:::1;:15;:20;:::i;:::-;27117:11;:34:::0;27162:41:::1;27180:4;27187:10;27199:3:::0;27162:9:::1;:41::i;:::-;27234:28;::::0;;;;;;;27246:10:::1;::::0;27234:28:::1;::::0;;;;;::::1;::::0;;::::1;-1:-1:-1::0;;10971:4:2;:12;;-1:-1:-1;;;;10971:12:2;;;26438:832::o;9455:27::-;;;;:::o;25742:649::-;25818:1;25812:3;:7;25804:30;;;;;-1:-1:-1;;;25804:30:2;;;;;;;;;;;;-1:-1:-1;;;25804:30:2;;;;;;;;;;;;;;;25871:3;25853:14;:12;:14::i;:::-;:21;;25845:61;;;;;-1:-1:-1;;;25845:61:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;25950:26;25965:10;25950:14;:26::i;:::-;25947:117;;;25992:14;:12;:14::i;:::-;26155:10;26135:31;;;;:19;:31;;;;;;:40;;26171:3;26135:40;:35;:40;:::i;:::-;26121:10;26101:31;;;;:19;:31;;;;;:74;26200:11;;:20;;26216:3;26200:20;:15;:20;:::i;:::-;26186:11;:34;26238:10;26231:18;;;;:6;:18;;;;;26271:3;26231:43;;26285:41;;26315:4;26322:3;26285:9;:41::i;:::-;26357:26;;;;;;;;26367:10;;26357:26;;;;;;;;;;25742:649;:::o;9489:52::-;;;;;;;;;;;;;:::o;12367:119::-;-1:-1:-1;;;;;12460:18:2;12433:7;12460:18;;;;;;;;;;;;12367:119::o;9168:21::-;;;;;;:::o;8457:37::-;;;-1:-1:-1;;;;;8457:37:2;;:::o;28068:259::-;10761:10;28169:4;10753:19;;;:7;:19;;;;;;;;10745:44;;;;;-1:-1:-1;;;10745:44:2;;;;;;;;;;;;-1:-1:-1;;;10745:44:2;;;;;;;;;;;;;;;28191:8:::1;28202:20;28212:9;;28202:5;:9;;:20;;;;:::i;:::-;28191:31:::0;-1:-1:-1;28250:8:2;28269:18:::1;28250:8:::0;28191:31;28269:5:::1;:18::i;:::-;-1:-1:-1::0;28315:4:2::1;::::0;28068:259;-1:-1:-1;;;;28068:259:2:o;28909:134::-;29024:11;;28909:134;:::o;11500:629::-;10656:10;10649:18;;;;:6;:18;;;;;;;;10641:43;;;;;-1:-1:-1;;;10641:43:2;;;;;;;;;;;;-1:-1:-1;;;10641:43:2;;;;;;;;;;;;;;;10908:4:::1;::::0;-1:-1:-1;;;10908:4:2;::::1;;;10907:5;10899:27;;;::::0;;-1:-1:-1;;;10899:27:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10899:27:2;;;;;;;;;;;;;::::1;;10937:4;:11:::0;;-1:-1:-1;;;;10937:11:2::1;-1:-1:-1::0;;;10937:11:2::1;::::0;;11641::::2;11628:9;:24;;11620:54;;;::::0;;-1:-1:-1;;;11620:54:2;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;11620:54:2;;;;;;;;;;;;;::::2;;11730:15;::::0;:50:::2;::::0;;-1:-1:-1;;;11730:50:2;;11770:9:::2;11730:50;::::0;::::2;::::0;;;11710:17:::2;::::0;-1:-1:-1;;;;;11730:15:2::2;::::0;:39:::2;::::0;:50;;;;;::::2;::::0;;;;;;;;:15;:50;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;11730:50:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;11730:50:2;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;11730:50:2;11844:9:::2;::::0;11730:50;;-1:-1:-1;11818:8:2::2;::::0;11730:50;11844:9;11829:24:::2;;;;;11818:35;;11864:25;11878:4;11885:3;11864:5;:25::i;:::-;11947:9;::::0;11930:32:::2;::::0;:4:::2;::::0;-1:-1:-1;;;;;11947:9:2::2;11958:3:::0;11930:32:::2;:16;:32;:::i;:::-;12004:15;::::0;:73:::2;::::0;;-1:-1:-1;;;12004:73:2;;:15:::2;:73;::::0;::::2;::::0;;;;;;;12065:10:::2;12059:3;:16;12004:73:::0;;;;;;-1:-1:-1;;;;;12004:15:2;;::::2;::::0;:28:::2;::::0;12039:9:::2;::::0;12004:73;;;;;::::2;::::0;;;;;;;;12039:9;12004:15;:73;::::2;;2:2:-1::0;::::2;;;27:1;24::::0;17:12:::2;2:2;12004:73:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;12004:73:2;;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28::::0;21:12:::2;4:2;-1:-1:::0;;10971:4:2::1;:12:::0;;-1:-1:-1;;;;10971:12:2::1;::::0;;-1:-1:-1;;11500:629:2:o;9763:37::-;;;;;;;;;;;;;;-1:-1:-1;;;9763:37:2;;;;:::o;8954:41::-;;;;:::o;28538:212::-;10554:8;;28629:4;;-1:-1:-1;;;;;10554:8:2;10540:10;:22;10532:49;;;;;-1:-1:-1;;;10532:49:2;;;;;;;;;;;;-1:-1:-1;;;10532:49:2;;;;;;;;;;;;;;;-1:-1:-1;;;;;;28659:15:2::1;;::::0;;;:7:::1;:15;::::0;;;;:22;;-1:-1:-1;;28659:22:2::1;28677:4;28659:22:::0;;::::1;::::0;;;28692:15:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;28692:28:2;;;;;::::1;::::0;;-1:-1:-1;;;;;;28692:28:2::1;::::0;;::::1;::::0;;;28677:4;28538:212::o;29080:133::-;29152:7;29184:21;29194:10;29184:9;:21::i;:::-;29177:28;;29080:133;:::o;15275:257::-;15360:4;15377:125;15386:10;15398:7;15407:94;15444:15;15407:94;;;;;;;;;;;;;;;;;15419:10;15407:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;15407:32:2;;;;;;;;;;;:94;;:36;:94;:::i;21886:3631::-;10656:10;10649:18;;;;:6;:18;;;;;;;;10641:43;;;;;-1:-1:-1;;;10641:43:2;;;;;;;;;;;;-1:-1:-1;;;10641:43:2;;;;;;;;;;;;;;;10908:4:::1;::::0;-1:-1:-1;;;10908:4:2;::::1;;;10907:5;10899:27;;;::::0;;-1:-1:-1;;;10899:27:2;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;10899:27:2;;;;;;;;;;;;;::::1;;10937:4;:11:::0;;-1:-1:-1;;;;10937:11:2::1;-1:-1:-1::0;;;10937:11:2::1;::::0;;21995:20:::2;::::0;10937:11;;22016:2:::2;::::0;21995:23:::2;21978:40;;22049:2;22037:9:::0;::::2;:14;22029:48;;;::::0;;-1:-1:-1;;;22029:48:2;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;22029:48:2;;;;;;;;;;;;;::::2;;22156:3;22096:56;22126:25;22140:10;;22126:9;:13;;:25;;;;:::i;:::-;22096;::::0;;:56:::2;:29;:56;:::i;:::-;:63;;22088:105;;;::::0;;-1:-1:-1;;;22088:105:2;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;22236:10;22266:2;22249:16;;:19;;;;;;22236:32;;22344:3;22282:58;22312:27;22328:10;;22313:9;22312:15;;:27;;;;:::i;22282:58::-;:65;;:83;;;;-1:-1:-1::0;22351:9:2::2;::::0;:14;22282:83:::2;22279:3190;;;22381:9;:11:::0;;::::2;;::::0;;22429:19:::2;::::0;:30:::2;::::0;22453:5;22429:30:::2;:23;:30;:::i;:::-;22407:19;:52:::0;22483:3:::2;::::0;22474:27:::2;::::0;-1:-1:-1;;;;;22483:3:2::2;22488:12;:5:::0;22498:1:::2;22488:12;:9;:12;:::i;:::-;22474:8;:27::i;:::-;-1:-1:-1::0;22525:3:2::2;::::0;22516:27:::2;::::0;-1:-1:-1;;;;;22525:3:2::2;22530:12;:5:::0;22540:1:::2;22530:12;:9;:12;:::i;22516:27::-;;22279:3190;;;22639:3;22573:62;22603:31;22623:10;;22604:9;22616:1;22604:13;22603:19;;:31;;;;:::i;22573:62::-;:69;;:87;;;;;22646:9;;22659:1;22646:14;22573:87;22570:2899;;;22676:9;:11:::0;;::::2;;::::0;;22724:19:::2;::::0;:30:::2;::::0;22748:5;22724:30:::2;:23;:30;:::i;22570:2899::-;22934:3;22868:62;22898:31;22918:10;;22899:9;22911:1;22899:13;22898:19;;:31;;;;:::i;22868:62::-;:69;;:87;;;;;22941:9;;22954:1;22941:14;22868:87;22865:2604;;;22971:9;:11:::0;;::::2;;::::0;;23019:19:::2;::::0;:30:::2;::::0;23043:5;23019:30:::2;:23;:30;:::i;22865:2604::-;23229:3;23163:62;23193:31;23213:10;;23194:9;23206:1;23194:13;23193:19;;:31;;;;:::i;23163:62::-;:69;;:87;;;;;23236:9;;23249:1;23236:14;23163:87;23160:2309;;;23266:9;:11:::0;;::::2;;::::0;;23314:19:::2;::::0;:30:::2;::::0;23338:5;23314:30:::2;:23;:30;:::i;23160:2309::-;23524:3;23458:62;23488:31;23508:10;;23489:9;23501:1;23489:13;23488:19;;:31;;;;:::i;23458:62::-;:69;;:87;;;;;23531:9;;23544:1;23531:14;23458:87;23455:2014;;;23561:9;:11:::0;;::::2;;::::0;;23609:19:::2;::::0;:30:::2;::::0;23633:5;23609:30:::2;:23;:30;:::i;23455:2014::-;23819:3;23753:62;23783:31;23803:10;;23784:9;23796:1;23784:13;23783:19;;:31;;;;:::i;23753:62::-;:69;;:87;;;;;23826:9;;23839:1;23826:14;23753:87;23750:1719;;;23856:9;:11:::0;;::::2;;::::0;;23904:19:::2;::::0;:30:::2;::::0;23928:5;23904:30:::2;:23;:30;:::i;23750:1719::-;24114:3;24048:62;24078:31;24098:10;;24079:9;24091:1;24079:13;24078:19;;:31;;;;:::i;24048:62::-;:69;;:87;;;;;24121:9;;24134:1;24121:14;24048:87;24045:1424;;;24151:9;:11:::0;;::::2;;::::0;;24199:19:::2;::::0;:30:::2;::::0;24223:5;24199:30:::2;:23;:30;:::i;24045:1424::-;24409:3;24343:62;24373:31;24393:10;;24374:9;24386:1;24374:13;24373:19;;:31;;;;:::i;24343:62::-;:69;;:87;;;;;24416:9;;24429:1;24416:14;24343:87;24340:1129;;;24456:9;:11:::0;;::::2;;::::0;;24509:19:::2;::::0;:30:::2;::::0;24533:5;24509:30:::2;:23;:30;:::i;24340:1129::-;24725:3;24659:62;24689:31;24709:10;;24690:9;24702:1;24690:13;24689:19;;:31;;;;:::i;24659:62::-;:69;;:87;;;;;24732:9;;24745:1;24732:14;24659:87;24656:813;;;24762:9;:11:::0;;::::2;;::::0;;24810:19:::2;::::0;:30:::2;::::0;24834:5;24810:30:::2;:23;:30;:::i;24656:813::-;25021:3;24954:63;24984:32;25005:10;;24985:9;24997:2;24985:14;24984:20;;:32;;;;:::i;24954:63::-;:70;;:88;;;;;25028:9;;25041:1;25028:14;24954:88;24951:518;;;25058:9;:11:::0;;::::2;;::::0;;25087:19:::2;::::0;:28;-1:-1:-1;25084:241:2::2;;25157:19;::::0;:30:::2;::::0;25181:5;25157:30:::2;:23;:30;:::i;:::-;25135:19;:52:::0;25084:241:::2;;;-1:-1:-1::0;25248:19:2::2;::::0;;25308:1:::2;25286:23:::0;;;25084:241:::2;25348:3;::::0;25339:27:::2;::::0;-1:-1:-1;;;;;25348:3:2::2;25353:12;:5:::0;25363:1:::2;25353:12;:9;:12;:::i;24951:518::-;25484:25;::::0;;;;;25505:3:::2;25484:25;::::0;::::2;::::0;;;::::2;::::0;;;;;;;;;::::2;-1:-1:-1::0;;10971:4:2::1;:12:::0;;-1:-1:-1;;;;10971:12:2::1;::::0;;21886:3631::o;12699:165::-;12777:4;12794:40;12804:10;12816:9;12827:6;12794:9;:40::i;8922:25::-;;;;:::o;10340:41::-;;;;;;;;;;;;;;;;;;;:::o;9002:39::-;;;;:::o;12927:143::-;-1:-1:-1;;;;;13035:18:2;;;13008:7;13035:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;12927:143::o;9084:35::-;;;;:::o;27315:210::-;27405:4;27494:21;:19;:21::i;:::-;27475:16;;-1:-1:-1;;;;;27435:26:2;;;;;;:19;:26;;;;;;27475:40;;;27435:36;;27466:4;27435:36;:30;:36;:::i;:::-;:81;;27315:210;-1:-1:-1;;27315:210:2:o;27603:372::-;27770:10;;27734;27681:4;27727:18;;;:6;:18;;;;;:37;27681:4;;;;27719:62;;27770:10;27719:46;;:3;;:46;:7;:46;:::i;:::-;:50;:62;:50;:62;:::i;:::-;27703:78;;27807:16;;27795:8;:28;27792:176;;27857:16;;27846:27;;;-1:-1:-1;27839:34:2;;27792:176;27955:1;27948:8;;;;;3169:132:4;3227:7;3254:39;3258:1;3261;3254:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3247:46;3169:132;-1:-1:-1;;;3169:132:4:o;19834:338:2:-;-1:-1:-1;;;;;19928:19:2;;19920:68;;;;-1:-1:-1;;;19920:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20007:21:2;;19999:68;;;;-1:-1:-1;;;19999:68:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20080:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;20132:32;;;;;;;;;;;;;;;;;19834:338;;;:::o;16021:469::-;-1:-1:-1;;;;;16119:20:2;;16111:70;;;;-1:-1:-1;;;16111:70:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16200:23:2;;16192:71;;;;-1:-1:-1;;;16192:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16294;16316:6;16294:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16294:17:2;;:9;:17;;;;;;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;16274:17:2;;;:9;:17;;;;;;;;;;;:91;;;;16399:20;;;;;;;:32;;16424:6;16399:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;16376:20:2;;;:9;:20;;;;;;;;;;;;:55;;;;16447:35;;;;;;;16376:20;;16447:35;;;;;;;;;;;;;16021:469;;;:::o;1787:192:4:-;1873:7;1909:12;1901:6;;;;1893:29;;;;-1:-1:-1;;;1893:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;1893:29:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1945:5:4;;;1787:192::o;858:181::-;916:7;948:5;;;972:6;;;;964:46;;;;;-1:-1:-1;;;964:46:4;;;;;;;;;;;;;;;;;;;;;;;;;;;2230:471;2288:7;2533:6;2529:47;;-1:-1:-1;2563:1:4;2556:8;;2529:47;2600:5;;;2604:1;2600;:5;:1;2624:5;;;;;:10;2616:56;;;;-1:-1:-1;;;2616:56:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16795:1919:2;16877:6;-1:-1:-1;;;;;16902:21:2;;16894:65;;;;;-1:-1:-1;;;16894:65:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;16974:9;;;;16970:1737;;17017:10;;17002:12;;:25;16999:1697;;;17074:10;;17050:12;;:21;;17067:3;17050:21;:16;:21;:::i;:::-;:34;17047:1509;;;17129:12;;17114:10;;:28;;;:14;:28;:::i;:::-;17180:10;;17165:12;:25;17213:9;:16;;-1:-1:-1;;17213:16:2;17225:4;17213:16;;;17108:34;-1:-1:-1;17047:1509:2;;;17309:12;;:21;;17326:3;17309:21;:16;:21;:::i;:::-;17294:12;:36;17372:10;;:27;;17395:3;;17372:18;;17387:2;17372:18;:14;:18;:::i;:27::-;17356:12;;:43;17353:1184;;17439:4;17427:9;:16;17489:10;;:27;;17512:3;;17489:18;;17504:2;17489:18;:14;:18;:::i;:27::-;17473:12;;:43;17470:1044;;17560:4;17548:9;:16;17614:10;;:27;;17637:3;;17614:18;;17629:2;17614:18;:14;:18;:::i;:27::-;17598:12;;:43;17595:892;;17689:4;17677:9;:16;17747:10;;:27;;17770:3;;17747:18;;17762:2;17747:18;:14;:18;:::i;:27::-;17731:12;;:43;17728:728;;17826:4;17814:9;:16;17888:10;;:27;;17911:3;;17888:18;;17903:2;17888:18;:14;:18;:::i;:27::-;17872:12;;:43;17869:551;;17971:4;17959:9;:16;18037:10;;:27;;18060:3;;18037:18;;18052:2;18037:18;:14;:18;:::i;:27::-;18021:12;;:43;18018:363;;18124:4;18112:9;:16;18194:10;;:27;;18217:3;;18194:18;;18209:2;18194:18;:14;:18;:::i;:27::-;18178:12;;:43;18175:163;;18285:5;18273:9;:17;18175:163;-1:-1:-1;;;;;18595:18:2;;:9;:18;;;;;;;;;;;:27;;18618:3;18595:27;:22;:27;:::i;:::-;-1:-1:-1;;;;;18574:18:2;;:9;:18;;;;;;;;;;;:48;;;;18646:34;;;;;;;18574:18;;:9;;18646:34;;;;;;;;;;16795:1919;;;:::o;1314:136:4:-;1372:7;1399:43;1403:1;1406;1399:43;;;;;;;;;;;;;;;;;:3;:43::i;706:622:2:-;1076:10;;;1075:62;;-1:-1:-1;1092:39:2;;;-1:-1:-1;;;1092:39:2;;1116:4;1092:39;;;;-1:-1:-1;;;;;1092:39:2;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;2:2:-1;;;;27:1;24;17:12;2:2;1092:39:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1092:39:2;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;1092:39:2;:44;1075:62;1067:152;;;;-1:-1:-1;;;1067:152:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1257:62;;;-1:-1:-1;;;;;1257:62:2;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1257:62:2;;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;1230:90:2;;1250:5;;1230:19;:90::i;3831:345:4:-;3917:7;4019:12;4012:5;4004:28;;;;-1:-1:-1;;;4004:28:4;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:10:-1;;8:100;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4004:28:4;;4043:9;4059:1;4055;:5;;;;;;;3831:345;-1:-1:-1;;;;;3831:345:4:o;1719:1115:2:-;2324:27;2332:5;-1:-1:-1;;;;;2324:25:2;;:27::i;:::-;2316:71;;;;;-1:-1:-1;;;2316:71:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;2461:12;2475:23;2510:5;-1:-1:-1;;;;;2502:19:2;2522:4;2502: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;;;2502:25:2;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;2460:67:2;;;;2546:7;2538:52;;;;;-1:-1:-1;;;2538:52:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2607:17;;:21;2603:224;;2749:10;2738:30;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;2738:30:2;2730:85;;;;-1:-1:-1;;;2730:85:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1719:1115;;;;:::o;707:619:0:-;767:4;1235:20;;1078:66;1275:23;;;;;;:42;;-1:-1:-1;1302:15:0;;;1275:42;1267:51;707:619;-1:-1:-1;;;;707:619:0:o

Swarm Source

ipfs://005545448900d6ee922e705ddb74eaaf714880f81def8cde51acb2085b69d217
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.