ETH Price: $3,645.36 (+1.03%)
 

Overview

Max Total Supply

333.083681868926109082 EPRO

Holders

92

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
1.008011873385486836 EPRO

Value
$0.00
0x59a839d2b7f0423a3eb5c47c68bbc7a6c6d8e918
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:
EthPro

Compiler Version
v0.6.7+commit.b8d736ae

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Apache-2.0 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-08-06
*/

/**
*
*  ███████╗████████╗██╗  ██╗    ██████╗ ██████╗  ██████╗ 
*  ██╔════╝╚══██╔══╝██║  ██║    ██╔══██╗██╔══██╗██╔═══██╗
*  █████╗     ██║   ███████║    ██████╔╝██████╔╝██║   ██║
*  ██╔══╝     ██║   ██╔══██║    ██╔═══╝ ██╔══██╗██║   ██║
*  ███████╗   ██║   ██║  ██║    ██║     ██║  ██║╚██████╔╝
*  ╚══════╝   ╚═╝   ╚═╝  ╚═╝    ╚═╝     ╚═╝  ╚═╝ ╚═════╝ 
*
* 
* ETH PRO
* https://eth-pro.github.io/
* or
* https://eth-pro.netlify.app/
* 
**/


pragma solidity ^0.6.7;

/**
    Utilities & Common Modifiers
*/

contract GreaterThanZero {
    // verifies that an amount is greater than zero
    modifier greaterThanZero(uint256 _amount) {
        require(_amount > 0);
        _;
    }
}

contract ValidAddress {
    // validates an address - currently only checks that it isn't null
    modifier validAddress(address _address) {
        require(_address != address(0));
        _;
    }
}

contract OnlyPayloadSize {
	//Mitigate short address attack and compatible padding problem while using “call“ 
	modifier onlyPayloadSize(uint256 numCount){
		assert((msg.data.length == numCount*32 + 4) || (msg.data.length == (numCount + 1)*32));
		_;
	}
}

contract NotThis {
    // verifies that the address is different than this contract address
    modifier notThis(address _address) {
        require(_address != address(this));
        _;
    }
}

contract SafeMath {
    // Overflow protected math functions

    /**
        @dev returns the sum of _x and _y, asserts if the calculation overflows

        @param _x   value 1
        @param _y   value 2

        @return sum
    */
    function safeAdd(uint256 _x, uint256 _y) internal pure returns (uint256) {
        uint256 z = _x + _y;
        require(z >= _x);        //assert(z >= _x);
        return z;
    }

    /**
        @dev returns the difference of _x minus _y, asserts if the subtraction results in a negative number

        @param _x   minuend
        @param _y   subtrahend

        @return difference
    */
    function safeSub(uint256 _x, uint256 _y) internal pure returns (uint256) {
        require(_x >= _y);        //assert(_x >= _y);
        return _x - _y;
    }

    /**
        @dev returns the product of multiplying _x by _y, asserts if the calculation overflows

        @param _x   factor 1
        @param _y   factor 2

        @return product
    */
    function safeMul(uint256 _x, uint256 _y) internal pure returns (uint256) {
        uint256 z = _x * _y;
        require(_x == 0 || z / _x == _y);        //assert(_x == 0 || z / _x == _y);
        return z;
    }
	
	function safeDiv(uint256 _x, uint256 _y)internal pure returns (uint256){
	    // assert(b > 0); // Solidity automatically throws when dividing by 0
        // uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold
        return _x / _y;
	}
	
	function ceilDiv(uint256 _x, uint256 _y)internal pure returns (uint256){
		return (_x + _y - 1) / _y;
	}
}


contract Sqrt {
	function sqrt(uint x)public pure returns(uint y) {
        uint z = (x + 1) / 2;
        y = x;
        while (z < y) {
            y = z;
            z = (x / z + z) / 2;
        }
    }
}


contract Floor {
	/**
        @dev Returns the largest integer smaller than or equal to _x.
        @param _x   number _x
        @return     value
    */
	function floor(uint _x)public pure returns(uint){
		return (_x / 1 ether) * 1 ether;
	}
}

contract Ceil {
	/**
        @dev Returns the smallest integer larger than or equal to _x.
        @param _x   number _x
        @return ret    value ret
    */
	function ceil(uint _x)public pure returns(uint ret){
		ret = (_x / 1 ether) * 1 ether;
		if((_x % 1 ether) == 0){
			return ret;
		}else{
			return ret + 1 ether;
		}
	}
}
	
contract IsContract {
	//assemble the given address bytecode. If bytecode exists then the _addr is a contract.
    function isContract(address _addr) internal view returns (bool is_contract) {
        uint length;
        assembly {
              //retrieve the size of the code on target address, this needs assembly
              length := extcodesize(_addr)
        }
        return (length>0);
    }
}
    
contract LogEvent {
    // todo: for debug
    event logEvent(string name, uint256 value);
}


/**
    ERC20 Standard Token interface
*/
interface IERC20Token {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address _holder) external view returns (uint256);
    function allowance(address _holder, address _spender) external view returns (uint256);

    function transfer(address _to, uint256 _amount) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _amount) external returns (bool success);
    function approve(address _spender, uint256 _amount) external returns (bool success);
    
    event Transfer(address indexed _from, address indexed _to, uint256 _amount);
    event Approval(address indexed _holder, address indexed _spender, uint256 _amount);
}


/**
    ERC20 Standard Token implementation
*/
contract ERC20Token is IERC20Token, SafeMath, ValidAddress {
    string  internal/*public*/ m_name = '';
    string  internal/*public*/ m_symbol = '';
    uint8   internal/*public*/ m_decimals = 0;
    uint256 internal/*public*/ m_totalSupply = 0;
    mapping (address => uint256) internal/*public*/ m_balanceOf;
    mapping (address => mapping (address => uint256)) internal/*public*/ m_allowance;

    event Transfer(address indexed _from, address indexed _to, uint256 _amount);
    event Approval(address indexed _holder, address indexed _spender, uint256 _amount);

    ///**
    //    @dev constructor
    //
    //    @param _name        token name
    //    @param _symbol      token symbol
    //    @param _decimals    decimal points, for display purposes
    //*/
    //constructor(string  memory _name, string  memory _symbol, uint8 _decimals) public{
    //    require(bytes(_name).length > 0 && bytes(_symbol).length > 0); // validate input
    //
    //    m_name = _name;
    //    m_symbol = _symbol;
    //    m_decimals = _decimals;
    //}

    function name() override public view returns (string memory){
        return m_name;
    }
    function symbol() override public view returns (string memory){
        return m_symbol;
    }
    function decimals() override public view returns (uint8){
        return m_decimals;
    }
    function totalSupply() override public view returns (uint256){
        return m_totalSupply;
    }
    function balanceOf(address _holder) override public view returns(uint256){
        return m_balanceOf[_holder];
    }
    function allowance(address _holder, address _spender) override public view returns (uint256){
        return m_allowance[_holder][_spender];
    }
    
    /**
        @dev send coins
        throws on any error rather then return a false flag to minimize user errors

        @param _to      target address
        @param _amount   transfer amount

        @return success is true if the transfer was successful, false if it wasn't
    */
    function transfer(address _to, uint256 _amount)
        virtual 
        override 
        public
        validAddress(_to)
        returns (bool success)
    {
        m_balanceOf[msg.sender] = safeSub(m_balanceOf[msg.sender], _amount);
        m_balanceOf[_to]        = safeAdd(m_balanceOf[_to], _amount);
        emit Transfer(msg.sender, _to, _amount);
        return true;
    }

    /**
        @dev an account/contract attempts to get the coins
        throws on any error rather then return a false flag to minimize user errors

        @param _from    source address
        @param _to      target address
        @param _amount   transfer amount

        @return success is true if the transfer was successful, false if it wasn't
    */
    function transferFrom(address _from, address _to, uint256 _amount)
        virtual
        override 
        public
        validAddress(_from)
        validAddress(_to)
        returns (bool success)
    {
        m_allowance[_from][msg.sender]  = safeSub(m_allowance[_from][msg.sender], _amount);
        m_balanceOf[_from]              = safeSub(m_balanceOf[_from], _amount);
        m_balanceOf[_to]                = safeAdd(m_balanceOf[_to], _amount);
        emit Transfer(_from, _to, _amount);
        return true;
    }

    /**
        @dev allow another account/contract to spend some tokens on your behalf
        throws on any error rather then return a false flag to minimize user errors

        also, to minimize the risk of the approve/transferFrom attack vector
        (see https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/), approve has to be called twice
        in 2 separate transactions - once to change the allowance to 0 and secondly to change it to the new allowance value

        @param _spender approved address
        @param _amount   allowance amount

        @return success is true if the approval was successful, false if it wasn't
    */
    function approve(address _spender, uint256 _amount)
        override 
        public
        validAddress(_spender)
        returns (bool success)
    {
        // if the allowance isn't 0, it can only be updated to 0 to prevent an allowance change immediately after withdrawal
        require(_amount == 0 || m_allowance[msg.sender][_spender] == 0);

        m_allowance[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }
}


/**
    Provides support and utilities for contract Creator
*/
contract Creator {
    address payable public creator;
    address payable public newCreator;

    /**
        @dev constructor
    */
    constructor() public {
        creator = msg.sender;
    }

    // allows execution by the creator only
    modifier creatorOnly {
        assert(msg.sender == creator);
        _;
    }

    /**
        @dev allows transferring the contract creatorship
        the new creator still needs to accept the transfer
        can only be called by the contract creator

        @param _newCreator    new contract creator
    */
    function transferCreator(address payable _newCreator) virtual public creatorOnly {
        require(_newCreator != creator);
        newCreator = _newCreator;
    }

    /**
        @dev used by a new creator to accept an Creator transfer
    */
    function acceptCreator() virtual public {
        require(msg.sender == newCreator);
        creator = newCreator;
        newCreator = address(0x0);
    }
}

/**
    Provides support and utilities for disable contract functions
*/
contract Disable is Creator {
	bool public disabled;
	
	modifier enabled {
		assert(!disabled);
		_;
	}
	
	function disable(bool _disable) public creatorOnly {
		disabled = _disable;
	}
}


/**
    Smart Token interface
     is IOwned, IERC20Token
*/
abstract contract ISmartToken{
    function disableTransfers(bool _disable) virtual public;
    function issue(address _to, uint256 _amount) virtual internal;
    function destroy(address _from, uint256 _amount) virtual internal;
	//function() public payable;
}


/**
    SmartToken implementation
*/
contract SmartToken is ISmartToken, Creator, ERC20Token, NotThis {

    bool public transfersEnabled = true;    // true if transfer/transferFrom are enabled, false if not

    // triggered when a smart token is deployed - the _token address is defined for forward compatibility, in case we want to trigger the event from a factory
    event NewSmartToken(address _token);
    // triggered when the total supply is increased
    event Issuance(uint256 _amount);
    // triggered when the total supply is decreased
    event Destruction(uint256 _amount);

    ///**
    //    @dev constructor
    //
    //    @param _name       token name
    //    @param _symbol     token short symbol, minimum 1 character
    //    @param _decimals   for display purposes only
    //*/
    //constructor(string memory _name, string memory _symbol, uint8 _decimals)
    //    ERC20Token(_name, _symbol, _decimals) public
    //{
    //    emit NewSmartToken(address(this));
    //}

    // allows execution only when transfers aren't disabled
    modifier transfersAllowed {
        assert(transfersEnabled);
        _;
    }

    /**
        @dev disables/enables transfers
        can only be called by the contract creator

        @param _disable    true to disable transfers, false to enable them
    */
    function disableTransfers(bool _disable) override public creatorOnly {
        transfersEnabled = !_disable;
    }

    /**
        @dev increases the token supply and sends the new tokens to an account
        can only be called by the contract creator

        @param _to         account to receive the new amount
        @param _amount     amount to increase the supply by
    */
    function issue(address _to, uint256 _amount)
        override
        internal
        //creatorOnly
        validAddress(_to)
        notThis(_to)
    {
        m_totalSupply = safeAdd(m_totalSupply, _amount);
        m_balanceOf[_to] = safeAdd(m_balanceOf[_to], _amount);

        emit Issuance(_amount);
        emit Transfer(address(0), _to, _amount);
    }

    /**
        @dev removes tokens from an account and decreases the token supply
        can be called by the contract creator to destroy tokens from any account or by any holder to destroy tokens from his/her own account

        @param _from       account to remove the amount from
        @param _amount     amount to decrease the supply by
    */
    function destroy(address _from, uint256 _amount) virtual override internal {
        //require(msg.sender == _from || msg.sender == creator); // validate input

        m_balanceOf[_from] = safeSub(m_balanceOf[_from], _amount);
        m_totalSupply = safeSub(m_totalSupply, _amount);

        emit Transfer(_from, address(0), _amount);
        emit Destruction(_amount);
    }
    
    function transfer(address _to, uint256 _amount) virtual override public transfersAllowed returns (bool success){
        return super.transfer(_to, _amount);
    }
    
    function transferFrom(address _from, address _to, uint256 _amount) virtual override public transfersAllowed returns (bool success){
        return super.transferFrom(_from, _to, _amount);
    }
}


contract Formula is SafeMath {

    uint256 public constant ONE = 1; 
    uint32 public constant MAX_WEIGHT = 1000000;
    uint8 public constant MIN_PRECISION = 32;
    uint8 public constant MAX_PRECISION = 127;

    /**
        The values below depend on MAX_PRECISION. If you choose to change it:
        Apply the same change in file 'PrintIntScalingFactors.py', run it and paste the results below.
    */
    uint256 private constant FIXED_1 = 0x080000000000000000000000000000000;
    uint256 private constant FIXED_2 = 0x100000000000000000000000000000000;
    uint256 private constant MAX_NUM = 0x1ffffffffffffffffffffffffffffffff;

    /**
        The values below depend on MAX_PRECISION. If you choose to change it:
        Apply the same change in file 'PrintLn2ScalingFactors.py', run it and paste the results below.
    */
    uint256 private constant LN2_NUMERATOR   = 0x3f80fe03f80fe03f80fe03f80fe03f8;
    uint256 private constant LN2_DENOMINATOR = 0x5b9de1d10bf4103d647b0955897ba80;

    /**
        The values below depend on MIN_PRECISION and MAX_PRECISION. If you choose to change either one of them:
        Apply the same change in file 'PrintFunctionBancorFormula.py', run it and paste the results below.
    */
    uint256[128] private maxExpArray;

    constructor () public {

    //  maxExpArray[  0] = 0x6bffffffffffffffffffffffffffffffff;
    //  maxExpArray[  1] = 0x67ffffffffffffffffffffffffffffffff;
    //  maxExpArray[  2] = 0x637fffffffffffffffffffffffffffffff;
    //  maxExpArray[  3] = 0x5f6fffffffffffffffffffffffffffffff;
    //  maxExpArray[  4] = 0x5b77ffffffffffffffffffffffffffffff;
    //  maxExpArray[  5] = 0x57b3ffffffffffffffffffffffffffffff;
    //  maxExpArray[  6] = 0x5419ffffffffffffffffffffffffffffff;
    //  maxExpArray[  7] = 0x50a2ffffffffffffffffffffffffffffff;
    //  maxExpArray[  8] = 0x4d517fffffffffffffffffffffffffffff;
    //  maxExpArray[  9] = 0x4a233fffffffffffffffffffffffffffff;
    //  maxExpArray[ 10] = 0x47165fffffffffffffffffffffffffffff;
    //  maxExpArray[ 11] = 0x4429afffffffffffffffffffffffffffff;
    //  maxExpArray[ 12] = 0x415bc7ffffffffffffffffffffffffffff;
    //  maxExpArray[ 13] = 0x3eab73ffffffffffffffffffffffffffff;
    //  maxExpArray[ 14] = 0x3c1771ffffffffffffffffffffffffffff;
    //  maxExpArray[ 15] = 0x399e96ffffffffffffffffffffffffffff;
    //  maxExpArray[ 16] = 0x373fc47fffffffffffffffffffffffffff;
    //  maxExpArray[ 17] = 0x34f9e8ffffffffffffffffffffffffffff;
    //  maxExpArray[ 18] = 0x32cbfd5fffffffffffffffffffffffffff;
    //  maxExpArray[ 19] = 0x30b5057fffffffffffffffffffffffffff;
    //  maxExpArray[ 20] = 0x2eb40f9fffffffffffffffffffffffffff;
    //  maxExpArray[ 21] = 0x2cc8340fffffffffffffffffffffffffff;
    //  maxExpArray[ 22] = 0x2af09481ffffffffffffffffffffffffff;
    //  maxExpArray[ 23] = 0x292c5bddffffffffffffffffffffffffff;
    //  maxExpArray[ 24] = 0x277abdcdffffffffffffffffffffffffff;
    //  maxExpArray[ 25] = 0x25daf6657fffffffffffffffffffffffff;
    //  maxExpArray[ 26] = 0x244c49c65fffffffffffffffffffffffff;
    //  maxExpArray[ 27] = 0x22ce03cd5fffffffffffffffffffffffff;
    //  maxExpArray[ 28] = 0x215f77c047ffffffffffffffffffffffff;
    //  maxExpArray[ 29] = 0x1fffffffffffffffffffffffffffffffff;
    //  maxExpArray[ 30] = 0x1eaefdbdabffffffffffffffffffffffff;
    //  maxExpArray[ 31] = 0x1d6bd8b2ebffffffffffffffffffffffff;
        maxExpArray[ 32] = 0x1c35fedd14ffffffffffffffffffffffff;
        maxExpArray[ 33] = 0x1b0ce43b323fffffffffffffffffffffff;
        maxExpArray[ 34] = 0x19f0028ec1ffffffffffffffffffffffff;
        maxExpArray[ 35] = 0x18ded91f0e7fffffffffffffffffffffff;
        maxExpArray[ 36] = 0x17d8ec7f0417ffffffffffffffffffffff;
        maxExpArray[ 37] = 0x16ddc6556cdbffffffffffffffffffffff;
        maxExpArray[ 38] = 0x15ecf52776a1ffffffffffffffffffffff;
        maxExpArray[ 39] = 0x15060c256cb2ffffffffffffffffffffff;
        maxExpArray[ 40] = 0x1428a2f98d72ffffffffffffffffffffff;
        maxExpArray[ 41] = 0x13545598e5c23fffffffffffffffffffff;
        maxExpArray[ 42] = 0x1288c4161ce1dfffffffffffffffffffff;
        maxExpArray[ 43] = 0x11c592761c666fffffffffffffffffffff;
        maxExpArray[ 44] = 0x110a688680a757ffffffffffffffffffff;
        maxExpArray[ 45] = 0x1056f1b5bedf77ffffffffffffffffffff;
        maxExpArray[ 46] = 0x0faadceceeff8bffffffffffffffffffff;
        maxExpArray[ 47] = 0x0f05dc6b27edadffffffffffffffffffff;
        maxExpArray[ 48] = 0x0e67a5a25da4107fffffffffffffffffff;
        maxExpArray[ 49] = 0x0dcff115b14eedffffffffffffffffffff;
        maxExpArray[ 50] = 0x0d3e7a392431239fffffffffffffffffff;
        maxExpArray[ 51] = 0x0cb2ff529eb71e4fffffffffffffffffff;
        maxExpArray[ 52] = 0x0c2d415c3db974afffffffffffffffffff;
        maxExpArray[ 53] = 0x0bad03e7d883f69bffffffffffffffffff;
        maxExpArray[ 54] = 0x0b320d03b2c343d5ffffffffffffffffff;
        maxExpArray[ 55] = 0x0abc25204e02828dffffffffffffffffff;
        maxExpArray[ 56] = 0x0a4b16f74ee4bb207fffffffffffffffff;
        maxExpArray[ 57] = 0x09deaf736ac1f569ffffffffffffffffff;
        maxExpArray[ 58] = 0x0976bd9952c7aa957fffffffffffffffff;
        maxExpArray[ 59] = 0x09131271922eaa606fffffffffffffffff;
        maxExpArray[ 60] = 0x08b380f3558668c46fffffffffffffffff;
        maxExpArray[ 61] = 0x0857ddf0117efa215bffffffffffffffff;
        maxExpArray[ 62] = 0x07ffffffffffffffffffffffffffffffff;
        maxExpArray[ 63] = 0x07abbf6f6abb9d087fffffffffffffffff;
        maxExpArray[ 64] = 0x075af62cbac95f7dfa7fffffffffffffff;
        maxExpArray[ 65] = 0x070d7fb7452e187ac13fffffffffffffff;
        maxExpArray[ 66] = 0x06c3390ecc8af379295fffffffffffffff;
        maxExpArray[ 67] = 0x067c00a3b07ffc01fd6fffffffffffffff;
        maxExpArray[ 68] = 0x0637b647c39cbb9d3d27ffffffffffffff;
        maxExpArray[ 69] = 0x05f63b1fc104dbd39587ffffffffffffff;
        maxExpArray[ 70] = 0x05b771955b36e12f7235ffffffffffffff;
        maxExpArray[ 71] = 0x057b3d49dda84556d6f6ffffffffffffff;
        maxExpArray[ 72] = 0x054183095b2c8ececf30ffffffffffffff;
        maxExpArray[ 73] = 0x050a28be635ca2b888f77fffffffffffff;
        maxExpArray[ 74] = 0x04d5156639708c9db33c3fffffffffffff;
        maxExpArray[ 75] = 0x04a23105873875bd52dfdfffffffffffff;
        maxExpArray[ 76] = 0x0471649d87199aa990756fffffffffffff;
        maxExpArray[ 77] = 0x04429a21a029d4c1457cfbffffffffffff;
        maxExpArray[ 78] = 0x0415bc6d6fb7dd71af2cb3ffffffffffff;
        maxExpArray[ 79] = 0x03eab73b3bbfe282243ce1ffffffffffff;
        maxExpArray[ 80] = 0x03c1771ac9fb6b4c18e229ffffffffffff;
        maxExpArray[ 81] = 0x0399e96897690418f785257fffffffffff;
        maxExpArray[ 82] = 0x0373fc456c53bb779bf0ea9fffffffffff;
        maxExpArray[ 83] = 0x034f9e8e490c48e67e6ab8bfffffffffff;
        maxExpArray[ 84] = 0x032cbfd4a7adc790560b3337ffffffffff;
        maxExpArray[ 85] = 0x030b50570f6e5d2acca94613ffffffffff;
        maxExpArray[ 86] = 0x02eb40f9f620fda6b56c2861ffffffffff;
        maxExpArray[ 87] = 0x02cc8340ecb0d0f520a6af58ffffffffff;
        maxExpArray[ 88] = 0x02af09481380a0a35cf1ba02ffffffffff;
        maxExpArray[ 89] = 0x0292c5bdd3b92ec810287b1b3fffffffff;
        maxExpArray[ 90] = 0x0277abdcdab07d5a77ac6d6b9fffffffff;
        maxExpArray[ 91] = 0x025daf6654b1eaa55fd64df5efffffffff;
        maxExpArray[ 92] = 0x0244c49c648baa98192dce88b7ffffffff;
        maxExpArray[ 93] = 0x022ce03cd5619a311b2471268bffffffff;
        maxExpArray[ 94] = 0x0215f77c045fbe885654a44a0fffffffff;
        maxExpArray[ 95] = 0x01ffffffffffffffffffffffffffffffff;
        maxExpArray[ 96] = 0x01eaefdbdaaee7421fc4d3ede5ffffffff;
        maxExpArray[ 97] = 0x01d6bd8b2eb257df7e8ca57b09bfffffff;
        maxExpArray[ 98] = 0x01c35fedd14b861eb0443f7f133fffffff;
        maxExpArray[ 99] = 0x01b0ce43b322bcde4a56e8ada5afffffff;
        maxExpArray[100] = 0x019f0028ec1fff007f5a195a39dfffffff;
        maxExpArray[101] = 0x018ded91f0e72ee74f49b15ba527ffffff;
        maxExpArray[102] = 0x017d8ec7f04136f4e5615fd41a63ffffff;
        maxExpArray[103] = 0x016ddc6556cdb84bdc8d12d22e6fffffff;
        maxExpArray[104] = 0x015ecf52776a1155b5bd8395814f7fffff;
        maxExpArray[105] = 0x015060c256cb23b3b3cc3754cf40ffffff;
        maxExpArray[106] = 0x01428a2f98d728ae223ddab715be3fffff;
        maxExpArray[107] = 0x013545598e5c23276ccf0ede68034fffff;
        maxExpArray[108] = 0x01288c4161ce1d6f54b7f61081194fffff;
        maxExpArray[109] = 0x011c592761c666aa641d5a01a40f17ffff;
        maxExpArray[110] = 0x0110a688680a7530515f3e6e6cfdcdffff;
        maxExpArray[111] = 0x01056f1b5bedf75c6bcb2ce8aed428ffff;
        maxExpArray[112] = 0x00faadceceeff8a0890f3875f008277fff;
        maxExpArray[113] = 0x00f05dc6b27edad306388a600f6ba0bfff;
        maxExpArray[114] = 0x00e67a5a25da41063de1495d5b18cdbfff;
        maxExpArray[115] = 0x00dcff115b14eedde6fc3aa5353f2e4fff;
        maxExpArray[116] = 0x00d3e7a3924312399f9aae2e0f868f8fff;
        maxExpArray[117] = 0x00cb2ff529eb71e41582cccd5a1ee26fff;
        maxExpArray[118] = 0x00c2d415c3db974ab32a51840c0b67edff;
        maxExpArray[119] = 0x00bad03e7d883f69ad5b0a186184e06bff;
        maxExpArray[120] = 0x00b320d03b2c343d4829abd6075f0cc5ff;
        maxExpArray[121] = 0x00abc25204e02828d73c6e80bcdb1a95bf;
        maxExpArray[122] = 0x00a4b16f74ee4bb2040a1ec6c15fbbf2df;
        maxExpArray[123] = 0x009deaf736ac1f569deb1b5ae3f36c130f;
        maxExpArray[124] = 0x00976bd9952c7aa957f5937d790ef65037;
        maxExpArray[125] = 0x009131271922eaa6064b73a22d0bd4f2bf;
        maxExpArray[126] = 0x008b380f3558668c46c91c49a2f8e967b9;
        maxExpArray[127] = 0x00857ddf0117efa215952912839f6473e6;
    }

    /**
        @dev given a token supply, connector balance, weight and a deposit amount (in the connector token),
        calculates the return for a given conversion (in the main token)

        Formula:
        Return = _supply * ((1 + _depositAmount / _connectorBalance) ^ (_connectorWeight / 1000000) - 1)

        @param _supply              token total supply
        @param _connectorBalance    total connector balance
        @param _connectorWeight     connector weight, represented in ppm, 1-1000000
        @param _depositAmount       deposit amount, in connector token

        @return purchase return amount
    */
    function calculatePurchaseReturn(uint256 _supply, uint256 _connectorBalance, uint32 _connectorWeight, uint256 _depositAmount) public view returns (uint256) {
        // validate input
        require(_supply > 0 && _connectorBalance > 0 && _connectorWeight > 0 && _connectorWeight <= MAX_WEIGHT);

        // special case for 0 deposit amount
        if (_depositAmount == 0)
            return 0;

        // special case if the weight = 100%
        if (_connectorWeight == MAX_WEIGHT)
            return safeMul(_supply, _depositAmount) / _connectorBalance;

        uint256 result;
        uint8 precision;
        uint256 baseN = safeAdd(_depositAmount, _connectorBalance);
        (result, precision) = power(baseN, _connectorBalance, _connectorWeight, MAX_WEIGHT);
        uint256 temp = safeMul(_supply, result) >> precision;
        return temp - _supply;
    }

    /**
        @dev given a token supply, connector balance, weight and a sell amount (in the main token),
        calculates the return for a given conversion (in the connector token)

        Formula:
        Return = _connectorBalance * (1 - (1 - _sellAmount / _supply) ^ (1 / (_connectorWeight / 1000000)))

        @param _supply              token total supply
        @param _connectorBalance    total connector
        @param _connectorWeight     constant connector Weight, represented in ppm, 1-1000000
        @param _sellAmount          sell amount, in the token itself

        @return sale return amount
    */
    function calculateRedeemReturn(uint256 _supply, uint256 _connectorBalance, uint32 _connectorWeight, uint256 _sellAmount) public view returns (uint256) {
        // validate input
        require(_supply > 0 && _connectorBalance > 0 && _connectorWeight > 0 && _connectorWeight <= MAX_WEIGHT && _sellAmount <= _supply);

        // special case for 0 sell amount
        if (_sellAmount == 0)
            return 0;

        // special case for selling the entire supply
        if (_sellAmount == _supply)
            return _connectorBalance;

        // special case if the weight = 100%
        if (_connectorWeight == MAX_WEIGHT)
            return safeMul(_connectorBalance, _sellAmount) / _supply;

        uint256 result;
        uint8 precision;
        uint256 baseD = _supply - _sellAmount;
        (result, precision) = power(_supply, baseD, MAX_WEIGHT, _connectorWeight);
        uint256 temp1 = safeMul(_connectorBalance, result);
        uint256 temp2 = _connectorBalance << precision;
        return (temp1 - temp2) / result;
    }
    
    /**
        General Description:
            Determine a value of precision.
            Calculate an integer approximation of (_baseN / _baseD) ^ (_expN / _expD) * 2 ^ precision.
            Return the result along with the precision used.

        Detailed Description:
            Instead of calculating "base ^ exp", we calculate "e ^ (ln(base) * exp)".
            The value of "ln(base)" is represented with an integer slightly smaller than "ln(base) * 2 ^ precision".
            The larger "precision" is, the more accurately this value represents the real value.
            However, the larger "precision" is, the more bits are required in order to store this value.
            And the exponentiation function, which takes "x" and calculates "e ^ x", is limited to a maximum exponent (maximum value of "x").
            This maximum exponent depends on the "precision" used, and it is given by "maxExpArray[precision] >> (MAX_PRECISION - precision)".
            Hence we need to determine the highest precision which can be used for the given input, before calling the exponentiation function.
            This allows us to compute "base ^ exp" with maximum accuracy and without exceeding 256 bits in any of the intermediate computations.
            This functions assumes that "_expN < (1 << 256) / ln(MAX_NUM, 1)", otherwise the multiplication should be replaced with a "safeMul".
    */
    function power(uint256 _baseN, uint256 _baseD, uint32 _expN, uint32 _expD) public view returns (uint256, uint8) {
        
        uint256 lnBaseTimesExp = ln(_baseN, _baseD) * _expN / _expD;
        uint8 precision = findPositionInMaxExpArray(lnBaseTimesExp);
        assert(precision >= MIN_PRECISION);                                     //hhj+ move from findPositionInMaxExpArray
        return (fixedExp(lnBaseTimesExp >> (MAX_PRECISION - precision), precision), precision);
    }

    // support _baseN < _baseD
    function power2(uint256 _baseN, uint256 _baseD, uint32 _expN, uint32 _expD) public view returns (uint256, uint8) {
        if(_baseN >= _baseD)
            return power(_baseN, _baseD, _expN, _expD);
        uint256 lnBaseTimesExp = ln(_baseD, _baseN) * _expN / _expD;
        uint8 precision = findPositionInMaxExpArray(lnBaseTimesExp);
        if(precision < MIN_PRECISION)
            return (0, 0);
        uint256 base = fixedExp(lnBaseTimesExp >> (MAX_PRECISION - precision), precision);
        base = (uint256(1) << (MIN_PRECISION + MAX_PRECISION)) / base;
        precision = MIN_PRECISION + MAX_PRECISION - precision;
        return (base, precision);
    }

    /**
        Return floor(ln(numerator / denominator) * 2 ^ MAX_PRECISION), where:
        - The numerator   is a value between 1 and 2 ^ (256 - MAX_PRECISION) - 1
        - The denominator is a value between 1 and 2 ^ (256 - MAX_PRECISION) - 1
        - The output      is a value between 0 and floor(ln(2 ^ (256 - MAX_PRECISION) - 1) * 2 ^ MAX_PRECISION)
        This functions assumes that the numerator is larger than or equal to the denominator, because the output would be negative otherwise.
    */
    function ln(uint256 _numerator, uint256 _denominator) public pure returns (uint256) {
        assert(_numerator <= MAX_NUM);

        uint256 res = 0;
        uint256 x = _numerator * FIXED_1 / _denominator;

        // If x >= 2, then we compute the integer part of log2(x), which is larger than 0.
        if (x >= FIXED_2) {
            uint8 count = floorLog2(x / FIXED_1);
            x >>= count; // now x < 2
            res = count * FIXED_1;
        }

        // If x > 1, then we compute the fraction part of log2(x), which is larger than 0.
        if (x > FIXED_1) {
            for (uint8 i = MAX_PRECISION; i > 0; --i) {
                x = (x * x) / FIXED_1; // now 1 < x < 4
                if (x >= FIXED_2) {
                    x >>= 1; // now 1 < x < 2
                    res += ONE << (i - 1);
                }
            }
        }

        return res * LN2_NUMERATOR / LN2_DENOMINATOR;
    }

    /**
        Compute the largest integer smaller than or equal to the binary logarithm of the input.
    */
    function floorLog2(uint256 _n) internal/*public*/ pure returns (uint8) {
        uint8 res = 0;

        if (_n < 256) {
            // At most 8 iterations
            while (_n > 1) {
                _n >>= 1;
                res += 1;
            }
        }
        else {
            // Exactly 8 iterations
            for (uint8 s = 128; s > 0; s >>= 1) {
                if (_n >= (ONE << s)) {
                    _n >>= s;
                    res |= s;
                }
            }
        }

        return res;
    }

    /**
        The global "maxExpArray" is sorted in descending order, and therefore the following statements are equivalent:
        - This function finds the position of [the smallest value in "maxExpArray" larger than or equal to "x"]
        - This function finds the highest position of [a value in "maxExpArray" larger than or equal to "x"]
    */
    function findPositionInMaxExpArray(uint256 _x) internal/*public*/ view returns (uint8) {
        uint8 lo = MIN_PRECISION;
        uint8 hi = MAX_PRECISION;

        while (lo + 1 < hi) {
            uint8 mid = (lo + hi) / 2;
            if (maxExpArray[mid] >= _x)
                lo = mid;
            else
                hi = mid;
        }

        if (maxExpArray[hi] >= _x)
            return hi;
        if (maxExpArray[lo] >= _x)
            return lo;

        //assert(false);                                                        // move to power
        return 0;
    }

    /**
        This function can be auto-generated by the script 'PrintFunctionFixedExp.py'.
        It approximates "e ^ x" via maclaurin summation: "(x^0)/0! + (x^1)/1! + ... + (x^n)/n!".
        It returns "e ^ (x / 2 ^ precision) * 2 ^ precision", that is, the result is upshifted for accuracy.
        The global "maxExpArray" maps each "precision" to "((maximumExponent + 1) << (MAX_PRECISION - precision)) - 1".
        The maximum permitted value for "x" is therefore given by "maxExpArray[precision] >> (MAX_PRECISION - precision)".
    */
    function fixedExp(uint256 _x, uint8 _precision) internal/*public*/ pure returns (uint256) {
        uint256 xi = _x;
        uint256 res = 0;

        xi = (xi * _x) >> _precision;
        res += xi * 0x03442c4e6074a82f1797f72ac0000000; // add x^2 * (33! / 2!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0116b96f757c380fb287fd0e40000000; // add x^3 * (33! / 3!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0045ae5bdd5f0e03eca1ff4390000000; // add x^4 * (33! / 4!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000defabf91302cd95b9ffda50000000; // add x^5 * (33! / 5!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0002529ca9832b22439efff9b8000000; // add x^6 * (33! / 6!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000054f1cf12bd04e516b6da88000000; // add x^7 * (33! / 7!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000a9e39e257a09ca2d6db51000000; // add x^8 * (33! / 8!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0000012e066e7b839fa050c309000000; // add x^9 * (33! / 9!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0000001e33d7d926c329a1ad1a800000; // add x^10 * (33! / 10!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000002bee513bdb4a6b19b5f800000; // add x^11 * (33! / 11!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000003a9316fa79b88eccf2a00000; // add x^12 * (33! / 12!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000048177ebe1fa812375200000; // add x^13 * (33! / 13!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000005263fe90242dcbacf00000; // add x^14 * (33! / 14!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0000000000057e22099c030d94100000; // add x^15 * (33! / 15!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000000057e22099c030d9410000; // add x^16 * (33! / 16!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000000000052b6b54569976310000; // add x^17 * (33! / 17!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000000000004985f67696bf748000; // add x^18 * (33! / 18!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0000000000000003dea12ea99e498000; // add x^19 * (33! / 19!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000000000000031880f2214b6e000; // add x^20 * (33! / 20!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0000000000000000025bcff56eb36000; // add x^21 * (33! / 21!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0000000000000000001b722e10ab1000; // add x^22 * (33! / 22!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000000000000001317c70077000; // add x^23 * (33! / 23!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000000000000000000cba84aafa00; // add x^24 * (33! / 24!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000000000000000000082573a0a00; // add x^25 * (33! / 25!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000000000000000000005035ad900; // add x^26 * (33! / 26!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x0000000000000000000000002f881b00; // add x^27 * (33! / 27!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000000000000000000001b29340; // add x^28 * (33! / 28!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x000000000000000000000000000efc40; // add x^29 * (33! / 29!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000000000000000000000007fe0; // add x^30 * (33! / 30!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000000000000000000000000420; // add x^31 * (33! / 31!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000000000000000000000000021; // add x^32 * (33! / 32!)
        xi = (xi * _x) >> _precision;
        res += xi * 0x00000000000000000000000000000001; // add x^33 * (33! / 33!)

        return res / 0x688589cc0e9505e2f2fee5580000000 + _x + (ONE << _precision); // divide by 33! and then add x^1 / 1! + x^0 / 0!
    }
   
} 


contract Constant {
    uint256 internal constant ONE_DAY                           = 86400;
    uint256 internal constant ONE_HOUR                          = 3600; 
    uint256 internal constant UP_NODE_CONTER                    = 9;     
    uint256 internal constant SPEND_PERSENT_EVERY_DATE          = 1;    
    
    function getAdjustedNow() internal view returns(uint256){
       return   now+ONE_HOUR*9;
    }
    function getAdjustedDate()internal view returns(uint256)
    {
        return (now+ONE_HOUR*9) - (now+ONE_HOUR*9)%ONE_DAY - ONE_HOUR*9;
    }
    
}


/**
    EProToken implementation
*/
contract EProToken is SmartToken, Constant, Floor, Sqrt, Formula {
    uint32  public weight                           = MAX_WEIGHT;               // 100%
    uint256 public reserve;
    uint256 public profitPool;
    mapping (address => uint256) public stakingOf;
    mapping (address => uint256) public lastDay4ProfitOf;
    mapping (address => uint256) public profitedOf;
    uint256 public totalProfited;
    uint256 public totalDestroyed;
    mapping (address => uint256) public remainderOf;
    
    constructor() public{
        m_name = "ETH PRO Token";
        m_symbol = "EPRO";
        m_decimals = 18;
    }
    
    function issueToken(address _holder, address _parent, uint256 _value) virtual internal {
        uint256 value2 = safeAdd(_value, remainderOf[_holder]);
        uint256 amount = floor(safeDiv(value2, 9));
        remainderOf[_holder] = safeSub(value2, safeMul(amount, 9)); 
        issue(_holder, amount);
        if(_parent != address(0)){
		    value2 = safeAdd(_value, remainderOf[_parent]);
			amount = floor(safeDiv(value2, 9));
			remainderOf[_parent] = safeSub(value2, safeMul(amount, 9));
            issue(_parent, amount);
		}
        _value = safeDiv(_value, 40);                                           // 2.5%
        profitPool = safeAdd(profitPool, _value);
        reserve = safeAdd(reserve, _value);
        adjustWeight();
        emitPrice();
    }
    
    function destroy(address _from, uint256 _amount) virtual override internal {
        super.destroy(_from, _amount);
        totalDestroyed = safeAdd(totalDestroyed, _amount);
    }
    
    function calcWeight(uint256 _reserve) virtual public pure returns (uint32 weight_) {
        weight_ = uint32(safeDiv(safeMul(MAX_WEIGHT, 2e9), sqrt(_reserve)));
        if(weight_ > MAX_WEIGHT)
            weight_ = MAX_WEIGHT;
    }
    
    // adjust weight when reserve changed
    function adjustWeight() virtual internal {
        weight = calcWeight(reserve);
    }
    
    // tax 10% when transfer or unstake
    event Tax(address _to, uint256 _amount);
    function tax(address _to, uint256 _amount) virtual internal {
        if(_to == address(this))                                                // no tax when stake
            return;
            
        destroy(_to, _amount / 10);
        emit Tax(_to, _amount / 10);
        emitPrice();
    }
    
    function transfer(address _to, uint256 _amount) override public transfersAllowed returns (bool success){
        success = super.transfer(_to, _amount);
        tax(_to, _amount);
    }
    
    function transferFrom(address _from, address _to, uint256 _amount) override public transfersAllowed returns (bool success){
        success = super.transferFrom(_from, _to, _amount);
        tax(_to, _amount);
    }
    
    function totalStaking() virtual public view returns (uint256){
        return balanceOf(address(this));
    }
    
    event Stake(address _holder, uint256 _amount);
    function stake(uint256 _amount) virtual public returns (bool success){
        success = transfer(address(this), _amount);
        stakingOf[msg.sender] = safeAdd(stakingOf[msg.sender], _amount);
        lastDay4ProfitOf[msg.sender] = getAdjustedNow() / ONE_DAY;
        emit Stake(msg.sender, _amount);
    }
    
    event Unstake(address _holder, uint256 _amount);
    function unstake(uint256 _amount) virtual public returns (bool success){
        stakingOf[msg.sender] = safeSub(stakingOf[msg.sender], _amount);
        success = this.transfer(msg.sender, _amount);
        emit Unstake(msg.sender, _amount);
    }
    
    function profitingOf(address _holder) virtual public view returns (uint256){
        uint256 day = safeSub( getAdjustedNow() / ONE_DAY, lastDay4ProfitOf[_holder]);
        if(day < 1)
            return 0;
        //if(day > 7)
        //    day = 7;
        if(totalStaking() == 0)
            return 0;
        if(stakingOf[_holder] * day > totalStaking())
            return profitPool / 10;
        else
            return profitPool / 10 * stakingOf[_holder] * day / totalStaking();
    }
    
    event DivideProfit(address _holder, uint256 _value);
    function divideProfit() virtual public returns (uint256 profit){
        profit = profitingOf(msg.sender);
        profitedOf[msg.sender] = safeAdd(profitedOf[msg.sender], profit);
        totalProfited = safeAdd(totalProfited, profit);
        profitPool = safeSub(profitPool, profit);
        lastDay4ProfitOf[msg.sender] =  getAdjustedNow() / ONE_DAY;
        msg.sender.transfer(profit);
        emit DivideProfit(msg.sender, profit);
    }
    
    function price() virtual public view returns (uint256){
        if(m_totalSupply == 0)
            return 0.01 ether;
		return safeDiv(safeMul(safeDiv(safeMul(reserve, MAX_WEIGHT), weight), 1 ether), m_totalSupply);   
    }
    
    event Price(uint256 _price, uint256 _reserve, uint256 _supply, uint32 _weight);
    function emitPrice() virtual internal {
        emit Price(price(), reserve, m_totalSupply, weight);
    }
    
    function calcPurchaseRet(uint256 _value) virtual public view returns (uint256 amount, uint256 price_, uint256 tax_) {
        uint256 value_90 = safeDiv(safeMul(_value, 90), 100);                   // 90% into reserve, 10% to distributePool
        uint32  weight_ = calcWeight(safeAdd(reserve, value_90));
        uint256 value_85 = safeDiv(safeMul(_value, 85), 100);                   // 85% token returns
        amount = calculatePurchaseReturn(m_totalSupply, reserve, weight_, value_85);
        price_ = safeDiv(safeMul(value_85, 1 ether), amount);
        tax_ = safeSub(_value, value_85);
    }
    
    function purchase() virtual public payable returns (uint256 amount){
        uint256 value_90 = safeDiv(safeMul(msg.value, 90), 100);                // 90% into reserve, 10% to distributePool
        weight = calcWeight(safeAdd(reserve, value_90));
        uint256 value_85 = safeDiv(safeMul(msg.value, 85), 100);                // 85% token returns
        amount = calculatePurchaseReturn(m_totalSupply, reserve, weight, value_85);
        reserve = safeAdd(reserve, value_90);
        issue(msg.sender, amount);
        emitPrice();
    }
    
    function calcRedeemRet(uint256 _amount) virtual public view returns (uint256 value_, uint256 price_, uint256 tax_) {
        value_ = calculateRedeemReturn(m_totalSupply, reserve, weight, _amount);
        price_ = safeDiv(safeMul(value_, 1 ether), _amount);
        tax_ = safeDiv(safeMul(value_, 15), 100); 
        value_ -= tax_;
    }
    
    function redeem(uint256 _amount) virtual public returns (uint256 value_){
        value_ = calculateRedeemReturn(m_totalSupply, reserve, weight, _amount);
        reserve = safeSub(reserve, safeDiv(safeMul(value_, 95), 100));
        adjustWeight();
        destroy(msg.sender, _amount);
        value_ = safeDiv(safeMul(value_, 85), 100);                             // 85% redeem, 5% to reserve, 10% to distributePool
        msg.sender.transfer(value_);
        emitPrice();
    }
        
}


/**
    Main contract Ethpro implementation
*/
contract EthPro is EProToken {
    
    function purchase() virtual override public payable returns (uint256 amount){
        uint256 tax = safeDiv(msg.value, 10);
        distributePool = safeAdd(distributePool, tax);  // 10% to distributePool
        ethTax[roundNo] = safeAdd(ethTax[roundNo], tax);
        amount = super.purchase();
    }
    
    function redeem(uint256 _amount) virtual override public returns (uint256 value_){
        value_ = super.redeem(_amount);
        uint256 tax = safeDiv(safeMul(value_, 10), 85);
        distributePool = safeAdd(distributePool, tax);  // 10% to distributePool
        ethTax[roundNo] = safeAdd(ethTax[roundNo], tax);
    }

    uint256 public distributePool;                      
    uint256 public devFund;                             
    uint256 public top3Pool;                            
    mapping (uint256 => uint256) public totalInvestment;
    mapping (uint256 => uint256) public ethTax;         
    mapping (uint256 => uint256) public lastSeriesNo;   
    uint256 public roundNo;                           


    struct User{ 
        uint256 seriesNo;
        uint256 investment;                           
        mapping (uint256 => uint256) investmentHistory;
        uint256 ethDone;                              
        mapping (uint256 => uint256) ethDoneHistory;   
        uint256 disDone;                              
        uint256 roundFirstDate;                       
        uint256 distributeLastTime;                   
        bool quitted;                                
        bool boxReward;                              
    }
    
    struct User1{                                     
        uint256 sonAmount;                            
        uint256 sonAmountPre;                         
        uint256 sonAmountDate;                        
        uint256 sonTotalAmount1;                      
        uint256 sonTotalAmount9;                      
        
        uint256 linkReward;                           
        uint256 nodeReward;                           
        uint256 supNodeReward;                        
        uint256 linkRewardTotal;                      
        uint256 nodeRewardTotal;                      
        uint256 supNodeRewardTotal;                   
    }
    
    struct User2{
	    uint256 firstTime;                            
        uint256 roundNo;                              
        address parent;                               
        uint256 sonCount;                             
        uint256 sonNodeCount;                         
		uint256 supNodeCount;                         
    }

    mapping (uint256 => mapping(address => User)) public user;     
    mapping (uint256 => mapping(address => User1)) public user1;   
    mapping (address => User2) public user2;                     
    
    mapping(uint256 => uint256) public quitAmount;                
    mapping(uint256 => uint256) public quitLastTime;              

    address[3] public top3;                                      
    address[3] public top3Pre;                                   
    bool[3]    public top3Withdraw;                             
    uint256    public top3date;                                 
    uint256    public top3PoolPre;                                 
    
    mapping(uint256 => uint256) public boxExpire;
    mapping(uint256 => uint256) public boxLastSeriesNo;           
    
    constructor() public{
        roundNo = 1;
        boxExpire[roundNo]=now+72*ONE_HOUR;
        quitLastTime[roundNo] = getAdjustedDate();
    }
    
    event logAddrAmount(uint256 indexed lastSeriesNo,uint256 indexed round,address send, uint256 amount,uint256 logtime);
    event logProfit(uint256 indexed round,address addr, uint256 profitAmount,uint256 invitAmount,uint256 logtime);
    
    event loglink(uint256 indexed round, address indexed parent, address indexed addr, uint256 investment, uint256 invitAmount, uint256 sonCount, uint256 nodeCount, uint256 supNodeCount, uint256 firstTime);

	
    receive() external payable  {
      if (msg.value==0)
        distributionReward();
      else
        play(address(0));
    }

    function limSub(uint256 _x,uint256 _y) internal pure returns (uint256) {
      if (_x>_y)
        return _x - _y;
      else
        return 0;
    }

    function play(address parent) public payable { 
      address addr=msg.sender;
      uint256 value=msg.value;
      if (value<(1 ether))
        revert();
      if (now > boxExpire[roundNo])          
        revert();
      if  (((parent==address(0))||(user2[parent].roundNo == 0))&&(addr!=creator)){ 
          parent=creator;
      }
      if(user2[addr].parent==address(0))
        user2[addr].parent = parent;
      else
        parent = user2[addr].parent;
        
	  if (user2[addr].firstTime==0)
	       user2[addr].firstTime = now;
      bool reinvestment = false; 
      if (roundNo>user2[addr].roundNo){ 
        user2[addr].roundNo = roundNo;
      }
      
      if(user[roundNo][addr].investment>0){
		if (user[roundNo][addr].ethDone < user[roundNo][addr].investment *125/100){ 
          revert();
        }else{
          reinvestment = true;
        }
      }

      
      uint256 curDay = getAdjustedDate();
      user[roundNo][addr].investment += value;
      user[roundNo][addr].investmentHistory[curDay] = user[roundNo][addr].investment; 
      if(user[roundNo][addr].roundFirstDate == 0)
         user[roundNo][addr].roundFirstDate = curDay; 
      user[roundNo][addr].distributeLastTime = curDay; 

      totalInvestment[roundNo]     += value;
      distributePool        += value *85 / 100; 
      devFund               += value * 4 / 100; 
      top3Pool              += value * 3 / 100; 

      if (parent!=address(0)){
          
        nodeReward(parent, value);

        if (!reinvestment) {
            address parent_temp = addSon(parent);
            if(parent_temp != address(0))
                addSonNode(parent_temp);
        }
		  
        updateSonAmount(parent,value);
		
        emit loglink(roundNo, parent, addr, user[roundNo][addr].investment, user1[roundNo][addr].sonTotalAmount9, user2[addr].sonCount, user2[addr].sonNodeCount, user2[addr].supNodeCount, user2[addr].firstTime);
            
        updateTop3(parent);

      }

      lastSeriesNo[roundNo]=lastSeriesNo[roundNo]+1;
      user[roundNo][addr].seriesNo=lastSeriesNo[roundNo];
      if (now<=boxExpire[roundNo]){
        boxLastSeriesNo[roundNo]=lastSeriesNo[roundNo];
        if ((now+72*ONE_HOUR)>(boxExpire[roundNo]+3*ONE_HOUR))
          boxExpire[roundNo]=boxExpire[roundNo]+3*ONE_HOUR;
        else
          boxExpire[roundNo]=now+72*ONE_HOUR;
      }

      issueToken(addr, parent, value);

      emit logAddrAmount(lastSeriesNo[roundNo],roundNo,addr,value,now);
    }


  function addSon(address addr) internal returns(address){
        user2[addr].sonCount += 1;
        if ((user2[addr].sonCount==UP_NODE_CONTER)&&(user2[addr].parent!=address(0))){
          return user2[addr].parent;
        }
        return address(0);
    }

    function addSonNode(address addr)internal {
       user2[addr].sonNodeCount += 1;
		if ((user2[addr].sonNodeCount==UP_NODE_CONTER)&&(user2[addr].parent!=address(0)))
		 {
		      user2[user2[addr].parent].supNodeCount += 1;
		 }
    }

    function restart() internal returns(bool){
      if (now>boxExpire[roundNo]){ 
        if (distributePool < (10 ether)){
          distributePool += totalInvestment[roundNo]* 1/100;
          roundNo = roundNo + 1;
          boxExpire[roundNo]=now + 72*ONE_HOUR;
          return true;
        }
      }
      return false;
    }


    function quit() public { 
        address payable addr = msg.sender;
        if (user[roundNo][addr].quitted) 
            revert();
        uint256 curDay = getAdjustedDate();
        uint256 quitDone = 0; 
        if (quitLastTime[roundNo] == curDay)
            quitDone = quitAmount[roundNo];

        uint256 value = safeSub(user[roundNo][addr].investment*80/100, (user[roundNo][addr].ethDone * 2));
        uint256 quitAmount1= quitDone + value;
        if(quitAmount1 > distributePool *1/100)
            revert();
        
        user[roundNo][addr].quitted = true;
        if (quitLastTime[roundNo] != curDay)
            quitLastTime[roundNo] = curDay;
        
        quitAmount[roundNo] = quitDone + value;
        distributePool = limSub(distributePool, value);
        addr.transfer(value);
        restart();
    }


    function distributionReward() public {
      if (user[roundNo][msg.sender].quitted) 
         revert();
      address payable addr=msg.sender;
      uint256 curDay = getAdjustedDate();
      uint256[9] memory r=calcUserReward(addr);
      user[roundNo][addr].distributeLastTime = curDay;
      user[roundNo][addr].ethDone += r[4];
      user[roundNo][addr].ethDoneHistory[curDay] = user[roundNo][addr].ethDone;
      user[roundNo][addr].disDone += r[0];

      distributePool = limSub(distributePool, r[4]);

      user1[roundNo][addr].linkReward = 0;
      user1[roundNo][addr].nodeReward = 0;
      user1[roundNo][addr].supNodeReward = 0;
      if (addr == creator){
        addr.transfer(r[4] + devFund); 
        devFund = 0;
      }
      else
        addr.transfer(r[4]);  
  
      emit logProfit(roundNo, addr, r[8], user1[roundNo][addr].sonTotalAmount1, now);

      if (user2[addr].parent!=address(0))
        linkReward(user2[addr].parent, r[6] *10/100 /2);
      restart();
    }
    
    function ceilReward(address addr, uint256 amount) public view returns(uint256 amount_) {
        uint256 curDay = getAdjustedDate();
        uint256 day = limSub(curDay , user[roundNo][addr].distributeLastTime) / ONE_DAY;
        if (day>7)
            day=7;
        uint256 disReward = (user[roundNo][addr].investment + floor(user[roundNo][addr].ethDone)) *SPEND_PERSENT_EVERY_DATE/100 * day;
        uint256 sumReward =disReward + user1[roundNo][addr].linkReward + user1[roundNo][addr].nodeReward + user1[roundNo][addr].supNodeReward;
        return limSub(amount, limSub(amount + user[roundNo][addr].ethDone + sumReward, user[roundNo][addr].investment *125/100));
    }
    
    function linkReward(address addr,uint256 amount) internal {
        for(uint i=0; i<9; i++){
            if(user2[addr].sonCount > i) {
                uint256 amount_ = ceilReward(addr, amount);
                if(amount_ > 0){
                    user1[roundNo][addr].linkReward += amount_;
                    user1[roundNo][addr].linkRewardTotal += amount_;
                }
            }
            addr = user2[addr].parent;
            if (addr==address(0))
               break;
        }
    }

    function nodeReward(address addr,uint256 amount) internal {
        bool bNode = false;
        bool bSupNode = false;
        for (uint i=0; i<200; i++){
            if (addr==address(0))
                break;
            if ((user2[addr].sonCount >= UP_NODE_CONTER) && (user2[addr].sonNodeCount < UP_NODE_CONTER) && (!bNode)){
                uint256 amount_ =  ceilReward(addr, amount * 5/100/2);
                if(amount_ > 0){
                    user1[roundNo][addr].nodeReward += amount_;
                    user1[roundNo][addr].nodeRewardTotal += amount_;
                }
                bNode = true;
            }
            if (user2[addr].sonNodeCount >= UP_NODE_CONTER){                
                if (bNode){
                    uint256 amount_ =  ceilReward(addr, amount * 5/100/2);  
                    if(amount_ > 0){
                        user1[roundNo][addr].supNodeReward += amount_;      
                        user1[roundNo][addr].supNodeRewardTotal += amount_; 
                    }
                }else{
                    uint256 amount_ =  ceilReward(addr, amount * 10/100/2); 
                    if(amount_ > 0){
                        user1[roundNo][addr].supNodeReward += amount_;      
                        user1[roundNo][addr].supNodeRewardTotal += amount_; 
                    }
                }
                bSupNode = true;
            }
            if (bSupNode || addr==creator)
                break;
            addr = user2[addr].parent;
        }
    }

    function updateSonAmount(address addr,uint value) internal {
      uint256 date = getAdjustedDate();
      if (date == user1[roundNo][addr].sonAmountDate){
        user1[roundNo][addr].sonAmount = user1[roundNo][addr].sonAmount + value;
      }
      else if (date-ONE_DAY == user1[roundNo][addr].sonAmountDate){
        user1[roundNo][addr].sonAmountPre = user1[roundNo][addr].sonAmount;
        user1[roundNo][addr].sonAmount = value;
      }
      else if (user1[roundNo][addr].sonAmountDate==0){
        user1[roundNo][addr].sonAmount = value;
      }
      else{
        user1[roundNo][addr].sonAmountPre = 0;
        user1[roundNo][addr].sonAmount = value;
      }
      user1[roundNo][addr].sonAmountDate = date;
      
      user1[roundNo][addr].sonTotalAmount1 += value;
      for(uint256 i=0; i<9; i++) {
        user1[roundNo][addr].sonTotalAmount9 += value;

		address parent = user2[addr].parent;
		if(parent == address(0))
		    break;
		    
        emit loglink(roundNo, parent, addr, user[roundNo][addr].investment, user1[roundNo][addr].sonTotalAmount9, user2[addr].sonCount, user2[addr].sonNodeCount, user2[addr].supNodeCount, user2[addr].firstTime);
            
        addr = parent;
      }
    }


    function updateTop3(address addr) internal {
      if (addr == creator) 
        return;
      uint256 amount1 = user1[roundNo][addr].sonAmount;
      uint256 date =  getAdjustedDate();
      bool updateTop3date=false;
      address addr0 = top3[0];
      address addr1 = top3[1];
      address addr2 = top3[2];
      if (date == top3date){
        uint256 insertIndex=100;
        uint256 repeateIndex=100;
        address[3] memory tmp;
        if(!((amount1>user1[roundNo][top3[2]].sonAmount)||(amount1>user1[roundNo][top3[1]].sonAmount)))
          return;
        for (uint i=0;i<3;i++){
	      if (top3[i] == addr)
	        repeateIndex=i;
	      else
	        tmp[i] = top3[i];
        }
        for (uint i=0;i<3;i++){
          if (amount1>user1[roundNo][tmp[i]].sonAmount){
	        insertIndex = i;
            break;
          }
        }
        uint j=0;//tmp
        for (uint i=0;i<3;i++){
          if (insertIndex==i){
            if (top3[i]!=addr)
	          top3[i]=addr;
	      }
          else{
            if (top3[i]!=tmp[j])
              top3[i]=tmp[j];
	        j += 1;
	      }
         if(j == repeateIndex)
	          j += 1;
        }
      }
      else if (date-ONE_DAY == top3date){
        top3Pre[0]=addr0;
        top3Pre[1]=addr1;
        top3Pre[2]=addr2;
        top3[0]=addr;
        top3[1]=address(0);
        top3[2]=address(0);
        top3PoolPre = limSub(top3Pool , msg.value*3/100);
        updateTop3date=true;
      } 
      else if(top3date == 0){
        top3[0] = addr;
        updateTop3date = true;
      }
      else{
        for (uint i=0; i<3; i++){
          top3Pre[i] = address(0);
          if (i != 0)
          top3[i] = address(0);
        }
        top3[0] = addr;
        updateTop3date = true;
      }
      if (updateTop3date){
        top3date = date;
        for (uint i=0; i<3; i++)
          top3Withdraw[i] = false;
      }
    }

    function calcTop3Reward(uint256 rank,uint256 poolAmount) public pure returns(uint256) {
      uint256 ret=0;
      //if (top3date==date){
        if (rank==0)
          ret=poolAmount*3*6/100;
        else if(rank==1)
          ret = poolAmount*3*3/100;
        else if(rank==2)
          ret = poolAmount*3*1/100;
      //}
      return ret;
    }

    function getTop3Reward() public {
      if (user[roundNo][msg.sender].quitted) 
         revert();
      address payable addr=msg.sender;
      uint256 date = getAdjustedDate();
      //uint256 ret = 0;
      uint256 index = 100;
   
      if (date-ONE_DAY == top3date){
        top3Pre[0] = top3[0];
        top3Pre[1] = top3[1];
        top3Pre[2] = top3[2];
        for (uint i=0; i<3; i++){
          top3[i] = address(0);
          top3Withdraw[i] = false;
        }
        top3date = date;
		top3PoolPre=top3Pool;
      } 

      if (top3date==date){

        if (addr == top3Pre[0]){
          index = 0;
        }
        else if(addr==top3Pre[1]){
          index =1;
        }
        else if(addr==top3Pre[2]){
          index = 2;
        }
      }
      if ((index<3)&&(!top3Withdraw[index])){
        uint256 ret = calcTop3Reward(index,top3PoolPre);
        top3Pool = limSub(top3Pool,ret);
        top3Withdraw[index] = true;
        addr.transfer(ret);  
      }
    }

    function calcBoxReward(uint256 rank,uint256 curRoundNo) internal view returns(uint256) {
      if (rank==1){
        //return boxPool[curRoundNo]*25/100;
        return totalInvestment[curRoundNo]*2/100 *25/100;
      }
      else if(rank>=2 && rank<=6){
        //return boxPool[curRoundNo]*25/100/5;
        return totalInvestment[curRoundNo]*2/100 *25/100 /5;
      }
      else if(rank>=7 && rank<=56){
        //return boxPool[curRoundNo]*25/100/50;
        return totalInvestment[curRoundNo]*2/100 *25/100 /50;
      }
      else if(rank>=57 && rank<=556){
        //return boxPool[curRoundNo]*25/100/500;
        return totalInvestment[curRoundNo]*2/100 *25/100 /500;
      }
      return 0;
    }

    function userBoxInfo(address addr) public view returns(uint256 curRoundNo,uint256 userBoxReward,bool boxOpened,bool drew){
      curRoundNo = user2[addr].roundNo;
      drew = false;
      userBoxReward = 0;
      if (curRoundNo==0){
        boxOpened = false;
        return (curRoundNo,userBoxReward,boxOpened,drew);
      }
      if (now>boxExpire[curRoundNo]){
        boxOpened = true;
        if ((user[curRoundNo][addr].seriesNo>0)&&(boxLastSeriesNo[curRoundNo]>=user[curRoundNo][addr].seriesNo)&&(boxLastSeriesNo[curRoundNo]-user[curRoundNo][addr].seriesNo<556)){
          drew = user[curRoundNo][addr].boxReward;
            //user[curRoundNo][addr].boxReward = true;
          uint256 rank = boxLastSeriesNo[curRoundNo]-user[curRoundNo][addr].seriesNo+1;
          userBoxReward = calcBoxReward(rank,curRoundNo);
        }
      }
    }

    function getBoxReward() public {
      if (user[roundNo][msg.sender].quitted)
        revert();
      address payable addr=msg.sender;
      uint256 curRoundNo;
      uint256 userBoxReward;
      bool boxOpened;
      bool drew=false;
      (curRoundNo,userBoxReward,boxOpened,drew) = userBoxInfo(addr);
      if ((userBoxReward>0)&&(!drew)){
        user[curRoundNo][addr].boxReward = true;
        //boxPool[curRoundNo] = boxPool[curRoundNo]-userBoxReward;
        addr.transfer(userBoxReward);
      }
    }

    function quitable(address addr) public view returns(uint256){ 
      if (user[roundNo][addr].quitted){
        return 0;
      }
      uint256 curDay = getAdjustedDate();
      uint256 quitDone=0; 
      if (quitLastTime[roundNo]==curDay)
        quitDone=quitAmount[roundNo];
      
      uint256 value = limSub(user[roundNo][addr].investment *80/100, user[roundNo][addr].ethDone * 2); 
      uint256 quitAmount1= quitDone + value;
      if(quitAmount1 > distributePool *1/100){
         return 2;
      }
      return 1;

    }

    function boolToUint256(bool bVar) public pure returns (uint256) {
      if (bVar)
        return 1;
      else
        return 0;
    }

    function calcIndateInvestment(address addr, uint256 curDay) public view returns (uint256) {
        mapping (uint256 => uint256) storage investmentHistory = user[roundNo][addr].investmentHistory;
        uint256 outdated = 0;
        uint256 roundFirstDate = user[roundNo][addr].roundFirstDate;
        if(roundFirstDate > 0) {
            for(uint256 i = curDay - 125 * ONE_DAY; i >= roundFirstDate; i-= ONE_DAY) {
                if(investmentHistory[i] > 0) {
                    outdated = investmentHistory[i];
                    break;
                }
            }
        }
        return limSub(user[roundNo][addr].investment, outdated);
    }
    
    function calcIndateEthDone(address addr, uint256 curDay) public view returns (uint256) {
        mapping (uint256 => uint256) storage ethDoneHistory = user[roundNo][addr].ethDoneHistory;
        uint256 outdated = 0;
        uint256 roundFirstDate = user[roundNo][addr].roundFirstDate;
        if(roundFirstDate > 0) {
            for(uint256 i = curDay - 125 * ONE_DAY; i >= roundFirstDate; i-= ONE_DAY) {
                if(ethDoneHistory[i] > 0) {
                    outdated = ethDoneHistory[i];
                    break;
                }
            }
        }
        return limSub(floor(user[roundNo][addr].ethDone), floor(outdated));
    }
    
    function calcUserReward(address  addr) public view returns(uint256[9] memory r){ 
        uint256 curDay = getAdjustedDate();
        uint256 day = limSub(curDay , user[roundNo][addr].distributeLastTime) / ONE_DAY;
        if (day < 1){
            for(uint256 i=0; i<9; i++){
                r[i]=0;
            }
            //return r;
        }
        if (day>7)
            day=7;
        
        uint256 disPure   = calcIndateInvestment(addr, curDay) *SPEND_PERSENT_EVERY_DATE/100 * day;   
        uint256 disReward = disPure + calcIndateEthDone(addr, curDay) *SPEND_PERSENT_EVERY_DATE/100 * day; 
        uint256 sumReward = disReward + user1[roundNo][addr].linkReward + user1[roundNo][addr].nodeReward + user1[roundNo][addr].supNodeReward; 
        
        if ((user[roundNo][addr].ethDone + sumReward) > (user[roundNo][addr].investment *125/100)){
            sumReward = limSub(user[roundNo][addr].investment *125/100, user[roundNo][addr].ethDone);
        }
        if (disPure > sumReward)
            disPure = sumReward;
        if (sumReward < disReward)
            disReward = sumReward;
        
        r[0] = disReward;                                
        r[1] = user1[roundNo][addr].linkRewardTotal *2;   
        r[2] = user1[roundNo][addr].nodeRewardTotal *2;   
        r[3] = user1[roundNo][addr].supNodeRewardTotal *2;
        
        r[4] = sumReward;                                
        r[5] = limSub((user[roundNo][addr].investment + floor(user[roundNo][addr].ethDone)) *250/100, user[roundNo][addr].disDone *2);
        r[6] = disPure;                                         
        r[7] = user[roundNo][addr].ethDone *2;                   
        if (addr != creator)
            r[8] = (user[roundNo][addr].ethDone + sumReward) *2; 
    }
    
 
 function userTop3RewardInfo(address addr) public view returns(uint256 reward,bool done){  
    uint256 date = getAdjustedDate();
    uint256 index =100;
	uint256 poolAmount;
    if (top3date==date){
        if (addr == top3Pre[0]){
          index = 0;
        }
        else if(addr==top3Pre[1]){
          index =1;
        }
        else if(addr==top3Pre[2]){
          index = 2;
        }
		poolAmount = top3PoolPre;
    }
    else if (date-ONE_DAY == top3date){
        if (addr == top3[0]){
          index = 0;
        }
        else if(addr==top3[1]){
          index =1;
        }
        else if(addr==top3[2]){
          index = 2;
        }
		poolAmount = top3Pool;
    }
    if (index<3){
        reward =  calcTop3Reward(index,poolAmount);
        done = top3Withdraw[index];
    }else{
        reward = 0;
        done = false;
    }

    
 }

    function getUserInfo(address addr) public view returns(uint256[50] memory ret) {
        uint256[9] memory r= calcUserReward(addr);
        uint256 curUserRoundNo = user2[addr].roundNo;
        
        ret[0] = user[roundNo][addr].seriesNo;
        ret[1] = user[roundNo][addr].investment;           
        ret[2] = user[roundNo][addr].ethDone + r[4];       
        ret[3] = user[roundNo][addr].ethDone;              
        ret[4] = user[roundNo][addr].distributeLastTime;   
        ret[5] = boolToUint256(user[roundNo][addr].quitted);
        ret[6] = uint256(user2[addr].parent);               
        ret[7] = user2[addr].sonCount;                     
        ret[8] = user2[addr].sonNodeCount;                 
        
        uint256 date = getAdjustedDate();
        if (user1[roundNo][addr].sonAmountDate == date){
          ret[9] = user1[roundNo][addr].sonAmount;                       
          ret[10] = user1[roundNo][addr].sonAmountPre;                   
        }else if(date-ONE_DAY == user1[roundNo][addr].sonAmountDate) {
          ret[9] = 0;                              
          ret[10] = user1[roundNo][addr].sonAmount;                      
        }
        bool top3Done;
        (ret[30],top3Done) = userTop3RewardInfo(addr);                   
        ret[31] = boolToUint256(top3Done);                               
        ret[11] = user1[roundNo][addr].sonAmountDate;                    

        ret[12] = boolToUint256(user[curUserRoundNo][addr].boxReward);   
        ret[13] = user[roundNo][addr].roundFirstDate;
        ret[14] = quitable(addr);                                        
        ret[15] = user[roundNo][addr].ethDone;                           
        ret[16] = balanceOf(addr);                                       
        ret[17] = stakingOf[addr];                                       
        ret[18] = profitedOf[addr];                                      
        
        ret[19] = user[roundNo][addr].disDone *2;                        
        ret[20] = r[1];                                                  
        ret[21] = r[2];                                                  
        ret[22] = r[3];                                                  
        ret[23] = r[4];                                                  
        ret[24] = r[5];                                                  
        ret[25] = limSub(user[roundNo][addr].investment * 250/100, r[7]); 
        ret[26] = r[7];                                                  

        uint256 curRoundNo;
        bool boxOpened;
        bool drew=false;
        //(curRoundNo,userBoxReward,boxOpened,drew) = userBoxInfo(addr);
        (curRoundNo,ret[27], boxOpened, drew) = userBoxInfo(addr);           
        ret[28] = boolToUint256(boxOpened);                                  
        ret[29] = profitingOf(addr);                                         
        
        ret[32] = r[8];                                                      
        
        return ret;
    }

    function getInfo() public view returns(uint256[50] memory) {
        uint256[50] memory ret;
        ret[0] = distributePool;                 
        ret[1] = top3Pool;                       
        ret[2] = totalInvestment[roundNo]* 2/100;
        ret[3] = totalInvestment[roundNo]* 1/100;
        ret[4] = devFund;                        
        ret[5] = totalInvestment[roundNo];       
        ret[6] = lastSeriesNo[roundNo];          
        ret[7] = roundNo;                        
        ret[8] = boxExpire[roundNo];             
        ret[9] = boxLastSeriesNo[roundNo];       
        ret[10]= ethTax[roundNo];                

      uint256 i=11;
      uint256 date = getAdjustedDate();
      if (top3date == date){
        for (uint256 j=0;j<3;j++){
          ret[i]=uint256(top3[j]); 
          i=i+1;
          ret[i]=user1[roundNo][top3[j]].sonAmount;
          i=i+1;
          if (ret[i-2]==0)
            ret[i] = 0;
          else
            ret[i]=calcTop3Reward(j,top3Pool);
          i=i+1;
        }
      }
      ret[20] = m_totalSupply;
      ret[21] = reserve;
      ret[22] = profitPool;
      ret[23] = totalProfited;
      ret[24] = totalDestroyed;
      ret[25] = price();
      ret[26] = totalStaking();
      ret[27] = uint256(creator);
      ret[28] = weight;
      ret[29] = totalInvestment[roundNo-1]; 
	  uint256 quitDone = 0;  
      if (quitLastTime[roundNo] == date)
		quitDone = quitAmount[roundNo];
	  ret[30] = limSub(distributePool *1/100, quitDone);
      ret[49] = now;
      return ret;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_holder","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Destruction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"DivideProfit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Issuance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_token","type":"address"}],"name":"NewSmartToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_reserve","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_supply","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"_weight","type":"uint32"}],"name":"Price","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Stake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Tax","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":"_amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_holder","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"lastSeriesNo","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"},{"indexed":false,"internalType":"address","name":"send","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logtime","type":"uint256"}],"name":"logAddrAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"},{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"profitAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"invitAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"logtime","type":"uint256"}],"name":"logProfit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"round","type":"uint256"},{"indexed":true,"internalType":"address","name":"parent","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"investment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"invitAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sonCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"nodeCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"supNodeCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"firstTime","type":"uint256"}],"name":"loglink","type":"event"},{"inputs":[],"name":"MAX_PRECISION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WEIGHT","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_PRECISION","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ONE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","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":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"bVar","type":"bool"}],"name":"boolToUint256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxExpire","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boxLastSeriesNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"curDay","type":"uint256"}],"name":"calcIndateEthDone","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"curDay","type":"uint256"}],"name":"calcIndateInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"calcPurchaseRet","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"uint256","name":"tax_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calcRedeemRet","outputs":[{"internalType":"uint256","name":"value_","type":"uint256"},{"internalType":"uint256","name":"price_","type":"uint256"},{"internalType":"uint256","name":"tax_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rank","type":"uint256"},{"internalType":"uint256","name":"poolAmount","type":"uint256"}],"name":"calcTop3Reward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"calcUserReward","outputs":[{"internalType":"uint256[9]","name":"r","type":"uint256[9]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reserve","type":"uint256"}],"name":"calcWeight","outputs":[{"internalType":"uint32","name":"weight_","type":"uint32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_connectorBalance","type":"uint256"},{"internalType":"uint32","name":"_connectorWeight","type":"uint32"},{"internalType":"uint256","name":"_depositAmount","type":"uint256"}],"name":"calculatePurchaseReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supply","type":"uint256"},{"internalType":"uint256","name":"_connectorBalance","type":"uint256"},{"internalType":"uint32","name":"_connectorWeight","type":"uint32"},{"internalType":"uint256","name":"_sellAmount","type":"uint256"}],"name":"calculateRedeemReturn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ceilReward","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"creator","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFund","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_disable","type":"bool"}],"name":"disableTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributionReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"divideProfit","outputs":[{"internalType":"uint256","name":"profit","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ethTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_x","type":"uint256"}],"name":"floor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getBoxReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"internalType":"uint256[50]","name":"","type":"uint256[50]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTop3Reward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getUserInfo","outputs":[{"internalType":"uint256[50]","name":"ret","type":"uint256[50]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastDay4ProfitOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lastSeriesNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numerator","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"ln","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newCreator","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"parent","type":"address"}],"name":"play","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseN","type":"uint256"},{"internalType":"uint256","name":"_baseD","type":"uint256"},{"internalType":"uint32","name":"_expN","type":"uint32"},{"internalType":"uint32","name":"_expD","type":"uint32"}],"name":"power","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseN","type":"uint256"},{"internalType":"uint256","name":"_baseD","type":"uint256"},{"internalType":"uint32","name":"_expN","type":"uint32"},{"internalType":"uint32","name":"_expD","type":"uint32"}],"name":"power2","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"profitedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_holder","type":"address"}],"name":"profitingOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"purchase","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"quit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quitAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"quitLastTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"quitable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"value_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"remainderOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"roundNo","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"x","type":"uint256"}],"name":"sqrt","outputs":[{"internalType":"uint256","name":"y","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stake","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakingOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"top3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"top3Pool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"top3PoolPre","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"top3Pre","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"top3Withdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"top3date","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDestroyed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalProfited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaking","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":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newCreator","type":"address"}],"name":"transferCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstake","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"user","outputs":[{"internalType":"uint256","name":"seriesNo","type":"uint256"},{"internalType":"uint256","name":"investment","type":"uint256"},{"internalType":"uint256","name":"ethDone","type":"uint256"},{"internalType":"uint256","name":"disDone","type":"uint256"},{"internalType":"uint256","name":"roundFirstDate","type":"uint256"},{"internalType":"uint256","name":"distributeLastTime","type":"uint256"},{"internalType":"bool","name":"quitted","type":"bool"},{"internalType":"bool","name":"boxReward","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"user1","outputs":[{"internalType":"uint256","name":"sonAmount","type":"uint256"},{"internalType":"uint256","name":"sonAmountPre","type":"uint256"},{"internalType":"uint256","name":"sonAmountDate","type":"uint256"},{"internalType":"uint256","name":"sonTotalAmount1","type":"uint256"},{"internalType":"uint256","name":"sonTotalAmount9","type":"uint256"},{"internalType":"uint256","name":"linkReward","type":"uint256"},{"internalType":"uint256","name":"nodeReward","type":"uint256"},{"internalType":"uint256","name":"supNodeReward","type":"uint256"},{"internalType":"uint256","name":"linkRewardTotal","type":"uint256"},{"internalType":"uint256","name":"nodeRewardTotal","type":"uint256"},{"internalType":"uint256","name":"supNodeRewardTotal","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"user2","outputs":[{"internalType":"uint256","name":"firstTime","type":"uint256"},{"internalType":"uint256","name":"roundNo","type":"uint256"},{"internalType":"address","name":"parent","type":"address"},{"internalType":"uint256","name":"sonCount","type":"uint256"},{"internalType":"uint256","name":"sonNodeCount","type":"uint256"},{"internalType":"uint256","name":"supNodeCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"userBoxInfo","outputs":[{"internalType":"uint256","name":"curRoundNo","type":"uint256"},{"internalType":"uint256","name":"userBoxReward","type":"uint256"},{"internalType":"bool","name":"boxOpened","type":"bool"},{"internalType":"bool","name":"drew","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"userTop3RewardInfo","outputs":[{"internalType":"uint256","name":"reward","type":"uint256"},{"internalType":"bool","name":"done","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"weight","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040819052600060808190526200001b916002916200089e565b506040805160208101918290526000908190526200003c916003916200089e565b506004805460ff1990811690915560006005556008805490911660011790556089805463ffffffff1916620f42401790553480156200007a57600080fd5b50600080546001600160a01b031916331790556001641c35fedd1560601b036029556001646c3390ecc9605e1b03602a556001640cf801476160611b03602b5560016431bdb23e1d605f1b03602c5560016502fb1d8fe083605b1b03602d5560016505b771955b37605a1b03602e556001650af67a93bb5160591b03602f5560016515060c256cb360581b036030556001651428a2f98d7360581b036031556001654d515663970960561b03603255600165944620b0e70f60551b03603355600166011c592761c66760541b0360345560016602214d10d014eb60531b03603555600166020ade36b7dbef60531b0360365560016603eab73b3bbfe360521b036037556001660782ee3593f6d760511b036038556001661ccf4b44bb4821604f1b0360395560016606e7f88ad8a77760511b03603a5560016669f3d1c921891d604d1b03603b55600166cb2ff529eb71e5604c1b03603c55600166c2d415c3db974b604c1b03603d5560016702eb40f9f620fda7604a1b03603e5560016705990681d961a1eb60491b03603f55600167055e12902701414760491b03604090815560016714962dee9dc9764160471b0360415560016704ef57b9b560fab560491b0360425560016712ed7b32a58f552b60471b036043556001679131271922eaa60760441b036044556001678b380f3558668c4760441b036045556001680215f77c045fbe885760421b036046556001600160831b036047556001670f577eded5773a1160471b036048556001680eb5ec597592befbf5603f1b036049556001681c35fedd14b861eb05603e1b03604a556001683619c87664579bc94b603d1b03604b5560016867c00a3b07ffc01fd7603c1b03604c55600168c6f6c8f8739773a7a5603b1b03604d55600168bec763f8209b7a72b1603b1b03604e5560016902dbb8caad9b7097b91b60391b03604f55600169057b3d49dda84556d6f760381b03605055600169054183095b2c8ececf3160381b036051556001690a14517cc6b9457111ef60371b0360525560016913545598e5c23276ccf160361b036053556001692511882c39c3adea96ff60351b03605455600169471649d87199aa99075760341b036055557004429a21a029d4c1457cfbffffffffffff605655700415bc6d6fb7dd71af2cb3ffffffffffff6057557003eab73b3bbfe282243ce1ffffffffffff6058557003c1771ac9fb6b4c18e229ffffffffffff605955700399e96897690418f785257fffffffffff605a55700373fc456c53bb779bf0ea9fffffffffff605b5570034f9e8e490c48e67e6ab8bfffffffffff605c5570032cbfd4a7adc790560b3337ffffffffff605d5570030b50570f6e5d2acca94613ffffffffff605e557002eb40f9f620fda6b56c2861ffffffffff605f557002cc8340ecb0d0f520a6af58ffffffffff6060557002af09481380a0a35cf1ba02ffffffffff606155700292c5bdd3b92ec810287b1b3fffffffff606255700277abdcdab07d5a77ac6d6b9fffffffff60635570025daf6654b1eaa55fd64df5efffffffff606455700244c49c648baa98192dce88b7ffffffff60655570022ce03cd5619a311b2471268bffffffff606655700215f77c045fbe885654a44a0fffffffff6067556001600160811b036068557001eaefdbdaaee7421fc4d3ede5ffffffff6069557001d6bd8b2eb257df7e8ca57b09bfffffff606a557001c35fedd14b861eb0443f7f133fffffff606b557001b0ce43b322bcde4a56e8ada5afffffff606c5570019f0028ec1fff007f5a195a39dfffffff606d5570018ded91f0e72ee74f49b15ba527ffffff606e5570017d8ec7f04136f4e5615fd41a63ffffff606f5570016ddc6556cdb84bdc8d12d22e6fffffff60705570015ecf52776a1155b5bd8395814f7fffff60715570015060c256cb23b3b3cc3754cf40ffffff6072557001428a2f98d728ae223ddab715be3fffff60735570013545598e5c23276ccf0ede68034fffff6074557001288c4161ce1d6f54b7f61081194fffff60755570011c592761c666aa641d5a01a40f17ffff607655700110a688680a7530515f3e6e6cfdcdffff6077557001056f1b5bedf75c6bcb2ce8aed428ffff6078556ffaadceceeff8a0890f3875f008277fff6079556ff05dc6b27edad306388a600f6ba0bfff607a556fe67a5a25da41063de1495d5b18cdbfff607b556fdcff115b14eedde6fc3aa5353f2e4fff607c556fd3e7a3924312399f9aae2e0f868f8fff607d556fcb2ff529eb71e41582cccd5a1ee26fff607e556fc2d415c3db974ab32a51840c0b67edff607f556fbad03e7d883f69ad5b0a186184e06bff6080556fb320d03b2c343d4829abd6075f0cc5ff6081556fabc25204e02828d73c6e80bcdb1a95bf6082556fa4b16f74ee4bb2040a1ec6c15fbbf2df6083556f9deaf736ac1f569deb1b5ae3f36c130f6084556f976bd9952c7aa957f5937d790ef650376085556f9131271922eaa6064b73a22d0bd4f2bf6086556f8b380f3558668c46c91c49a2f8e967b96087556f857ddf0117efa215952912839f6473e66088558051808201909152600d8082526c22aa2410282927902a37b5b2b760991b6020909201918252620007ec916002916200089e565b50604080518082019091526004808252634550524f60e01b60209092019182526200081a916003916200089e565b506004805460ff191660121790556001609881905560005260a7602052426203f480017ff936680a2e361e18e838750e65cfefc213ca9dab38fec4920ecd801cda7b25e655620008726001600160e01b036200088a16565b6098546000908152609d602052604090205562000940565b6201518042617e9081019190910690035b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620008e157805160ff191683800117855562000911565b8280016001018555821562000911579182015b8281111562000911578251825591602001919060010190620008f4565b506200091f92915062000923565b5090565b6200089b91905b808211156200091f57600081556001016200092a565b6158a180620009506000396000f3fe6080604052600436106104825760003560e01c8063677342ce11610255578063ab899e0511610144578063db006a75116100c1578063e7ef2c6011610085578063e7ef2c6014611257578063ed8460311461128a578063f0275663146112b4578063fa3fa196146112c9578063fae94149146112fc578063fc2b8cc31461132f576104a5565b8063db006a751461118d578063dd62ed3e146111b7578063e492814f146111f2578063e4a28a5214611218578063e653e1871461122d576104a5565b8063c3d5769a11610108578063c3d5769a146110eb578063c9bf5b1514611100578063cc329e811461112a578063cd3293de14611163578063d316eddd14611178576104a5565b8063ab899e0514611058578063ac6b643d14611082578063ad7ffe9014611097578063bef97c87146110c1578063c2ee3a08146110d6576104a5565b806395862f35116101d2578063a1aab33f11610196578063a1aab33f14610f5d578063a1c2160714610f72578063a694fc3a14610fe0578063a88eca611461100a578063a9059cbb1461101f576104a5565b806395862f3514610e9957806395d89b4114610ec35780639719340a14610ed857806397607f7a14610f33578063a035b1fe14610f48576104a5565b806373f599da1161021957806373f599da14610dc4578063831cc04f14610dd95780638f85543314610e03578063917ab34214610e18578063928094bd14610e51576104a5565b8063677342ce14610d115780636933f79314610d3b5780636b7a2a9514610d675780636cd388e714610d7c57806370a0823114610d91576104a5565b806337849b3c116103715780634e65f29b116102ee5780635a9b0b89116102b25780635a9b0b8914610c075780635bc5a4f314610c325780635dfec67614610cc15780636386c1c714610cd657806364edfbf014610d09576104a5565b80634e65f29b14610ad55780634e875a5814610b185780634f5b9f2314610b84578063504f5e5614610bc857806354ffc09a14610bf2576104a5565b80634390d2a8116103355780634390d2a814610a0357806344f7787f14610a1857806345189aeb14610a48578063471f2bb514610a72578063496c6c6914610a9c576104a5565b806337849b3c146108be5780633ba8b2431461093c5780633e4a4fcf14610988578063410e8e4b1461099d57806342a062c6146109d0576104a5565b806320e72ac9116103ff578063313ce567116103c3578063313ce567146107b357806332833d51146107de57806332a643701461083d578063335fba7e146108675780633368ee48146108a9576104a5565b806320e72ac9146106c55780632197a9e8146106ef57806323b872dd1461070457806329a00e7c146107475780632e17de7814610789576104a5565b806314aa164f1161044657806314aa164f1461062a5780631608f18f1461065a578063165defa41461068657806318160ddd1461069b5780631830b4e2146106b0576104a5565b806302d05d3f146104aa578063037859af146104db57806306fdde031461052057806308f4ac92146105aa578063095ea7b3146105dd576104a5565b366104a5573461049957610494611344565b6104a3565b6104a3600061161c565b005b600080fd5b3480156104b657600080fd5b506104bf611b6c565b604080516001600160a01b039092168252519081900360200190f35b3480156104e757600080fd5b5061050e600480360360208110156104fe57600080fd5b50356001600160a01b0316611b7b565b60408051918252519081900360200190f35b34801561052c57600080fd5b50610535611b8d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561056f578181015183820152602001610557565b50505050905090810190601f16801561059c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105b657600080fd5b5061050e600480360360208110156105cd57600080fd5b50356001600160a01b0316611c21565b3480156105e957600080fd5b506106166004803603604081101561060057600080fd5b506001600160a01b038135169060200135611cfe565b604080519115158252519081900360200190f35b34801561063657600080fd5b5061050e6004803603604081101561064d57600080fd5b5080359060200135611db3565b34801561066657600080fd5b506104a36004803603602081101561067d57600080fd5b50351515611df9565b34801561069257600080fd5b5061050e611e1f565b3480156106a757600080fd5b5061050e611e2f565b3480156106bc57600080fd5b506104a3611e35565b3480156106d157600080fd5b5061050e600480360360208110156106e857600080fd5b5035611e73565b3480156106fb57600080fd5b5061050e611e85565b34801561071057600080fd5b506106166004803603606081101561072757600080fd5b506001600160a01b03813581169160208101359091169060400135611e8b565b34801561075357600080fd5b5061050e6004803603608081101561076a57600080fd5b5080359060208101359063ffffffff6040820135169060600135611eb8565b34801561079557600080fd5b50610616600480360360208110156107ac57600080fd5b5035611f7a565b3480156107bf57600080fd5b506107c861205e565b6040805160ff9092168252519081900360200190f35b3480156107ea57600080fd5b506108226004803603608081101561080157600080fd5b5080359060208101359063ffffffff60408201358116916060013516612067565b6040805192835260ff90911660208301528051918290030190f35b34801561084957600080fd5b5061050e6004803603602081101561086057600080fd5b50356120cc565b34801561087357600080fd5b5061050e6004803603608081101561088a57600080fd5b5080359060208101359063ffffffff60408201351690606001356120de565b3480156108b557600080fd5b5061050e6121ac565b3480156108ca57600080fd5b506108f7600480360360408110156108e157600080fd5b50803590602001356001600160a01b03166121b2565b604080519889526020890197909752878701959095526060870193909352608086019190915260a0850152151560c0840152151560e083015251908190036101000190f35b34801561094857600080fd5b5061096f6004803603602081101561095f57600080fd5b50356001600160a01b0316612206565b6040805192835290151560208301528051918290030190f35b34801561099457600080fd5b5061050e612346565b3480156109a957600080fd5b5061050e600480360360208110156109c057600080fd5b50356001600160a01b031661234c565b3480156109dc57600080fd5b5061050e600480360360208110156109f357600080fd5b50356001600160a01b031661235e565b348015610a0f57600080fd5b5061050e612370565b348015610a2457600080fd5b5061050e60048036036040811015610a3b57600080fd5b5080359060200135612376565b348015610a5457600080fd5b506104bf60048036036020811015610a6b57600080fd5b5035612455565b348015610a7e57600080fd5b5061061660048036036020811015610a9557600080fd5b5035612472565b348015610aa857600080fd5b5061050e60048036036040811015610abf57600080fd5b506001600160a01b038135169060200135612499565b348015610ae157600080fd5b50610aff60048036036020811015610af857600080fd5b50356125fa565b6040805163ffffffff9092168252519081900360200190f35b348015610b2457600080fd5b50610b4b60048036036020811015610b3b57600080fd5b50356001600160a01b031661263b565b604051808261012080838360005b83811015610b71578181015183820152602001610b59565b5050505090500191505060405180910390f35b348015610b9057600080fd5b5061082260048036036080811015610ba757600080fd5b5080359060208101359063ffffffff6040820135811691606001351661294e565b348015610bd457600080fd5b5061050e60048036036020811015610beb57600080fd5b50356129f1565b348015610bfe57600080fd5b5061050e612a02565b348015610c1357600080fd5b50610c1c612a08565b6040518151815280826106408083836020610b59565b348015610c3e57600080fd5b50610c6b60048036036040811015610c5557600080fd5b50803590602001356001600160a01b0316612c82565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b348015610ccd57600080fd5b5061050e612ce9565b348015610ce257600080fd5b50610c1c60048036036020811015610cf957600080fd5b50356001600160a01b0316612cef565b61050e6130d6565b348015610d1d57600080fd5b5061050e60048036036020811015610d3457600080fd5b5035613131565b348015610d4757600080fd5b5061050e60048036036020811015610d5e57600080fd5b50351515613162565b348015610d7357600080fd5b5061050e61317a565b348015610d8857600080fd5b506107c8613180565b348015610d9d57600080fd5b5061050e60048036036020811015610db457600080fd5b50356001600160a01b0316613185565b348015610dd057600080fd5b506107c86131a0565b348015610de557600080fd5b5061050e60048036036020811015610dfc57600080fd5b50356131a5565b348015610e0f57600080fd5b506104bf6131b7565b348015610e2457600080fd5b5061050e60048036036040811015610e3b57600080fd5b506001600160a01b0381351690602001356131c6565b348015610e5d57600080fd5b50610e7b60048036036020811015610e7457600080fd5b5035613281565b60408051938452602084019290925282820152519081900360600190f35b348015610ea557600080fd5b5061050e60048036036020811015610ebc57600080fd5b503561330c565b348015610ecf57600080fd5b5061053561331e565b348015610ee457600080fd5b50610f0b60048036036020811015610efb57600080fd5b50356001600160a01b031661337f565b6040805194855260208501939093529015158383015215156060830152519081900360800190f35b348015610f3f57600080fd5b506104a36134c1565b348015610f5457600080fd5b5061050e6136f9565b348015610f6957600080fd5b50610aff613756565b348015610f7e57600080fd5b50610fa560048036036020811015610f9557600080fd5b50356001600160a01b0316613762565b6040805196875260208701959095526001600160a01b03909316858501526060850191909152608084015260a0830152519081900360c00190f35b348015610fec57600080fd5b506106166004803603602081101561100357600080fd5b50356137a1565b34801561101657600080fd5b506104a3613844565b34801561102b57600080fd5b506106166004803603604081101561104257600080fd5b506001600160a01b038135169060200135613900565b34801561106457600080fd5b5061050e6004803603602081101561107b57600080fd5b5035613925565b34801561108e57600080fd5b5061050e613937565b3480156110a357600080fd5b5061050e600480360360208110156110ba57600080fd5b503561393d565b3480156110cd57600080fd5b5061061661394f565b3480156110e257600080fd5b5061050e613958565b3480156110f757600080fd5b5061050e61395d565b34801561110c57600080fd5b506104bf6004803603602081101561112357600080fd5b5035613963565b34801561113657600080fd5b5061050e6004803603604081101561114d57600080fd5b506001600160a01b038135169060200135613970565b34801561116f57600080fd5b5061050e613a2d565b34801561118457600080fd5b506104a3611344565b34801561119957600080fd5b5061050e600480360360208110156111b057600080fd5b5035613a33565b3480156111c357600080fd5b5061050e600480360360408110156111da57600080fd5b506001600160a01b0381358116916020013516613a9c565b6104a36004803603602081101561120857600080fd5b50356001600160a01b031661161c565b34801561122457600080fd5b50610aff613ac7565b34801561123957600080fd5b5061050e6004803603602081101561125057600080fd5b5035613ace565b34801561126357600080fd5b5061050e6004803603602081101561127a57600080fd5b50356001600160a01b0316613ae0565b34801561129657600080fd5b50610e7b600480360360208110156112ad57600080fd5b5035613af2565b3480156112c057600080fd5b5061050e613b4c565b3480156112d557600080fd5b506104a3600480360360208110156112ec57600080fd5b50356001600160a01b0316613c37565b34801561130857600080fd5b5061050e6004803603602081101561131f57600080fd5b50356001600160a01b0316613c88565b34801561133b57600080fd5b506104a3613d6f565b609854600090815260996020908152604080832033845290915290206008015460ff161561137157600080fd5b33600061137c613ef5565b90506113866157ef565b61138f8361263b565b6098805460009081526099602081815260408084206001600160a01b038a16808652908352818520600701899055608087015186548652848452828620828752845282862060039081018054909201909155865486528484528286208287528452828620908101548a87526004918201855283872055875196548652938352818520908552909152909120600501805490920190915560925491925061143d919083905b6020020151613f08565b609255609880546000908152609a602081815260408084206001600160a01b03808a16808752918452828620600501869055865486528484528286208287528452828620600601869055955485529282528084208385529091528220600701829055905490911614156114f55760935460808201516040516001600160a01b038616929190910180156108fc02916000818181858888f193505050501580156114ea573d6000803e3d6000fd5b506000609355611530565b60808101516040516001600160a01b0385169180156108fc02916000818181858888f1935050505015801561152e573d6000803e3d6000fd5b505b6098546101008201516000828152609a602090815260408083206001600160a01b03891680855290835292819020600301548151938452918301939093528183015242606082015290517fd2fb33acf3a27ac5107604b2e434858447d771a059c22bec654fa96ebde88cde9181900360800190a26001600160a01b038381166000908152609b6020526040902060020154161561160e576001600160a01b038084166000908152609b6020526040902060029081015461160e92169060648460066020020151600a028161160057fe5b048161160857fe5b04613f23565b611616613fe8565b50505050565b3334670de0b6b3a764000081101561163357600080fd5b609854600090815260a7602052604090205442111561165157600080fd5b6001600160a01b038316158061168057506001600160a01b0383166000908152609b6020526040902060010154155b801561169a57506000546001600160a01b03838116911614155b156116ae576000546001600160a01b031692505b6001600160a01b038281166000908152609b602052604090206002015416611706576001600160a01b038281166000908152609b6020526040902060020180546001600160a01b031916918516919091179055611727565b6001600160a01b038083166000908152609b60205260409020600201541692505b6001600160a01b0382166000908152609b6020526040902054611760576001600160a01b0382166000908152609b602052604090204290555b6001600160a01b0382166000908152609b602052604081206001015460985411156117a5576098546001600160a01b0384166000908152609b60205260409020600101555b60985460009081526099602090815260408083206001600160a01b03871684529091529020600101541561181d5760985460009081526099602090815260408083206001600160a01b0387168452909152902060018101546003909101546064607d90920291909104111561181957600080fd5b5060015b6000611827613ef5565b6098805460009081526099602081815260408084206001600160a01b038b16808652908352818520600190810180548c019055865486528484528286208287528452828620908101548887526002909101845282862055945484529181528183209383529290925220600601549091506118c75760985460009081526099602090815260408083206001600160a01b038816845290915290206006018190555b6098805460009081526099602090815260408083206001600160a01b03898116855290835281842060070186905593548352609590915290208054850190556092805460646055870281900490910190915560938054600487028390040190556094805460038702929092049091019055851615611a4257611949858461405f565b81611975576000611959866142a0565b90506001600160a01b038116156119735761197381614320565b505b61197f85846143a6565b60985460008181526099602090815260408083206001600160a01b03808a1680865291845282852060010154868652609a85528386208387528552838620600490810154609b87529685902060038101549181015460058201549154875194855297840198909852828601919091526060820196909652608081019590955260a085019390935290519093918916927ff2531eca1f304c5bd5f42fc86493d0467d9cfc7d8d3b13e59337d621c84d66d1919081900360c00190a4611a4285614692565b609880546000908152609760209081526040808320805460010190558354835280832054609983528184206001600160a01b038a1685528352818420559254825260a7905220544211611aff576098805460009081526097602090815260408083205460a88352818420559254825260a790522054612a3001426203f480011115611ae557609854600090815260a7602052604090208054612a30019055611aff565b609854600090815260a760205260409020426203f4800190555b611b0a848685614b1d565b6098546000818152609760209081526040918290205482516001600160a01b0389168152918201879052428284015291517f1ae00033f78a24b0e0cb734f176cbecd4ee22b206737a14d9f242538844aec659181900360600190a35050505050565b6000546001600160a01b031681565b608c6020526000908152604090205481565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015611c165780601f10611beb57610100808354040283529160200191611c16565b820191906000526020600020905b815481529060010190602001808311611bf957829003601f168201915b505050505090505b90565b600080611c5c62015180611c33614c44565b81611c3a57fe5b6001600160a01b0386166000908152608d602052604090205491900490614c4c565b90506001811015611c71576000915050611cf9565b611c79611e1f565b611c87576000915050611cf9565b611c8f611e1f565b6001600160a01b0384166000908152608c602052604090205482021115611cc557600a608b5481611cbc57fe5b04915050611cf9565b611ccd611e1f565b6001600160a01b0384166000908152608c6020526040902054608b54600a900402820281611cbc57fe5b505b919050565b6000826001600160a01b038116611d1457600080fd5b821580611d4257503360009081526007602090815260408083206001600160a01b0388168452909152902054155b611d4b57600080fd5b3360008181526007602090815260408083206001600160a01b03891680855290835292819020879055805187815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b60008083611dca576064601284025b049050611df0565b8360011415611dde57606460098402611dc2565b8360021415611df05750606460038302045b90505b92915050565b6000546001600160a01b03163314611e0d57fe5b6008805460ff19169115919091179055565b6000611e2a30613185565b905090565b60055490565b6001546001600160a01b03163314611e4c57600080fd5b60018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60966020526000908152604090205481565b60a65481565b60085460009060ff16611e9a57fe5b611ea5848484614c61565b9050611eb18383614c7b565b9392505050565b60008085118015611ec95750600084115b8015611edb575060008363ffffffff16115b8015611ef05750620f424063ffffffff841611155b611ef957600080fd5b81611f0657506000611f72565b63ffffffff8316620f42401415611f315783611f228684614cf0565b81611f2957fe5b049050611f72565b6000806000611f408588614d13565b9050611f51818888620f4240612067565b9093509150600060ff8316611f668a86614cf0565b901c8990039450505050505b949350505050565b336000908152608c6020526040812054611f949083614c4c565b336000818152608c6020908152604080832094909455835163a9059cbb60e01b81526004810193909352602483018690529251309363a9059cbb93604480820194929392918390030190829087803b158015611fef57600080fd5b505af1158015612003573d6000803e3d6000fd5b505050506040513d602081101561201957600080fd5b5051604080513381526020810185905281519293507f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd929081900390910190a1919050565b60045460ff1690565b60008060008363ffffffff168563ffffffff166120848989612376565b028161208c57fe5b049050600061209a82614d25565b9050602060ff821610156120aa57fe5b6120bd81607f0360ff1683901c82614dbf565b93509150505b94509492505050565b60956020526000908152604090205481565b600080851180156120ef5750600084115b8015612101575060008363ffffffff16115b80156121165750620f424063ffffffff841611155b80156121225750848211155b61212b57600080fd5b8161213857506000611f72565b84821415612147575082611f72565b63ffffffff8316620f424014156121635784611f228584614cf0565b6000808387036121788882620f424089612067565b909350915060006121898885614cf0565b905060ff831688901b848183038161219d57fe5b049a9950505050505050505050565b60905481565b60996020908152600092835260408084209091529082529020805460018201546003830154600584015460068501546007860154600890960154949593949293919290919060ff8082169161010090041688565b6000806000612213613ef5565b905060006064905060008260a55414156122895760a1546001600160a01b03878116911614156122465760009150612280565b60a2546001600160a01b03878116911614156122655760019150612280565b60a3546001600160a01b038781169116141561228057600291505b5060a6546122f6565b60a55462015180840314156122f657609e546001600160a01b03878116911614156122b757600091506122f1565b609f546001600160a01b03878116911614156122d657600191506122f1565b60a0546001600160a01b03878116911614156122f157600291505b506094545b6003821015612335576123098282611db3565b945060a4826003811061231857fe5b602081049091015460ff601f9092166101000a900416935061233e565b60009450600093505b505050915091565b60925481565b608e6020526000908152604090205481565b60916020526000908152604090205481565b60935481565b60007001ffffffffffffffffffffffffffffffff83111561239357fe5b600080836001607f1b8602816123a557fe5b049050600160801b81106123d75760006123c46001607f1b830461515c565b60ff166001607f1b810293509190911c90505b6001607f1b81111561242757607f5b60ff811615612425576001607f1b828002049150600160801b821061241c57600182901c91506001810360ff166001901b830192505b600019016123e6565b505b6f05b9de1d10bf4103d647b0955897ba806f03f80fe03f80fe03f80fe03f80fe03f883020495945050505050565b60a1816003811061246257fe5b01546001600160a01b0316905081565b60a4816003811061247f57fe5b60209182820401919006915054906101000a900460ff1681565b6000806124a4613ef5565b60985460009081526099602090815260408083206001600160a01b03891684529091528120600701549192509062015180906124e1908490613f08565b816124e857fe5b04905060078111156124f8575060075b60985460009081526099602090815260408083206001600160a01b03891684529091528120600301548290606490600190612532906129f1565b60985460009081526099602090815260408083206001600160a01b038e16845290915290206001015401028161256457fe5b6098546000818152609a602090815260408083206001600160a01b038e168085529083528184206007810154600682015460059092015496865260998552838620928652919093529220600381015460019091015495909404959095029550908501909301909201916125ef9188916125ea91908301850190606490607d025b04613f08565b613f08565b979650505050505050565b600061261e612610620f42406377359400614cf0565b61261984613131565b6151bd565b9050620f424063ffffffff82161115611cf95750620f4240919050565b6126436157ef565b600061264d613ef5565b60985460009081526099602090815260408083206001600160a01b038816845290915281206007015491925090620151809061268a908490613f08565b8161269157fe5b04905060018110156126c65760005b60098110156126c45760008482600981106126b757fe5b60200201526001016126a0565b505b60078111156126d3575060075b600081606460016126e488876131c6565b02816126ec57fe5b04029050600082606460016127018988613970565b028161270957fe5b6098546000818152609a602090815260408083206001600160a01b038e1680855290835281842060078101546006820154600590920154968652609985528386209286529190935292206001810154600390910154959094049590950287019550908501909301909201916064607d9091020490820111156127ca5760985460009081526099602090815260408083206001600160a01b038b168452909152902060018101546003909101546127c7916064607d9091020490613f08565b90505b808311156127d6578092505b818110156127e2578091505b8186526098546000818152609a602090815260408083206001600160a01b038c1680855290835281842060088101546002908102858e015260098201548102848e0152600a909101540260608c015260808b018690529383526099825280832093835292905220600301546128c69060649061285d906129f1565b60985460009081526099602090815260408083206001600160a01b038e1684529091529020600101540160fa028161289157fe5b60985460009081526099602090815260408083206001600160a01b038e16845290915290206005015491900490600202613f08565b60a087015260c0860183905260985460009081526099602090815260408083206001600160a01b038b8116808652919093529083206003015460020260e08a0152915416146129445760985460009081526099602090815260408083206001600160a01b038b16845290915290206003015481016002026101008701525b5050505050919050565b60008084861061296d5761296486868686612067565b915091506120c3565b60008363ffffffff168563ffffffff16612987888a612376565b028161298f57fe5b049050600061299d82614d25565b9050602060ff821610156129ba5750600092508291506120c39050565b60006129cf82607f0360ff1684901c83614dbf565b9050806001609f1b816129de57fe5b04945050609f0391505094509492505050565b670de0b6b3a7640000908190040290565b60a55481565b612a1061580e565b612a1861580e565b60925481526094546020808301919091526098546000818152609583526040808220546064600282028190048388015281046060870152609354608087015260a0860152828252609784528082205460c086015260e0850183905282825260a784528082205461010086015282825260a88452808220546101208601529181526096909252812054610140830152600b90612ab1613ef5565b90508060a5541415612baf5760005b6003811015612bad57609e8160038110612ad657fe5b01546001600160a01b0316848460328110612aed57fe5b602002018181525050826001019250609a600060985481526020019081526020016000206000609e8360038110612b2057fe5b01546001600160a01b03168152602081019190915260400160002054848460328110612b4857fe5b6020020152600183019284906000190160328110612b6257fe5b6020020151612b83576000848460328110612b7957fe5b6020020152612ba1565b612b8f81609454611db3565b848460328110612b9b57fe5b60200201525b60019283019201612ac0565b505b600554610280840152608a546102a0840152608b546102c0840152608f546102e0840152609054610300840152612be46136f9565b610320840152612bf2611e1f565b610340840152600080546001600160a01b031661036085015260895463ffffffff1661038085015260985460001981018252609560209081526040808420546103a0880152918352609d9052812054821415612c5c57506098546000908152609c60205260409020545b609254612c6d906064900482613f08565b6103c085015250504261062083015250919050565b609a6020528160005260406000206020528060005260406000206000915091505080600001549080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a015490508b565b60985481565b612cf761580e565b612cff6157ef565b612d088361263b565b6001600160a01b0384166000818152609b6020908152604080832060019081015460985485526099845282852086865280855283862080548b52878752818652928301548a8601526080808901516003850154908101958c019590955260608b01949094526007830154938a01939093529490935290526008015491925090612d939060ff16613162565b60a08401526001600160a01b038481166000818152609b602081815260408320600281015490951660c0890152600385015460e0890152928252909152600490910154610100850152612de4613ef5565b6098546000908152609a602090815260408083206001600160a01b038a168452909152902060020154909150811415612e5c576098546000908152609a602090815260408083206001600160a01b03891680855281845291842080546101208a01529190935291905260010154610140850152612ec6565b6098546000908152609a602090815260408083206001600160a01b03891684529091529020600201546201517f1982011415612ec657600061012085018190526098548152609a602090815260408083206001600160a01b03891684529091529020546101408501525b6000612ed186612206565b6103c08701919091529050612ee581613162565b6103e08601526098546000908152609a602090815260408083206001600160a01b038a16808552908352818420600201546101608a015286845260998352818420908452909152902060080154612f4390610100900460ff16613162565b61018086015260985460009081526099602090815260408083206001600160a01b038a1684529091529020600601546101a0860152612f8186613c88565b6101c086015260985460009081526099602090815260408083206001600160a01b038a1684529091529020600301546101e0860152612fbf86613185565b6102008601526001600160a01b0386166000818152608c60209081526040808320546102208a0152838352608e8252808320546102408a015260985483526099825280832084845280835281842060058101546002026102608c0152898401516102808c0152918901516102a08b015260608901516102c08b015260808901516102e08b015260a08901516103008b015293909252919091526001015461307090606460fa90910204856007611433565b61032086015260e08401516103408601526000808061308e8961337f565b6103608c019290925291945090925090506130a882613162565b6103808901526130b789611c21565b6103a08901526101008701518860208002015250505050505050919050565b6000806130e434600a6151bd565b90506130f260925482614d13565b6092556098546000908152609660205260409020546131119082614d13565b60985460009081526096602052604090205561312b6151d0565b91505090565b80600260018201045b81811015611cf75780915060028182858161315157fe5b04018161315a57fe5b04905061313a565b6000811561317257506001611cf9565b506000611cf9565b608b5481565b602081565b6001600160a01b031660009081526006602052604090205490565b607f81565b609d6020526000908152604090205481565b6001546001600160a01b031681565b60985460009081526099602090815260408083206001600160a01b038616845290915281206006810154600290910190829080156132445762a4cb7f1985015b8181106132425760008181526020859052604090205415613237576000818152602085905260409020549250613242565b6201517f1901613206565b505b60985460009081526099602090815260408083206001600160a01b038a1684529091529020600101546132779083613f08565b9695505050505050565b60008060008061329c61329586605a614cf0565b60646151bd565b905060006132b46132af608a5484614d13565b6125fa565b905060006132c6613295886055614cf0565b90506132d8600554608a548484611eb8565b95506132f56132ef82670de0b6b3a7640000614cf0565b876151bd565b94506133018782614c4c565b959794965050505050565b60976020526000908152604090205481565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611c165780601f10611beb57610100808354040283529160200191611c16565b6001600160a01b0381166000908152609b6020526040812060010154908080836133ac57600091506134ba565b600084815260a760205260409020544211156134ba5760008481526099602090815260408083206001600160a01b03891684529091529020546001925015801590613424575060008481526099602090815260408083206001600160a01b038916845282528083205487845260a89092529091205410155b8015613462575060008481526099602090815260408083206001600160a01b038916845282528083205487845260a89092529091205461022c919003105b156134ba575060008381526099602090815260408083206001600160a01b038816845282528083206008810154905487855260a890935292205461010090920460ff16916001919003016134b68186615260565b9350505b9193509193565b609854600090815260996020908152604080832033845290915290206008015460ff16156134ee57600080fd5b3360006134f9613ef5565b60a5549091506064906201517f19830114156135d657609e5460a180546001600160a01b039283166001600160a01b031991821617909155609f5460a2805491841691831691909117905560a05460a3805491909316911617905560005b60038110156135c9576000609e826003811061356f57fe5b0180546001600160a01b0319166001600160a01b0392909216919091179055600060a4826003811061359d57fe5b602081049091018054921515601f9092166101000a91820260ff90920219909216179055600101613557565b5060a582905560945460a6555b8160a55414156136365760a1546001600160a01b03848116911614156135fe57506000613636565b60a2546001600160a01b038481169116141561361c57506001613636565b60a3546001600160a01b0384811691161415613636575060025b600381108015613666575060a4816003811061364e57fe5b602081049091015460ff601f9092166101000a900416155b156136f45760006136798260a654611db3565b905061368760945482613f08565b609455600160a4836003811061369957fe5b602091828204019190066101000a81548160ff021916908315150217905550836001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156136f1573d6000803e3d6000fd5b50505b505050565b6000600554600014156137145750662386f26fc10000611c1e565b611e2a61374e613740613732608a54620f424063ffffffff16614cf0565b60895463ffffffff166151bd565b670de0b6b3a7640000614cf0565b6005546151bd565b60895463ffffffff1681565b609b60205260009081526040902080546001820154600283015460038401546004850154600590950154939492936001600160a01b0390921692909186565b60006137ad3083613900565b336000908152608c60205260409020549091506137ca9083614d13565b336000908152608c6020526040902055620151806137e6614c44565b816137ed57fe5b336000818152608d602090815260409182902094909304909355825190815290810184905281517febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a929181900390910190a1919050565b609854600090815260996020908152604080832033845290915290206008015460ff161561387157600080fd5b3360008080806138808561337f565b929650909450925090508215801590613897575080155b156136f15760008481526099602090815260408083206001600160a01b0389168085529252808320600801805461ff00191661010017905551909185156108fc02918691818181858888f193505050501580156138f8573d6000803e3d6000fd5b505050505050565b60085460009060ff1661390f57fe5b6139198383615351565b9050611df38383614c7b565b60a76020526000908152604090205481565b60945481565b60a86020526000908152604090205481565b60085460ff1681565b600181565b608f5481565b609e816003811061246257fe5b60985460009081526099602090815260408083206001600160a01b038616845290915281206006810154600490910190829080156139ee5762a4cb7f1985015b8181106139ec57600081815260208590526040902054156139e15760008181526020859052604090205492506139ec565b6201517f19016139b0565b505b60985460009081526099602090815260408083206001600160a01b038a16845290915290206003015461327790613a24906129f1565b6125ea846129f1565b608a5481565b6000613a3e8261536a565b90506000613a57613a5083600a614cf0565b60556151bd565b9050613a6560925482614d13565b609255609854600090815260966020526040902054613a849082614d13565b60985460009081526096602052604090205550919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b620f424081565b609c6020526000908152604090205481565b608d6020526000908152604090205481565b600554608a5460895460009283928392613b1492919063ffffffff16876120de565b9250613b31613b2b84670de0b6b3a7640000614cf0565b856151bd565b9150613b4161329584600f614cf0565b928390039491935050565b6000613b5733611c21565b336000908152608e6020526040902054909150613b749082614d13565b336000908152608e6020526040902055608f54613b919082614d13565b608f55608b54613ba19082614c4c565b608b5562015180613bb0614c44565b81613bb757fe5b336000818152608d6020526040808220949093049093559051909183156108fc02918491818181858888f19350505050158015613bf8573d6000803e3d6000fd5b50604080513381526020810183905281517f84b8e87f53fc40fd95af6906b7d6a2ec3eaeb463ad6c1dd77522883cf8a92ab9929181900390910190a190565b6000546001600160a01b03163314613c4b57fe5b6000546001600160a01b0382811691161415613c6657600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60985460009081526099602090815260408083206001600160a01b038516845290915281206008015460ff1615613cc157506000611cf9565b6000613ccb613ef5565b6098546000908152609d602052604081205491925090821415613cfc57506098546000908152609c60205260409020545b60985460009081526099602090815260408083206001600160a01b038816845290915281206001810154600390910154613d4191606460509091020490600202613f08565b6092549091508282019060649004811115613d63576002945050505050611cf9565b50600195945050505050565b60985460009081526099602090815260408083203380855292529091206008015460ff1615613d9d57600080fd5b6000613da7613ef5565b6098546000908152609d602052604081205491925090821415613dd857506098546000908152609c60205260409020545b60985460009081526099602090815260408083206001600160a01b038716845290915281206001810154600390910154613e1d91606460509091020490600202614c4c565b6092549091508282019060649004811115613e3757600080fd5b6098805460009081526099602090815260408083206001600160a01b038a1684528252808320600801805460ff1916600117905592548252609d905220548414613e90576098546000908152609d602052604090208490555b6098546000908152609c602052604090208383019055609254613eb39083613f08565b6092556040516001600160a01b0386169083156108fc029084906000818181858888f19350505050158015613eec573d6000803e3d6000fd5b506138f8613fe8565b6201518042617e90810191909106900390565b600081831115613f1b5750808203611df3565b506000611df3565b60005b60098110156136f4576001600160a01b0383166000908152609b6020526040902060030154811015613fb5576000613f5e8484612499565b90508015613fb357609880546000908152609a602081815260408084206001600160a01b038a168086529083528185206005018054880190559454845291815281832093835292909252206008018054820190555b505b6001600160a01b039283166000908152609b60205260409020600201549092169182613fe0576136f4565b600101613f26565b609854600090815260a7602052604081205442111561405957678ac7230489e800006092541015614059575060988054600081815260956020908152604080832054609280546064909204909101905560019384019485905593825260a7905291909120426203f480019055611c1e565b50600090565b600080805b60c88110156136f1576001600160a01b038516614080576136f1565b6001600160a01b0385166000908152609b60205260409020600301546009118015906140c757506001600160a01b0385166000908152609b60205260409020600401546009115b80156140d1575082155b1561414e5760006140f38660026064600589025b04816140ed57fe5b04612499565b9050801561414857609880546000908152609a602081815260408084206001600160a01b038c168086529083528185206006018054880190559454845291815281832093835292909252206009018054820190555b60019350505b6001600160a01b0385166000908152609b60205260409020600401546009116142545782156141e557600061418a8660026064600589026140e5565b905080156141df57609880546000908152609a602081815260408084206001600160a01b038c16808652908352818520600701805488019055945484529181528183209383529290925220600a018054820190555b5061424f565b60006141f88660026064600a89026140e5565b9050801561424d57609880546000908152609a602081815260408084206001600160a01b038c16808652908352818520600701805488019055945484529181528183209383529290925220600a018054820190555b505b600191505b818061426d57506000546001600160a01b038681169116145b15614277576136f1565b6001600160a01b039485166000908152609b602052604090206002015490941693600101614064565b6001600160a01b0381166000908152609b6020526040812060030180546001019081905560091480156142ef57506001600160a01b038281166000908152609b60205260409020600201541615155b1561431857506001600160a01b038082166000908152609b602052604090206002015416611cf9565b506000919050565b6001600160a01b0381166000908152609b60205260409020600401805460010190819055600914801561436f57506001600160a01b038181166000908152609b60205260409020600201541615155b156143a3576001600160a01b038082166000908152609b602052604080822060020154909216815220600501805460010190555b50565b60006143b0613ef5565b6098546000908152609a602090815260408083206001600160a01b0388168452909152902060020154909150811415614413576098546000908152609a602090815260408083206001600160a01b03871684529091529020805483019055614531565b6098546000908152609a602090815260408083206001600160a01b03871684529091529020600201546201517f198201141561449357609880546000908152609a602081815260408084206001600160a01b0389168086529083528185208054600190910155945484529181528183209383529290925220829055614531565b6098546000908152609a602090815260408083206001600160a01b03871684529091529020600201546144ed576098546000908152609a602090815260408083206001600160a01b03871684529091529020829055614531565b609880546000908152609a602081815260408084206001600160a01b0389168086529083528185206001018590559454845291815281832093835292909252208290555b609880546000908152609a602081815260408084206001600160a01b03891680865290835281852060020187905594548452918152818320938352929092529081206003018054840190555b6009811015611616576098546000908152609a602090815260408083206001600160a01b038089168552908352818420600401805488019055609b9092529091206002015416806145ce5750611616565b60985460008181526099602090815260408083206001600160a01b03808b1680865291845282852060010154868652609a85528386208387528552838620600490810154609b87529685902060038101549181015460058201549154875194855297840198909852828601919091526060820196909652608081019590955260a085019390935290519093918516927ff2531eca1f304c5bd5f42fc86493d0467d9cfc7d8d3b13e59337d621c84d66d1919081900360c00190a4935060010161457d565b6000546001600160a01b03828116911614156146ad576143a3565b6098546000908152609a602090815260408083206001600160a01b0385168452909152812054906146dc613ef5565b609e54609f5460a05460a5549394506000936001600160a01b039384169392831692909116908514156149755760648061471461582d565b6098546000908152609a6020908152604080832060a0546001600160a01b0316845290915290205489118061476f57506098546000908152609a60209081526040808320609f546001600160a01b0316845290915290205489115b614781575050505050505050506143a3565b60005b60038110156147fd578a6001600160a01b0316609e82600381106147a457fe5b01546001600160a01b031614156147bd578092506147f5565b609e81600381106147ca57fe5b01546001600160a01b03168282600381106147e157fe5b6001600160a01b0390921660209290920201525b600101614784565b5060005b6003811015614868576098546000908152609a602052604081209083836003811061482857fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020600001548a111561486057809350614868565b600101614801565b506000805b600381101561496b57808514156148d8578b6001600160a01b0316609e826003811061489557fe5b01546001600160a01b0316146148d3578b609e82600381106148b357fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b614954565b8282600381106148e457fe5b60200201516001600160a01b0316609e82600381106148ff57fe5b01546001600160a01b03161461494d5782826003811061491b57fe5b6020020151609e826003811061492d57fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b6001820191505b83821415614963576001820191505b60010161486d565b5050505050614ac0565b60a55462015180860314156149fd5760a180546001600160a01b038086166001600160a01b03199283161790925560a2805485841690831617905560a38054848416908316179055609e8054928a1692821692909217909155609f80548216905560a0805490911690556094546149f1906064346003026125e4565b60a65560019350614ac0565b60a554614a2857609e80546001600160a01b0319166001600160a01b03891617905560019350614ac0565b60005b6003811015614a9f57600060a18260038110614a4357fe5b0180546001600160a01b0319166001600160a01b03929092169190911790558015614a97576000609e8260038110614a7757fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b600101614a2b565b50609e80546001600160a01b0319166001600160a01b038916179055600193505b8315614b145760a585905560005b6003811015614b1257600060a48260038110614ae657fe5b602081049091018054921515601f9092166101000a91820260ff90920219909216179055600101614ace565b505b50505050505050565b6001600160a01b038316600090815260916020526040812054614b41908390614d13565b90506000614b58614b538360096151bd565b6129f1565b9050614b6e82614b69836009614cf0565b614c4c565b6001600160a01b038616600090815260916020526040902055614b9185826153fa565b6001600160a01b03841615614c08576001600160a01b038416600090815260916020526040902054614bc4908490614d13565b9150614bd4614b538360096151bd565b9050614be582614b69836009614cf0565b6001600160a01b038516600090815260916020526040902055614c0884826153fa565b614c138360286151bd565b9250614c21608b5484614d13565b608b55608a54614c319084614d13565b608a55614c3c6154de565b6136f1615505565b42617e900190565b600081831015614c5b57600080fd5b50900390565b60085460009060ff16614c7057fe5b611f72848484615564565b6001600160a01b038216301415614c9157614cec565b614c9e82600a8304615677565b604080516001600160a01b0384168152600a8304602082015281517f800f0710d5627fe1155e84a30f52e968a8b0df991b6f2538e4ab459786289a32929181900390910190a1614cec615505565b5050565b6000828202831580614d0a575082848281614d0757fe5b04145b611df057600080fd5b600082820183811015611df057600080fd5b60006020607f5b8060ff168260010160ff161015614d74576000600260ff848401160490508460098260ff1660808110614d5b57fe5b015410614d6a57809250614d6e565b8091505b50614d2c565b8360098260ff1660808110614d8557fe5b015410614d95579150611cf99050565b8360098360ff1660808110614da657fe5b015410614db557509050611cf9565b5060009392505050565b60008083905060008090508360ff16858302901c9150816f03442c4e6074a82f1797f72ac000000002810190508360ff16858302901c9150816f0116b96f757c380fb287fd0e4000000002810190508360ff16858302901c9150816e45ae5bdd5f0e03eca1ff439000000002810190508360ff16858302901c9150816e0defabf91302cd95b9ffda5000000002810190508360ff16858302901c9150816e02529ca9832b22439efff9b800000002810190508360ff16858302901c9150816d54f1cf12bd04e516b6da8800000002810190508360ff16858302901c9150816d0a9e39e257a09ca2d6db5100000002810190508360ff16858302901c9150816d012e066e7b839fa050c30900000002810190508360ff16858302901c9150816c1e33d7d926c329a1ad1a80000002810190508360ff16858302901c9150816c02bee513bdb4a6b19b5f80000002810190508360ff16858302901c9150816b3a9316fa79b88eccf2a0000002810190508360ff16858302901c9150816b048177ebe1fa81237520000002810190508360ff16858302901c9150816a5263fe90242dcbacf0000002810190508360ff16858302901c9150816a057e22099c030d9410000002810190508360ff16858302901c9150816957e22099c030d941000002810190508360ff16858302901c91508169052b6b5456997631000002810190508360ff16858302901c915081684985f67696bf74800002810190508360ff16858302901c9150816803dea12ea99e49800002810190508360ff16858302901c9150816731880f2214b6e00002810190508360ff16858302901c91508167025bcff56eb3600002810190508360ff16858302901c915081661b722e10ab100002810190508360ff16858302901c9150816601317c7007700002810190508360ff16858302901c915081650cba84aafa0002810190508360ff16858302901c9150816482573a0a0002810190508360ff16858302901c9150816405035ad90002810190508360ff16858302901c915081632f881b0002810190508360ff16858302901c9150816301b2934002810190508360ff16858302901c915081620efc4002810190508360ff16858302901c915081617fe002810190508360ff16858302901c91508161042002810190508360ff16858302901c915081602102810190508360ff16858302901c915081600102810190508360ff166001901b856f0688589cc0e9505e2f2fee5580000000838161515057fe5b04010195945050505050565b600080610100831015615184575b600183111561517f57600192831c920161516a565b611df3565b60805b60ff8116156151b657600160ff82161b84106151ab5760ff81169390931c92908117905b60011c607f16615187565b5092915050565b60008183816151c857fe5b049392505050565b6000806151e161329534605a614cf0565b90506151f26132af608a5483614d13565b6089805463ffffffff191663ffffffff92909216919091179055600061521c613295346055614cf0565b600554608a546089549293506152389263ffffffff1684611eb8565b9250615246608a5483614d13565b608a5561525333846153fa565b61525b615505565b505090565b60008260011415615295576000828152609560205260409020546064908190600202046019028161528d57fe5b049050611df3565b600283101580156152a7575060068311155b156152da5760008281526095602052604090205460059060649081906002025b04601902816152d257fe5b048161528d57fe5b600783101580156152ec575060388311155b156153105760008281526095602052604090205460329060649081906002026152c7565b60398310158015615323575061022c8311155b15615348576000828152609560205260409020546101f49060649081906002026152c7565b50600092915050565b60085460009060ff1661536057fe5b611df08383615694565b600554608a5460895460009261538892909163ffffffff16856120de565b905061539e608a54614b6961329584605f614cf0565b608a556153a96154de565b6153b33383615677565b6153c1613295826055614cf0565b604051909150339082156108fc029083906000818181858888f193505050501580156153f1573d6000803e3d6000fd5b50611cf9615505565b816001600160a01b03811661540e57600080fd5b826001600160a01b03811630141561542557600080fd5b61543160055484614d13565b6005556001600160a01b0384166000908152600660205260409020546154579084614d13565b6001600160a01b03851660009081526006602090815260409182902092909255805185815290517f9386c90217c323f58030f9dadcbc938f807a940f4ff41cd4cead9562f5da7dc3929181900390910190a16040805184815290516001600160a01b0386169160009160008051602061584c8339815191529181900360200190a350505050565b6154e9608a546125fa565b6089805463ffffffff191663ffffffff92909216919091179055565b7ffaadf08c2c8671e36d7e9aa9e1873fc9b16bea4e73be146c2f84213f043db62961552e6136f9565b608a546005546089546040805194855260208501939093528383019190915263ffffffff166060830152519081900360800190a1565b6000836001600160a01b03811661557a57600080fd5b836001600160a01b03811661558e57600080fd5b6001600160a01b03861660009081526007602090815260408083203384529091529020546155bc9085614c4c565b6001600160a01b0387166000818152600760209081526040808320338452825280832094909455918152600690915220546155f79085614c4c565b6001600160a01b0380881660009081526006602052604080822093909355908716815220546156269085614d13565b6001600160a01b0380871660008181526006602090815260409182902094909455805188815290519193928a169260008051602061584c83398151915292918290030190a350600195945050505050565b615681828261573d565b61568d60905482614d13565b6090555050565b6000826001600160a01b0381166156aa57600080fd5b336000908152600660205260409020546156c49084614c4c565b33600090815260066020526040808220929092556001600160a01b038616815220546156f09084614d13565b6001600160a01b03851660008181526006602090815260409182902093909355805186815290519192339260008051602061584c8339815191529281900390910190a35060019392505050565b6001600160a01b0382166000908152600660205260409020546157609082614c4c565b6001600160a01b0383166000908152600660205260409020556005546157869082614c4c565b6005556040805182815290516000916001600160a01b0385169160008051602061584c8339815191529181900360200190a36040805182815290517f9a1b418bc061a5d80270261562e6986a35d995f8051145f277be16103abd34539181900360200190a15050565b6040518061012001604052806009906020820280368337509192915050565b6040518061064001604052806032906020820280368337509192915050565b6040518060600160405280600390602082028036833750919291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220109ad270bb29cf90e3a3537cb7aec6760e684e90eb7c8fce81f96e778bf14faf64736f6c63430006070033

Deployed Bytecode

0x6080604052600436106104825760003560e01c8063677342ce11610255578063ab899e0511610144578063db006a75116100c1578063e7ef2c6011610085578063e7ef2c6014611257578063ed8460311461128a578063f0275663146112b4578063fa3fa196146112c9578063fae94149146112fc578063fc2b8cc31461132f576104a5565b8063db006a751461118d578063dd62ed3e146111b7578063e492814f146111f2578063e4a28a5214611218578063e653e1871461122d576104a5565b8063c3d5769a11610108578063c3d5769a146110eb578063c9bf5b1514611100578063cc329e811461112a578063cd3293de14611163578063d316eddd14611178576104a5565b8063ab899e0514611058578063ac6b643d14611082578063ad7ffe9014611097578063bef97c87146110c1578063c2ee3a08146110d6576104a5565b806395862f35116101d2578063a1aab33f11610196578063a1aab33f14610f5d578063a1c2160714610f72578063a694fc3a14610fe0578063a88eca611461100a578063a9059cbb1461101f576104a5565b806395862f3514610e9957806395d89b4114610ec35780639719340a14610ed857806397607f7a14610f33578063a035b1fe14610f48576104a5565b806373f599da1161021957806373f599da14610dc4578063831cc04f14610dd95780638f85543314610e03578063917ab34214610e18578063928094bd14610e51576104a5565b8063677342ce14610d115780636933f79314610d3b5780636b7a2a9514610d675780636cd388e714610d7c57806370a0823114610d91576104a5565b806337849b3c116103715780634e65f29b116102ee5780635a9b0b89116102b25780635a9b0b8914610c075780635bc5a4f314610c325780635dfec67614610cc15780636386c1c714610cd657806364edfbf014610d09576104a5565b80634e65f29b14610ad55780634e875a5814610b185780634f5b9f2314610b84578063504f5e5614610bc857806354ffc09a14610bf2576104a5565b80634390d2a8116103355780634390d2a814610a0357806344f7787f14610a1857806345189aeb14610a48578063471f2bb514610a72578063496c6c6914610a9c576104a5565b806337849b3c146108be5780633ba8b2431461093c5780633e4a4fcf14610988578063410e8e4b1461099d57806342a062c6146109d0576104a5565b806320e72ac9116103ff578063313ce567116103c3578063313ce567146107b357806332833d51146107de57806332a643701461083d578063335fba7e146108675780633368ee48146108a9576104a5565b806320e72ac9146106c55780632197a9e8146106ef57806323b872dd1461070457806329a00e7c146107475780632e17de7814610789576104a5565b806314aa164f1161044657806314aa164f1461062a5780631608f18f1461065a578063165defa41461068657806318160ddd1461069b5780631830b4e2146106b0576104a5565b806302d05d3f146104aa578063037859af146104db57806306fdde031461052057806308f4ac92146105aa578063095ea7b3146105dd576104a5565b366104a5573461049957610494611344565b6104a3565b6104a3600061161c565b005b600080fd5b3480156104b657600080fd5b506104bf611b6c565b604080516001600160a01b039092168252519081900360200190f35b3480156104e757600080fd5b5061050e600480360360208110156104fe57600080fd5b50356001600160a01b0316611b7b565b60408051918252519081900360200190f35b34801561052c57600080fd5b50610535611b8d565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561056f578181015183820152602001610557565b50505050905090810190601f16801561059c5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156105b657600080fd5b5061050e600480360360208110156105cd57600080fd5b50356001600160a01b0316611c21565b3480156105e957600080fd5b506106166004803603604081101561060057600080fd5b506001600160a01b038135169060200135611cfe565b604080519115158252519081900360200190f35b34801561063657600080fd5b5061050e6004803603604081101561064d57600080fd5b5080359060200135611db3565b34801561066657600080fd5b506104a36004803603602081101561067d57600080fd5b50351515611df9565b34801561069257600080fd5b5061050e611e1f565b3480156106a757600080fd5b5061050e611e2f565b3480156106bc57600080fd5b506104a3611e35565b3480156106d157600080fd5b5061050e600480360360208110156106e857600080fd5b5035611e73565b3480156106fb57600080fd5b5061050e611e85565b34801561071057600080fd5b506106166004803603606081101561072757600080fd5b506001600160a01b03813581169160208101359091169060400135611e8b565b34801561075357600080fd5b5061050e6004803603608081101561076a57600080fd5b5080359060208101359063ffffffff6040820135169060600135611eb8565b34801561079557600080fd5b50610616600480360360208110156107ac57600080fd5b5035611f7a565b3480156107bf57600080fd5b506107c861205e565b6040805160ff9092168252519081900360200190f35b3480156107ea57600080fd5b506108226004803603608081101561080157600080fd5b5080359060208101359063ffffffff60408201358116916060013516612067565b6040805192835260ff90911660208301528051918290030190f35b34801561084957600080fd5b5061050e6004803603602081101561086057600080fd5b50356120cc565b34801561087357600080fd5b5061050e6004803603608081101561088a57600080fd5b5080359060208101359063ffffffff60408201351690606001356120de565b3480156108b557600080fd5b5061050e6121ac565b3480156108ca57600080fd5b506108f7600480360360408110156108e157600080fd5b50803590602001356001600160a01b03166121b2565b604080519889526020890197909752878701959095526060870193909352608086019190915260a0850152151560c0840152151560e083015251908190036101000190f35b34801561094857600080fd5b5061096f6004803603602081101561095f57600080fd5b50356001600160a01b0316612206565b6040805192835290151560208301528051918290030190f35b34801561099457600080fd5b5061050e612346565b3480156109a957600080fd5b5061050e600480360360208110156109c057600080fd5b50356001600160a01b031661234c565b3480156109dc57600080fd5b5061050e600480360360208110156109f357600080fd5b50356001600160a01b031661235e565b348015610a0f57600080fd5b5061050e612370565b348015610a2457600080fd5b5061050e60048036036040811015610a3b57600080fd5b5080359060200135612376565b348015610a5457600080fd5b506104bf60048036036020811015610a6b57600080fd5b5035612455565b348015610a7e57600080fd5b5061061660048036036020811015610a9557600080fd5b5035612472565b348015610aa857600080fd5b5061050e60048036036040811015610abf57600080fd5b506001600160a01b038135169060200135612499565b348015610ae157600080fd5b50610aff60048036036020811015610af857600080fd5b50356125fa565b6040805163ffffffff9092168252519081900360200190f35b348015610b2457600080fd5b50610b4b60048036036020811015610b3b57600080fd5b50356001600160a01b031661263b565b604051808261012080838360005b83811015610b71578181015183820152602001610b59565b5050505090500191505060405180910390f35b348015610b9057600080fd5b5061082260048036036080811015610ba757600080fd5b5080359060208101359063ffffffff6040820135811691606001351661294e565b348015610bd457600080fd5b5061050e60048036036020811015610beb57600080fd5b50356129f1565b348015610bfe57600080fd5b5061050e612a02565b348015610c1357600080fd5b50610c1c612a08565b6040518151815280826106408083836020610b59565b348015610c3e57600080fd5b50610c6b60048036036040811015610c5557600080fd5b50803590602001356001600160a01b0316612c82565b604080519b8c5260208c019a909a528a8a019890985260608a0196909652608089019490945260a088019290925260c087015260e086015261010085015261012084015261014083015251908190036101600190f35b348015610ccd57600080fd5b5061050e612ce9565b348015610ce257600080fd5b50610c1c60048036036020811015610cf957600080fd5b50356001600160a01b0316612cef565b61050e6130d6565b348015610d1d57600080fd5b5061050e60048036036020811015610d3457600080fd5b5035613131565b348015610d4757600080fd5b5061050e60048036036020811015610d5e57600080fd5b50351515613162565b348015610d7357600080fd5b5061050e61317a565b348015610d8857600080fd5b506107c8613180565b348015610d9d57600080fd5b5061050e60048036036020811015610db457600080fd5b50356001600160a01b0316613185565b348015610dd057600080fd5b506107c86131a0565b348015610de557600080fd5b5061050e60048036036020811015610dfc57600080fd5b50356131a5565b348015610e0f57600080fd5b506104bf6131b7565b348015610e2457600080fd5b5061050e60048036036040811015610e3b57600080fd5b506001600160a01b0381351690602001356131c6565b348015610e5d57600080fd5b50610e7b60048036036020811015610e7457600080fd5b5035613281565b60408051938452602084019290925282820152519081900360600190f35b348015610ea557600080fd5b5061050e60048036036020811015610ebc57600080fd5b503561330c565b348015610ecf57600080fd5b5061053561331e565b348015610ee457600080fd5b50610f0b60048036036020811015610efb57600080fd5b50356001600160a01b031661337f565b6040805194855260208501939093529015158383015215156060830152519081900360800190f35b348015610f3f57600080fd5b506104a36134c1565b348015610f5457600080fd5b5061050e6136f9565b348015610f6957600080fd5b50610aff613756565b348015610f7e57600080fd5b50610fa560048036036020811015610f9557600080fd5b50356001600160a01b0316613762565b6040805196875260208701959095526001600160a01b03909316858501526060850191909152608084015260a0830152519081900360c00190f35b348015610fec57600080fd5b506106166004803603602081101561100357600080fd5b50356137a1565b34801561101657600080fd5b506104a3613844565b34801561102b57600080fd5b506106166004803603604081101561104257600080fd5b506001600160a01b038135169060200135613900565b34801561106457600080fd5b5061050e6004803603602081101561107b57600080fd5b5035613925565b34801561108e57600080fd5b5061050e613937565b3480156110a357600080fd5b5061050e600480360360208110156110ba57600080fd5b503561393d565b3480156110cd57600080fd5b5061061661394f565b3480156110e257600080fd5b5061050e613958565b3480156110f757600080fd5b5061050e61395d565b34801561110c57600080fd5b506104bf6004803603602081101561112357600080fd5b5035613963565b34801561113657600080fd5b5061050e6004803603604081101561114d57600080fd5b506001600160a01b038135169060200135613970565b34801561116f57600080fd5b5061050e613a2d565b34801561118457600080fd5b506104a3611344565b34801561119957600080fd5b5061050e600480360360208110156111b057600080fd5b5035613a33565b3480156111c357600080fd5b5061050e600480360360408110156111da57600080fd5b506001600160a01b0381358116916020013516613a9c565b6104a36004803603602081101561120857600080fd5b50356001600160a01b031661161c565b34801561122457600080fd5b50610aff613ac7565b34801561123957600080fd5b5061050e6004803603602081101561125057600080fd5b5035613ace565b34801561126357600080fd5b5061050e6004803603602081101561127a57600080fd5b50356001600160a01b0316613ae0565b34801561129657600080fd5b50610e7b600480360360208110156112ad57600080fd5b5035613af2565b3480156112c057600080fd5b5061050e613b4c565b3480156112d557600080fd5b506104a3600480360360208110156112ec57600080fd5b50356001600160a01b0316613c37565b34801561130857600080fd5b5061050e6004803603602081101561131f57600080fd5b50356001600160a01b0316613c88565b34801561133b57600080fd5b506104a3613d6f565b609854600090815260996020908152604080832033845290915290206008015460ff161561137157600080fd5b33600061137c613ef5565b90506113866157ef565b61138f8361263b565b6098805460009081526099602081815260408084206001600160a01b038a16808652908352818520600701899055608087015186548652848452828620828752845282862060039081018054909201909155865486528484528286208287528452828620908101548a87526004918201855283872055875196548652938352818520908552909152909120600501805490920190915560925491925061143d919083905b6020020151613f08565b609255609880546000908152609a602081815260408084206001600160a01b03808a16808752918452828620600501869055865486528484528286208287528452828620600601869055955485529282528084208385529091528220600701829055905490911614156114f55760935460808201516040516001600160a01b038616929190910180156108fc02916000818181858888f193505050501580156114ea573d6000803e3d6000fd5b506000609355611530565b60808101516040516001600160a01b0385169180156108fc02916000818181858888f1935050505015801561152e573d6000803e3d6000fd5b505b6098546101008201516000828152609a602090815260408083206001600160a01b03891680855290835292819020600301548151938452918301939093528183015242606082015290517fd2fb33acf3a27ac5107604b2e434858447d771a059c22bec654fa96ebde88cde9181900360800190a26001600160a01b038381166000908152609b6020526040902060020154161561160e576001600160a01b038084166000908152609b6020526040902060029081015461160e92169060648460066020020151600a028161160057fe5b048161160857fe5b04613f23565b611616613fe8565b50505050565b3334670de0b6b3a764000081101561163357600080fd5b609854600090815260a7602052604090205442111561165157600080fd5b6001600160a01b038316158061168057506001600160a01b0383166000908152609b6020526040902060010154155b801561169a57506000546001600160a01b03838116911614155b156116ae576000546001600160a01b031692505b6001600160a01b038281166000908152609b602052604090206002015416611706576001600160a01b038281166000908152609b6020526040902060020180546001600160a01b031916918516919091179055611727565b6001600160a01b038083166000908152609b60205260409020600201541692505b6001600160a01b0382166000908152609b6020526040902054611760576001600160a01b0382166000908152609b602052604090204290555b6001600160a01b0382166000908152609b602052604081206001015460985411156117a5576098546001600160a01b0384166000908152609b60205260409020600101555b60985460009081526099602090815260408083206001600160a01b03871684529091529020600101541561181d5760985460009081526099602090815260408083206001600160a01b0387168452909152902060018101546003909101546064607d90920291909104111561181957600080fd5b5060015b6000611827613ef5565b6098805460009081526099602081815260408084206001600160a01b038b16808652908352818520600190810180548c019055865486528484528286208287528452828620908101548887526002909101845282862055945484529181528183209383529290925220600601549091506118c75760985460009081526099602090815260408083206001600160a01b038816845290915290206006018190555b6098805460009081526099602090815260408083206001600160a01b03898116855290835281842060070186905593548352609590915290208054850190556092805460646055870281900490910190915560938054600487028390040190556094805460038702929092049091019055851615611a4257611949858461405f565b81611975576000611959866142a0565b90506001600160a01b038116156119735761197381614320565b505b61197f85846143a6565b60985460008181526099602090815260408083206001600160a01b03808a1680865291845282852060010154868652609a85528386208387528552838620600490810154609b87529685902060038101549181015460058201549154875194855297840198909852828601919091526060820196909652608081019590955260a085019390935290519093918916927ff2531eca1f304c5bd5f42fc86493d0467d9cfc7d8d3b13e59337d621c84d66d1919081900360c00190a4611a4285614692565b609880546000908152609760209081526040808320805460010190558354835280832054609983528184206001600160a01b038a1685528352818420559254825260a7905220544211611aff576098805460009081526097602090815260408083205460a88352818420559254825260a790522054612a3001426203f480011115611ae557609854600090815260a7602052604090208054612a30019055611aff565b609854600090815260a760205260409020426203f4800190555b611b0a848685614b1d565b6098546000818152609760209081526040918290205482516001600160a01b0389168152918201879052428284015291517f1ae00033f78a24b0e0cb734f176cbecd4ee22b206737a14d9f242538844aec659181900360600190a35050505050565b6000546001600160a01b031681565b608c6020526000908152604090205481565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015611c165780601f10611beb57610100808354040283529160200191611c16565b820191906000526020600020905b815481529060010190602001808311611bf957829003601f168201915b505050505090505b90565b600080611c5c62015180611c33614c44565b81611c3a57fe5b6001600160a01b0386166000908152608d602052604090205491900490614c4c565b90506001811015611c71576000915050611cf9565b611c79611e1f565b611c87576000915050611cf9565b611c8f611e1f565b6001600160a01b0384166000908152608c602052604090205482021115611cc557600a608b5481611cbc57fe5b04915050611cf9565b611ccd611e1f565b6001600160a01b0384166000908152608c6020526040902054608b54600a900402820281611cbc57fe5b505b919050565b6000826001600160a01b038116611d1457600080fd5b821580611d4257503360009081526007602090815260408083206001600160a01b0388168452909152902054155b611d4b57600080fd5b3360008181526007602090815260408083206001600160a01b03891680855290835292819020879055805187815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060019392505050565b60008083611dca576064601284025b049050611df0565b8360011415611dde57606460098402611dc2565b8360021415611df05750606460038302045b90505b92915050565b6000546001600160a01b03163314611e0d57fe5b6008805460ff19169115919091179055565b6000611e2a30613185565b905090565b60055490565b6001546001600160a01b03163314611e4c57600080fd5b60018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b60966020526000908152604090205481565b60a65481565b60085460009060ff16611e9a57fe5b611ea5848484614c61565b9050611eb18383614c7b565b9392505050565b60008085118015611ec95750600084115b8015611edb575060008363ffffffff16115b8015611ef05750620f424063ffffffff841611155b611ef957600080fd5b81611f0657506000611f72565b63ffffffff8316620f42401415611f315783611f228684614cf0565b81611f2957fe5b049050611f72565b6000806000611f408588614d13565b9050611f51818888620f4240612067565b9093509150600060ff8316611f668a86614cf0565b901c8990039450505050505b949350505050565b336000908152608c6020526040812054611f949083614c4c565b336000818152608c6020908152604080832094909455835163a9059cbb60e01b81526004810193909352602483018690529251309363a9059cbb93604480820194929392918390030190829087803b158015611fef57600080fd5b505af1158015612003573d6000803e3d6000fd5b505050506040513d602081101561201957600080fd5b5051604080513381526020810185905281519293507f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd929081900390910190a1919050565b60045460ff1690565b60008060008363ffffffff168563ffffffff166120848989612376565b028161208c57fe5b049050600061209a82614d25565b9050602060ff821610156120aa57fe5b6120bd81607f0360ff1683901c82614dbf565b93509150505b94509492505050565b60956020526000908152604090205481565b600080851180156120ef5750600084115b8015612101575060008363ffffffff16115b80156121165750620f424063ffffffff841611155b80156121225750848211155b61212b57600080fd5b8161213857506000611f72565b84821415612147575082611f72565b63ffffffff8316620f424014156121635784611f228584614cf0565b6000808387036121788882620f424089612067565b909350915060006121898885614cf0565b905060ff831688901b848183038161219d57fe5b049a9950505050505050505050565b60905481565b60996020908152600092835260408084209091529082529020805460018201546003830154600584015460068501546007860154600890960154949593949293919290919060ff8082169161010090041688565b6000806000612213613ef5565b905060006064905060008260a55414156122895760a1546001600160a01b03878116911614156122465760009150612280565b60a2546001600160a01b03878116911614156122655760019150612280565b60a3546001600160a01b038781169116141561228057600291505b5060a6546122f6565b60a55462015180840314156122f657609e546001600160a01b03878116911614156122b757600091506122f1565b609f546001600160a01b03878116911614156122d657600191506122f1565b60a0546001600160a01b03878116911614156122f157600291505b506094545b6003821015612335576123098282611db3565b945060a4826003811061231857fe5b602081049091015460ff601f9092166101000a900416935061233e565b60009450600093505b505050915091565b60925481565b608e6020526000908152604090205481565b60916020526000908152604090205481565b60935481565b60007001ffffffffffffffffffffffffffffffff83111561239357fe5b600080836001607f1b8602816123a557fe5b049050600160801b81106123d75760006123c46001607f1b830461515c565b60ff166001607f1b810293509190911c90505b6001607f1b81111561242757607f5b60ff811615612425576001607f1b828002049150600160801b821061241c57600182901c91506001810360ff166001901b830192505b600019016123e6565b505b6f05b9de1d10bf4103d647b0955897ba806f03f80fe03f80fe03f80fe03f80fe03f883020495945050505050565b60a1816003811061246257fe5b01546001600160a01b0316905081565b60a4816003811061247f57fe5b60209182820401919006915054906101000a900460ff1681565b6000806124a4613ef5565b60985460009081526099602090815260408083206001600160a01b03891684529091528120600701549192509062015180906124e1908490613f08565b816124e857fe5b04905060078111156124f8575060075b60985460009081526099602090815260408083206001600160a01b03891684529091528120600301548290606490600190612532906129f1565b60985460009081526099602090815260408083206001600160a01b038e16845290915290206001015401028161256457fe5b6098546000818152609a602090815260408083206001600160a01b038e168085529083528184206007810154600682015460059092015496865260998552838620928652919093529220600381015460019091015495909404959095029550908501909301909201916125ef9188916125ea91908301850190606490607d025b04613f08565b613f08565b979650505050505050565b600061261e612610620f42406377359400614cf0565b61261984613131565b6151bd565b9050620f424063ffffffff82161115611cf95750620f4240919050565b6126436157ef565b600061264d613ef5565b60985460009081526099602090815260408083206001600160a01b038816845290915281206007015491925090620151809061268a908490613f08565b8161269157fe5b04905060018110156126c65760005b60098110156126c45760008482600981106126b757fe5b60200201526001016126a0565b505b60078111156126d3575060075b600081606460016126e488876131c6565b02816126ec57fe5b04029050600082606460016127018988613970565b028161270957fe5b6098546000818152609a602090815260408083206001600160a01b038e1680855290835281842060078101546006820154600590920154968652609985528386209286529190935292206001810154600390910154959094049590950287019550908501909301909201916064607d9091020490820111156127ca5760985460009081526099602090815260408083206001600160a01b038b168452909152902060018101546003909101546127c7916064607d9091020490613f08565b90505b808311156127d6578092505b818110156127e2578091505b8186526098546000818152609a602090815260408083206001600160a01b038c1680855290835281842060088101546002908102858e015260098201548102848e0152600a909101540260608c015260808b018690529383526099825280832093835292905220600301546128c69060649061285d906129f1565b60985460009081526099602090815260408083206001600160a01b038e1684529091529020600101540160fa028161289157fe5b60985460009081526099602090815260408083206001600160a01b038e16845290915290206005015491900490600202613f08565b60a087015260c0860183905260985460009081526099602090815260408083206001600160a01b038b8116808652919093529083206003015460020260e08a0152915416146129445760985460009081526099602090815260408083206001600160a01b038b16845290915290206003015481016002026101008701525b5050505050919050565b60008084861061296d5761296486868686612067565b915091506120c3565b60008363ffffffff168563ffffffff16612987888a612376565b028161298f57fe5b049050600061299d82614d25565b9050602060ff821610156129ba5750600092508291506120c39050565b60006129cf82607f0360ff1684901c83614dbf565b9050806001609f1b816129de57fe5b04945050609f0391505094509492505050565b670de0b6b3a7640000908190040290565b60a55481565b612a1061580e565b612a1861580e565b60925481526094546020808301919091526098546000818152609583526040808220546064600282028190048388015281046060870152609354608087015260a0860152828252609784528082205460c086015260e0850183905282825260a784528082205461010086015282825260a88452808220546101208601529181526096909252812054610140830152600b90612ab1613ef5565b90508060a5541415612baf5760005b6003811015612bad57609e8160038110612ad657fe5b01546001600160a01b0316848460328110612aed57fe5b602002018181525050826001019250609a600060985481526020019081526020016000206000609e8360038110612b2057fe5b01546001600160a01b03168152602081019190915260400160002054848460328110612b4857fe5b6020020152600183019284906000190160328110612b6257fe5b6020020151612b83576000848460328110612b7957fe5b6020020152612ba1565b612b8f81609454611db3565b848460328110612b9b57fe5b60200201525b60019283019201612ac0565b505b600554610280840152608a546102a0840152608b546102c0840152608f546102e0840152609054610300840152612be46136f9565b610320840152612bf2611e1f565b610340840152600080546001600160a01b031661036085015260895463ffffffff1661038085015260985460001981018252609560209081526040808420546103a0880152918352609d9052812054821415612c5c57506098546000908152609c60205260409020545b609254612c6d906064900482613f08565b6103c085015250504261062083015250919050565b609a6020528160005260406000206020528060005260406000206000915091505080600001549080600101549080600201549080600301549080600401549080600501549080600601549080600701549080600801549080600901549080600a015490508b565b60985481565b612cf761580e565b612cff6157ef565b612d088361263b565b6001600160a01b0384166000818152609b6020908152604080832060019081015460985485526099845282852086865280855283862080548b52878752818652928301548a8601526080808901516003850154908101958c019590955260608b01949094526007830154938a01939093529490935290526008015491925090612d939060ff16613162565b60a08401526001600160a01b038481166000818152609b602081815260408320600281015490951660c0890152600385015460e0890152928252909152600490910154610100850152612de4613ef5565b6098546000908152609a602090815260408083206001600160a01b038a168452909152902060020154909150811415612e5c576098546000908152609a602090815260408083206001600160a01b03891680855281845291842080546101208a01529190935291905260010154610140850152612ec6565b6098546000908152609a602090815260408083206001600160a01b03891684529091529020600201546201517f1982011415612ec657600061012085018190526098548152609a602090815260408083206001600160a01b03891684529091529020546101408501525b6000612ed186612206565b6103c08701919091529050612ee581613162565b6103e08601526098546000908152609a602090815260408083206001600160a01b038a16808552908352818420600201546101608a015286845260998352818420908452909152902060080154612f4390610100900460ff16613162565b61018086015260985460009081526099602090815260408083206001600160a01b038a1684529091529020600601546101a0860152612f8186613c88565b6101c086015260985460009081526099602090815260408083206001600160a01b038a1684529091529020600301546101e0860152612fbf86613185565b6102008601526001600160a01b0386166000818152608c60209081526040808320546102208a0152838352608e8252808320546102408a015260985483526099825280832084845280835281842060058101546002026102608c0152898401516102808c0152918901516102a08b015260608901516102c08b015260808901516102e08b015260a08901516103008b015293909252919091526001015461307090606460fa90910204856007611433565b61032086015260e08401516103408601526000808061308e8961337f565b6103608c019290925291945090925090506130a882613162565b6103808901526130b789611c21565b6103a08901526101008701518860208002015250505050505050919050565b6000806130e434600a6151bd565b90506130f260925482614d13565b6092556098546000908152609660205260409020546131119082614d13565b60985460009081526096602052604090205561312b6151d0565b91505090565b80600260018201045b81811015611cf75780915060028182858161315157fe5b04018161315a57fe5b04905061313a565b6000811561317257506001611cf9565b506000611cf9565b608b5481565b602081565b6001600160a01b031660009081526006602052604090205490565b607f81565b609d6020526000908152604090205481565b6001546001600160a01b031681565b60985460009081526099602090815260408083206001600160a01b038616845290915281206006810154600290910190829080156132445762a4cb7f1985015b8181106132425760008181526020859052604090205415613237576000818152602085905260409020549250613242565b6201517f1901613206565b505b60985460009081526099602090815260408083206001600160a01b038a1684529091529020600101546132779083613f08565b9695505050505050565b60008060008061329c61329586605a614cf0565b60646151bd565b905060006132b46132af608a5484614d13565b6125fa565b905060006132c6613295886055614cf0565b90506132d8600554608a548484611eb8565b95506132f56132ef82670de0b6b3a7640000614cf0565b876151bd565b94506133018782614c4c565b959794965050505050565b60976020526000908152604090205481565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015611c165780601f10611beb57610100808354040283529160200191611c16565b6001600160a01b0381166000908152609b6020526040812060010154908080836133ac57600091506134ba565b600084815260a760205260409020544211156134ba5760008481526099602090815260408083206001600160a01b03891684529091529020546001925015801590613424575060008481526099602090815260408083206001600160a01b038916845282528083205487845260a89092529091205410155b8015613462575060008481526099602090815260408083206001600160a01b038916845282528083205487845260a89092529091205461022c919003105b156134ba575060008381526099602090815260408083206001600160a01b038816845282528083206008810154905487855260a890935292205461010090920460ff16916001919003016134b68186615260565b9350505b9193509193565b609854600090815260996020908152604080832033845290915290206008015460ff16156134ee57600080fd5b3360006134f9613ef5565b60a5549091506064906201517f19830114156135d657609e5460a180546001600160a01b039283166001600160a01b031991821617909155609f5460a2805491841691831691909117905560a05460a3805491909316911617905560005b60038110156135c9576000609e826003811061356f57fe5b0180546001600160a01b0319166001600160a01b0392909216919091179055600060a4826003811061359d57fe5b602081049091018054921515601f9092166101000a91820260ff90920219909216179055600101613557565b5060a582905560945460a6555b8160a55414156136365760a1546001600160a01b03848116911614156135fe57506000613636565b60a2546001600160a01b038481169116141561361c57506001613636565b60a3546001600160a01b0384811691161415613636575060025b600381108015613666575060a4816003811061364e57fe5b602081049091015460ff601f9092166101000a900416155b156136f45760006136798260a654611db3565b905061368760945482613f08565b609455600160a4836003811061369957fe5b602091828204019190066101000a81548160ff021916908315150217905550836001600160a01b03166108fc829081150290604051600060405180830381858888f193505050501580156136f1573d6000803e3d6000fd5b50505b505050565b6000600554600014156137145750662386f26fc10000611c1e565b611e2a61374e613740613732608a54620f424063ffffffff16614cf0565b60895463ffffffff166151bd565b670de0b6b3a7640000614cf0565b6005546151bd565b60895463ffffffff1681565b609b60205260009081526040902080546001820154600283015460038401546004850154600590950154939492936001600160a01b0390921692909186565b60006137ad3083613900565b336000908152608c60205260409020549091506137ca9083614d13565b336000908152608c6020526040902055620151806137e6614c44565b816137ed57fe5b336000818152608d602090815260409182902094909304909355825190815290810184905281517febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a929181900390910190a1919050565b609854600090815260996020908152604080832033845290915290206008015460ff161561387157600080fd5b3360008080806138808561337f565b929650909450925090508215801590613897575080155b156136f15760008481526099602090815260408083206001600160a01b0389168085529252808320600801805461ff00191661010017905551909185156108fc02918691818181858888f193505050501580156138f8573d6000803e3d6000fd5b505050505050565b60085460009060ff1661390f57fe5b6139198383615351565b9050611df38383614c7b565b60a76020526000908152604090205481565b60945481565b60a86020526000908152604090205481565b60085460ff1681565b600181565b608f5481565b609e816003811061246257fe5b60985460009081526099602090815260408083206001600160a01b038616845290915281206006810154600490910190829080156139ee5762a4cb7f1985015b8181106139ec57600081815260208590526040902054156139e15760008181526020859052604090205492506139ec565b6201517f19016139b0565b505b60985460009081526099602090815260408083206001600160a01b038a16845290915290206003015461327790613a24906129f1565b6125ea846129f1565b608a5481565b6000613a3e8261536a565b90506000613a57613a5083600a614cf0565b60556151bd565b9050613a6560925482614d13565b609255609854600090815260966020526040902054613a849082614d13565b60985460009081526096602052604090205550919050565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b620f424081565b609c6020526000908152604090205481565b608d6020526000908152604090205481565b600554608a5460895460009283928392613b1492919063ffffffff16876120de565b9250613b31613b2b84670de0b6b3a7640000614cf0565b856151bd565b9150613b4161329584600f614cf0565b928390039491935050565b6000613b5733611c21565b336000908152608e6020526040902054909150613b749082614d13565b336000908152608e6020526040902055608f54613b919082614d13565b608f55608b54613ba19082614c4c565b608b5562015180613bb0614c44565b81613bb757fe5b336000818152608d6020526040808220949093049093559051909183156108fc02918491818181858888f19350505050158015613bf8573d6000803e3d6000fd5b50604080513381526020810183905281517f84b8e87f53fc40fd95af6906b7d6a2ec3eaeb463ad6c1dd77522883cf8a92ab9929181900390910190a190565b6000546001600160a01b03163314613c4b57fe5b6000546001600160a01b0382811691161415613c6657600080fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60985460009081526099602090815260408083206001600160a01b038516845290915281206008015460ff1615613cc157506000611cf9565b6000613ccb613ef5565b6098546000908152609d602052604081205491925090821415613cfc57506098546000908152609c60205260409020545b60985460009081526099602090815260408083206001600160a01b038816845290915281206001810154600390910154613d4191606460509091020490600202613f08565b6092549091508282019060649004811115613d63576002945050505050611cf9565b50600195945050505050565b60985460009081526099602090815260408083203380855292529091206008015460ff1615613d9d57600080fd5b6000613da7613ef5565b6098546000908152609d602052604081205491925090821415613dd857506098546000908152609c60205260409020545b60985460009081526099602090815260408083206001600160a01b038716845290915281206001810154600390910154613e1d91606460509091020490600202614c4c565b6092549091508282019060649004811115613e3757600080fd5b6098805460009081526099602090815260408083206001600160a01b038a1684528252808320600801805460ff1916600117905592548252609d905220548414613e90576098546000908152609d602052604090208490555b6098546000908152609c602052604090208383019055609254613eb39083613f08565b6092556040516001600160a01b0386169083156108fc029084906000818181858888f19350505050158015613eec573d6000803e3d6000fd5b506138f8613fe8565b6201518042617e90810191909106900390565b600081831115613f1b5750808203611df3565b506000611df3565b60005b60098110156136f4576001600160a01b0383166000908152609b6020526040902060030154811015613fb5576000613f5e8484612499565b90508015613fb357609880546000908152609a602081815260408084206001600160a01b038a168086529083528185206005018054880190559454845291815281832093835292909252206008018054820190555b505b6001600160a01b039283166000908152609b60205260409020600201549092169182613fe0576136f4565b600101613f26565b609854600090815260a7602052604081205442111561405957678ac7230489e800006092541015614059575060988054600081815260956020908152604080832054609280546064909204909101905560019384019485905593825260a7905291909120426203f480019055611c1e565b50600090565b600080805b60c88110156136f1576001600160a01b038516614080576136f1565b6001600160a01b0385166000908152609b60205260409020600301546009118015906140c757506001600160a01b0385166000908152609b60205260409020600401546009115b80156140d1575082155b1561414e5760006140f38660026064600589025b04816140ed57fe5b04612499565b9050801561414857609880546000908152609a602081815260408084206001600160a01b038c168086529083528185206006018054880190559454845291815281832093835292909252206009018054820190555b60019350505b6001600160a01b0385166000908152609b60205260409020600401546009116142545782156141e557600061418a8660026064600589026140e5565b905080156141df57609880546000908152609a602081815260408084206001600160a01b038c16808652908352818520600701805488019055945484529181528183209383529290925220600a018054820190555b5061424f565b60006141f88660026064600a89026140e5565b9050801561424d57609880546000908152609a602081815260408084206001600160a01b038c16808652908352818520600701805488019055945484529181528183209383529290925220600a018054820190555b505b600191505b818061426d57506000546001600160a01b038681169116145b15614277576136f1565b6001600160a01b039485166000908152609b602052604090206002015490941693600101614064565b6001600160a01b0381166000908152609b6020526040812060030180546001019081905560091480156142ef57506001600160a01b038281166000908152609b60205260409020600201541615155b1561431857506001600160a01b038082166000908152609b602052604090206002015416611cf9565b506000919050565b6001600160a01b0381166000908152609b60205260409020600401805460010190819055600914801561436f57506001600160a01b038181166000908152609b60205260409020600201541615155b156143a3576001600160a01b038082166000908152609b602052604080822060020154909216815220600501805460010190555b50565b60006143b0613ef5565b6098546000908152609a602090815260408083206001600160a01b0388168452909152902060020154909150811415614413576098546000908152609a602090815260408083206001600160a01b03871684529091529020805483019055614531565b6098546000908152609a602090815260408083206001600160a01b03871684529091529020600201546201517f198201141561449357609880546000908152609a602081815260408084206001600160a01b0389168086529083528185208054600190910155945484529181528183209383529290925220829055614531565b6098546000908152609a602090815260408083206001600160a01b03871684529091529020600201546144ed576098546000908152609a602090815260408083206001600160a01b03871684529091529020829055614531565b609880546000908152609a602081815260408084206001600160a01b0389168086529083528185206001018590559454845291815281832093835292909252208290555b609880546000908152609a602081815260408084206001600160a01b03891680865290835281852060020187905594548452918152818320938352929092529081206003018054840190555b6009811015611616576098546000908152609a602090815260408083206001600160a01b038089168552908352818420600401805488019055609b9092529091206002015416806145ce5750611616565b60985460008181526099602090815260408083206001600160a01b03808b1680865291845282852060010154868652609a85528386208387528552838620600490810154609b87529685902060038101549181015460058201549154875194855297840198909852828601919091526060820196909652608081019590955260a085019390935290519093918516927ff2531eca1f304c5bd5f42fc86493d0467d9cfc7d8d3b13e59337d621c84d66d1919081900360c00190a4935060010161457d565b6000546001600160a01b03828116911614156146ad576143a3565b6098546000908152609a602090815260408083206001600160a01b0385168452909152812054906146dc613ef5565b609e54609f5460a05460a5549394506000936001600160a01b039384169392831692909116908514156149755760648061471461582d565b6098546000908152609a6020908152604080832060a0546001600160a01b0316845290915290205489118061476f57506098546000908152609a60209081526040808320609f546001600160a01b0316845290915290205489115b614781575050505050505050506143a3565b60005b60038110156147fd578a6001600160a01b0316609e82600381106147a457fe5b01546001600160a01b031614156147bd578092506147f5565b609e81600381106147ca57fe5b01546001600160a01b03168282600381106147e157fe5b6001600160a01b0390921660209290920201525b600101614784565b5060005b6003811015614868576098546000908152609a602052604081209083836003811061482857fe5b60200201516001600160a01b03166001600160a01b03168152602001908152602001600020600001548a111561486057809350614868565b600101614801565b506000805b600381101561496b57808514156148d8578b6001600160a01b0316609e826003811061489557fe5b01546001600160a01b0316146148d3578b609e82600381106148b357fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b614954565b8282600381106148e457fe5b60200201516001600160a01b0316609e82600381106148ff57fe5b01546001600160a01b03161461494d5782826003811061491b57fe5b6020020151609e826003811061492d57fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b6001820191505b83821415614963576001820191505b60010161486d565b5050505050614ac0565b60a55462015180860314156149fd5760a180546001600160a01b038086166001600160a01b03199283161790925560a2805485841690831617905560a38054848416908316179055609e8054928a1692821692909217909155609f80548216905560a0805490911690556094546149f1906064346003026125e4565b60a65560019350614ac0565b60a554614a2857609e80546001600160a01b0319166001600160a01b03891617905560019350614ac0565b60005b6003811015614a9f57600060a18260038110614a4357fe5b0180546001600160a01b0319166001600160a01b03929092169190911790558015614a97576000609e8260038110614a7757fe5b0180546001600160a01b0319166001600160a01b03929092169190911790555b600101614a2b565b50609e80546001600160a01b0319166001600160a01b038916179055600193505b8315614b145760a585905560005b6003811015614b1257600060a48260038110614ae657fe5b602081049091018054921515601f9092166101000a91820260ff90920219909216179055600101614ace565b505b50505050505050565b6001600160a01b038316600090815260916020526040812054614b41908390614d13565b90506000614b58614b538360096151bd565b6129f1565b9050614b6e82614b69836009614cf0565b614c4c565b6001600160a01b038616600090815260916020526040902055614b9185826153fa565b6001600160a01b03841615614c08576001600160a01b038416600090815260916020526040902054614bc4908490614d13565b9150614bd4614b538360096151bd565b9050614be582614b69836009614cf0565b6001600160a01b038516600090815260916020526040902055614c0884826153fa565b614c138360286151bd565b9250614c21608b5484614d13565b608b55608a54614c319084614d13565b608a55614c3c6154de565b6136f1615505565b42617e900190565b600081831015614c5b57600080fd5b50900390565b60085460009060ff16614c7057fe5b611f72848484615564565b6001600160a01b038216301415614c9157614cec565b614c9e82600a8304615677565b604080516001600160a01b0384168152600a8304602082015281517f800f0710d5627fe1155e84a30f52e968a8b0df991b6f2538e4ab459786289a32929181900390910190a1614cec615505565b5050565b6000828202831580614d0a575082848281614d0757fe5b04145b611df057600080fd5b600082820183811015611df057600080fd5b60006020607f5b8060ff168260010160ff161015614d74576000600260ff848401160490508460098260ff1660808110614d5b57fe5b015410614d6a57809250614d6e565b8091505b50614d2c565b8360098260ff1660808110614d8557fe5b015410614d95579150611cf99050565b8360098360ff1660808110614da657fe5b015410614db557509050611cf9565b5060009392505050565b60008083905060008090508360ff16858302901c9150816f03442c4e6074a82f1797f72ac000000002810190508360ff16858302901c9150816f0116b96f757c380fb287fd0e4000000002810190508360ff16858302901c9150816e45ae5bdd5f0e03eca1ff439000000002810190508360ff16858302901c9150816e0defabf91302cd95b9ffda5000000002810190508360ff16858302901c9150816e02529ca9832b22439efff9b800000002810190508360ff16858302901c9150816d54f1cf12bd04e516b6da8800000002810190508360ff16858302901c9150816d0a9e39e257a09ca2d6db5100000002810190508360ff16858302901c9150816d012e066e7b839fa050c30900000002810190508360ff16858302901c9150816c1e33d7d926c329a1ad1a80000002810190508360ff16858302901c9150816c02bee513bdb4a6b19b5f80000002810190508360ff16858302901c9150816b3a9316fa79b88eccf2a0000002810190508360ff16858302901c9150816b048177ebe1fa81237520000002810190508360ff16858302901c9150816a5263fe90242dcbacf0000002810190508360ff16858302901c9150816a057e22099c030d9410000002810190508360ff16858302901c9150816957e22099c030d941000002810190508360ff16858302901c91508169052b6b5456997631000002810190508360ff16858302901c915081684985f67696bf74800002810190508360ff16858302901c9150816803dea12ea99e49800002810190508360ff16858302901c9150816731880f2214b6e00002810190508360ff16858302901c91508167025bcff56eb3600002810190508360ff16858302901c915081661b722e10ab100002810190508360ff16858302901c9150816601317c7007700002810190508360ff16858302901c915081650cba84aafa0002810190508360ff16858302901c9150816482573a0a0002810190508360ff16858302901c9150816405035ad90002810190508360ff16858302901c915081632f881b0002810190508360ff16858302901c9150816301b2934002810190508360ff16858302901c915081620efc4002810190508360ff16858302901c915081617fe002810190508360ff16858302901c91508161042002810190508360ff16858302901c915081602102810190508360ff16858302901c915081600102810190508360ff166001901b856f0688589cc0e9505e2f2fee5580000000838161515057fe5b04010195945050505050565b600080610100831015615184575b600183111561517f57600192831c920161516a565b611df3565b60805b60ff8116156151b657600160ff82161b84106151ab5760ff81169390931c92908117905b60011c607f16615187565b5092915050565b60008183816151c857fe5b049392505050565b6000806151e161329534605a614cf0565b90506151f26132af608a5483614d13565b6089805463ffffffff191663ffffffff92909216919091179055600061521c613295346055614cf0565b600554608a546089549293506152389263ffffffff1684611eb8565b9250615246608a5483614d13565b608a5561525333846153fa565b61525b615505565b505090565b60008260011415615295576000828152609560205260409020546064908190600202046019028161528d57fe5b049050611df3565b600283101580156152a7575060068311155b156152da5760008281526095602052604090205460059060649081906002025b04601902816152d257fe5b048161528d57fe5b600783101580156152ec575060388311155b156153105760008281526095602052604090205460329060649081906002026152c7565b60398310158015615323575061022c8311155b15615348576000828152609560205260409020546101f49060649081906002026152c7565b50600092915050565b60085460009060ff1661536057fe5b611df08383615694565b600554608a5460895460009261538892909163ffffffff16856120de565b905061539e608a54614b6961329584605f614cf0565b608a556153a96154de565b6153b33383615677565b6153c1613295826055614cf0565b604051909150339082156108fc029083906000818181858888f193505050501580156153f1573d6000803e3d6000fd5b50611cf9615505565b816001600160a01b03811661540e57600080fd5b826001600160a01b03811630141561542557600080fd5b61543160055484614d13565b6005556001600160a01b0384166000908152600660205260409020546154579084614d13565b6001600160a01b03851660009081526006602090815260409182902092909255805185815290517f9386c90217c323f58030f9dadcbc938f807a940f4ff41cd4cead9562f5da7dc3929181900390910190a16040805184815290516001600160a01b0386169160009160008051602061584c8339815191529181900360200190a350505050565b6154e9608a546125fa565b6089805463ffffffff191663ffffffff92909216919091179055565b7ffaadf08c2c8671e36d7e9aa9e1873fc9b16bea4e73be146c2f84213f043db62961552e6136f9565b608a546005546089546040805194855260208501939093528383019190915263ffffffff166060830152519081900360800190a1565b6000836001600160a01b03811661557a57600080fd5b836001600160a01b03811661558e57600080fd5b6001600160a01b03861660009081526007602090815260408083203384529091529020546155bc9085614c4c565b6001600160a01b0387166000818152600760209081526040808320338452825280832094909455918152600690915220546155f79085614c4c565b6001600160a01b0380881660009081526006602052604080822093909355908716815220546156269085614d13565b6001600160a01b0380871660008181526006602090815260409182902094909455805188815290519193928a169260008051602061584c83398151915292918290030190a350600195945050505050565b615681828261573d565b61568d60905482614d13565b6090555050565b6000826001600160a01b0381166156aa57600080fd5b336000908152600660205260409020546156c49084614c4c565b33600090815260066020526040808220929092556001600160a01b038616815220546156f09084614d13565b6001600160a01b03851660008181526006602090815260409182902093909355805186815290519192339260008051602061584c8339815191529281900390910190a35060019392505050565b6001600160a01b0382166000908152600660205260409020546157609082614c4c565b6001600160a01b0383166000908152600660205260409020556005546157869082614c4c565b6005556040805182815290516000916001600160a01b0385169160008051602061584c8339815191529181900360200190a36040805182815290517f9a1b418bc061a5d80270261562e6986a35d995f8051145f277be16103abd34539181900360200190a15050565b6040518061012001604052806009906020820280368337509192915050565b6040518061064001604052806032906020820280368337509192915050565b6040518060600160405280600390602082028036833750919291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220109ad270bb29cf90e3a3537cb7aec6760e684e90eb7c8fce81f96e778bf14faf64736f6c63430006070033

Deployed Bytecode Sourcemap

46914:28824:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51104:9;51100:86;;51127:20;:18;:20::i;:::-;51100:86;;;51170:16;51183:1;51170:4;:16::i;:::-;46914:28824;;12:1:-1;9;2:12;10574:30:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10574:30:0;;;:::i;:::-;;;;-1:-1:-1;;;;;10574:30:0;;;;;;;;;;;;;;39873:45;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39873:45:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39873:45:0;-1:-1:-1;;;;;39873:45:0;;:::i;:::-;;;;;;;;;;;;;;;;6981:92;;5:9:-1;2:2;;;27:1;24;17:12;2:2;6981:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;6981:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43332:505;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43332:505:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43332:505:0;-1:-1:-1;;;;;43332:505:0;;:::i;9978:497::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9978:497:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;9978:497:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;62717:359;;5:9:-1;2:2;;;27:1;24;17:12;2:2;62717:359:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;62717:359:0;;;;;;;:::i;13553:116::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;13553:116:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13553:116:0;;;;:::i;42513:111::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42513:111:0;;;:::i;7279:100::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7279:100:0;;;:::i;11397:159::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11397:159:0;;;:::i;47842:42::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47842:42:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47842:42:0;;:::i;50246:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50246:29:0;;;:::i;42283:218::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42283:218:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;42283:218:0;;;;;;;;;;;;;;;;;:::i;25906:888::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;25906:888:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;25906:888:0;;;;;;;;;;;;;;;;;;;:::i;43068:252::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43068:252:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43068:252:0;;:::i;7181:92::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7181:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29944:491;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29944:491:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;29944:491:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;47784:51;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47784:51:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47784:51:0;;:::i;27441:1067::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;27441:1067:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;27441:1067:0;;;;;;;;;;;;;;;;;;;:::i;40072:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40072:29:0;;;:::i;49631:57::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49631:57:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49631:57:0;;;;;;-1:-1:-1;;;;;49631:57:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70138:895;;5:9:-1;2:2;;;27:1;24;17:12;2:2;70138:895:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;70138:895:0;-1:-1:-1;;;;;70138:895:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;47610:29;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47610:29:0;;;:::i;39984:46::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39984:46:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39984:46:0;-1:-1:-1;;;;;39984:46:0;;:::i;40108:47::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40108:47:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;40108:47:0;-1:-1:-1;;;;;40108:47:0;;:::i;47668:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47668:22:0;;;:::i;31677:944::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;31677:944:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31677:944:0;;;;;;;:::i;50047:25::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50047:25:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50047:25:0;;:::i;50114:30::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50114:30:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50114:30:0;;:::i;56696:681::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;56696:681:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;56696:681:0;;;;;;;;:::i;41289:238::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;41289:238:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;41289:238:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;68305:1821;;5:9:-1;2:2;;;27:1;24;17:12;2:2;68305:1821:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;68305:1821:0;-1:-1:-1;;;;;68305:1821:0;;:::i;:::-;;;;;;;;;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;68305:1821:0;;;;;;;;;;;;;;;;30475:678;;5:9:-1;2:2;;;27:1;24;17:12;2:2;30475:678:0;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;30475:678:0;;;;;;;;;;;;;;;;;;;;;:::i;3927:89::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3927:89:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3927:89:0;;:::i;50180:26::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50180:26:0;;;:::i;74143:1590::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;74143:1590:0;;;:::i;:::-;;;84:18:-1;;64:39;;74143:1590:0;;;;;;52:2:-1;8:100;;49700:59:0;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49700:59:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49700:59:0;;;;;;-1:-1:-1;;;;;49700:59:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47958:22;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47958:22:0;;;:::i;71041:3094::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;71041:3094:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;71041:3094:0;-1:-1:-1;;;;;71041:3094:0;;:::i;46956:307::-;;;:::i;3562:194::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;3562:194:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;3562:194:0;;:::i;66802:139::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66802:139:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66802:139:0;;;;:::i;39841:25::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39841:25:0;;;:::i;15597:40::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15597:40:0;;;:::i;7385:119::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7385:119:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;7385:119:0;-1:-1:-1;;;;;7385:119:0;;:::i;15644:41::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15644:41:0;;;:::i;49910:47::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49910:47:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49910:47:0;;:::i;10611:33::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;10611:33:0;;;:::i;66949:668::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66949:668:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;66949:668:0;;;;;;;;:::i;44816:609::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44816:609:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44816:609:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;47900:48;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47900:48:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47900:48:0;;:::i;7079:96::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7079:96:0;;;:::i;64845:864::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;64845:864:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;64845:864:0;-1:-1:-1;;;;;64845:864:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63084:1023;;5:9:-1;2:2;;;27:1;24;17:12;2:2;63084:1023:0;;;:::i;44371:228::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;44371:228:0;;;:::i;39723:60::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39723:60:0;;;:::i;49769:39::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49769:39:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49769:39:0;-1:-1:-1;;;;;49769:39:0;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;49769:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42688:314;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42688:314:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;42688:314:0;;:::i;65717:524::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;65717:524:0;;;:::i;42083:188::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;42083:188:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;42083:188:0;;;;;;;;:::i;50321:44::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50321:44:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50321:44:0;;:::i;47726:23::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47726:23:0;;;:::i;50372:50::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;50372:50:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50372:50:0;;:::i;12294:35::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;12294:35:0;;;:::i;15508:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15508:31:0;;;:::i;40037:28::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;40037:28:0;;;:::i;49980:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49980:22:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49980:22:0;;:::i;67629:664::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67629:664:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;67629:664:0;;;;;;;;:::i;39812:22::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39812:22:0;;;:::i;55665:1019::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;55665:1019:0;;;:::i;47275:327::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;47275:327:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;47275:327:0;;:::i;7510:148::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;7510:148:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;7510:148:0;;;;;;;;;;:::i;51363:2562::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;51363:2562:0;-1:-1:-1;;;;;51363:2562:0;;:::i;15547:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;15547:43:0;;;:::i;49842:45::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;49842:45:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;49842:45:0;;:::i;39925:52::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;39925:52:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39925:52:0;-1:-1:-1;;;;;39925:52:0;;:::i;45998:344::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;45998:344:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45998:344:0;;:::i;43907:452::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43907:452:0;;;:::i;11140:166::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;11140:166:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;11140:166:0;-1:-1:-1;;;;;11140:166:0;;:::i;66249:545::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;66249:545:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;66249:545:0;-1:-1:-1;;;;;66249:545:0;;:::i;54802:853::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54802:853:0;;;:::i;55665:1019::-;55720:7;;55715:13;;;;:4;:13;;;;;;;;55729:10;55715:25;;;;;;;:33;;;;;55711:58;;;12:1:-1;9;2:12;55711:58:0;55799:10;55778:20;55835:17;:15;:17::i;:::-;55818:34;;55861:19;;:::i;:::-;55881:20;55896:4;55881:14;:20::i;:::-;55915:7;;;55910:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;55910:19:0;;;;;;;;;;;:38;;:47;;;55997:4;;;;55971:7;;55966:13;;;;;;;;:19;;;;;;;;:27;;;;:35;;;;;;;;56060:7;;56055:13;;;;;;;;:19;;;;;;;;:27;;;;56010:42;;;55999:1;56010:34;;;:42;;;;;:72;56122:4;;56096:7;;56091:13;;;;;;;;:19;;;;;;;;;:27;;:35;;;;;;;;56161:14;;55861:40;;-1:-1:-1;56154:28:0;;56161:14;55861:40;;56177:4;;;;;56154:6;:28::i;:::-;56137:14;:45;56199:7;;;56227:1;56193:14;;;:5;:14;;;;;;;;-1:-1:-1;;;;;56193:20:0;;;;;;;;;;;;:31;;:35;;;56243:7;;56237:14;;;;;;;;:20;;;;;;;;:31;;:35;;;56287:7;;56281:14;;;;;;;;:20;;;;;;;;:34;;:38;;;56340:7;;;;;56332:15;56328:134;;;56380:7;;56373:4;;;;56359:29;;-1:-1:-1;;;;;56359:13:0;;;56373:14;;;;56359:29;;;;;;;;;56373:14;56359:13;:29;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;56410:1:0;56400:7;:11;56328:134;;;56457:4;;;;56443:19;;-1:-1:-1;;;;;56443:13:0;;;:19;;;;;;;;;56457:4;56443:13;:19;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56443:19:0;56328:134;56492:7;;56507:4;;;;56513:14;;;;:5;56507:4;56513:14;;;;;;;-1:-1:-1;;;;;56513:20:0;;;;;;;;;;;;:36;;;56482:73;;;;;;;;;;;;;;;;56551:3;56482:73;;;;;;;;;;;;;;;-1:-1:-1;;;;;56570:11:0;;;56598:1;56570:11;;;:5;:11;;;;;:18;;;;:30;56566:92;;-1:-1:-1;;;;;56622:11:0;;;;;;;:5;:11;;;;;:18;;;;;56611:47;;56622:18;;56651:3;56642:1;56644;56642:4;;;;56648:2;56642:8;:12;;;;;;:15;;;;;;56611:10;:47::i;:::-;56667:9;:7;:9::i;:::-;;55665:1019;;;:::o;51363:2562::-;51431:10;51464:9;51493:7;51486:15;;51482:38;;;12:1:-1;9;2:12;51482:38:0;51549:7;;51539:18;;;;:9;:18;;;;;;51533:3;:24;51529:57;;;12:1:-1;9;2:12;51529:57:0;-1:-1:-1;;;;;51602:18:0;;;;51601:50;;-1:-1:-1;;;;;;51624:13:0;;;;;;:5;:13;;;;;:21;;;:26;51601:50;51600:69;;;;-1:-1:-1;51661:7:0;;-1:-1:-1;;;;;51655:13:0;;;51661:7;;51655:13;;51600:69;51595:113;;;51691:7;;-1:-1:-1;;;;;51691:7:0;;-1:-1:-1;51595:113:0;-1:-1:-1;;;;;51719:11:0;;;51747:1;51719:11;;;:5;:11;;;;;:18;;;;51716:121;;-1:-1:-1;;;;;51760:11:0;;;;;;;:5;:11;;;;;:18;;:27;;-1:-1:-1;;;;;;51760:27:0;;;;;;;;;;51716:121;;;-1:-1:-1;;;;;51819:11:0;;;;;;;:5;:11;;;;;:18;;;;;-1:-1:-1;51716:121:0;-1:-1:-1;;;;;51857:11:0;;;;;;:5;:11;;;;;:21;51853:66;;-1:-1:-1;;;;;51892:11:0;;;;;;:5;:11;;;;;51916:3;51892:27;;51853:66;-1:-1:-1;;;;;51975:11:0;;51928:17;51975:11;;;:5;:11;;;;;:19;;;51967:7;;:27;51963:83;;;52029:7;;-1:-1:-1;;;;;52007:11:0;;;;;;:5;:11;;;;;:19;;:29;51963:83;52070:7;;52096:1;52065:13;;;:4;:13;;;;;;;;-1:-1:-1;;;;;52065:19:0;;;;;;;;;:30;;;:32;52062:206;;52142:7;;52137:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;52137:19:0;;;;;;;;;:30;;;;52107:27;;;;;52173:3;52169;52137:35;;;:39;;;;-1:-1:-1;52103:156:0;;;12:1:-1;9;2:12;52103:156:0;-1:-1:-1;52243:4:0;52103:156;52286:14;52303:17;:15;:17::i;:::-;52334:7;;;52329:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;52329:19:0;;;;;;;;;;;:30;;;;:39;;;;;;52430:7;;52425:13;;;;;;;;:19;;;;;;;;:30;;;;52377:45;;;:37;;;;:45;;;;;:78;52473:7;;52468:13;;;;;;;;:19;;;;;;;;:34;;;52286;;-1:-1:-1;52465:97:0;;52524:7;;52519:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;52519:19:0;;;;;;;;;:34;;:43;;;52465:97;52577:7;;;52572:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;52572:19:0;;;;;;;;;;;:38;;:47;;;52647:7;;52631:24;;:15;:24;;;;;:37;;;;;;52677:14;:40;;52714:3;52709:2;52702:9;;:15;;;52677:40;;;;;;52727:7;:40;;52760:1;52752:9;;:15;;;52727:40;;;52777:8;:40;;52810:1;52802:9;;:15;;;;52777:40;;;;;52833:18;;;52829:568;;52875:25;52886:6;52894:5;52875:10;:25::i;:::-;52918:12;52913:167;;52947:19;52969:14;52976:6;52969;:14::i;:::-;52947:36;-1:-1:-1;;;;;;53001:25:0;;;52998:70;;53045:23;53056:11;53045:10;:23::i;:::-;52913:167;;53096:29;53112:6;53119:5;53096:15;:29::i;:::-;53153:7;;53176:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;53145:197:0;;;53176:19;;;;;;;;;:30;;;53208:14;;;:5;:14;;;;;:20;;;;;;;;:36;;;;;53246:5;:11;;;;;;:20;;;;53268:24;;;;53294;;;;53320:21;;53145:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53367:18;53378:6;53367:10;:18::i;:::-;53442:7;;;53429:21;;;;:12;:21;;;;;;;;;;53451:1;53429:23;53407:45;;53503:7;;53490:21;;;;;;53461:4;:13;;;;;-1:-1:-1;;;;;53461:19:0;;;;;;;;;:50;53539:7;;53529:18;;:9;:18;;;;53524:3;:23;53520:281;;53597:7;;;53584:21;;;;:12;:21;;;;;;;;;53559:15;:24;;;;;:46;53649:7;;53639:18;;:9;:18;;;;53658:10;53639:29;53621:3;53625:11;53621:15;53620:49;53616:175;;;53711:7;;53701:18;;;;:9;:18;;;;;;;53720:10;53701:29;53682:48;;53616:175;;;53767:7;;53757:18;;;;:9;:18;;;;;53776:3;53780:11;53776:15;53757:34;;53616:175;53811:31;53822:4;53828:6;53836:5;53811:10;:31::i;:::-;53894:7;;53872:21;;;;:12;:21;;;;;;;;;;53858:59;;-1:-1:-1;;;;;53858:59:0;;;;;;;;;;53913:3;53858:59;;;;;;;;;;;;;;;51363:2562;;;;;:::o;10574:30::-;;;-1:-1:-1;;;;;10574:30:0;;:::o;39873:45::-;;;;;;;;;;;;;:::o;6981:92::-;7059:6;7052:13;;;;;;;-1:-1:-1;;7052:13:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7027;;7052;;7059:6;;7052:13;;7059:6;7052:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6981:92;;:::o;43332:505::-;43399:7;43418:11;43432:63;39109:5;43441:16;:14;:16::i;:::-;:26;;;;;-1:-1:-1;;;;;43469:25:0;;;;;;:16;:25;;;;;;43441:26;;;;43432:7;:63::i;:::-;43418:77;;43515:1;43509:3;:7;43506:33;;;43538:1;43531:8;;;;;43506:33;43600:14;:12;:14::i;:::-;43597:45;;43641:1;43634:8;;;;;43597:45;43683:14;:12;:14::i;:::-;-1:-1:-1;;;;;43656:18:0;;;;;;:9;:18;;;;;;:24;;:41;43653:176;;;43732:2;43719:10;;:15;;;;;;43712:22;;;;;43653:176;43815:14;:12;:14::i;:::-;-1:-1:-1;;;;;43788:18:0;;;;;;:9;:18;;;;;;43770:10;;43783:2;43770:15;;:36;:42;;:59;;;;43653:176;43332:505;;;;;:::o;9978:497::-;10115:12;10087:8;-1:-1:-1;;;;;1352:22:0;;1344:31;;12:1:-1;9;2:12;1344:31:0;10279:12;;;:54:::1;;-1:-1:-1::0;10307:10:0::1;10295:23;::::0;;;:11:::1;:23;::::0;;;;;;;-1:-1:-1;;;;;10295:33:0;::::1;::::0;;;;;;;;:38;10279:54:::1;10271:63;;12:1:-1;9::::0;2:12:::1;10271:63:0;10359:10;10347:23;::::0;;;:11:::1;:23;::::0;;;;;;;-1:-1:-1;;;;;10347:33:0;::::1;::::0;;;;;;;;;;:43;;;10406:39;;;;;;;10347:33;;10359:10;10406:39:::1;::::0;;;;;;;;;::::1;-1:-1:-1::0;10463:4:0::1;::::0;9978:497;-1:-1:-1;;;9978:497:0:o;62717:359::-;62794:7;;62870;62866:172;;62909:3;62894:14;;;:18;;62890:22;;62866:172;;;62931:4;62937:1;62931:7;62928:110;;;62972:3;62957:14;;;:18;;62928:110;62994:4;63000:1;62994:7;62991:47;;;-1:-1:-1;63035:3:0;63031:1;63020:12;;:18;62991:47;63065:3;-1:-1:-1;62717:359:0;;;;;:::o;13553:116::-;10862:7;;-1:-1:-1;;;;;10862:7:0;10848:10;:21;10841:29;;;;13633:16:::1;:28:::0;;-1:-1:-1;;13633:28:0::1;13652:9:::0;::::1;13633:28:::0;;;::::1;::::0;;13553:116::o;42513:111::-;42566:7;42592:24;42610:4;42592:9;:24::i;:::-;42585:31;;42513:111;:::o;7279:100::-;7358:13;;7279:100;:::o;11397:159::-;11470:10;;-1:-1:-1;;;;;11470:10:0;11456;:24;11448:33;;12:1:-1;9;2:12;11448:33:0;11502:10;;;;11492:20;;-1:-1:-1;;;;;;11492:20:0;;;-1:-1:-1;;;;;11502:10:0;;11492:20;;;;11523:25;;;11397:159::o;47842:42::-;;;;;;;;;;;;;:::o;50246:29::-;;;;:::o;42283:218::-;13320:16;;42392:12;;13320:16;;13313:24;;;;42426:39:::1;42445:5;42452:3;42457:7;42426:18;:39::i;:::-;42416:49;;42476:17;42480:3;42485:7;42476:3;:17::i;:::-;42283:218:::0;;;;;:::o;25906:888::-;26053:7;26118:1;26108:7;:11;:36;;;;;26143:1;26123:17;:21;26108:36;:60;;;;;26167:1;26148:16;:20;;;26108:60;:94;;;;-1:-1:-1;15583:7:0;26172:30;;;;;26108:94;26100:103;;12:1:-1;9;2:12;26100:103:0;26266:19;26262:46;;-1:-1:-1;26307:1:0;26300:8;;26262:46;26371:30;;;15583:7;26371:30;26367:108;;;26458:17;26423:32;26431:7;26440:14;26423:7;:32::i;:::-;:52;;;;;;26416:59;;;;26367:108;26488:14;26513:15;26539:13;26555:42;26563:14;26579:17;26555:7;:42::i;:::-;26539:58;;26630:61;26636:5;26643:17;26662:16;15583:7;26630:5;:61::i;:::-;26608:83;;-1:-1:-1;26608:83:0;-1:-1:-1;26702:12:0;26717:37;;;:24;26725:7;26608:83;26717:7;:24::i;:::-;:37;;26772:14;;;;-1:-1:-1;;;;;25906:888:0;;;;;;;:::o;43068:252::-;43192:10;43126:12;43182:21;;;:9;:21;;;;;;43174:39;;43205:7;43174;:39::i;:::-;43160:10;43150:21;;;;:9;:21;;;;;;;;:63;;;;43234:34;;-1:-1:-1;;;43234:34:0;;;;;;;;;;;;;;;;;:4;;:13;;:34;;;;;43150:21;;43234:34;;;;;;;;;:4;:34;;;2:2:-1;;;;27:1;24;17:12;2:2;43234:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43234:34:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43234:34:0;43284:28;;;43292:10;43284:28;;43234:34;43284:28;;;;;;;43234:34;;-1:-1:-1;43284:28:0;;;;;;;;;;;43068:252;;;:::o;7181:92::-;7255:10;;;;7181:92;:::o;29944:491::-;30040:7;30049:5;30077:22;30131:5;30102:34;;30123:5;30102:26;;:18;30105:6;30113;30102:2;:18::i;:::-;:26;:34;;;;;;30077:59;;30147:15;30165:41;30191:14;30165:25;:41::i;:::-;30147:59;-1:-1:-1;15635:2:0;30224:26;;;;;30217:34;;;;30349:66;30393:9;15682:3;30377:25;30358:45;;:14;:45;;30405:9;30349:8;:66::i;:::-;30341:86;-1:-1:-1;30417:9:0;-1:-1:-1;;29944:491:0;;;;;;;;:::o;47784:51::-;;;;;;;;;;;;;:::o;27441:1067::-;27583:7;27648:1;27638:7;:11;:36;;;;;27673:1;27653:17;:21;27638:36;:60;;;;;27697:1;27678:16;:20;;;27638:60;:94;;;;-1:-1:-1;15583:7:0;27702:30;;;;;27638:94;:120;;;;;27751:7;27736:11;:22;;27638:120;27630:129;;12:1:-1;9;2:12;27630:129:0;27819:16;27815:43;;-1:-1:-1;27857:1:0;27850:8;;27815:43;27945:7;27930:11;:22;27926:65;;;-1:-1:-1;27974:17:0;27967:24;;27926:65;28054:30;;;15583:7;28054:30;28050:105;;;28148:7;28106:39;28114:17;28133:11;28106:7;:39::i;28050:105::-;28168:14;;28235:21;;;28289:51;28235:7;:21;15583:7;28323:16;28289:5;:51::i;:::-;28267:73;;-1:-1:-1;28267:73:0;-1:-1:-1;28351:13:0;28367:34;28375:17;28267:73;28367:7;:34::i;:::-;28351:50;-1:-1:-1;28428:30:0;;;;;;28494:6;28477:13;;;28494:6;28476:24;;;;;;27441:1067;-1:-1:-1;;;;;;;;;;27441:1067:0:o;40072:29::-;;;;:::o;49631:57::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;70138:895::-;70200:14;70215:9;70234:12;70249:17;:15;:17::i;:::-;70234:32;;70273:13;70288:3;70273:18;;70295;70334:4;70324:8;;:14;70320:529;;;70362:7;:10;-1:-1:-1;;;;;70354:18:0;;;70362:10;;70354:18;70350:194;;;70394:1;70386:9;;70350:194;;;70431:10;;-1:-1:-1;;;;;70425:16:0;;;70431:10;;70425:16;70422:122;;;70462:1;70455:8;;70422:122;;;70499:10;;-1:-1:-1;;;;;70493:16:0;;;70499:10;;70493:16;70490:54;;;70531:1;70523:9;;70490:54;-1:-1:-1;70561:11:0;;70320:529;;;70611:8;;39109:5;70595:4;:12;:24;70591:258;;;70643:4;:7;-1:-1:-1;;;;;70635:15:0;;;70643:7;;70635:15;70631:185;;;70672:1;70664:9;;70631:185;;;70709:7;;-1:-1:-1;;;;;70703:13:0;;;70709:7;;70703:13;70700:116;;;70737:1;70730:8;;70700:116;;;70774:7;;-1:-1:-1;;;;;70768:13:0;;;70774:7;;70768:13;70765:51;;;70803:1;70795:9;;70765:51;-1:-1:-1;70833:8:0;;70591:258;70865:1;70859:5;:7;70855:166;;;70888:32;70903:5;70909:10;70888:14;:32::i;:::-;70878:42;;70938:12;70951:5;70938:19;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;70855:166:0;;;70989:1;70980:10;;71008:5;71001:12;;70855:166;70138:895;;;;;;:::o;47610:29::-;;;;:::o;39984:46::-;;;;;;;;;;;;;:::o;40108:47::-;;;;;;;;;;;;;:::o;47668:22::-;;;;:::o;31677:944::-;31752:7;16083:35;31779:10;:21;;31772:29;;;;31814:11;;31875:12;-1:-1:-1;;;31852:20:0;;31875:12;31852:35;;;;;31840:47;;-1:-1:-1;;;31996:1:0;:12;31992:156;;32025:11;32039:22;-1:-1:-1;;;32049:1:0;:11;32039:9;:22::i;:::-;32076:11;;-1:-1:-1;;;32121:15:0;;;-1:-1:-1;32076:11:0;;;;;-1:-1:-1;31992:156:0;-1:-1:-1;;;32256:1:0;:11;32252:305;;;15682:3;32284:262;32314:5;;;;32284:262;;-1:-1:-1;;;32350:5:0;;;32349:17;32345:21;;-1:-1:-1;;;32406:1:0;:12;32402:129;;32449:1;32443:7;;;;;32509:1;32505;:5;32497:14;;15538:1;32497:14;;32490:21;;;;32402:129;-1:-1:-1;;32321:3:0;32284:262;;;;32252:305;16453:33;16370;32576:19;;:37;;31677:944;-1:-1:-1;;;;;31677:944:0:o;50047:25::-;;;;;;;;;;;;-1:-1:-1;;;;;50047:25:0;;-1:-1:-1;50047:25:0;:::o;50114:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56696:681::-;56766:15;56794:14;56811:17;:15;:17::i;:::-;56874:7;;56839:11;56869:13;;;:4;:13;;;;;;;;-1:-1:-1;;;;;56869:19:0;;;;;;;;;:38;;;56794:34;;-1:-1:-1;56839:11:0;39109:5;;56853:55;;56794:34;;56853:6;:55::i;:::-;:65;;;;;;56839:79;;56937:1;56933:3;:5;56929:29;;;-1:-1:-1;56957:1:0;56929:29;57034:7;;56969:17;57029:13;;;:4;:13;;;;;;;;-1:-1:-1;;;;;57029:19:0;;;;;;;;;:27;;;57091:3;;57085;;39332:1;;57023:34;;:5;:34::i;:::-;56995:7;;56990:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;56990:19:0;;;;;;;;;:30;;;:67;56989:95;:99;;;;;57210:7;;57105:17;57204:14;;;:5;:14;;;;;;;;-1:-1:-1;;;;;57204:20:0;;;;;;;;;;;:34;;;;57170:31;;;;57136;;;;;57287:13;;;:4;:13;;;;;:19;;;;;;;;;:27;;;;57328:30;;;;;56989:99;;;;:105;;;;;-1:-1:-1;57124:43:0;;;:77;;;:114;;;;57256:113;;57263:6;;57271:97;;57278:36;;;:48;;;57364:3;;57360;57328:35;:39;;57271:6;:97::i;:::-;57256:6;:113::i;:::-;57249:120;56696:681;-1:-1:-1;;;;;;;56696:681:0:o;41289:238::-;41356:14;41400:49;41408:24;15583:7;41428:3;41408:7;:24::i;:::-;41434:14;41439:8;41434:4;:14::i;:::-;41400:7;:49::i;:::-;41383:67;-1:-1:-1;15583:7:0;41464:20;;;;41461:58;;;-1:-1:-1;15583:7:0;41289:238;;;:::o;68305:1821::-;68364:19;;:::i;:::-;68396:14;68413:17;:15;:17::i;:::-;68476:7;;68441:11;68471:13;;;:4;:13;;;;;;;;-1:-1:-1;;;;;68471:19:0;;;;;;;;;:38;;;68396:34;;-1:-1:-1;68441:11:0;39109:5;;68455:55;;68396:34;;68455:6;:55::i;:::-;:65;;;;;;68441:79;;68541:1;68535:3;:7;68531:130;;;68562:9;68558:67;68577:1;68575;:3;68558:67;;;68608:1;68603;68605;68603:4;;;;;;;;;;:6;68580:3;;68558:67;;;;68531:130;68679:1;68675:3;:5;68671:29;;;-1:-1:-1;68699:1:0;68671:29;68721:15;68808:3;68802;39332:1;68741:34;68762:4;68768:6;68741:20;:34::i;:::-;:60;:64;;;;;;:70;68721:90;;68825:17;68919:3;68913;39332:1;68855:31;68873:4;68879:6;68855:17;:31::i;:::-;:57;:61;;;;;69040:7;;68934:17;69034:14;;;:5;:14;;;;;;;;-1:-1:-1;;;;;69034:20:0;;;;;;;;;;;:34;;;;69000:31;;;;68966;;;;;69139:13;;;:4;:13;;;;;:19;;;;;;;;;:30;;;;69095:27;;;;;68855:61;;;;:67;;;;68845:77;;;-1:-1:-1;68954:43:0;;;:77;;;:114;;;;69175:3;69171;69139:35;;;:39;69095;;;69094:85;69090:205;;;69219:7;;69214:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;69214:19:0;;;;;;;;;:30;;;;69255:27;;;;;69207:76;;69250:3;69246;69214:35;;;:39;;69207:6;:76::i;:::-;69195:88;;69090:205;69319:9;69309:7;:19;69305:57;;;69353:9;69343:19;;69305:57;69389:9;69377;:21;69373:61;;;69425:9;69413:21;;69373:61;69455:16;;;69527:7;;69457:1;69521:14;;;:5;69455:4;69521:14;;;;;;;-1:-1:-1;;;;;69521:20:0;;;;;;;;;;;:36;;;;69559:1;69521:39;;;69514:4;;;:46;69581:36;;;;:39;;69574:4;;;:46;69641:39;;;;;:42;69634:4;;;:49;69704:4;;;:16;;;69817:13;;;:4;:13;;;;;:19;;;;;;;69636:1;69817:27;;69770:118;;69852:3;;69811:34;;:5;:34::i;:::-;69783:7;;69778:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;69778:19:0;;;;;;;;;:30;;;:67;69848:3;69777:74;:78;;;;;69862:7;;69857:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;69857:19:0;;;;;;;;;:27;;;69777:78;;;;69886:1;69857:30;69770:6;:118::i;:::-;69763:4;;;:125;69899:4;;;:14;;;69977:7;;-1:-1:-1;69972:13:0;;;:4;69763;69972:13;;;;;;;-1:-1:-1;;;;;69972:19:0;;;;;;;;;;;;;:27;;;70001:1;69972:30;69965:4;;;:37;70044:7;;;70036:15;70032:85;;70079:7;;70074:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;70074:19:0;;;;;;;;;:27;;;:39;;70116:1;70073:44;70066:4;;;:51;70032:85;68305:1821;;;;;;;;:::o;30475:678::-;30572:7;30581:5;30612:6;30602;:16;30599:76;;30640:35;30646:6;30654;30662:5;30669;30640;:35::i;:::-;30633:42;;;;;;30599:76;30686:22;30740:5;30711:34;;30732:5;30711:26;;:18;30714:6;30722;30711:2;:18::i;:::-;:26;:34;;;;;;30686:59;;30756:15;30774:41;30800:14;30774:25;:41::i;:::-;30756:59;-1:-1:-1;15635:2:0;30829:25;;;;30826:56;;;-1:-1:-1;30877:1:0;;-1:-1:-1;30877:1:0;;-1:-1:-1;30869:13:0;;-1:-1:-1;30869:13:0;30826:56;30893:12;30908:66;30952:9;15682:3;30936:25;30917:45;;:14;:45;;30964:9;30908:8;:66::i;:::-;30893:81;-1:-1:-1;30893:81:0;-1:-1:-1;;;30893:81:0;30992:54;;;;;;-1:-1:-1;;31069:29:0;:41;;-1:-1:-1;;30475:678:0;;;;;;;:::o;3927:89::-;3993:7;3988:12;;;;3987:24;;3927:89::o;50180:26::-;;;;:::o;74143:1590::-;74182:18;;:::i;:::-;74213:22;;:::i;:::-;74255:14;;74246:23;;74306:8;;74246:6;74297;;;:17;;;;74373:7;;-1:-1:-1;74357:24:0;;;:15;:24;;;;;;;74385:3;74383:1;74357:27;;:31;;;74348:6;;;:40;74408:31;;74399:6;;;:40;74459:7;;74450:6;;;:16;74501:6;;;:33;74561:21;;;:12;:21;;;;;;74552:6;;;:30;74603:6;;;:16;;;74663:18;;;:9;:18;;;;;;74654:6;;;:27;74714:24;;;:15;:24;;;;;;74705:6;;;:33;74765:15;;;:6;:15;;;;;;74756:7;;;:24;74817:2;;74843:17;:15;:17::i;:::-;74828:32;;74885:4;74873:8;;:16;74869:339;;;74906:9;74901:298;74920:1;74918;:3;74901:298;;;74954:4;74959:1;74954:7;;;;;;;;;-1:-1:-1;;;;;74954:7:0;74939:3;74943:1;74939:6;;;;;;;;;;:23;;;;;74978:1;74980;74978:3;74976:5;;75001;:14;75007:7;;75001:14;;;;;;;;;;;:23;75016:4;75021:1;75016:7;;;;;;;;;-1:-1:-1;;;;;75016:7:0;75001:23;;;;;;;;;;;75016:7;75001:23;:33;74994:3;74998:1;74994:6;;;;;;;;;;:40;75051:1;75049:3;;;75069;;-1:-1:-1;;75073:3:0;75069:8;;;;;;;;;;;75065:104;;75104:1;75095:3;75099:1;75095:6;;;;;;;;;;:10;75065:104;;;75143:26;75158:1;75160:8;;75143:14;:26::i;:::-;75136:3;75140:1;75136:6;;;;;;;;;;:33;75065:104;75186:1;75184:3;;;;74922;74901:298;;;;74869:339;75226:13;;75216:7;;;:23;75258:7;;75248;;;:17;75284:10;;75274:7;;;:20;75313:13;;75303:7;;;:23;75345:14;;75335:7;;;:24;75378:7;:5;:7::i;:::-;75368;;;:17;75404:14;:12;:14::i;:::-;75394:7;;;:24;75445:7;;;-1:-1:-1;;;;;75445:7:0;75427;;;:26;75472:6;;;;75462:7;;;:16;75513:7;;-1:-1:-1;;75513:9:0;;75497:26;;:15;75394:7;75497:26;;;;;;;;75487:7;;;:36;75565:21;;;:12;:21;;;;;:29;;75561:68;;;-1:-1:-1;75621:7:0;;75610:19;;;;:10;:19;;;;;;75561:68;75652:14;;75645:39;;75670:3;;75652:21;75675:8;75645:6;:39::i;:::-;75635:7;;;:49;-1:-1:-1;;75703:3:0;75693:7;;;:13;-1:-1:-1;75635:3:0;74143:1590;-1:-1:-1;74143:1590:0:o;49700:59::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47958:22::-;;;;:::o;71041:3094::-;71096:22;;:::i;:::-;71131:19;;:::i;:::-;71152:20;71167:4;71152:14;:20::i;:::-;-1:-1:-1;;;;;71208:11:0;;71183:22;71208:11;;;:5;:11;;;;;;;;:19;;;;;71262:7;;71257:13;;:4;:13;;;;;:19;;;;;;;;;:28;;71248:37;;71305:19;;;;;;:30;;;;71296:6;;;:39;71396:4;;;;;71366:27;;;;:34;;;71357:6;;;:43;;;;71418:6;;;:36;;;;71488:38;;;;71479:6;;;:47;;;;71563:19;;;;;;:27;;;71131:41;;-1:-1:-1;71208:19:0;71549:42;;71563:27;;71549:13;:42::i;:::-;71540:6;;;:51;-1:-1:-1;;;;;71619:11:0;;;;;;;:5;71540:6;71619:11;;;;;;:18;;;;;;;71602:6;;;:36;71673:20;;;;71664:6;;;:29;71734:11;;;;;;:24;;;;;71725:6;;;:33;71811:17;:15;:17::i;:::-;71849:7;;71843:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;71843:20:0;;;;;;;;;:34;;;71796:32;;-1:-1:-1;71843:42:0;;71839:409;;;71914:7;;71908:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;71908:20:0;;;;;;;;;;;:30;;71899:6;;;:39;71984:20;;;;;;;:33;;;71974:7;;;:43;71839:409;;;72078:7;;72072:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;72072:20:0;;;;;;;;;:34;;;-1:-1:-1;;72056:12:0;;:50;72053:195;;;72130:1;72121:6;;;:10;;;72190:7;;72184:14;;:5;72121:6;72184:14;;;;;;;-1:-1:-1;;;;;72184:20:0;;;;;;;;;:30;72174:7;;;:40;72053:195;72258:13;72303:24;72322:4;72303:18;:24::i;:::-;72283:7;;;72282:45;;;;;-1:-1:-1;72367:23:0;72282:45;72367:13;:23::i;:::-;72357:7;;;:33;72448:7;;72442:14;;;;:5;72357:7;72442:14;;;;;;;-1:-1:-1;;;;;72442:20:0;;;;;;;;;;;:34;;;72432:7;;;:44;72533:20;;;:4;:20;;;;;:26;;;;;;;;:36;;;72519:51;;72533:36;;;;;72519:13;:51::i;:::-;72509:7;;;:61;72599:7;;72594:13;;;;:4;72509:7;72594:13;;;;;;;-1:-1:-1;;;;;72594:19:0;;;;;;;;;:34;;;72584:7;;;:44;72649:14;72594:19;72649:8;:14::i;:::-;72639:7;;;:24;72729:7;;72724:13;;;;:4;72639:7;72724:13;;;;;;;-1:-1:-1;;;;;72724:19:0;;;;;;;;;:27;;;72714:7;;;:37;72799:15;72724:19;72799:9;:15::i;:::-;72789:7;;;:25;-1:-1:-1;;;;;72874:15:0;;;;;;:9;72789:7;72874:15;;;;;;;;72864:7;;;:25;72949:16;;;:10;:16;;;;;;72939:7;;;:26;73039:7;;73034:13;;:4;:13;;;;;:19;;;;;;;;;:27;;;;73063:1;73034:30;73024:7;;;:40;73109:4;;;;73099:7;;;:14;73184:4;;;;73174:7;;;:14;73259:4;;;;73249:7;;;:14;73334:4;;;;73324:7;;;:14;73409:4;;;;73399:7;;;:14;73491:19;;;;;;;;73111:1;73491:30;;73484:54;;73528:3;73524;73491:36;;;:40;73109:1;73535;73533:4;;73484:54;73474:7;;;:64;73560:4;;;;73550:7;;;:14;-1:-1:-1;;;73821:17:0;73833:4;73821:11;:17::i;:::-;73793:7;;;73781:57;;;;;;-1:-1:-1;73781:57:0;;-1:-1:-1;73781:57:0;-1:-1:-1;73870:24:0;73781:57;73870:13;:24::i;:::-;73860:7;;;:34;73949:17;73961:4;73949:11;:17::i;:::-;73939:7;;;:27;74038:4;;;;73939:3;:7;74028;;;:14;-1:-1:-1;;;;;;;71041:3094:0;;;:::o;46956:307::-;47017:14;47043:11;47057:22;47065:9;47076:2;47057:7;:22::i;:::-;47043:36;;47107:28;47115:14;;47131:3;47107:7;:28::i;:::-;47090:14;:45;47205:7;;47198:15;;;;:6;:15;;;;;;47190:29;;47215:3;47190:7;:29::i;:::-;47179:7;;47172:15;;;;:6;:15;;;;;:47;47239:16;:14;:16::i;:::-;47230:25;;46956:307;;:::o;3562:194::-;3632:5;3641:1;3636;3632:5;;3631:11;3669:80;3680:1;3676;:5;3669:80;;;3702:1;3698:5;;3736:1;3731;3727;3723;:5;;;;;;:9;3722:15;;;;;;3718:19;;3669:80;;66802:139;66857:7;66879:4;66875:58;;;-1:-1:-1;66901:1:0;66894:8;;66875:58;-1:-1:-1;66932:1:0;66925:8;;39841:25;;;;:::o;15597:40::-;15635:2;15597:40;:::o;7385:119::-;-1:-1:-1;;;;;7476:20:0;7450:7;7476:20;;;:11;:20;;;;;;;7385:119::o;15644:41::-;15682:3;15644:41;:::o;49910:47::-;;;;;;;;;;;;;:::o;10611:33::-;;;-1:-1:-1;;;;;10611:33:0;;:::o;66949:668::-;67112:7;;67030;67107:13;;;:4;:13;;;;;;;;-1:-1:-1;;;;;67107:19:0;;;;;;;;;67211:34;;;;67107:37;;;;;67030:7;;67259:18;;67256:288;;-1:-1:-1;;67310:22:0;;67294:239;67339:14;67334:1;:19;67294:239;;67413:1;67390:20;;;;;;;;;;;:24;67387:131;;67450:20;;;;;;;;;;;;;-1:-1:-1;67493:5:0;;67387:131;-1:-1:-1;;67355:11:0;67294:239;;;;67256:288;67573:7;;67568:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;67568:19:0;;;;;;;;;:30;;;67561:48;;67600:8;67561:6;:48::i;:::-;67554:55;66949:668;-1:-1:-1;;;;;;66949:668:0:o;44816:609::-;44886:14;44902;44918:12;44943:16;44962:33;44970:19;44978:6;44986:2;44970:7;:19::i;:::-;44991:3;44962:7;:33::i;:::-;44943:52;;45067:15;45085:38;45096:26;45104:7;;45113:8;45096:7;:26::i;:::-;45085:10;:38::i;:::-;45067:56;;45134:16;45153:33;45161:19;45169:6;45177:2;45161:7;:19::i;45153:33::-;45134:52;;45245:66;45269:13;;45284:7;;45293;45302:8;45245:23;:66::i;:::-;45236:75;;45331:43;45339:26;45347:8;45357:7;45339;:26::i;:::-;45367:6;45331:7;:43::i;:::-;45322:52;;45392:25;45400:6;45408:8;45392:7;:25::i;:::-;44816:609;;;;-1:-1:-1;;;;;44816:609:0:o;47900:48::-;;;;;;;;;;;;;:::o;7079:96::-;7159:8;7152:15;;;;;;;;-1:-1:-1;;7152:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7127:13;;7152:15;;7159:8;;7152:15;;7159:8;7152:15;;;;;;;;;;;;;;;;;;;;;;;;64845:864;-1:-1:-1;;;;;64988:11:0;;64900:18;64988:11;;;:5;:11;;;;;:19;;;;64900:18;;65067:13;65063:115;;65104:5;;-1:-1:-1;65120:48:0;;65063:115;65194:21;;;;:9;:21;;;;;;65190:3;:25;65186:516;;;65291:1;65259:16;;;:4;:16;;;;;;;;-1:-1:-1;;;;;65259:22:0;;;;;;;;;:31;65239:4;;-1:-1:-1;65259:33:0;;;;65258:99;;-1:-1:-1;65325:16:0;;;;:4;:16;;;;;;;;-1:-1:-1;;;;;65325:22:0;;;;;;;;;:31;65296:27;;;:15;:27;;;;;;;:60;;65258:99;:166;;;;-1:-1:-1;65388:16:0;;;;:4;:16;;;;;;;;-1:-1:-1;;;;;65388:22:0;;;;;;;;;:31;65360:27;;;:15;:27;;;;;;;65420:3;65360:59;;;:63;65258:166;65254:439;;;-1:-1:-1;65445:16:0;;;;:4;:16;;;;;;;;-1:-1:-1;;;;;65445:22:0;;;;;;;;;:32;;;;65589:31;;65561:27;;;:15;:27;;;;;;65445:32;;;;;;;;65561:59;;;:61;65651:30;65561:61;65445:16;65651:13;:30::i;:::-;65635:46;;65254:439;;64845:864;;;;;:::o;63084:1023::-;63134:7;;63129:13;;;;:4;:13;;;;;;;;63143:10;63129:25;;;;;;;:33;;;;;63125:58;;;12:1:-1;9;2:12;63125:58:0;63213:10;63192:20;63247:17;:15;:17::i;:::-;63352:8;;63232:32;;-1:-1:-1;63315:3:0;;-1:-1:-1;;63336:12:0;;:24;63332:298;;;63385:4;:7;63372;:20;;-1:-1:-1;;;;;63385:7:0;;;-1:-1:-1;;;;;;63372:20:0;;;;;;;63416:7;;63403:10;:20;;63416:7;;;63403:20;;;;;;;;;63447:7;;63434:10;:20;;63447:7;;;;63434:20;;;;;-1:-1:-1;63465:105:0;63482:1;63480;:3;63465:105;;;63520:1;63502:4;63507:1;63502:7;;;;;;;;:20;;-1:-1:-1;;;;;;63502:20:0;-1:-1:-1;;;;;63502:20:0;;;;;;;;;;-1:-1:-1;63535:12:0;63548:1;63535:15;;;;;;;;;;;;;:23;;;;;:15;;;;:23;;;;;;;;;;;;;;;;-1:-1:-1;63485:3:0;63465:105;;;-1:-1:-1;63580:8:0;:15;;;63612:8;;63600:11;:20;63332:298;63655:4;63645:8;;:14;63641:235;;;63685:7;:10;-1:-1:-1;;;;;63677:18:0;;;63685:10;;63677:18;63673:194;;;-1:-1:-1;63717:1:0;63673:194;;;63754:10;;-1:-1:-1;;;;;63748:16:0;;;63754:10;;63748:16;63745:122;;;-1:-1:-1;63785:1:0;63745:122;;;63822:10;;-1:-1:-1;;;;;63816:16:0;;;63822:10;;63816:16;63813:54;;;-1:-1:-1;63854:1:0;63813:54;63895:1;63889:5;:7;63888:33;;;;;63901:12;63914:5;63901:19;;;;;;;;;;;;;;;;;;;;;;;;63900:20;63888:33;63884:216;;;63933:11;63947:33;63962:5;63968:11;;63947:14;:33::i;:::-;63933:47;;64002:20;64009:8;;64018:3;64002:6;:20::i;:::-;63991:8;:31;64055:4;64033:12;64046:5;64033:19;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;64070:4;-1:-1:-1;;;;;64070:13:0;:18;64084:3;64070:18;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;64070:18:0;63884:216;;63084:1023;;;:::o;44371:228::-;44417:7;44439:13;;44456:1;44439:18;44436:53;;;-1:-1:-1;44479:10:0;44472:17;;44436:53;44501:87;44509:63;44517:45;44525:28;44533:7;;15583;44525:28;;:7;:28::i;:::-;44555:6;;;;44517:7;:45::i;:::-;44564:7;44509;:63::i;:::-;44574:13;;44501:7;:87::i;39723:60::-;;;;;;:::o;49769:39::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;49769:39:0;;;;;;;:::o;42688:314::-;42744:12;42778:32;42795:4;42802:7;42778:8;:32::i;:::-;42863:10;42853:21;;;;:9;:21;;;;;;42768:42;;-1:-1:-1;42845:39:0;;42876:7;42845;:39::i;:::-;42831:10;42821:21;;;;:9;:21;;;;;:63;39109:5;42926:16;:14;:16::i;:::-;:26;;;;;42912:10;42895:28;;;;:16;:28;;;;;;;;;42926:26;;;;42895:57;;;42968:26;;;;;;;;;;;;;;;;;;;;;;;;42688:314;;;:::o;65717:524::-;65766:7;;65761:13;;;;:4;:13;;;;;;;;65775:10;65761:25;;;;;;;:33;;;;;65757:56;;;12:1:-1;9;2:12;65757:56:0;65843:10;65822:20;;;;66010:17;65843:10;66010:11;:17::i;:::-;65966:61;;-1:-1:-1;65966:61:0;;-1:-1:-1;65966:61:0;-1:-1:-1;65966:61:0;-1:-1:-1;66041:15:0;;;;;66040:26;;;66061:4;66060:5;66040:26;66036:198;;;66078:16;;;;:4;:16;;;;;;;;-1:-1:-1;;;;;66078:22:0;;;;;;;;;;:32;;:39;;-1:-1:-1;;66078:39:0;;;;;66196:28;66078:22;;66196:28;;;;;66210:13;;66196:28;66078:16;66196:28;66210:13;66078:22;66196:28;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;66196:28:0;65717:524;;;;;:::o;42083:188::-;13320:16;;42173:12;;13320:16;;13313:24;;;;42207:28:::1;42222:3;42227:7;42207:14;:28::i;:::-;42197:38;;42246:17;42250:3;42255:7;42246:3;:17::i;50321:44::-:0;;;;;;;;;;;;;:::o;47726:23::-;;;;:::o;50372:50::-;;;;;;;;;;;;;:::o;12294:35::-;;;;;;:::o;15508:31::-;15538:1;15508:31;:::o;40037:28::-;;;;:::o;49980:22::-;;;;;;;;;67629:664;67786:7;;67707;67781:13;;;:4;:13;;;;;;;;-1:-1:-1;;;;;67781:19:0;;;;;;;;;67882:34;;;;67781;;;;;67707:7;;67930:18;;67927:282;;-1:-1:-1;;67981:22:0;;67965:233;68010:14;68005:1;:19;67965:233;;68081:1;68061:17;;;;;;;;;;;:21;68058:125;;68118:17;;;;;;;;;;;;;-1:-1:-1;68158:5:0;;68058:125;-1:-1:-1;;68026:11:0;67965:233;;;;67927:282;68244:7;;68239:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;68239:19:0;;;;;;;;;:27;;;68226:59;;68233:34;;:5;:34::i;:::-;68269:15;68275:8;68269:5;:15::i;39812:22::-;;;;:::o;47275:327::-;47341:14;47376:21;47389:7;47376:12;:21::i;:::-;47367:30;;47408:11;47422:32;47430:19;47438:6;47446:2;47430:7;:19::i;:::-;47451:2;47422:7;:32::i;:::-;47408:46;;47482:28;47490:14;;47506:3;47482:7;:28::i;:::-;47465:14;:45;47580:7;;47573:15;;;;:6;:15;;;;;;47565:29;;47590:3;47565:7;:29::i;:::-;47554:7;;47547:15;;;;:6;:15;;;;;:47;-1:-1:-1;47275:327:0;;-1:-1:-1;47275:327:0:o;7510:148::-;-1:-1:-1;;;;;7620:20:0;;;7594:7;7620:20;;;:11;:20;;;;;;;;:30;;;;;;;;;;;;;7510:148::o;15547:43::-;15583:7;15547:43;:::o;49842:45::-;;;;;;;;;;;;;:::o;39925:52::-;;;;;;;;;;;;;:::o;45998:344::-;46155:13;;46170:7;;46179:6;;46067:14;;;;;;46133:62;;46155:13;46170:7;46179:6;;46187:7;46133:21;:62::i;:::-;46124:71;;46215:42;46223:24;46231:6;46239:7;46223;:24::i;:::-;46249:7;46215;:42::i;:::-;46206:51;;46275:33;46283:19;46291:6;46299:2;46283:7;:19::i;46275:33::-;46320:14;;;;;45998:344;;-1:-1:-1;;45998:344:0:o;43907:452::-;43955:14;43990:23;44002:10;43990:11;:23::i;:::-;44068:10;44057:22;;;;:10;:22;;;;;;43981:32;;-1:-1:-1;44049:39:0;;43981:32;44049:7;:39::i;:::-;44035:10;44024:22;;;;:10;:22;;;;;:64;44123:13;;44115:30;;44138:6;44115:7;:30::i;:::-;44099:13;:46;44177:10;;44169:27;;44189:6;44169:7;:27::i;:::-;44156:10;:40;39109:5;44239:16;:14;:16::i;:::-;:26;;;;;44224:10;44207:28;;;;:16;:28;;;;;;44239:26;;;;44207:58;;;44276:27;;44224:10;;44276:27;;;;;44296:6;;44276:27;44207:28;44276:27;44296:6;44224:10;44276:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;44319:32:0;;;44332:10;44319:32;;;;;;;;;;;;;;;;;;;;;43907:452;:::o;11140:166::-;10862:7;;-1:-1:-1;;;;;10862:7:0;10848:10;:21;10841:29;;;;11255:7:::1;::::0;-1:-1:-1;;;;;11240:22:0;;::::1;11255:7:::0;::::1;11240:22;;11232:31;;12:1:-1;9::::0;2:12:::1;11232:31:0;11274:10;:24:::0;;-1:-1:-1;;;;;;11274:24:0::1;-1:-1:-1::0;;;;;11274:24:0;;;::::1;::::0;;;::::1;::::0;;11140:166::o;66249:545::-;66328:7;;66301;66323:13;;;:4;:13;;;;;;;;-1:-1:-1;;;;;66323:19:0;;;;;;;;;:27;;;;;66319:61;;;-1:-1:-1;66369:1:0;66362:8;;66319:61;66388:14;66405:17;:15;:17::i;:::-;66476:7;;66431:16;66463:21;;;:12;:21;;;;;;66388:34;;-1:-1:-1;66431:16:0;66463:29;;66459:72;;;-1:-1:-1;66523:7:0;;66512:19;;;;:10;:19;;;;;;66459:72;66576:7;;66548:13;66571;;;:4;:13;;;;;;;;-1:-1:-1;;;;;66571:19:0;;;;;;;;;:30;;;;66611:27;;;;;66564:79;;66606:3;66603:2;66571:34;;;:38;;66641:1;66611:31;66564:6;:79::i;:::-;66716:14;;66548:95;;-1:-1:-1;66674:16:0;;;;66734:3;;66716:21;66702:11;:35;66699:69;;;66757:1;66750:8;;;;;;;;66699:69;-1:-1:-1;66783:1:0;;66249:545;-1:-1:-1;;;;;66249:545:0:o;54802:853::-;54890:7;;54837:20;54885:13;;;:4;:13;;;;;;;;54860:10;54885:19;;;;;;;;:27;;;;;54881:55;;;12:1:-1;9;2:12;54881:55:0;54947:14;54964:17;:15;:17::i;:::-;55041:7;;54992:16;55028:21;;;:12;:21;;;;;;54947:34;;-1:-1:-1;54992:16:0;55028:31;;55024:80;;;-1:-1:-1;55096:7:0;;55085:19;;;;:10;:19;;;;;;55024:80;55146:7;;55117:13;55141;;;:4;:13;;;;;;;;-1:-1:-1;;;;;55141:19:0;;;;;;;;;:30;;;;55181:27;;;;;55133:81;;55175:3;55172:2;55141:33;;;:37;;55211:1;55181:31;55133:7;:81::i;:::-;55290:14;;55117:97;;-1:-1:-1;55246:16:0;;;;55308:3;;55290:21;55276:11;:35;55273:61;;;12:1:-1;9;2:12;55273:61:0;55360:7;;;55355:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;55355:19:0;;;;;;;;;:27;;:34;;-1:-1:-1;;55355:34:0;55385:4;55355:34;;;55417:7;;55404:21;;:12;:21;;;;:31;;55400:80;;55463:7;;55450:21;;;;:12;:21;;;;;:30;;;55400:80;55512:7;;55501:19;;;;:10;:19;;;;;55523:16;;;55501:38;;55574:14;;55567:29;;55534:5;55567:6;:29::i;:::-;55550:14;:46;55607:20;;-1:-1:-1;;;;;55607:13:0;;;:20;;;;;55621:5;;55607:20;;;;55621:5;55607:13;:20;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55607:20:0;55638:9;:7;:9::i;39453:144::-;39109:5;39553:3;39579:10;39553:14;;39552:24;;;;39533:43;;;39453:144::o;51202:153::-;51264:7;51289:2;51286;:5;51282:65;;;-1:-1:-1;51309:7:0;;;51302:14;;51282:65;-1:-1:-1;51346:1:0;51339:8;;57389:517;57462:6;57458:441;57474:1;57472;:3;57458:441;;;-1:-1:-1;;;;;57499:11:0;;;;;;:5;:11;;;;;:20;;;:24;-1:-1:-1;57496:294:0;;;57544:15;57562:24;57573:4;57579:6;57562:10;:24::i;:::-;57544:42;-1:-1:-1;57608:11:0;;57605:170;;57649:7;;;57643:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;57643:20:0;;;;;;;;;;;:31;;:42;;;;;;57714:7;;57708:14;;;;;;;;:20;;;;;;;;:36;;:47;;;;;;57605:170;57496:294;;-1:-1:-1;;;;;57811:11:0;;;;;;;:5;:11;;;;;:18;;;;;;;57848:16;57844:43;;57882:5;;57844:43;57477:3;;57458:441;;54453:339;54521:7;;54489:4;54511:18;;;:9;:18;;;;;;54507:3;:22;54503:261;;;54564:8;54546:14;;:27;54542:213;;;-1:-1:-1;54621:7:0;;;54605:24;;;;:15;:24;;;;;;;;;54587:14;:49;;54633:3;54605:31;;;54587:49;;;;;-1:-1:-1;54659:11:0;;;54649:21;;;;54683:18;;;:9;:18;;;;;;54702:3;54708:11;54702:17;54683:36;;54732:11;;54542:213;-1:-1:-1;54779:5:0;54453:339;:::o;57914:1556::-;57983:10;;;58044:1419;58061:3;58059:1;:5;58044:1419;;;-1:-1:-1;;;;;58089:16:0;;58085:44;;58124:5;;58085:44;-1:-1:-1;;;;;58149:11:0;;;;;;:5;:11;;;;;:20;;;39257:1;-1:-1:-1;58149:38:0;;;58148:87;;-1:-1:-1;;;;;;58193:11:0;;;;;;:5;:11;;;;;:24;;;39257:1;-1:-1:-1;58148:87:0;:99;;;;;58241:5;58240:6;58148:99;58144:411;;;58267:15;58286:34;58297:4;58318:1;58314:3;58312:1;58303:10;;:14;;:16;;;;;;58286:10;:34::i;:::-;58267:53;-1:-1:-1;58342:11:0;;58339:170;;58383:7;;;58377:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;58377:20:0;;;;;;;;;;;:31;;:42;;;;;;58448:7;;58442:14;;;;;;;;:20;;;;;;;;:36;;:47;;;;;;58339:170;58535:4;58527:12;;58144:411;;-1:-1:-1;;;;;58573:11:0;;;;;;:5;:11;;;;;:24;;;39257:1;-1:-1:-1;58569:775:0;;58655:5;58651:644;;;58684:15;58703:34;58714:4;58735:1;58731:3;58729:1;58720:10;;:14;;58703:34;58684:53;-1:-1:-1;58765:11:0;;58762:195;;58810:7;;;58804:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;58804:20:0;;;;;;;;;;;:34;;:45;;;;;;58888:7;;58882:14;;;;;;;;:20;;;;;;;;:39;;:50;;;;;;58762:195;58651:644;;;;59003:15;59022:35;59033:4;59055:1;59051:3;59048:2;59039:11;;:15;;59022:35;59003:54;-1:-1:-1;59084:11:0;;59081:195;;59129:7;;;59123:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;59123:20:0;;;;;;;;;;;:34;;:45;;;;;;59207:7;;59201:14;;;;;;;;:20;;;;;;;;:39;;:50;;;;;;59081:195;58651:644;;59324:4;59313:15;;58569:775;59362:8;:25;;;-1:-1:-1;59380:7:0;;-1:-1:-1;;;;;59374:13:0;;;59380:7;;59374:13;59362:25;59358:53;;;59406:5;;59358:53;-1:-1:-1;;;;;59433:11:0;;;;;;;:5;:11;;;;;:18;;;;;;;;58066:3;58044:1419;;53933:264;-1:-1:-1;;;;;53999:11:0;;53980:7;53999:11;;;:5;:11;;;;;:20;;:25;;54023:1;53999:25;;;;;39257:1;54040:36;54039:72;;;;-1:-1:-1;;;;;;54080:11:0;;;54108:1;54080:11;;;:5;:11;;;;;:18;;;;:30;;54039:72;54035:127;;;-1:-1:-1;;;;;;54132:11:0;;;;;;;:5;:11;;;;;:18;;;;54125:25;;54035:127;-1:-1:-1;54187:1:0;53933:264;;;:::o;54205:240::-;-1:-1:-1;;;;;54257:11:0;;;;;;:5;:11;;;;;:24;;:29;;54285:1;54257:29;;;;;39257:1;54296:40;54295:76;;;;-1:-1:-1;;;;;;54340:11:0;;;54368:1;54340:11;;;:5;:11;;;;;:18;;;;:30;;54295:76;54291:147;;;-1:-1:-1;;;;;54394:11:0;;;54388:25;54394:11;;;54388:5;54394:11;;;;;;:18;;;;;;54388:25;;;:38;;:43;;54430:1;54388:43;;;54291:147;54205:240;:::o;59478:1248::-;59546:12;59561:17;:15;:17::i;:::-;59605:7;;59599:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;59599:20:0;;;;;;;;;:34;;;59546:32;;-1:-1:-1;59591:42:0;;59587:576;;;59684:7;;59678:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;59678:20:0;;;;;;;;;:30;;:38;;59645:71;;59587:576;;;59765:7;;59759:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;59759:20:0;;;;;;;;;:34;;;-1:-1:-1;;59743:12:0;;:50;59739:424;;;59847:7;;;59841:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;59841:20:0;;;;;;;;;;;:30;;59805:33;;;;:66;59888:7;;59882:14;;;;;;;;:20;;;;;;;;:38;;;59739:424;;;59953:7;;59947:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;59947:20:0;;;;;;;;;:34;;;59943:220;;60002:7;;59996:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;59996:20:0;;;;;;;;;:38;;;59943:220;;;60073:7;;;60103:1;60067:14;;;:5;:14;;;;;;;;-1:-1:-1;;;;;60067:20:0;;;;;;;;;;;:33;;:37;;;60121:7;;60115:14;;;;;;;;:20;;;;;;;;:38;;;59943:220;60177:7;;;60171:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;60171:20:0;;;;;;;;;;;:34;;:41;;;60235:7;;60229:14;;;;;;;;:20;;;;;;;;;;:36;;:45;;;;;;60283:436;60302:1;60300;:3;60283:436;;;60327:7;;60321:14;;;;:5;:14;;;;;;;;-1:-1:-1;;;;;60321:20:0;;;;;;;;;;;:36;;:45;;;;;;60390:5;:11;;;;;;:18;;;;60416:20;60413:37;;60445:5;;;60413:37;60482:7;;60505:13;;;;:4;:13;;;;;;;;-1:-1:-1;;;;;60474:197:0;;;60505:19;;;;;;;;;:30;;;60537:14;;;:5;:14;;;;;:20;;;;;;;;:36;;;;;60575:5;:11;;;;;;:20;;;;60597:24;;;;60623;;;;60649:21;;60474:197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60703:6;-1:-1:-1;60305:3:0;;60283:436;;60736:1973;60800:7;;-1:-1:-1;;;;;60792:15:0;;;60800:7;;60792:15;60788:38;;;60819:7;;60788:38;60858:7;;60834:15;60852:14;;;:5;:14;;;;;;;;-1:-1:-1;;;;;60852:20:0;;;;;;;;;:30;;60907:17;:15;:17::i;:::-;60983:4;:7;61015;;61047;;61075:8;;60891:33;;-1:-1:-1;60933:19:0;;-1:-1:-1;;;;;60983:7:0;;;;61015;;;;61047;;;;61067:16;;61063:1506;;;61115:3;;61164:21;;:::i;:::-;61216:7;;61210:14;;;;:5;:14;;;;;;;;61225:7;;-1:-1:-1;;;;;61225:7:0;61210:23;;;;;;;:33;61202:41;;;61201:88;;-1:-1:-1;61261:7:0;;61255:14;;;;:5;:14;;;;;;;;61270:7;;-1:-1:-1;;;;;61270:7:0;61255:23;;;;;;;:33;61247:41;;61201:88;61196:114;;61303:7;;;;;;;;;;;61196:114;61325:6;61320:130;61336:1;61334;:3;61320:130;;;61367:4;-1:-1:-1;;;;;61356:15:0;:4;61361:1;61356:7;;;;;;;;;-1:-1:-1;;;;;61356:7:0;:15;61352:86;;;61396:1;61383:14;;61352:86;;;61431:4;61436:1;61431:7;;;;;;;;;-1:-1:-1;;;;;61431:7:0;61422:3;61426:1;61422:6;;;;;;;-1:-1:-1;;;;;61422:16:0;;;:6;;;;;;:16;61352:86;61338:3;;61320:130;;;-1:-1:-1;61465:6:0;61460:152;61476:1;61474;:3;61460:152;;;61513:7;;61507:14;;;;:5;:14;;;;;;61522:3;61526:1;61522:6;;;;;;;;;;;-1:-1:-1;;;;;61507:22:0;-1:-1:-1;;;;;61507:22:0;;;;;;;;;;;;:32;;;61499:7;:40;61495:106;;;61566:1;61552:15;;61582:5;;61495:106;61478:3;;61460:152;;;-1:-1:-1;61622:6:0;;61646:296;61662:1;61660;:3;61646:296;;;61698:1;61685:11;:14;61681:198;;;61728:4;-1:-1:-1;;;;;61719:13:0;:4;61724:1;61719:7;;;;;;;;;-1:-1:-1;;;;;61719:7:0;:13;61715:43;;61754:4;61746;61751:1;61746:7;;;;;;;;:12;;-1:-1:-1;;;;;;61746:12:0;-1:-1:-1;;;;;61746:12:0;;;;;;;;;;61715:43;61681:198;;;61813:3;61817:1;61813:6;;;;;;;;;;;-1:-1:-1;;;;;61804:15:0;:4;61809:1;61804:7;;;;;;;;;-1:-1:-1;;;;;61804:7:0;:15;61800:50;;61844:3;61848:1;61844:6;;;;;;;;;;;61836:4;61841:1;61836:7;;;;;;;;:14;;-1:-1:-1;;;;;;61836:14:0;-1:-1:-1;;;;;61836:14:0;;;;;;;;;;61800:50;61867:1;61862:6;;;;61681:198;61898:12;61893:1;:17;61890:40;;;61929:1;61924:6;;;;61890:40;61664:3;;61646:296;;;;61063:1506;;;;;;;61984:8;;39109:5;61968:4;:12;:24;61964:605;;;62004:7;:16;;-1:-1:-1;;;;;62004:16:0;;;-1:-1:-1;;;;;;62004:16:0;;;;;;;62031:10;:16;;;;;;;;;;;62058:10;:16;;;;;;;;;;;62085:4;:12;;;;;;;;;;;;;;;62108:7;:18;;;;;;62137:7;:18;;;;;;;62187:8;;62180:34;;62210:3;62198:9;-1:-1:-1;62198:11:0;:15;;62180:34;62166:11;:48;62240:4;;-1:-1:-1;61964:605:0;;;62271:8;;62268:301;;62296:4;:14;;-1:-1:-1;;;;;;62296:14:0;-1:-1:-1;;;;;62296:14:0;;;;;-1:-1:-1;;;62268:301:0;;;62380:6;62375:128;62392:1;62390;:3;62375:128;;;62433:1;62412:7;62420:1;62412:10;;;;;;;;:23;;-1:-1:-1;;;;;;62412:23:0;-1:-1:-1;;;;;62412:23:0;;;;;;;;;;62452:6;;62448:43;;62489:1;62471:4;62476:1;62471:7;;;;;;;;:20;;-1:-1:-1;;;;;;62471:20:0;-1:-1:-1;;;;;62471:20:0;;;;;;;;;;62448:43;62395:3;;62375:128;;;-1:-1:-1;62513:4:0;:14;;-1:-1:-1;;;;;;62513:14:0;-1:-1:-1;;;;;62513:14:0;;;;;-1:-1:-1;;;62268:301:0;62581:14;62577:125;;;62607:8;:15;;;62638:6;62633:59;62650:1;62648;:3;62633:59;;;62687:5;62669:12;62682:1;62669:15;;;;;;;;;;;;;:23;;;;;:15;;;;:23;;;;;;;;;;;;;;;;-1:-1:-1;62653:3:0;62633:59;;;;62577:125;60736:1973;;;;;;;:::o;40297:785::-;-1:-1:-1;;;;;40428:20:0;;40395:14;40428:20;;;:11;:20;;;;;;40412:37;;40420:6;;40412:7;:37::i;:::-;40395:54;;40460:14;40477:25;40483:18;40491:6;40499:1;40483:7;:18::i;:::-;40477:5;:25::i;:::-;40460:42;;40536:35;40544:6;40552:18;40560:6;40568:1;40552:7;:18::i;:::-;40536:7;:35::i;:::-;-1:-1:-1;;;;;40513:20:0;;;;;;:11;:20;;;;;:58;40583:22;40525:7;40598:6;40583:5;:22::i;:::-;-1:-1:-1;;;;;40619:21:0;;;40616:227;;-1:-1:-1;;;;;40675:20:0;;;;;;:11;:20;;;;;;40659:37;;40667:6;;40659:7;:37::i;:::-;40650:46;;40711:25;40717:18;40725:6;40733:1;40717:7;:18::i;40711:25::-;40702:34;;40765:35;40773:6;40781:18;40789:6;40797:1;40781:7;:18::i;40765:35::-;-1:-1:-1;;;;;40742:20:0;;;;;;:11;:20;;;;;:58;40815:22;40754:7;40830:6;40815:5;:22::i;:::-;40862:19;40870:6;40878:2;40862:7;:19::i;:::-;40853:28;;40955:27;40963:10;;40975:6;40955:7;:27::i;:::-;40942:10;:40;41011:7;;41003:24;;41020:6;41003:7;:24::i;:::-;40993:7;:34;41038:14;:12;:14::i;:::-;41063:11;:9;:11::i;39350:97::-;39425:3;39429:10;39425:14;39350:97;:::o;2536:161::-;2600:7;2634:2;2628;:8;;2620:17;;12:1:-1;9;2:12;2620:17:0;-1:-1:-1;2682:7:0;;;2536:161::o;15266:195::-;13320:16;;15383:12;;13320:16;;13313:24;;;;15414:39:::1;15433:5;15440:3;15445:7;15414:18;:39::i;41769:302::-:0;-1:-1:-1;;;;;41843:20:0;;41858:4;41843:20;41840:113;;;41946:7;;41840:113;41977:26;41985:3;42000:2;41990:7;:12;41977:7;:26::i;:::-;42019:22;;;-1:-1:-1;;;;;42019:22:0;;;;42038:2;42028:12;;42019:22;;;;;;;;;;;;;;;;;42052:11;:9;:11::i;:::-;41769:302;;:::o;2907:215::-;2971:7;3003;;;3029;;;:23;;;3050:2;3044;3040:1;:6;;;;;;:12;3029:23;3021:32;;12:1:-1;9;2:12;2126:183:0;2190:7;2222;;;2248;;;;2240:16;;12:1:-1;9;2:12;33663:603:0;33743:5;15635:2;15682:3;33833:185;33849:2;33840:11;;:2;33845:1;33840:6;:11;;;33833:185;;;33868:9;33892:1;33880:13;33881:7;;;33880:13;;33868:25;;33932:2;33912:11;33924:3;33912:16;;;;;;;;;;;:22;33908:98;;33958:3;33953:8;;33908:98;;;34003:3;33998:8;;33908:98;33833:185;;;;34053:2;34034:11;34046:2;34034:15;;;;;;;;;;;:21;34030:49;;34077:2;-1:-1:-1;34070:9:0;;-1:-1:-1;34070:9:0;34030:49;34113:2;34094:11;34106:2;34094:15;;;;;;;;;;;:21;34090:49;;-1:-1:-1;34137:2:0;-1:-1:-1;34130:9:0;;34090:49;-1:-1:-1;34257:1:0;;33663:603;-1:-1:-1;;;33663:603:0:o;34831:4176::-;34912:7;34932:10;34945:2;34932:15;;34958:11;34972:1;34958:15;;35004:10;34991:23;;34997:2;34992;:7;34991:23;;34986:28;;35032:2;35037:34;35032:39;35025:46;;;;35124:10;35111:23;;35117:2;35112;:7;35111:23;;35106:28;;35152:2;35157:34;35152:39;35145:46;;;;35244:10;35231:23;;35237:2;35232;:7;35231:23;;35226:28;;35272:2;35277:34;35272:39;35265:46;;;;35364:10;35351:23;;35357:2;35352;:7;35351:23;;35346:28;;35392:2;35397:34;35392:39;35385:46;;;;35484:10;35471:23;;35477:2;35472;:7;35471:23;;35466:28;;35512:2;35517:34;35512:39;35505:46;;;;35604:10;35591:23;;35597:2;35592;:7;35591:23;;35586:28;;35632:2;35637:34;35632:39;35625:46;;;;35724:10;35711:23;;35717:2;35712;:7;35711:23;;35706:28;;35752:2;35757:34;35752:39;35745:46;;;;35844:10;35831:23;;35837:2;35832;:7;35831:23;;35826:28;;35872:2;35877:34;35872:39;35865:46;;;;35964:10;35951:23;;35957:2;35952;:7;35951:23;;35946:28;;35992:2;35997:34;35992:39;35985:46;;;;36086:10;36073:23;;36079:2;36074;:7;36073:23;;36068:28;;36114:2;36119:34;36114:39;36107:46;;;;36208:10;36195:23;;36201:2;36196;:7;36195:23;;36190:28;;36236:2;36241:34;36236:39;36229:46;;;;36330:10;36317:23;;36323:2;36318;:7;36317:23;;36312:28;;36358:2;36363:34;36358:39;36351:46;;;;36452:10;36439:23;;36445:2;36440;:7;36439:23;;36434:28;;36480:2;36485:34;36480:39;36473:46;;;;36574:10;36561:23;;36567:2;36562;:7;36561:23;;36556:28;;36602:2;36607:34;36602:39;36595:46;;;;36696:10;36683:23;;36689:2;36684;:7;36683:23;;36678:28;;36724:2;36729:34;36724:39;36717:46;;;;36818:10;36805:23;;36811:2;36806;:7;36805:23;;36800:28;;36846:2;36851:34;36846:39;36839:46;;;;36940:10;36927:23;;36933:2;36928;:7;36927:23;;36922:28;;36968:2;36973:34;36968:39;36961:46;;;;37062:10;37049:23;;37055:2;37050;:7;37049:23;;37044:28;;37090:2;37095:34;37090:39;37083:46;;;;37184:10;37171:23;;37177:2;37172;:7;37171:23;;37166:28;;37212:2;37217:34;37212:39;37205:46;;;;37306:10;37293:23;;37299:2;37294;:7;37293:23;;37288:28;;37334:2;37339:34;37334:39;37327:46;;;;37428:10;37415:23;;37421:2;37416;:7;37415:23;;37410:28;;37456:2;37461:34;37456:39;37449:46;;;;37550:10;37537:23;;37543:2;37538;:7;37537:23;;37532:28;;37578:2;37583:34;37578:39;37571:46;;;;37672:10;37659:23;;37665:2;37660;:7;37659:23;;37654:28;;37700:2;37705:34;37700:39;37693:46;;;;37794:10;37781:23;;37787:2;37782;:7;37781:23;;37776:28;;37822:2;37827:34;37822:39;37815:46;;;;37916:10;37903:23;;37909:2;37904;:7;37903:23;;37898:28;;37944:2;37949:34;37944:39;37937:46;;;;38038:10;38025:23;;38031:2;38026;:7;38025:23;;38020:28;;38066:2;38071:34;38066:39;38059:46;;;;38160:10;38147:23;;38153:2;38148;:7;38147:23;;38142:28;;38188:2;38193:34;38188:39;38181:46;;;;38282:10;38269:23;;38275:2;38270;:7;38269:23;;38264:28;;38310:2;38315:34;38310:39;38303:46;;;;38404:10;38391:23;;38397:2;38392;:7;38391:23;;38386:28;;38432:2;38437:34;38432:39;38425:46;;;;38526:10;38513:23;;38519:2;38514;:7;38513:23;;38508:28;;38554:2;38559:34;38554:39;38547:46;;;;38648:10;38635:23;;38641:2;38636;:7;38635:23;;38630:28;;38676:2;38681:34;38676:39;38669:46;;;;38770:10;38757:23;;38763:2;38758;:7;38757:23;;38752:28;;38798:2;38803:34;38798:39;38791:46;;;;38938:10;38931:17;;15538:1;38931:17;;38925:2;38889:33;38883:3;:39;;;;;;:44;:66;;34831:4176;-1:-1:-1;;;;;34831:4176:0:o;32743:552::-;32807:5;;32860:3;32855:8;;32851:414;;;32917:85;32929:1;32924:2;:6;32917:85;;;32958:1;32951:8;;;;32978;32917:85;;;32851:414;;;33095:3;33080:174;33100:5;;;;33080:174;;15538:1;33146:8;;;;33139:16;;33135:104;;33180:8;;;;;;;;33211;;;;33135:104;33113:1;33107:7;;;33080:174;;;;33284:3;32743:552;-1:-1:-1;;32743:552:0:o;3128:295::-;3191:7;3416:2;3411;:7;;;;;;;3128:295;-1:-1:-1;;;3128:295:0:o;45437:549::-;45489:14;45515:16;45534:36;45542:22;45550:9;45561:2;45542:7;:22::i;45534:36::-;45515:55;;45648:38;45659:26;45667:7;;45676:8;45659:7;:26::i;45648:38::-;45639:6;:47;;-1:-1:-1;;45639:47:0;;;;;;;;;;;;-1:-1:-1;45716:36:0;45724:22;45732:9;45743:2;45724:7;:22::i;45716:36::-;45832:13;;45847:7;;45856:6;;45697:55;;-1:-1:-1;45808:65:0;;45856:6;;45697:55;45808:23;:65::i;:::-;45799:74;;45894:26;45902:7;;45911:8;45894:7;:26::i;:::-;45884:7;:36;45931:25;45937:10;45949:6;45931:5;:25::i;:::-;45967:11;:9;:11::i;:::-;45437:549;;;:::o;64115:722::-;64193:7;64215:4;64221:1;64215:7;64211:602;;;64287:27;;;;:15;:27;;;;;;64325:3;;;;64315:1;64287:29;:33;64322:2;64287:37;:41;;;;;;64280:48;;;;64211:602;64360:1;64354:4;:7;;:18;;;;;64371:1;64365:4;:7;;64354:18;64351:462;;;64439:27;;;;:15;:27;;;;;;64482:1;;64477:3;;;;64467:1;64439:29;:33;;64474:2;64439:37;:41;;;;;;:44;;;;64351:462;64515:1;64509:4;:7;;:19;;;;;64526:2;64520:4;:8;;64509:19;64506:307;;;64596:27;;;;:15;:27;;;;;;64639:2;;64634:3;;;;64624:1;64596:29;:33;;64506:307;64673:2;64667:4;:8;;:21;;;;;64685:3;64679:4;:9;;64667:21;64664:149;;;64757:27;;;;:15;:27;;;;;;64800:3;;64795;;;;64785:1;64757:29;:33;;64664:149;-1:-1:-1;64828:1:0;64115:722;;;;:::o;15089:165::-;13320:16;;15187:12;;13320:16;;13313:24;;;;15218:28:::1;15233:3;15238:7;15218:14;:28::i;46354:491::-:0;46468:13;;46483:7;;46492:6;;46411:14;;46446:62;;46468:13;;46492:6;;46500:7;46446:21;:62::i;:::-;46437:71;;46529:51;46537:7;;46546:33;46554:19;46562:6;46570:2;46554:7;:19::i;46529:51::-;46519:7;:61;46591:14;:12;:14::i;:::-;46616:28;46624:10;46636:7;46616;:28::i;:::-;46664:33;46672:19;46680:6;46688:2;46672:7;:19::i;46664:33::-;46788:27;;46655:42;;-1:-1:-1;46788:10:0;;:27;;;;;46655:42;;46788:27;;;;46655:42;46788:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46788:27:0;46826:11;:9;:11::i;13951:373::-;14077:3;-1:-1:-1;;;;;1352:22:0;;1344:31;;12:1:-1;9;2:12;1344:31:0;14099:3;-1:-1:-1;;;;;1823:25:0;::::1;1843:4;1823:25;;1815:34;;12:1:-1;9::::0;2:12:::1;1815:34:0;14136:31:::2;14144:13;;14159:7;14136;:31::i;:::-;14120:13;:47:::0;-1:-1:-1;;;;;14205:16:0;::::2;;::::0;;;:11:::2;:16;::::0;;;;;14197:34:::2;::::0;14223:7;14197::::2;:34::i;:::-;-1:-1:-1::0;;;;;14178:16:0;::::2;;::::0;;;:11:::2;:16;::::0;;;;;;;;:53;;;;14249:17;;;;;;;::::2;::::0;;;;;;;;;::::2;14282:34;::::0;;;;;;;-1:-1:-1;;;;;14282:34:0;::::2;::::0;14299:1:::2;::::0;-1:-1:-1;;;;;;;;;;;14282:34:0;;;;::::2;::::0;;::::2;1386:1:::1;13951:373:::0;;;:::o;41582:88::-;41643:19;41654:7;;41643:10;:19::i;:::-;41634:6;:28;;-1:-1:-1;;41634:28:0;;;;;;;;;;;;41582:88::o;44696:108::-;44750:46;44756:7;:5;:7::i;:::-;44765;;44774:13;;44789:6;;44750:46;;;;;;;;;;;;;;;;;;;;44789:6;;44750:46;;;;;;;;;;;;;44696:108::o;8741:540::-;8934:12;8882:5;-1:-1:-1;;;;;1352:22:0;;1344:31;;12:1:-1;9;2:12;1344:31:0;8911:3;-1:-1:-1;;;;;1352:22:0;::::1;1344:31;;12:1:-1;9::::0;2:12:::1;1344:31:0;-1:-1:-1::0;;;;;9006:18:0;::::2;;::::0;;;:11:::2;:18;::::0;;;;;;;9025:10:::2;9006:30:::0;;;;;;;;8998:48:::2;::::0;9038:7;8998::::2;:48::i;:::-;-1:-1:-1::0;;;;;8964:18:0;::::2;;::::0;;;:11:::2;:18;::::0;;;;;;;8983:10:::2;8964:30:::0;;;;;;;:82;;;;9099:18;;;:11:::2;:18:::0;;;;;9091:36:::2;::::0;9119:7;9091::::2;:36::i;:::-;-1:-1:-1::0;;;;;9057:18:0;;::::2;;::::0;;;:11:::2;:18;::::0;;;;;:70;;;;9180:16;;::::2;::::0;;;;9172:34:::2;::::0;9198:7;9172::::2;:34::i;:::-;-1:-1:-1::0;;;;;9138:16:0;;::::2;;::::0;;;:11:::2;:16;::::0;;;;;;;;:68;;;;9222:29;;;;;;;9138:16;;9222:29;;::::2;::::0;-1:-1:-1;;;;;;;;;;;9222:29:0;;;;;;;::::2;-1:-1:-1::0;9269:4:0::2;::::0;8741:540;-1:-1:-1;;;;;8741:540:0:o;41094:183::-;41180:29;41194:5;41201:7;41180:13;:29::i;:::-;41237:32;41245:14;;41261:7;41237;:32::i;:::-;41220:14;:49;-1:-1:-1;;41094:183:0:o;7967:394::-;8113:12;8090:3;-1:-1:-1;;;;;1352:22:0;;1344:31;;12:1:-1;9;2:12;1344:31:0;8189:10:::1;8177:23;::::0;;;:11:::1;:23;::::0;;;;;8169:41:::1;::::0;8202:7;8169::::1;:41::i;:::-;8155:10;8143:23;::::0;;;:11:::1;:23;::::0;;;;;:67;;;;-1:-1:-1;;;;;8255:16:0;::::1;::::0;;;;8247:34:::1;::::0;8273:7;8247::::1;:34::i;:::-;-1:-1:-1::0;;;;;8221:16:0;::::1;;::::0;;;:11:::1;:16;::::0;;;;;;;;:60;;;;8297:34;;;;;;;8221:16;;8306:10:::1;::::0;-1:-1:-1;;;;;;;;;;;8297:34:0;;;;;;;;::::1;-1:-1:-1::0;8349:4:0::1;::::0;7967:394;-1:-1:-1;;;7967:394:0:o;14692:385::-;-1:-1:-1;;;;;14893:18:0;;;;;;:11;:18;;;;;;14885:36;;14913:7;14885;:36::i;:::-;-1:-1:-1;;;;;14864:18:0;;;;;;:11;:18;;;;;:57;14956:13;;14948:31;;14971:7;14948;:31::i;:::-;14932:13;:47;14997:36;;;;;;;;15021:1;;-1:-1:-1;;;;;14997:36:0;;;-1:-1:-1;;;;;;;;;;;14997:36:0;;;;;;;;15049:20;;;;;;;;;;;;;;;;;14692:385;;:::o;46914:28824::-;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1;46914:28824:0;;;-1:-1:-1;;46914:28824:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1;46914:28824:0;;;-1:-1:-1;;46914:28824:0:o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;-1:-1;46914:28824:0;;;-1:-1:-1;;46914:28824:0:o

Swarm Source

ipfs://109ad270bb29cf90e3a3537cb7aec6760e684e90eb7c8fce81f96e778bf14faf
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.