ETH Price: $3,313.70 (-1.37%)

Contract

0xE417b912F6cB6592ec2D71dbF6F2B48191b2CdF6
 

Multichain Info

Transaction Hash
Method
Block
From
To
Cancel211794712024-11-13 14:48:599 days ago1731509339IN
LUKSO: Reversible ICO
0.7 ETH0.0028485886.23185686
Transfer202551942024-07-07 14:20:59138 days ago1720362059IN
LUKSO: Reversible ICO
0.0001 ETH0.000404623.46692403
Transfer170053912023-04-08 18:18:23594 days ago1680977903IN
LUKSO: Reversible ICO
0.0001 ETH0.0008493622.84710633
Transfer166937892023-02-23 21:32:59638 days ago1677187979IN
LUKSO: Reversible ICO
1 wei0.0045842239.27844773
Transfer161082952022-12-04 1:54:23719 days ago1670118863IN
LUKSO: Reversible ICO
0.01 ETH0.0003628511.12151032
Transfer161082872022-12-04 1:52:47719 days ago1670118767IN
LUKSO: Reversible ICO
0.0001 ETH0.0002295310.93002048
Transfer136914572021-11-26 18:49:171092 days ago1637952557IN
LUKSO: Reversible ICO
0.01 ETH0.00380148102.2563704
Transfer134494452021-10-19 17:12:191130 days ago1634663539IN
LUKSO: Reversible ICO
0 ETH0.00236808112.76585097
Transfer134494252021-10-19 17:06:381130 days ago1634663198IN
LUKSO: Reversible ICO
0 ETH0.0024424116.30519165
Transfer134286652021-10-16 11:08:061133 days ago1634382486IN
LUKSO: Reversible ICO
0.001 ETH0.0019561352.61827007
Transfer132643472021-09-20 18:50:581159 days ago1632163858IN
LUKSO: Reversible ICO
100 wei0.0035443495.33958045
Transfer132436452021-09-17 14:12:301162 days ago1631887950IN
LUKSO: Reversible ICO
0.0001 ETH0.0067647657.96167167
Transfer132277582021-09-15 2:58:251164 days ago1631674705IN
LUKSO: Reversible ICO
0.00125931 ETH0.0019356552.06738002
Transfer131999472021-09-10 19:34:391169 days ago1631302479IN
LUKSO: Reversible ICO
1 wei0.0108332692.82124246
Transfer130454202021-08-17 22:11:201193 days ago1629238280IN
LUKSO: Reversible ICO
0.0000001 ETH0.0040407834.6221272
Transfer123827102021-05-06 19:45:211296 days ago1620330321IN
LUKSO: Reversible ICO
0.0031655 ETH0.003192152
Transfer123827102021-05-06 19:45:211296 days ago1620330321IN
LUKSO: Reversible ICO
0.00319858 ETH0.00252120
Transfer123827102021-05-06 19:45:211296 days ago1620330321IN
LUKSO: Reversible ICO
0 ETH0.00357170
Transfer123827102021-05-06 19:45:211296 days ago1620330321IN
LUKSO: Reversible ICO
0 ETH0.00357170
Transfer123429222021-04-30 16:32:251302 days ago1619800345IN
LUKSO: Reversible ICO
0.0001 ETH0.0072233275
Transfer123176122021-04-26 18:32:291306 days ago1619461949IN
LUKSO: Reversible ICO
1 wei0.003853440.01
Transfer122857702021-04-21 20:40:441311 days ago1619037644IN
LUKSO: Reversible ICO
0.0001 ETH0.01425402148
Transfer122348412021-04-13 23:52:581318 days ago1618357978IN
LUKSO: Reversible ICO
0.05 ETH0.0062540981
Transfer121287312021-03-28 16:32:081335 days ago1616949128IN
LUKSO: Reversible ICO
0.001 ETH0.01011464131
Transfer121221692021-03-27 16:31:511336 days ago1616862711IN
LUKSO: Reversible ICO
0.00001 ETH0.01316447170.5
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
211794712024-11-13 14:48:599 days ago1731509339
LUKSO: Reversible ICO
0.7 ETH
202551942024-07-07 14:20:59138 days ago1720362059
LUKSO: Reversible ICO
0.1001 ETH
170053912023-04-08 18:18:23594 days ago1680977903
LUKSO: Reversible ICO
0.0001 ETH
166937892023-02-23 21:32:59638 days ago1677187979
LUKSO: Reversible ICO
0.7 ETH
136914572021-11-26 18:49:171092 days ago1637952557
LUKSO: Reversible ICO
0.01 ETH
134286652021-10-16 11:08:061133 days ago1634382486
LUKSO: Reversible ICO
0.001 ETH
132643472021-09-20 18:50:581159 days ago1632163858
LUKSO: Reversible ICO
100 wei
132436452021-09-17 14:12:301162 days ago1631887950
LUKSO: Reversible ICO
0.35480129 ETH
132277582021-09-15 2:58:251164 days ago1631674705
LUKSO: Reversible ICO
0.00125931 ETH
131999472021-09-10 19:34:391169 days ago1631302479
LUKSO: Reversible ICO
3 ETH
130454202021-08-17 22:11:201193 days ago1629238280
LUKSO: Reversible ICO
2.2000001 ETH
123429222021-04-30 16:32:251302 days ago1619800345
LUKSO: Reversible ICO
0.15649 ETH
123176122021-04-26 18:32:291306 days ago1619461949
LUKSO: Reversible ICO
0.2 ETH
122857702021-04-21 20:40:441311 days ago1619037644
LUKSO: Reversible ICO
0.2001 ETH
122348412021-04-13 23:52:581318 days ago1618357978
LUKSO: Reversible ICO
1.05 ETH
121287312021-03-28 16:32:081335 days ago1616949128
LUKSO: Reversible ICO
5.001 ETH
121221692021-03-27 16:31:511336 days ago1616862711
LUKSO: Reversible ICO
0.40001 ETH
120915092021-03-22 23:03:011341 days ago1616454181
LUKSO: Reversible ICO
0.005 ETH
120715562021-03-19 21:16:241344 days ago1616188584
LUKSO: Reversible ICO
0.0017231 ETH
120667482021-03-19 3:28:361344 days ago1616124516
LUKSO: Reversible ICO
1.501 ETH
120603432021-03-18 3:59:091345 days ago1616039949
LUKSO: Reversible ICO
0.105 ETH
120517112021-03-16 19:59:481347 days ago1615924788
LUKSO: Reversible ICO
1.70428018 ETH
120484302021-03-16 7:54:581347 days ago1615881298
LUKSO: Reversible ICO
2.9 ETH
120454522021-03-15 20:54:341348 days ago1615841674
LUKSO: Reversible ICO
0.65 ETH
120417582021-03-15 7:13:561348 days ago1615792436
LUKSO: Reversible ICO
0.901 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ReversibleICO

Compiler Version
v0.5.17+commit.d19bba13

Optimization Enabled:
Yes with 200 runs

Other Settings:
petersburg EvmVersion, Apache-2.0 license, Audited

Contract Source Code (Solidity)Audit Report

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

/*
 * Submitted for verification at etherscan.io on 2020-06-10
 *
 *   ________            ____                           _ __    __        ______________
 *  /_  __/ /_  ___     / __ \___ _   _____  __________(_) /_  / /__     /  _/ ____/ __ \
 *   / / / __ \/ _ \   / /_/ / _ \ | / / _ \/ ___/ ___/ / __ \/ / _ \    / // /   / / / /
 *  / / / / / /  __/  / _, _/  __/ |/ /  __/ /  (__  ) / /_/ / /  __/  _/ // /___/ /_/ /
 * /_/ /_/ /_/\___/  /_/ |_|\___/|___/\___/_/  /____/_/_.___/_/\___/  /___/\____/\____/
 *
 *
 * source      https://github.com/lukso-network/rICO-smart-contracts
 * @name       Reversible ICO
 * @author     Fabian Vogelsteller <@frozeman>, Micky Socaci <[email protected]>, Marjorie Hernandez <[email protected]>
 * @license    Apache 2.0
 *
 * Readme more about it here https://medium.com/lukso/rico-the-reversible-ico-5392bf64318b
 */

pragma solidity ^0.5.0;


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

        return c;
    }

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

        return c;
    }

    
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        
        
        
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        

        return c;
    }

    
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

interface IERC777 {
    
    function name() external view returns (string memory);

    
    function symbol() external view returns (string memory);

    
    function granularity() external view returns (uint256);

    
    function totalSupply() external view returns (uint256);

    
    function balanceOf(address owner) external view returns (uint256);

    
    function send(address recipient, uint256 amount, bytes calldata data) external;

    
    function burn(uint256 amount, bytes calldata data) external;

    
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    
    function authorizeOperator(address operator) external;

    
    function revokeOperator(address operator) external;

    
    function defaultOperators() external view returns (address[] memory);

    
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

interface IERC777Recipient {
    
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

interface IERC1820Registry {
    
    function setManager(address account, address newManager) external;

    
    function getManager(address account) external view returns (address);

    
    function setInterfaceImplementer(address account, bytes32 interfaceHash, address implementer) external;

    
    function getInterfaceImplementer(address account, bytes32 interfaceHash) external view returns (address);

    
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

contract ReversibleICO is IERC777Recipient {


    
    using SafeMath for uint256;

    
    IERC1820Registry private ERC1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);
    bytes32 constant private TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");


    
    
    bool public initialized;

    
    bool public frozen;
    uint256 public frozenPeriod;
    uint256 public freezeStart;


    
    
    address public deployingAddress;
    
    address public tokenAddress;
    
    address public projectAddress;
    
    address public whitelistingAddress;
    
    address public freezerAddress;
    
    address public rescuerAddress;


    
    
    uint256 public initialTokenSupply;
    
    uint256 public tokenSupply;
    
    uint256 public committedETH;
    
    uint256 public pendingETH;
    
    uint256 public canceledETH;
    
    uint256 public withdrawnETH;
    
    uint256 public projectWithdrawCount;
    
    uint256 public projectWithdrawnETH;

    
    uint256 public minContribution = 0.1 ether;
    uint256 public maxContribution = 4000 ether;

    mapping(uint8 => Stage) public stages;
    uint8 public stageCount;

    
    mapping(address => Participant) public participants;
    
    mapping(uint256 => address) public participantsById;
    
    uint256 public participantCount;

    
    
    uint256 public commitPhasePrice;
    
    uint256 public commitPhaseStartBlock;
    
    uint256 public commitPhaseEndBlock;
    
    uint256 public commitPhaseBlockCount;


    
    
    uint256 public buyPhaseStartBlock;
    
    uint256 public buyPhaseEndBlock;
    
    uint256 public buyPhaseBlockCount;

    
    
    uint256 internal _projectCurrentlyReservedETH;
    
    uint256 internal _projectUnlockedETH;
    
    uint256 internal _projectLastBlock;


    

    
    struct Stage {
        uint256 tokenLimit; 
        uint256 tokenPrice;
    }

    
    struct Participant {
        bool whitelisted;
        uint32 contributions;
        uint32 withdraws;
        uint256 firstContributionBlock;
        uint256 reservedTokens;
        uint256 committedETH;
        uint256 pendingETH;

        uint256 _currentReservedTokens;
        uint256 _unlockedTokens;
        uint256 _lastBlock;

        mapping(uint8 => ParticipantStageDetails) stages;
    }

    struct ParticipantStageDetails {
        uint256 pendingETH;
    }

    
    event PendingContributionAdded(address indexed participantAddress, uint256 indexed amount, uint32 indexed contributionId, uint8 stageId);
    event PendingContributionsCanceled(address indexed participantAddress, uint256 indexed amount, uint32 indexed contributionId);

    event WhitelistApproved(address indexed participantAddress, uint256 indexed pendingETH, uint32 indexed contributions);
    event WhitelistRejected(address indexed participantAddress, uint256 indexed pendingETH, uint32 indexed contributions);

    event ContributionsAccepted(address indexed participantAddress, uint256 indexed ethAmount, uint256 indexed tokenAmount, uint8 stageId);

    event ProjectWithdraw(address indexed projectAddress, uint256 indexed amount, uint32 indexed withdrawCount);
    event ParticipantWithdraw(address indexed participantAddress, uint256 indexed ethAmount, uint256 indexed tokenAmount, uint32 withdrawCount);

    event StageChanged(uint8 indexed stageId, uint256 indexed tokenLimit, uint256 indexed tokenPrice, uint256 effectiveBlockNumber);
    event WhitelistingAddressChanged(address indexed whitelistingAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber);
    event FreezerAddressChanged(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber);

    event SecurityFreeze(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber);
    event SecurityUnfreeze(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber);
    event SecurityDisableEscapeHatch(address indexed freezerAddress, uint8 indexed stageId, uint256 indexed effectiveBlockNumber);
    event SecurityEscapeHatch(address indexed rescuerAddress, address indexed to, uint8 indexed stageId, uint256 effectiveBlockNumber);


    event TransferEvent (
        uint8 indexed typeId,
        address indexed relatedAddress,
        uint256 indexed value
    );

    enum TransferTypes {
        NOT_SET, 
        WHITELIST_REJECTED, 
        CONTRIBUTION_CANCELED, 
        CONTRIBUTION_ACCEPTED_OVERFLOW, 
        PARTICIPANT_WITHDRAW, 
        PARTICIPANT_WITHDRAW_OVERFLOW, 
        PROJECT_WITHDRAWN, 
        FROZEN_ESCAPEHATCH_TOKEN, 
        FROZEN_ESCAPEHATCH_ETH 
    }


    

    
    constructor() public {
        deployingAddress = msg.sender;
        ERC1820.setInterfaceImplementer(address(this), TOKENS_RECIPIENT_INTERFACE_HASH, address(this));
    }

    
    function init(
        address _tokenAddress,
        address _whitelistingAddress,
        address _freezerAddress,
        address _rescuerAddress,
        address _projectAddress,
        uint256 _commitPhaseStartBlock,
        uint256 _buyPhaseStartBlock,
        uint256 _buyPhaseEndBlock,
        uint256 _initialPrice,
        uint8 _stageCount, 
        uint256 _stageTokenLimitIncrease,
        uint256 _stagePriceIncrease
    )
    public
    onlyDeployingAddress
    isNotInitialized
    {
        require(_tokenAddress != address(0), "_tokenAddress cannot be 0x");
        require(_whitelistingAddress != address(0), "_whitelistingAddress cannot be 0x");
        require(_freezerAddress != address(0), "_freezerAddress cannot be 0x");
        require(_rescuerAddress != address(0), "_rescuerAddress cannot be 0x");
        require(_projectAddress != address(0), "_projectAddress cannot be 0x");
        

        
        tokenAddress = _tokenAddress;
        whitelistingAddress = _whitelistingAddress;
        freezerAddress = _freezerAddress;
        rescuerAddress = _rescuerAddress;
        projectAddress = _projectAddress;

        
        commitPhaseStartBlock = _commitPhaseStartBlock;
        commitPhaseEndBlock = _buyPhaseStartBlock.sub(1);
        commitPhaseBlockCount = commitPhaseEndBlock.sub(commitPhaseStartBlock).add(1);
        commitPhasePrice = _initialPrice;

        stageCount = _stageCount;


        
        Stage storage commitPhase = stages[0];
        commitPhase.tokenLimit = _stageTokenLimitIncrease;
        commitPhase.tokenPrice = _initialPrice;


        
        uint256 previousStageTokenLimit = _stageTokenLimitIncrease;

        
        for (uint8 i = 1; i <= _stageCount; i++) {
            
            Stage storage byStage = stages[i];
            
            byStage.tokenLimit = previousStageTokenLimit.add(_stageTokenLimitIncrease);
            
            previousStageTokenLimit = byStage.tokenLimit;
            
            byStage.tokenPrice = _initialPrice.add(_stagePriceIncrease.mul(i));
        }

        
        
        buyPhaseStartBlock = _buyPhaseStartBlock;
        
        buyPhaseEndBlock = _buyPhaseEndBlock;
        
        buyPhaseBlockCount = buyPhaseEndBlock.sub(buyPhaseStartBlock).add(1);

        
        initialized = true;
    }

    

    

    
    function()
    external
    payable
    isInitialized
    isNotFrozen
    {
        Participant storage participantStats = participants[msg.sender];

        
        if (participantStats.whitelisted == true && participantStats.contributions > 0) {
            commit();

        
        } else {
            require(msg.value < minContribution, 'To contribute call commit() [0x3c7a3aff] and send ETH along.');

            
            cancelPendingContributions(msg.sender, msg.value);
        }
    }

    
    function tokensReceived(
        address,
        address _from,
        address,
        uint256 _amount,
        bytes calldata,
        bytes calldata
    )
    external
    isInitialized
    isNotFrozen
    {
        
        
        require(msg.sender == tokenAddress, "Unknown token contract sent tokens.");

        
        if (_from == projectAddress) {
            
            tokenSupply = tokenSupply.add(_amount);
            initialTokenSupply = initialTokenSupply.add(_amount);

            
        } else {
            withdraw(_from, _amount);
        }
    }

    
    function commit()
    public
    payable
    isInitialized
    isNotFrozen
    isRunning
    {
        
        require(msg.value >= minContribution, "Value sent is less than the minimum contribution.");

        
        uint8 currentStage = getCurrentStage();
        Participant storage participantStats = participants[msg.sender];
        ParticipantStageDetails storage byStage = participantStats.stages[currentStage];

        require(participantStats.committedETH.add(msg.value) <= maxContribution, "Value sent is larger than the maximum contribution.");

        
        if (participantStats.contributions == 0) {
            
            participantsById[participantCount] = msg.sender;
            
            participantCount++;
        }

        
        participantStats.contributions++;
        participantStats.pendingETH = participantStats.pendingETH.add(msg.value);
        byStage.pendingETH = byStage.pendingETH.add(msg.value);

        
        pendingETH = pendingETH.add(msg.value);

        emit PendingContributionAdded(
            msg.sender,
            msg.value,
            uint32(participantStats.contributions),
            currentStage
        );

        
        if (participantStats.whitelisted == true) {
            acceptContributions(msg.sender);
        }
    }

    
    function cancel()
    external
    payable
    isInitialized
    isNotFrozen
    {
        cancelPendingContributions(msg.sender, msg.value);
    }

    
    function whitelist(address[] calldata _addresses, bool _approve)
    external
    onlyWhitelistingAddress
    isInitialized
    isNotFrozen
    isRunning
    {
        
        require(_addresses.length > 0, "No addresses given to whitelist.");

        for (uint256 i = 0; i < _addresses.length; i++) {
            address participantAddress = _addresses[i];

            Participant storage participantStats = participants[participantAddress];

            if (_approve) {
                if (participantStats.whitelisted == false) {
                    
                    participantStats.whitelisted = true;
                    emit WhitelistApproved(participantAddress, participantStats.pendingETH, uint32(participantStats.contributions));
                }

                
                acceptContributions(participantAddress);

            } else {
                participantStats.whitelisted = false;
                emit WhitelistRejected(participantAddress, participantStats.pendingETH, uint32(participantStats.contributions));

                
                cancelPendingContributions(participantAddress, 0);
            }
        }
    }

    
    function projectTokenWithdraw(uint256 _tokenAmount)
    external
    onlyProjectAddress
    isInitialized
    {
        require(_tokenAmount <= tokenSupply, "Requested amount too high, not enough tokens available.");

        
        tokenSupply = tokenSupply.sub(_tokenAmount);
        initialTokenSupply = initialTokenSupply.sub(_tokenAmount);

        
        
        IERC777(tokenAddress).send(projectAddress, _tokenAmount, "");
    }

    
    function projectWithdraw(uint256 _ethAmount)
    external
    onlyProjectAddress
    isInitialized
    isNotFrozen
    {
        
        calcProjectAllocation();

        
        uint256 availableForWithdraw = _projectUnlockedETH.sub(projectWithdrawnETH);

        require(_ethAmount <= availableForWithdraw, "Requested amount too high, not enough ETH unlocked.");

        
        projectWithdrawCount++;
        projectWithdrawnETH = projectWithdrawnETH.add(_ethAmount);

        
        emit ProjectWithdraw(
            projectAddress,
            _ethAmount,
            uint32(projectWithdrawCount)
        );
        emit TransferEvent(
            uint8(TransferTypes.PROJECT_WITHDRAWN),
            projectAddress,
            _ethAmount
        );

        
        address(uint160(projectAddress)).transfer(_ethAmount);
    }


    function changeStage(uint8 _stageId, uint256 _tokenLimit, uint256 _tokenPrice)
    external
    onlyProjectAddress
    isInitialized
    {
        stages[_stageId].tokenLimit = _tokenLimit;
        stages[_stageId].tokenPrice = _tokenPrice;

        if(_stageId > stageCount) {
            stageCount = _stageId;
        }

        emit StageChanged(_stageId, _tokenLimit, _tokenPrice, getCurrentEffectiveBlockNumber());
    }


    function changeWhitelistingAddress(address _newAddress)
    external
    onlyProjectAddress
    isInitialized
    {
        whitelistingAddress = _newAddress;
        emit WhitelistingAddressChanged(whitelistingAddress, getCurrentStage(), getCurrentEffectiveBlockNumber());
    }


    function changeFreezerAddress(address _newAddress)
    external
    onlyProjectAddress
    isInitialized
    {
        freezerAddress = _newAddress;
        emit FreezerAddressChanged(freezerAddress, getCurrentStage(), getCurrentEffectiveBlockNumber());
    }


    

    
    function freeze()
    external
    onlyFreezerAddress
    isNotFrozen
    {
        frozen = true;
        freezeStart = getCurrentEffectiveBlockNumber();

        
        emit SecurityFreeze(freezerAddress, getCurrentStage(), freezeStart);
    }

    
    function unfreeze()
    external
    onlyFreezerAddress
    isFrozen
    {
        uint256 currentBlock = getCurrentEffectiveBlockNumber();

        frozen = false;
        frozenPeriod = frozenPeriod.add(
            currentBlock.sub(freezeStart)
        );

        
        emit SecurityUnfreeze(freezerAddress, getCurrentStage(), currentBlock);
    }

    
    function disableEscapeHatch()
    external
    onlyFreezerAddress
    isNotFrozen
    {
        freezerAddress = address(0);
        rescuerAddress = address(0);

        
        emit SecurityDisableEscapeHatch(freezerAddress, getCurrentStage(), getCurrentEffectiveBlockNumber());
    }

    
    function escapeHatch(address _to)
    external
    onlyRescuerAddress
    isFrozen
    {
        require(getCurrentEffectiveBlockNumber() == freezeStart.add(18000), 'Let it cool.. Wait at least ~3 days (18000 blk) before moving anything.');

        uint256 tokenBalance = IERC777(tokenAddress).balanceOf(address(this));
        uint256 ethBalance = address(this).balance;

        
        
        IERC777(tokenAddress).send(_to, tokenBalance, "");

        
        address(uint160(_to)).transfer(ethBalance);

        
        emit SecurityEscapeHatch(rescuerAddress, _to, getCurrentStage(), getCurrentEffectiveBlockNumber());

        emit TransferEvent(uint8(TransferTypes.FROZEN_ESCAPEHATCH_TOKEN), _to, tokenBalance);
        emit TransferEvent(uint8(TransferTypes.FROZEN_ESCAPEHATCH_ETH), _to, ethBalance);
    }


    

    
    function getUnlockedProjectETH() public view returns (uint256) {

        
        uint256 newlyUnlockedEth = calcUnlockedAmount(_projectCurrentlyReservedETH, _projectLastBlock);

        return _projectUnlockedETH
        .add(newlyUnlockedEth);
    }

    
    function getAvailableProjectETH() public view returns (uint256) {
        return getUnlockedProjectETH()
            .sub(projectWithdrawnETH);
    }

    
    function getParticipantReservedTokens(address _participantAddress) public view returns (uint256) {
        Participant storage participantStats = participants[_participantAddress];

        if(participantStats._currentReservedTokens == 0) {
            return 0;
        }

        return participantStats._currentReservedTokens.sub(
            calcUnlockedAmount(participantStats._currentReservedTokens, participantStats._lastBlock)
        );
    }

    
    function getParticipantUnlockedTokens(address _participantAddress) public view returns (uint256) {
        Participant storage participantStats = participants[_participantAddress];

        return participantStats._unlockedTokens.add(
            calcUnlockedAmount(participantStats._currentReservedTokens, participantStats._lastBlock)
        );
    }

    
    function getAvailableTokenAtCurrentStage() public view returns (uint256) {
        return stages[getCurrentStage()].tokenLimit.sub(
            initialTokenSupply.sub(tokenSupply)
        );
    }


    
    function getCurrentStage() public view returns (uint8) {
        return getStageByTokenLimit(
            initialTokenSupply.sub(tokenSupply)
        );
    }

    
    function getCurrentPrice() public view returns (uint256) {
        return getPriceAtStage(getCurrentStage());
    }


    
    function getPriceAtStage(uint8 _stageId) public view returns (uint256) {
        if (_stageId <= stageCount) {
            return stages[_stageId].tokenPrice;
        }
        return stages[stageCount].tokenPrice;
    }


    
    function getPriceForTokenLimit(uint256 _tokenLimit) public view returns (uint256) {
        return getPriceAtStage(getStageByTokenLimit(_tokenLimit));
    }

    
    function getStageByTokenLimit(uint256 _tokenLimit) public view returns (uint8) {

        
        for (uint8 stageId = 0; stageId <= stageCount; stageId++) {
            if(_tokenLimit <= stages[stageId].tokenLimit) {
                return stageId;
            }
        }
        
        return stageCount;
    }

    
    function committableEthAtStage(uint8 _stageId, uint8 _currentStage) public view returns (uint256) {
        uint256 supply;

        
        if(_stageId < _currentStage) {
            return 0;

        
        } else if(_stageId >= stageCount) {
            supply = tokenSupply;

        
        } else if(_stageId == _currentStage) {
            supply = stages[_currentStage].tokenLimit.sub(
                initialTokenSupply.sub(tokenSupply)
            );

        
        } else if(_stageId > _currentStage) {
            supply = stages[_stageId].tokenLimit.sub(stages[_stageId - 1].tokenLimit); 
        }

        return getEthAmountForTokensAtStage(
            supply
        , _stageId);
    }

    
    function getEthAmountForTokensAtStage(uint256 _tokenAmount, uint8 _stageId) public view returns (uint256) {
        return _tokenAmount
        .mul(stages[_stageId].tokenPrice)
        .div(10 ** 18);
    }

    
    function getTokenAmountForEthAtStage(uint256 _ethAmount, uint8 _stageId) public view returns (uint256) {
        return _ethAmount
        .mul(10 ** 18)
        .div(stages[_stageId].tokenPrice);
    }

    
    function getCurrentBlockNumber() public view returns (uint256) {
        return uint256(block.number);
    }

    
    function getCurrentEffectiveBlockNumber() public view returns (uint256) {
        return uint256(block.number)
        .sub(frozenPeriod); 
    }

    
    function calcUnlockedAmount(uint256 _amount, uint256 _lastBlock) public view returns (uint256) {

        uint256 currentBlock = getCurrentEffectiveBlockNumber();

        if(_amount == 0) {
            return 0;
        }

        
        if (currentBlock >= buyPhaseStartBlock && currentBlock < buyPhaseEndBlock) {

            
            uint256 lastBlock = _lastBlock;
            if(lastBlock < buyPhaseStartBlock) {
                lastBlock = buyPhaseStartBlock.sub(1); 
            }

            
            uint256 passedBlocks = currentBlock.sub(lastBlock);

            
            uint256 totalBlockCount = buyPhaseEndBlock.sub(lastBlock);

            return _amount.mul(
                passedBlocks.mul(10 ** 20)
                .div(totalBlockCount)
            ).div(10 ** 20);

            
        } else if (currentBlock >= buyPhaseEndBlock) {
            return _amount;
        }
        
        return 0;
    }

    


    
    function sanityCheckProject() internal view {
        
        require(
            committedETH == _projectCurrentlyReservedETH.add(_projectUnlockedETH),
            'Project Sanity check failed! Reserved + Unlock must equal committedETH'
        );

        
        require(
            address(this).balance == _projectUnlockedETH.add(_projectCurrentlyReservedETH).add(pendingETH).sub(projectWithdrawnETH),
            'Project sanity check failed! balance = Unlock + Reserved - Withdrawn'
        );
    }

    
    function sanityCheckParticipant(address _participantAddress) internal view {
        Participant storage participantStats = participants[_participantAddress];

        
        require(
            participantStats.reservedTokens == participantStats._currentReservedTokens.add(participantStats._unlockedTokens),
            'Participant Sanity check failed! Reser. + Unlock must equal totalReser'
        );
    }

    
    function calcProjectAllocation() internal {

        uint256 newlyUnlockedEth = calcUnlockedAmount(_projectCurrentlyReservedETH, _projectLastBlock);

        
        _projectCurrentlyReservedETH = _projectCurrentlyReservedETH.sub(newlyUnlockedEth);
        _projectUnlockedETH = _projectUnlockedETH.add(newlyUnlockedEth);
        _projectLastBlock = getCurrentEffectiveBlockNumber();

        sanityCheckProject();
    }

    
    function calcParticipantAllocation(address _participantAddress) internal {
        Participant storage participantStats = participants[_participantAddress];

        
        participantStats._unlockedTokens = getParticipantUnlockedTokens(_participantAddress);
        participantStats._currentReservedTokens = getParticipantReservedTokens(_participantAddress);

        
        participantStats._lastBlock = getCurrentEffectiveBlockNumber();

        
        calcProjectAllocation();
    }

    
    function cancelPendingContributions(address _participantAddress, uint256 _sentValue)
    internal
    isInitialized
    isNotFrozen
    {
        Participant storage participantStats = participants[_participantAddress];
        uint256 participantPendingEth = participantStats.pendingETH;

        
        if(participantPendingEth == 0) {
            
            if(_sentValue > 0) {
                address(uint160(_participantAddress)).transfer(_sentValue);
            }
            return;
        }

        
        for (uint8 stageId = 0; stageId <= stageCount; stageId++) {
            participantStats.stages[stageId].pendingETH = 0;
        }

        
        participantStats.pendingETH = 0;

        
        canceledETH = canceledETH.add(participantPendingEth);
        pendingETH = pendingETH.sub(participantPendingEth);

        
        emit PendingContributionsCanceled(_participantAddress, participantPendingEth, uint32(participantStats.contributions));
        emit TransferEvent(
            uint8(TransferTypes.CONTRIBUTION_CANCELED),
            _participantAddress,
            participantPendingEth
        );


        
        address(uint160(_participantAddress)).transfer(participantPendingEth.add(_sentValue));

        
        sanityCheckParticipant(_participantAddress);
        sanityCheckProject();
    }


    
    function acceptContributions(address _participantAddress)
    internal
    isInitialized
    isNotFrozen
    isRunning
    {
        Participant storage participantStats = participants[_participantAddress];

        
        if (participantStats.pendingETH == 0) {
            return;
        }

        uint8 currentStage = getCurrentStage();
        uint256 totalRefundedETH;
        uint256 totalNewReservedTokens;

        calcParticipantAllocation(_participantAddress);

        
        if(participantStats.committedETH == 0) {
            participantStats.firstContributionBlock = participantStats._lastBlock; 
        }

        
        for (uint8 stageId = 0; stageId <= stageCount; stageId++) {
            ParticipantStageDetails storage byStage = participantStats.stages[stageId];

            
            if (byStage.pendingETH == 0) {
                continue;
            }

            
            if(stageId < currentStage) {
                
                participantStats.stages[currentStage].pendingETH = participantStats.stages[currentStage].pendingETH.add(byStage.pendingETH);
                
                byStage.pendingETH = 0;
                continue;
            }

            

            uint256 maxCommittableEth = committableEthAtStage(stageId, currentStage);
            uint256 newlyCommittableEth = byStage.pendingETH;
            uint256 returnEth = 0;
            uint256 overflowEth = 0;

            
            
            if (newlyCommittableEth > maxCommittableEth) {
                overflowEth = newlyCommittableEth.sub(maxCommittableEth);
                newlyCommittableEth = maxCommittableEth;

                
                if (stageId == stageCount) {
                    returnEth = overflowEth;
                    totalRefundedETH = totalRefundedETH.add(returnEth);

                
                } else {
                    participantStats.stages[stageId + 1].pendingETH = participantStats.stages[stageId + 1].pendingETH.add(overflowEth);
                    byStage.pendingETH = byStage.pendingETH.sub(overflowEth);
                }
            }

            
            uint256 newTokenAmount = getTokenAmountForEthAtStage(
                newlyCommittableEth, stageId
            );

            totalNewReservedTokens = totalNewReservedTokens.add(newTokenAmount);

            
            participantStats._currentReservedTokens = participantStats._currentReservedTokens.add(newTokenAmount);
            participantStats.reservedTokens = participantStats.reservedTokens.add(newTokenAmount);
            participantStats.committedETH = participantStats.committedETH.add(newlyCommittableEth);
            participantStats.pendingETH = participantStats.pendingETH.sub(newlyCommittableEth).sub(returnEth);

            byStage.pendingETH = byStage.pendingETH.sub(newlyCommittableEth).sub(returnEth);

            
            tokenSupply = tokenSupply.sub(newTokenAmount);
            pendingETH = pendingETH.sub(newlyCommittableEth).sub(returnEth);
            committedETH = committedETH.add(newlyCommittableEth);
            _projectCurrentlyReservedETH = _projectCurrentlyReservedETH.add(newlyCommittableEth);

            
            emit ContributionsAccepted(_participantAddress, newlyCommittableEth, newTokenAmount, stageId);
        }

        
        if (totalRefundedETH > 0) {
            emit TransferEvent(uint8(TransferTypes.CONTRIBUTION_ACCEPTED_OVERFLOW), _participantAddress, totalRefundedETH);
            address(uint160(_participantAddress)).transfer(totalRefundedETH);
        }

        
        
        IERC777(tokenAddress).send(_participantAddress, totalNewReservedTokens, "");

        
        sanityCheckParticipant(_participantAddress);
        sanityCheckProject();
    }


    
    function withdraw(address _participantAddress, uint256 _returnedTokenAmount)
    internal
    isInitialized
    isNotFrozen
    isRunning
    {
        Participant storage participantStats = participants[_participantAddress];

        calcParticipantAllocation(_participantAddress);

        require(_returnedTokenAmount > 0, 'You can not withdraw without sending tokens.');
        require(participantStats._currentReservedTokens > 0 && participantStats.reservedTokens > 0, 'You can not withdraw, you have no locked tokens.');

        uint256 returnedTokenAmount = _returnedTokenAmount;
        uint256 overflowingTokenAmount;
        uint256 returnEthAmount;

        
        if (returnedTokenAmount > participantStats._currentReservedTokens) {
            overflowingTokenAmount = returnedTokenAmount.sub(participantStats._currentReservedTokens);
            returnedTokenAmount = participantStats._currentReservedTokens;
        }

        
        returnEthAmount = participantStats.committedETH.mul(
            returnedTokenAmount.sub(1).mul(10 ** 20) 
            .div(participantStats.reservedTokens)
        ).div(10 ** 20);


        
        participantStats.withdraws++;
        participantStats._currentReservedTokens = participantStats._currentReservedTokens.sub(returnedTokenAmount);
        participantStats.reservedTokens = participantStats.reservedTokens.sub(returnedTokenAmount);
        participantStats.committedETH = participantStats.committedETH.sub(returnEthAmount);

        
        tokenSupply = tokenSupply.add(returnedTokenAmount);
        withdrawnETH = withdrawnETH.add(returnEthAmount);
        committedETH = committedETH.sub(returnEthAmount);

        _projectCurrentlyReservedETH = _projectCurrentlyReservedETH.sub(returnEthAmount);


        
        if (overflowingTokenAmount > 0) {
            
            bytes memory data;

            
            emit TransferEvent(uint8(TransferTypes.PARTICIPANT_WITHDRAW_OVERFLOW), _participantAddress, overflowingTokenAmount);

            
            IERC777(tokenAddress).send(_participantAddress, overflowingTokenAmount, data);
        }

        
        emit ParticipantWithdraw(_participantAddress, returnEthAmount, returnedTokenAmount, uint32(participantStats.withdraws));
        emit TransferEvent(uint8(TransferTypes.PARTICIPANT_WITHDRAW), _participantAddress, returnEthAmount);

        
        address(uint160(_participantAddress)).transfer(returnEthAmount);

        
        sanityCheckParticipant(_participantAddress);
        sanityCheckProject();
    }

    

    
    modifier onlyProjectAddress() {
        require(msg.sender == projectAddress, "Only the project can call this method.");
        _;
    }

    
    modifier onlyDeployingAddress() {
        require(msg.sender == deployingAddress, "Only the deployer can call this method.");
        _;
    }

    
    modifier onlyWhitelistingAddress() {
        require(msg.sender == whitelistingAddress, "Only the whitelist controller can call this method.");
        _;
    }

    
    modifier onlyFreezerAddress() {
        require(msg.sender == freezerAddress, "Only the freezer address can call this method.");
        _;
    }

    
    modifier onlyRescuerAddress() {
        require(msg.sender == rescuerAddress, "Only the rescuer address can call this method.");
        _;
    }

    
    modifier isInitialized() {
        require(initialized == true, "Contract must be initialized.");
        _;
    }

    
    modifier isNotInitialized() {
        require(initialized == false, "Contract can not be initialized.");
        _;
    }

    
    modifier isFrozen() {
        require(frozen == true, "rICO has to be frozen!");
        _;
    }

    
    modifier isNotFrozen() {
        require(frozen == false, "rICO is frozen!");
        _;
    }

    
    modifier isRunning() {
        uint256 blockNumber = getCurrentEffectiveBlockNumber();
        require(blockNumber >= commitPhaseStartBlock && blockNumber <= buyPhaseEndBlock, "Current block is outside the rICO period.");
        _;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"stageId","type":"uint8"}],"name":"ContributionsAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"FreezerAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"withdrawCount","type":"uint32"}],"name":"ParticipantWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributionId","type":"uint32"},{"indexed":false,"internalType":"uint8","name":"stageId","type":"uint8"}],"name":"PendingContributionAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributionId","type":"uint32"}],"name":"PendingContributionsCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"projectAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"withdrawCount","type":"uint32"}],"name":"ProjectWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityDisableEscapeHatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rescuerAddress","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityEscapeHatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityFreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"freezerAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"SecurityUnfreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"tokenLimit","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"tokenPrice","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"StageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint8","name":"typeId","type":"uint8"},{"indexed":true,"internalType":"address","name":"relatedAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"pendingETH","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributions","type":"uint32"}],"name":"WhitelistApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"participantAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"pendingETH","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"contributions","type":"uint32"}],"name":"WhitelistRejected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"whitelistingAddress","type":"address"},{"indexed":true,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":true,"internalType":"uint256","name":"effectiveBlockNumber","type":"uint256"}],"name":"WhitelistingAddressChanged","type":"event"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"constant":true,"inputs":[],"name":"buyPhaseBlockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPhaseEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"buyPhaseStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_lastBlock","type":"uint256"}],"name":"calcUnlockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancel","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"canceledETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"changeFreezerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint8","name":"_stageId","type":"uint8"},{"internalType":"uint256","name":"_tokenLimit","type":"uint256"},{"internalType":"uint256","name":"_tokenPrice","type":"uint256"}],"name":"changeStage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"changeWhitelistingAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"commit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"commitPhaseBlockCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"commitPhaseEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"commitPhasePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"commitPhaseStartBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"_stageId","type":"uint8"},{"internalType":"uint8","name":"_currentStage","type":"uint8"}],"name":"committableEthAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"committedETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"deployingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disableEscapeHatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"escapeHatch","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"freeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"freezeStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"freezerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"frozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"frozenPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailableProjectETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getAvailableTokenAtCurrentStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentEffectiveBlockNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentStage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"},{"internalType":"uint8","name":"_stageId","type":"uint8"}],"name":"getEthAmountForTokensAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_participantAddress","type":"address"}],"name":"getParticipantReservedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_participantAddress","type":"address"}],"name":"getParticipantUnlockedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"_stageId","type":"uint8"}],"name":"getPriceAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenLimit","type":"uint256"}],"name":"getPriceForTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenLimit","type":"uint256"}],"name":"getStageByTokenLimit","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"},{"internalType":"uint8","name":"_stageId","type":"uint8"}],"name":"getTokenAmountForEthAtStage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getUnlockedProjectETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"address","name":"_whitelistingAddress","type":"address"},{"internalType":"address","name":"_freezerAddress","type":"address"},{"internalType":"address","name":"_rescuerAddress","type":"address"},{"internalType":"address","name":"_projectAddress","type":"address"},{"internalType":"uint256","name":"_commitPhaseStartBlock","type":"uint256"},{"internalType":"uint256","name":"_buyPhaseStartBlock","type":"uint256"},{"internalType":"uint256","name":"_buyPhaseEndBlock","type":"uint256"},{"internalType":"uint256","name":"_initialPrice","type":"uint256"},{"internalType":"uint8","name":"_stageCount","type":"uint8"},{"internalType":"uint256","name":"_stageTokenLimitIncrease","type":"uint256"},{"internalType":"uint256","name":"_stagePriceIncrease","type":"uint256"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"initialTokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"participantCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participants","outputs":[{"internalType":"bool","name":"whitelisted","type":"bool"},{"internalType":"uint32","name":"contributions","type":"uint32"},{"internalType":"uint32","name":"withdraws","type":"uint32"},{"internalType":"uint256","name":"firstContributionBlock","type":"uint256"},{"internalType":"uint256","name":"reservedTokens","type":"uint256"},{"internalType":"uint256","name":"committedETH","type":"uint256"},{"internalType":"uint256","name":"pendingETH","type":"uint256"},{"internalType":"uint256","name":"_currentReservedTokens","type":"uint256"},{"internalType":"uint256","name":"_unlockedTokens","type":"uint256"},{"internalType":"uint256","name":"_lastBlock","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participantsById","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"projectAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"projectTokenWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_ethAmount","type":"uint256"}],"name":"projectWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"projectWithdrawCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"projectWithdrawnETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rescuerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"stageCount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"stages","outputs":[{"internalType":"uint256","name":"tokenLimit","type":"uint256"},{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unfreeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"bool","name":"_approve","type":"bool"}],"name":"whitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"whitelistingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"withdrawnETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]

6080604052600080546001600160a01b031916731820a4b7618bde71dce8cdc73aab6c95905fad2417905567016345785d8a000060115568d8d726b7177a80000060125534801561004f57600080fd5b50600380546001600160a01b0319163317905560008054604080517f455243373737546f6b656e73526563697069656e740000000000000000000000815281519081900360150181207f29965a1d00000000000000000000000000000000000000000000000000000000825230600483018190526024830191909152604482015290516001600160a01b0392909216926329965a1d9260648084019382900301818387803b15801561010057600080fd5b505af1158015610114573d6000803e3d6000fd5b5050505061400880620001286000396000f3fe6080604052600436106103ac5760003560e01c80636fd902e1116101e7578063b307404d1161010d578063ea8a1af0116100a0578063eedbe31d1161006f578063eedbe31d14610df7578063ef7953a214610e0c578063f33261ac14610e21578063ff14e8ea14610e36576103ac565b8063ea8a1af014610db0578063eb10dec714610db8578063eb13a7d214610dcd578063eb91d37e14610de2576103ac565b8063d7d4c35c116100dc578063d7d4c35c14610d5c578063dddc380614610d71578063e43fa30f14610d86578063e6b8e77a14610d9b576103ac565b8063b307404d14610ccf578063c2df08e514610ce4578063cfe5971614610d17578063d106ed7814610d47576103ac565b8063925470f911610185578063a128242011610154578063a128242014610c32578063a142d60814610c72578063aaffadf314610ca5578063ac4c9ea114610cba576103ac565b8063925470f914610bc95780639424222414610bde578063986a9eaa14610bf35780639d76ea5814610c1d576103ac565b80637824407f116101c15780637824407f14610b5d5780637a4af4ce14610b725780638aacc8f714610b9f5780638d3d657614610bb4576103ac565b80636fd902e114610aeb578063751622d314610b00578063760c234f14610b33576103ac565b80632b2e863f116102d75780635a7b28da1161026a57806362a5af3b1161023957806362a5af3b14610a555780636a28f00014610a6a5780636ceb116c14610a7f5780636ed0b9d714610ab2576103ac565b80635a7b28da146109c55780635bfe8ad8146109f85780635dabfbcf14610a0d5780636213008314610a22576103ac565b8063385b2884116102a6578063385b28841461097e5780633c7a3aff146109935780633cf96af11461099b578063526f3577146109b0576103ac565b80632b2e863f1461090c5780632c77ddfd1461093f578063362f04c01461095457806336f62d4c14610969576103ac565b806309e69ede1161034f5780631675c3371161031e5780631675c337146108725780631c369b12146108875780631e88b2aa146108b157806321dd501b146108f7576103ac565b806309e69ede146107905780630de06a041461081e5780631219270114610848578063158ef93e1461085d576103ac565b8063031adff01161038b578063031adff01461069c578063054f7d9c146106cd5780630645dc86146106f657806306cc71591461070b576103ac565b806223de29146104dd57806301b38af5146105d657806302c9b6da14610655575b600054600160a01b900460ff1615156001146103fd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561044e576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b336000908152601560205260409020805460ff161515600114801561047e57508054610100900463ffffffff1615155b156104905761048b610e4b565b6104da565b60115434106104d05760405162461bcd60e51b815260040180806020018281038252603c815260200180613ce1603c913960400191505060405180910390fd5b6104da333461111a565b50005b3480156104e957600080fd5b506105d4600480360360c081101561050057600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91939092909160208101903564010000000081111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111640100000000831117156105c957600080fd5b50909250905061134e565b005b3480156105e257600080fd5b506105d4600480360360408110156105f957600080fd5b81019060208101813564010000000081111561061457600080fd5b82018360208201111561062657600080fd5b8035906020019184602083028401116401000000008311171561064857600080fd5b9193509150351515611494565b34801561066157600080fd5b5061068a6004803603604081101561067857600080fd5b5060ff81358116916020013516611748565b60408051918252519081900360200190f35b3480156106a857600080fd5b506106b161181f565b604080516001600160a01b039092168252519081900360200190f35b3480156106d957600080fd5b506106e261182e565b604080519115158252519081900360200190f35b34801561070257600080fd5b5061068a61183e565b34801561071757600080fd5b506105d4600480360361018081101561072f57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101358216916080820135169060a08101359060c08101359060e0810135906101008101359060ff6101208201351690610140810135906101600135611844565b34801561079c57600080fd5b506107c3600480360360208110156107b357600080fd5b50356001600160a01b0316611c43565b604080519a15158b5263ffffffff998a1660208c015297909816898801526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083019190915251908190036101400190f35b34801561082a57600080fd5b506106b16004803603602081101561084157600080fd5b5035611c9c565b34801561085457600080fd5b5061068a611cb7565b34801561086957600080fd5b506106e2611d04565b34801561087e57600080fd5b5061068a611d14565b34801561089357600080fd5b5061068a600480360360208110156108aa57600080fd5b5035611d1a565b3480156108bd57600080fd5b506108de600480360360208110156108d457600080fd5b503560ff16611d35565b6040805192835260208301919091528051918290030190f35b34801561090357600080fd5b506106b1611d4e565b34801561091857600080fd5b506105d46004803603602081101561092f57600080fd5b50356001600160a01b0316611d5d565b34801561094b57600080fd5b5061068a611e64565b34801561096057600080fd5b5061068a611e6a565b34801561097557600080fd5b5061068a611e70565b34801561098a57600080fd5b5061068a611e76565b6105d4610e4b565b3480156109a757600080fd5b506106b1611e7c565b3480156109bc57600080fd5b5061068a611e8b565b3480156109d157600080fd5b5061068a600480360360408110156109e857600080fd5b508035906020013560ff16611e91565b348015610a0457600080fd5b506106b1611ed6565b348015610a1957600080fd5b5061068a611ee5565b348015610a2e57600080fd5b5061068a60048036036020811015610a4557600080fd5b50356001600160a01b0316611eeb565b348015610a6157600080fd5b506105d4611f3c565b348015610a7657600080fd5b506105d461203f565b348015610a8b57600080fd5b506105d460048036036020811015610aa257600080fd5b50356001600160a01b0316612173565b348015610abe57600080fd5b506105d460048036036060811015610ad557600080fd5b5060ff813516906020810135906040013561227a565b348015610af757600080fd5b5061068a612391565b348015610b0c57600080fd5b5061068a60048036036020811015610b2357600080fd5b50356001600160a01b0316612395565b348015610b3f57600080fd5b506105d460048036036020811015610b5657600080fd5b50356123d5565b348015610b6957600080fd5b5061068a6125ed565b348015610b7e57600080fd5b5061068a60048036036020811015610b9557600080fd5b503560ff166125f3565b348015610bab57600080fd5b5061068a61263f565b348015610bc057600080fd5b5061068a61265b565b348015610bd557600080fd5b5061068a612661565b348015610bea57600080fd5b506106b1612667565b348015610bff57600080fd5b506105d460048036036020811015610c1657600080fd5b5035612676565b348015610c2957600080fd5b506106b16127f9565b348015610c3e57600080fd5b50610c5c60048036036020811015610c5557600080fd5b5035612808565b6040805160ff9092168252519081900360200190f35b348015610c7e57600080fd5b506105d460048036036020811015610c9557600080fd5b50356001600160a01b0316612851565b348015610cb157600080fd5b5061068a612b2f565b348015610cc657600080fd5b5061068a612b35565b348015610cdb57600080fd5b5061068a612b3b565b348015610cf057600080fd5b5061068a60048036036040811015610d0757600080fd5b508035906020013560ff16612b41565b348015610d2357600080fd5b5061068a60048036036040811015610d3a57600080fd5b5080359060200135612b76565b348015610d5357600080fd5b5061068a612c50565b348015610d6857600080fd5b5061068a612c56565b348015610d7d57600080fd5b5061068a612c5c565b348015610d9257600080fd5b5061068a612c89565b348015610da757600080fd5b5061068a612ca0565b6105d4612ca6565b348015610dc457600080fd5b506105d4612d54565b348015610dd957600080fd5b5061068a612e5b565b348015610dee57600080fd5b5061068a612e61565b348015610e0357600080fd5b50610c5c612e6a565b348015610e1857600080fd5b5061068a612e8b565b348015610e2d57600080fd5b50610c5c612e91565b348015610e4257600080fd5b5061068a612e9a565b600054600160a01b900460ff161515600114610e9c576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615610eed576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000610ef7612c89565b90506019548110158015610f0d5750601d548111155b610f485760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b601154341015610f895760405162461bcd60e51b8152600401808060200182810382526031815260200180613d646031913960400191505060405180910390fd5b6000610f93612e6a565b33600090815260156020908152604080832060ff851684526008810190925290912060125460038301549394509192909190610fd5903463ffffffff612ea016565b11156110125760405162461bcd60e51b8152600401808060200182810382526033815260200180613bf16033913960400191505060405180910390fd5b8154610100900463ffffffff1661104d5760178054600090815260166020526040902080546001600160a01b03191633179055805460010190555b815463ffffffff610100808304821660010182160264ffffffff00199092169190911783556004830154611083913490612ea016565b6004830155805461109a903463ffffffff612ea016565b8155600c546110af903463ffffffff612ea016565b600c5581546040805160ff86168152905161010090920463ffffffff1691349133917fe42dc85c0ca0d425b5cabdbc8ac4757bef107c19bde01c7e3ac017ef2c71c453916020908290030190a4815460ff161515600114156111145761111433612efa565b50505050565b600054600160a01b900460ff16151560011461116b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156111bc576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6001600160a01b038216600090815260156020526040902060048101548061122357821561121c576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505015801561121a573d6000803e3d6000fd5b505b505061134a565b60005b60145460ff908116908216116112535760ff81166000908152600884016020526040812055600101611226565b5060006004830155600d5461126e908263ffffffff612ea016565b600d55600c54611284908263ffffffff6133df16565b600c55815460405161010090910463ffffffff169082906001600160a01b038716907f364ec3f465370ab2a2e3372430e62b57888138adedc4fc228074738c8074d43e90600090a460405181906001600160a01b03861690600290600080516020613f8683398151915290600090a46001600160a01b0384166108fc611310838663ffffffff612ea016565b6040518115909202916000818181858888f19350505050158015611338573d6000803e3d6000fd5b506113428461343c565b6111146134ae565b5050565b600054600160a01b900460ff16151560011461139f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156113f0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6004546001600160a01b031633146114395760405162461bcd60e51b8152600401808060200182810382526023815260200180613c546023913960400191505060405180910390fd5b6005546001600160a01b038881169116141561148057600a54611462908663ffffffff612ea016565b600a55600954611478908663ffffffff612ea016565b60095561148a565b61148a8786613563565b5050505050505050565b6006546001600160a01b031633146114dd5760405162461bcd60e51b8152600401808060200182810382526033815260200180613c776033913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461152e576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561157f576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000611589612c89565b9050601954811015801561159f5750601d548111155b6115da5760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b8261162c576040805162461bcd60e51b815260206004820181905260248201527f4e6f2061646472657373657320676976656e20746f2077686974656c6973742e604482015290519081900360640190fd5b60005b8381101561174157600085858381811061164557fe5b602090810292909201356001600160a01b03166000818152601590935260409092209192505084156116dd57805460ff166116cf578054600160ff1990911617808255600482015460405161010090920463ffffffff16916001600160a01b038516907ff0539e8d8584ef4692bf4b5a19e6e1edbe065e4d4284543dbd1c426e11627aa390600090a45b6116d882612efa565b611737565b805460ff1916808255600482015460405161010090920463ffffffff16916001600160a01b038516907f627c2a10f06fa1b31039f063bad0eb419e52ce3c6cb6fe90483f5498a81d0fae90600090a461173782600061111a565b505060010161162f565b5050505050565b6000808260ff168460ff161015611763576000915050611819565b60145460ff9081169085161061177c5750600a5461180b565b8260ff168460ff1614156117ca576117c36117a4600a546009546133df90919063ffffffff16565b60ff85166000908152601360205260409020549063ffffffff6133df16565b905061180b565b8260ff168460ff16111561180b5760ff600019850181166000908152601360205260408082205492871682529020546118089163ffffffff6133df16565b90505b6118158185612b41565b9150505b92915050565b6006546001600160a01b031681565b600054600160a81b900460ff1681565b600c5481565b6003546001600160a01b0316331461188d5760405162461bcd60e51b8152600401808060200182810382526027815260200180613e836027913960400191505060405180910390fd5b600054600160a01b900460ff16156118ec576040805162461bcd60e51b815260206004820181905260248201527f436f6e74726163742063616e206e6f7420626520696e697469616c697a65642e604482015290519081900360640190fd5b6001600160a01b038c16611947576040805162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e416464726573732063616e6e6f74206265203078000000000000604482015290519081900360640190fd5b6001600160a01b038b1661198c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613f3c6021913960400191505060405180910390fd5b6001600160a01b038a166119e7576040805162461bcd60e51b815260206004820152601c60248201527f5f667265657a6572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038916611a42576040805162461bcd60e51b815260206004820152601c60248201527f5f72657363756572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038816611a9d576040805162461bcd60e51b815260206004820152601c60248201527f5f70726f6a656374416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b038f8116919091179092556006805482168e84161790556007805482168d84161790556008805482168c841617905560058054909116918a169190911790556019879055611b038660016133df565b601a819055601954611b2e91600191611b22919063ffffffff6133df16565b9063ffffffff612ea016565b601b5560188490556014805460ff191660ff85161790556000805260136020527f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6c8281557f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6d8590558260015b8560ff168160ff1611611bfd5760ff81166000908152601360205260409020611bc9838763ffffffff612ea016565b8082559250611bf1611be48660ff851663ffffffff613a4b16565b899063ffffffff612ea016565b60019182015501611b9a565b50601c889055601d879055611c1d6001611b22898b63ffffffff6133df16565b601e5550506000805460ff60a01b1916600160a01b179055505050505050505050505050565b6015602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff87169763ffffffff6101008904811698650100000000009004169695949392918a565b6016602052600090815260409020546001600160a01b031681565b6000611cff611cd3600a546009546133df90919063ffffffff16565b60136000611cdf612e6a565b60ff1681526020810191909152604001600020549063ffffffff6133df16565b905090565b600054600160a01b900460ff1681565b60025481565b6000611d2d611d2883612808565b6125f3565b90505b919050565b6013602052600090815260409020805460019091015482565b6003546001600160a01b031681565b6005546001600160a01b03163314611da65760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114611df7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b038316179055611e1a612c89565b611e22612e6a565b60075460405160ff92909216916001600160a01b03909116907f1c223660ab8492f7576b506eab2f6c471aa9c38007d4eef27b67bae9e6598ad090600090a450565b60015481565b60175481565b60195481565b601b5481565b6005546001600160a01b031681565b601d5481565b60ff8116600090815260136020526040812060010154611ecf90611ec385670de0b6b3a764000063ffffffff613a4b16565b9063ffffffff613aa416565b9392505050565b6007546001600160a01b031681565b601c5481565b6001600160a01b03811660009081526015602052604081206005810154611f16576000915050611d30565b611ecf611f2b82600501548360070154612b76565b60058301549063ffffffff6133df16565b6007546001600160a01b03163314611f855760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615611fd6576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000805460ff60a81b1916600160a81b179055611ff1612c89565b6002819055611ffe612e6a565b60075460405160ff92909216916001600160a01b03909116907f453d43c0c8c4324f6f7fabe1590e8486971f3455abca3efdd9f7218da290504890600090a4565b6007546001600160a01b031633146120885760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146120e4576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60006120ee612c89565b6000805460ff60a81b191690556002549091506121259061211690839063ffffffff6133df16565b6001549063ffffffff612ea016565b60015580612131612e6a565b60075460405160ff92909216916001600160a01b03909116907fa8a93bdc6ed0ce129bba00b28a8baab2dd98dd66ce0c6a4fee7e93fc216fc9c890600090a450565b6005546001600160a01b031633146121bc5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461220d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b038316179055612230612c89565b612238612e6a565b60065460405160ff92909216916001600160a01b03909116907f312b3da9a5eff0d2ce8eab74067fa710fe549f5aa7560fed1aaf9ba8c327447b90600090a450565b6005546001600160a01b031633146122c35760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612314576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b60ff8084166000818152601360205260409020848155600101839055601454909116101561234c576014805460ff191660ff85161790555b80828460ff167f9b378870df69152cb0440f92c873673b2d98e3a255ac6b1cad034c5c021d737361237b612c89565b60408051918252519081900360200190a4505050565b4390565b6001600160a01b038116600090815260156020526040812060058101546007820154611ecf916123c491612b76565b60068301549063ffffffff612ea016565b6005546001600160a01b0316331461241e5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461246f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156124c0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6124c8613b0e565b60006124e16010546020546133df90919063ffffffff16565b9050808211156125225760405162461bcd60e51b8152600401808060200182810382526033815260200180613d956033913960400191505060405180910390fd5b600f8054600101905560105461253e908363ffffffff612ea016565b601055600f5460055460405163ffffffff9092169184916001600160a01b0316907f2401460fed42ac772a5e87dc7479e7991386130f48d5be74dbbe742b782217fd90600090a460055460405183916001600160a01b031690600690600080516020613f8683398151915290600090a46005546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156125e8573d6000803e3d6000fd5b505050565b600a5481565b60145460009060ff90811690831611612622575060ff8116600090815260136020526040902060010154611d30565b505060145460ff1660009081526013602052604090206001015490565b6000611cff60105461264f612c5c565b9063ffffffff6133df16565b60125481565b600f5481565b6008546001600160a01b031681565b6005546001600160a01b031633146126bf5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612710576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600a548111156127515760405162461bcd60e51b8152600401808060200182810382526037815260200180613caa6037913960400191505060405180910390fd5b600a54612764908263ffffffff6133df16565b600a5560095461277a908263ffffffff6133df16565b6009556004805460055460408051634decdde360e11b81526001600160a01b0392831694810194909452602484018590526060604485015260006064850181905290519190921692639bd9bbc69260a480830193919282900301818387803b1580156127e557600080fd5b505af1158015611741573d6000803e3d6000fd5b6004546001600160a01b031681565b6000805b60145460ff908116908216116128445760ff8116600090815260136020526040902054831161283c579050611d30565b60010161280c565b505060145460ff16919050565b6008546001600160a01b0316331461289a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dee602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146128f6576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60025461290b9061465063ffffffff612ea016565b612913612c89565b1461294f5760405162461bcd60e51b8152600401808060200182810382526047815260200180613d1d6047913960600191505060405180910390fd5b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b15801561299e57600080fd5b505afa1580156129b2573d6000803e3d6000fd5b505050506040513d60208110156129c857600080fd5b50516004805460408051634decdde360e11b81526001600160a01b0387811694820194909452602481018590526060604482015260006064820181905291519495503031949290931692639bd9bbc69260a4808301939282900301818387803b158015612a3457600080fd5b505af1158015612a48573d6000803e3d6000fd5b50506040516001600160a01b038616925083156108fc02915083906000818181858888f19350505050158015612a82573d6000803e3d6000fd5b50612a8b612e6a565b60085460ff91909116906001600160a01b0380861691167f97e1f0a494f6dcddabfe8372c43b6c3fb5a19759e98943fa5fffd36e13a7ca56612acb612c89565b60408051918252519081900360200190a460405182906001600160a01b03851690600790600080516020613f8683398151915290600090a460405181906001600160a01b03851690600890600080516020613f8683398151915290600090a4505050565b60115481565b601e5481565b601a5481565b60ff8116600090815260136020526040812060010154611ecf90670de0b6b3a764000090611ec390869063ffffffff613a4b16565b600080612b81612c89565b905083612b92576000915050611819565b601c548110158015612ba55750601d5481105b15612c3457601c548390811015612bcd57601c54612bca90600163ffffffff6133df16565b90505b6000612bdf838363ffffffff6133df16565b90506000612bf883601d546133df90919063ffffffff16565b9050612c2968056bc75e2d63100000611ec3612c1c8482878563ffffffff613a4b16565b8a9063ffffffff613a4b16565b945050505050611819565b601d548110612c465783915050611819565b5060009392505050565b600b5481565b60185481565b600080612c6d601f54602154612b76565b602054909150612c83908263ffffffff612ea016565b91505090565b6000611cff600154436133df90919063ffffffff16565b600d5481565b600054600160a01b900460ff161515600114612cf7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612d48576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b612d52333461111a565b565b6007546001600160a01b03163314612d9d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615612dee576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600780546001600160a01b0319908116909155600880549091169055612e12612c89565b612e1a612e6a565b60075460405160ff92909216916001600160a01b03909116907f67418f39698b6c86da32d11c63208a646f1d27fe8c0ad2236320488f7e391c8b90600090a4565b60095481565b6000611cff611d285b6000611cff612e86600a546009546133df90919063ffffffff16565b612808565b600e5481565b60145460ff1681565b60105481565b600082820183811015611ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600054600160a01b900460ff161515600114612f4b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612f9c576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000612fa6612c89565b90506019548110158015612fbc5750601d548111155b612ff75760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b0382166000908152601560205260409020600481015461301e575061134a565b6000613028612e6a565b905060008061303686613b63565b600384015461304a57600784015460018501555b60005b60145460ff908116908216116132e35760ff811660009081526008860160205260409020805461307d57506132db565b8460ff168260ff1610156130d057805460ff861660009081526008880160205260409020546130b19163ffffffff612ea016565b60ff8616600090815260088801602052604081209190915590556132db565b60006130dc8387611748565b825490915060008083831115613181576130fc838563ffffffff6133df16565b60145485945090915060ff8781169116141561312c57905080613125888263ffffffff612ea016565b9750613181565b60ff6001870116600090815260088b016020526040902054613154908263ffffffff612ea016565b60ff6001880116600090815260088c016020526040902055845461317e908263ffffffff6133df16565b85555b600061318d8488611e91565b905061319f888263ffffffff612ea016565b60058c01549098506131b7908263ffffffff612ea016565b60058c015560028b01546131d1908263ffffffff612ea016565b60028c015560038b01546131eb908563ffffffff612ea016565b60038c015560048b015461320b90849061264f908763ffffffff6133df16565b60048c0155855461322890849061264f908763ffffffff6133df16565b8655600a5461323d908263ffffffff6133df16565b600a55600c5461325990849061264f908763ffffffff6133df16565b600c55600b5461326f908563ffffffff612ea016565b600b55601f54613285908563ffffffff612ea016565b601f8190555080848e6001600160a01b03167fb2164840ce0fc0bd8bb63f912be03052e55ed2918270ca7f3a3d1b28b6df76118a604051808260ff1660ff16815260200191505060405180910390a45050505050505b60010161304d565b5081156133495760405182906001600160a01b03881690600390600080516020613f8683398151915290600090a46040516001600160a01b0387169083156108fc029084906000818181858888f19350505050158015613347573d6000803e3d6000fd5b505b6004805460408051634decdde360e11b81526001600160a01b038a811694820194909452602481018590526060604482015260006064820181905291519390921692639bd9bbc69260a480820193929182900301818387803b1580156133ae57600080fd5b505af11580156133c2573d6000803e3d6000fd5b505050506133cf8661343c565b6133d76134ae565b505050505050565b600082821115613436576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03811660009081526015602052604090206006810154600582015461346d9163ffffffff612ea016565b81600201541461134a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613ef66046913960600191505060405180910390fd5b602054601f546134c39163ffffffff612ea016565b600b54146135025760405162461bcd60e51b8152600401808060200182810382526046815260200180613e1c6046913960600191505060405180910390fd5b61352560105461264f600c54611b22601f54602054612ea090919063ffffffff16565b303114612d525760405162461bcd60e51b8152600401808060200182810382526044815260200180613bad6044913960600191505060405180910390fd5b600054600160a01b900460ff1615156001146135b4576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615613605576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600061360f612c89565b905060195481101580156136255750601d548111155b6136605760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b038316600090815260156020526040902061368184613b63565b600083116136c05760405162461bcd60e51b815260040180806020018281038252602c815260200180613eaa602c913960400191505060405180910390fd5b600081600501541180156136d8575060008160020154115b6137135760405162461bcd60e51b8152600401808060200182810382526030815260200180613c246030913960400191505060405180910390fd5b6000839050600080836005015483111561374757600584015461373d90849063ffffffff6133df16565b9150836005015492505b61379d68056bc75e2d63100000611ec361378c8760020154611ec368056bc75e2d6310000061378060018b6133df90919063ffffffff16565b9063ffffffff613a4b16565b60038801549063ffffffff613a4b16565b845468ffffffff0000000000198116650100000000009182900463ffffffff908116600101811690920217865560058601549192506137df919085906133df16565b600585015560028401546137f9908463ffffffff6133df16565b60028501556003840154613813908263ffffffff6133df16565b6003850155600a5461382b908463ffffffff612ea016565b600a55600e54613841908263ffffffff612ea016565b600e55600b54613857908263ffffffff6133df16565b600b55601f5461386d908263ffffffff6133df16565b601f55811561397d5760405160609083906001600160a01b038a1690600590600080516020613f8683398151915290600090a460048054604051634decdde360e11b81526001600160a01b038b8116938201938452602482018790526060604483019081528551606484015285519190931693639bd9bbc6938d9389938893929160840190602085019080838360005b838110156139155781810151838201526020016138fd565b50505050905090810190601f1680156139425780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561396357600080fd5b505af1158015613977573d6000803e3d6000fd5b50505050505b83546040805163ffffffff6501000000000090930492909216825251849183916001600160a01b038b16917fd7c6db51aa831aa589cb4100184601073068b102f0a83dd5beccc7afdf7d1df5919081900360200190a460405181906001600160a01b03891690600490600080516020613f8683398151915290600090a46040516001600160a01b0388169082156108fc029083906000818181858888f19350505050158015613a30573d6000803e3d6000fd5b50613a3a8761343c565b613a426134ae565b50505050505050565b600082613a5a57506000611819565b82820282848281613a6757fe5b0414611ecf5760405162461bcd60e51b8152600401808060200182810382526021815260200180613e626021913960400191505060405180910390fd5b6000808211613afa576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481613b0557fe5b04949350505050565b6000613b1e601f54602154612b76565b601f54909150613b34908263ffffffff6133df16565b601f55602054613b4a908263ffffffff612ea016565b602055613b55612c89565b602155613b606134ae565b50565b6001600160a01b0381166000908152601560205260409020613b8482612395565b6006820155613b9282611eeb565b6005820155613b9f612c89565b600782015561134a613b0e56fe50726f6a6563742073616e69747920636865636b206661696c6564212062616c616e6365203d20556e6c6f636b202b205265736572766564202d2057697468647261776e56616c75652073656e74206973206c6172676572207468616e20746865206d6178696d756d20636f6e747269627574696f6e2e596f752063616e206e6f742077697468647261772c20796f752068617665206e6f206c6f636b656420746f6b656e732e556e6b6e6f776e20746f6b656e20636f6e74726163742073656e7420746f6b656e732e4f6e6c79207468652077686974656c69737420636f6e74726f6c6c65722063616e2063616c6c2074686973206d6574686f642e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f75676820746f6b656e7320617661696c61626c652e546f20636f6e747269627574652063616c6c20636f6d6d69742829205b307833633761336166665d20616e642073656e642045544820616c6f6e672e4c657420697420636f6f6c2e2e2057616974206174206c65617374207e3320646179732028313830303020626c6b29206265666f7265206d6f76696e6720616e797468696e672e56616c75652073656e74206973206c657373207468616e20746865206d696e696d756d20636f6e747269627574696f6e2e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f7567682045544820756e6c6f636b65642e4f6e6c79207468652070726f6a6563742063616e2063616c6c2074686973206d6574686f642e4f6e6c7920746865207265736375657220616464726573732063616e2063616c6c2074686973206d6574686f642e50726f6a6563742053616e69747920636865636b206661696c656421205265736572766564202b20556e6c6f636b206d75737420657175616c20636f6d6d6974746564455448536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c7920746865206465706c6f7965722063616e2063616c6c2074686973206d6574686f642e596f752063616e206e6f7420776974686472617720776974686f75742073656e64696e6720746f6b656e732e436f6e7472616374206d75737420626520696e697469616c697a65642e0000005061727469636970616e742053616e69747920636865636b206661696c6564212052657365722e202b20556e6c6f636b206d75737420657175616c20746f74616c52657365725f77686974656c697374696e67416464726573732063616e6e6f7420626520307843757272656e7420626c6f636b206973206f75747369646520746865207249434f20706572696f642e2938c8ea03db725889f8f57dcc5e7e6e60a26dada7197cd0c4261bcc035d6fbc4f6e6c792074686520667265657a657220616464726573732063616e2063616c6c2074686973206d6574686f642ea265627a7a72315820453ed0f045b785f726ff75ef544b1e3d0e8582f04313972828329af94cc9057864736f6c63430005110032

Deployed Bytecode

0x6080604052600436106103ac5760003560e01c80636fd902e1116101e7578063b307404d1161010d578063ea8a1af0116100a0578063eedbe31d1161006f578063eedbe31d14610df7578063ef7953a214610e0c578063f33261ac14610e21578063ff14e8ea14610e36576103ac565b8063ea8a1af014610db0578063eb10dec714610db8578063eb13a7d214610dcd578063eb91d37e14610de2576103ac565b8063d7d4c35c116100dc578063d7d4c35c14610d5c578063dddc380614610d71578063e43fa30f14610d86578063e6b8e77a14610d9b576103ac565b8063b307404d14610ccf578063c2df08e514610ce4578063cfe5971614610d17578063d106ed7814610d47576103ac565b8063925470f911610185578063a128242011610154578063a128242014610c32578063a142d60814610c72578063aaffadf314610ca5578063ac4c9ea114610cba576103ac565b8063925470f914610bc95780639424222414610bde578063986a9eaa14610bf35780639d76ea5814610c1d576103ac565b80637824407f116101c15780637824407f14610b5d5780637a4af4ce14610b725780638aacc8f714610b9f5780638d3d657614610bb4576103ac565b80636fd902e114610aeb578063751622d314610b00578063760c234f14610b33576103ac565b80632b2e863f116102d75780635a7b28da1161026a57806362a5af3b1161023957806362a5af3b14610a555780636a28f00014610a6a5780636ceb116c14610a7f5780636ed0b9d714610ab2576103ac565b80635a7b28da146109c55780635bfe8ad8146109f85780635dabfbcf14610a0d5780636213008314610a22576103ac565b8063385b2884116102a6578063385b28841461097e5780633c7a3aff146109935780633cf96af11461099b578063526f3577146109b0576103ac565b80632b2e863f1461090c5780632c77ddfd1461093f578063362f04c01461095457806336f62d4c14610969576103ac565b806309e69ede1161034f5780631675c3371161031e5780631675c337146108725780631c369b12146108875780631e88b2aa146108b157806321dd501b146108f7576103ac565b806309e69ede146107905780630de06a041461081e5780631219270114610848578063158ef93e1461085d576103ac565b8063031adff01161038b578063031adff01461069c578063054f7d9c146106cd5780630645dc86146106f657806306cc71591461070b576103ac565b806223de29146104dd57806301b38af5146105d657806302c9b6da14610655575b600054600160a01b900460ff1615156001146103fd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561044e576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b336000908152601560205260409020805460ff161515600114801561047e57508054610100900463ffffffff1615155b156104905761048b610e4b565b6104da565b60115434106104d05760405162461bcd60e51b815260040180806020018281038252603c815260200180613ce1603c913960400191505060405180910390fd5b6104da333461111a565b50005b3480156104e957600080fd5b506105d4600480360360c081101561050057600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135919081019060a08101608082013564010000000081111561054357600080fd5b82018360208201111561055557600080fd5b8035906020019184600183028401116401000000008311171561057757600080fd5b91939092909160208101903564010000000081111561059557600080fd5b8201836020820111156105a757600080fd5b803590602001918460018302840111640100000000831117156105c957600080fd5b50909250905061134e565b005b3480156105e257600080fd5b506105d4600480360360408110156105f957600080fd5b81019060208101813564010000000081111561061457600080fd5b82018360208201111561062657600080fd5b8035906020019184602083028401116401000000008311171561064857600080fd5b9193509150351515611494565b34801561066157600080fd5b5061068a6004803603604081101561067857600080fd5b5060ff81358116916020013516611748565b60408051918252519081900360200190f35b3480156106a857600080fd5b506106b161181f565b604080516001600160a01b039092168252519081900360200190f35b3480156106d957600080fd5b506106e261182e565b604080519115158252519081900360200190f35b34801561070257600080fd5b5061068a61183e565b34801561071757600080fd5b506105d4600480360361018081101561072f57600080fd5b506001600160a01b0381358116916020810135821691604082013581169160608101358216916080820135169060a08101359060c08101359060e0810135906101008101359060ff6101208201351690610140810135906101600135611844565b34801561079c57600080fd5b506107c3600480360360208110156107b357600080fd5b50356001600160a01b0316611c43565b604080519a15158b5263ffffffff998a1660208c015297909816898801526060890195909552608088019390935260a087019190915260c086015260e085015261010084015261012083019190915251908190036101400190f35b34801561082a57600080fd5b506106b16004803603602081101561084157600080fd5b5035611c9c565b34801561085457600080fd5b5061068a611cb7565b34801561086957600080fd5b506106e2611d04565b34801561087e57600080fd5b5061068a611d14565b34801561089357600080fd5b5061068a600480360360208110156108aa57600080fd5b5035611d1a565b3480156108bd57600080fd5b506108de600480360360208110156108d457600080fd5b503560ff16611d35565b6040805192835260208301919091528051918290030190f35b34801561090357600080fd5b506106b1611d4e565b34801561091857600080fd5b506105d46004803603602081101561092f57600080fd5b50356001600160a01b0316611d5d565b34801561094b57600080fd5b5061068a611e64565b34801561096057600080fd5b5061068a611e6a565b34801561097557600080fd5b5061068a611e70565b34801561098a57600080fd5b5061068a611e76565b6105d4610e4b565b3480156109a757600080fd5b506106b1611e7c565b3480156109bc57600080fd5b5061068a611e8b565b3480156109d157600080fd5b5061068a600480360360408110156109e857600080fd5b508035906020013560ff16611e91565b348015610a0457600080fd5b506106b1611ed6565b348015610a1957600080fd5b5061068a611ee5565b348015610a2e57600080fd5b5061068a60048036036020811015610a4557600080fd5b50356001600160a01b0316611eeb565b348015610a6157600080fd5b506105d4611f3c565b348015610a7657600080fd5b506105d461203f565b348015610a8b57600080fd5b506105d460048036036020811015610aa257600080fd5b50356001600160a01b0316612173565b348015610abe57600080fd5b506105d460048036036060811015610ad557600080fd5b5060ff813516906020810135906040013561227a565b348015610af757600080fd5b5061068a612391565b348015610b0c57600080fd5b5061068a60048036036020811015610b2357600080fd5b50356001600160a01b0316612395565b348015610b3f57600080fd5b506105d460048036036020811015610b5657600080fd5b50356123d5565b348015610b6957600080fd5b5061068a6125ed565b348015610b7e57600080fd5b5061068a60048036036020811015610b9557600080fd5b503560ff166125f3565b348015610bab57600080fd5b5061068a61263f565b348015610bc057600080fd5b5061068a61265b565b348015610bd557600080fd5b5061068a612661565b348015610bea57600080fd5b506106b1612667565b348015610bff57600080fd5b506105d460048036036020811015610c1657600080fd5b5035612676565b348015610c2957600080fd5b506106b16127f9565b348015610c3e57600080fd5b50610c5c60048036036020811015610c5557600080fd5b5035612808565b6040805160ff9092168252519081900360200190f35b348015610c7e57600080fd5b506105d460048036036020811015610c9557600080fd5b50356001600160a01b0316612851565b348015610cb157600080fd5b5061068a612b2f565b348015610cc657600080fd5b5061068a612b35565b348015610cdb57600080fd5b5061068a612b3b565b348015610cf057600080fd5b5061068a60048036036040811015610d0757600080fd5b508035906020013560ff16612b41565b348015610d2357600080fd5b5061068a60048036036040811015610d3a57600080fd5b5080359060200135612b76565b348015610d5357600080fd5b5061068a612c50565b348015610d6857600080fd5b5061068a612c56565b348015610d7d57600080fd5b5061068a612c5c565b348015610d9257600080fd5b5061068a612c89565b348015610da757600080fd5b5061068a612ca0565b6105d4612ca6565b348015610dc457600080fd5b506105d4612d54565b348015610dd957600080fd5b5061068a612e5b565b348015610dee57600080fd5b5061068a612e61565b348015610e0357600080fd5b50610c5c612e6a565b348015610e1857600080fd5b5061068a612e8b565b348015610e2d57600080fd5b50610c5c612e91565b348015610e4257600080fd5b5061068a612e9a565b600054600160a01b900460ff161515600114610e9c576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615610eed576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000610ef7612c89565b90506019548110158015610f0d5750601d548111155b610f485760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b601154341015610f895760405162461bcd60e51b8152600401808060200182810382526031815260200180613d646031913960400191505060405180910390fd5b6000610f93612e6a565b33600090815260156020908152604080832060ff851684526008810190925290912060125460038301549394509192909190610fd5903463ffffffff612ea016565b11156110125760405162461bcd60e51b8152600401808060200182810382526033815260200180613bf16033913960400191505060405180910390fd5b8154610100900463ffffffff1661104d5760178054600090815260166020526040902080546001600160a01b03191633179055805460010190555b815463ffffffff610100808304821660010182160264ffffffff00199092169190911783556004830154611083913490612ea016565b6004830155805461109a903463ffffffff612ea016565b8155600c546110af903463ffffffff612ea016565b600c5581546040805160ff86168152905161010090920463ffffffff1691349133917fe42dc85c0ca0d425b5cabdbc8ac4757bef107c19bde01c7e3ac017ef2c71c453916020908290030190a4815460ff161515600114156111145761111433612efa565b50505050565b600054600160a01b900460ff16151560011461116b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156111bc576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6001600160a01b038216600090815260156020526040902060048101548061122357821561121c576040516001600160a01b0385169084156108fc029085906000818181858888f1935050505015801561121a573d6000803e3d6000fd5b505b505061134a565b60005b60145460ff908116908216116112535760ff81166000908152600884016020526040812055600101611226565b5060006004830155600d5461126e908263ffffffff612ea016565b600d55600c54611284908263ffffffff6133df16565b600c55815460405161010090910463ffffffff169082906001600160a01b038716907f364ec3f465370ab2a2e3372430e62b57888138adedc4fc228074738c8074d43e90600090a460405181906001600160a01b03861690600290600080516020613f8683398151915290600090a46001600160a01b0384166108fc611310838663ffffffff612ea016565b6040518115909202916000818181858888f19350505050158015611338573d6000803e3d6000fd5b506113428461343c565b6111146134ae565b5050565b600054600160a01b900460ff16151560011461139f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156113f0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6004546001600160a01b031633146114395760405162461bcd60e51b8152600401808060200182810382526023815260200180613c546023913960400191505060405180910390fd5b6005546001600160a01b038881169116141561148057600a54611462908663ffffffff612ea016565b600a55600954611478908663ffffffff612ea016565b60095561148a565b61148a8786613563565b5050505050505050565b6006546001600160a01b031633146114dd5760405162461bcd60e51b8152600401808060200182810382526033815260200180613c776033913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461152e576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff161561157f576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000611589612c89565b9050601954811015801561159f5750601d548111155b6115da5760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b8261162c576040805162461bcd60e51b815260206004820181905260248201527f4e6f2061646472657373657320676976656e20746f2077686974656c6973742e604482015290519081900360640190fd5b60005b8381101561174157600085858381811061164557fe5b602090810292909201356001600160a01b03166000818152601590935260409092209192505084156116dd57805460ff166116cf578054600160ff1990911617808255600482015460405161010090920463ffffffff16916001600160a01b038516907ff0539e8d8584ef4692bf4b5a19e6e1edbe065e4d4284543dbd1c426e11627aa390600090a45b6116d882612efa565b611737565b805460ff1916808255600482015460405161010090920463ffffffff16916001600160a01b038516907f627c2a10f06fa1b31039f063bad0eb419e52ce3c6cb6fe90483f5498a81d0fae90600090a461173782600061111a565b505060010161162f565b5050505050565b6000808260ff168460ff161015611763576000915050611819565b60145460ff9081169085161061177c5750600a5461180b565b8260ff168460ff1614156117ca576117c36117a4600a546009546133df90919063ffffffff16565b60ff85166000908152601360205260409020549063ffffffff6133df16565b905061180b565b8260ff168460ff16111561180b5760ff600019850181166000908152601360205260408082205492871682529020546118089163ffffffff6133df16565b90505b6118158185612b41565b9150505b92915050565b6006546001600160a01b031681565b600054600160a81b900460ff1681565b600c5481565b6003546001600160a01b0316331461188d5760405162461bcd60e51b8152600401808060200182810382526027815260200180613e836027913960400191505060405180910390fd5b600054600160a01b900460ff16156118ec576040805162461bcd60e51b815260206004820181905260248201527f436f6e74726163742063616e206e6f7420626520696e697469616c697a65642e604482015290519081900360640190fd5b6001600160a01b038c16611947576040805162461bcd60e51b815260206004820152601a60248201527f5f746f6b656e416464726573732063616e6e6f74206265203078000000000000604482015290519081900360640190fd5b6001600160a01b038b1661198c5760405162461bcd60e51b8152600401808060200182810382526021815260200180613f3c6021913960400191505060405180910390fd5b6001600160a01b038a166119e7576040805162461bcd60e51b815260206004820152601c60248201527f5f667265657a6572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038916611a42576040805162461bcd60e51b815260206004820152601c60248201527f5f72657363756572416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b6001600160a01b038816611a9d576040805162461bcd60e51b815260206004820152601c60248201527f5f70726f6a656374416464726573732063616e6e6f7420626520307800000000604482015290519081900360640190fd5b600480546001600160a01b03199081166001600160a01b038f8116919091179092556006805482168e84161790556007805482168d84161790556008805482168c841617905560058054909116918a169190911790556019879055611b038660016133df565b601a819055601954611b2e91600191611b22919063ffffffff6133df16565b9063ffffffff612ea016565b601b5560188490556014805460ff191660ff85161790556000805260136020527f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6c8281557f8fa6efc3be94b5b348b21fea823fe8d100408cee9b7f90524494500445d8ff6d8590558260015b8560ff168160ff1611611bfd5760ff81166000908152601360205260409020611bc9838763ffffffff612ea016565b8082559250611bf1611be48660ff851663ffffffff613a4b16565b899063ffffffff612ea016565b60019182015501611b9a565b50601c889055601d879055611c1d6001611b22898b63ffffffff6133df16565b601e5550506000805460ff60a01b1916600160a01b179055505050505050505050505050565b6015602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460079097015460ff87169763ffffffff6101008904811698650100000000009004169695949392918a565b6016602052600090815260409020546001600160a01b031681565b6000611cff611cd3600a546009546133df90919063ffffffff16565b60136000611cdf612e6a565b60ff1681526020810191909152604001600020549063ffffffff6133df16565b905090565b600054600160a01b900460ff1681565b60025481565b6000611d2d611d2883612808565b6125f3565b90505b919050565b6013602052600090815260409020805460019091015482565b6003546001600160a01b031681565b6005546001600160a01b03163314611da65760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114611df7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600780546001600160a01b0319166001600160a01b038316179055611e1a612c89565b611e22612e6a565b60075460405160ff92909216916001600160a01b03909116907f1c223660ab8492f7576b506eab2f6c471aa9c38007d4eef27b67bae9e6598ad090600090a450565b60015481565b60175481565b60195481565b601b5481565b6005546001600160a01b031681565b601d5481565b60ff8116600090815260136020526040812060010154611ecf90611ec385670de0b6b3a764000063ffffffff613a4b16565b9063ffffffff613aa416565b9392505050565b6007546001600160a01b031681565b601c5481565b6001600160a01b03811660009081526015602052604081206005810154611f16576000915050611d30565b611ecf611f2b82600501548360070154612b76565b60058301549063ffffffff6133df16565b6007546001600160a01b03163314611f855760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615611fd6576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000805460ff60a81b1916600160a81b179055611ff1612c89565b6002819055611ffe612e6a565b60075460405160ff92909216916001600160a01b03909116907f453d43c0c8c4324f6f7fabe1590e8486971f3455abca3efdd9f7218da290504890600090a4565b6007546001600160a01b031633146120885760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146120e4576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60006120ee612c89565b6000805460ff60a81b191690556002549091506121259061211690839063ffffffff6133df16565b6001549063ffffffff612ea016565b60015580612131612e6a565b60075460405160ff92909216916001600160a01b03909116907fa8a93bdc6ed0ce129bba00b28a8baab2dd98dd66ce0c6a4fee7e93fc216fc9c890600090a450565b6005546001600160a01b031633146121bc5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461220d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b038316179055612230612c89565b612238612e6a565b60065460405160ff92909216916001600160a01b03909116907f312b3da9a5eff0d2ce8eab74067fa710fe549f5aa7560fed1aaf9ba8c327447b90600090a450565b6005546001600160a01b031633146122c35760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612314576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b60ff8084166000818152601360205260409020848155600101839055601454909116101561234c576014805460ff191660ff85161790555b80828460ff167f9b378870df69152cb0440f92c873673b2d98e3a255ac6b1cad034c5c021d737361237b612c89565b60408051918252519081900360200190a4505050565b4390565b6001600160a01b038116600090815260156020526040812060058101546007820154611ecf916123c491612b76565b60068301549063ffffffff612ea016565b6005546001600160a01b0316331461241e5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff16151560011461246f576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff16156124c0576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6124c8613b0e565b60006124e16010546020546133df90919063ffffffff16565b9050808211156125225760405162461bcd60e51b8152600401808060200182810382526033815260200180613d956033913960400191505060405180910390fd5b600f8054600101905560105461253e908363ffffffff612ea016565b601055600f5460055460405163ffffffff9092169184916001600160a01b0316907f2401460fed42ac772a5e87dc7479e7991386130f48d5be74dbbe742b782217fd90600090a460055460405183916001600160a01b031690600690600080516020613f8683398151915290600090a46005546040516001600160a01b039091169083156108fc029084906000818181858888f193505050501580156125e8573d6000803e3d6000fd5b505050565b600a5481565b60145460009060ff90811690831611612622575060ff8116600090815260136020526040902060010154611d30565b505060145460ff1660009081526013602052604090206001015490565b6000611cff60105461264f612c5c565b9063ffffffff6133df16565b60125481565b600f5481565b6008546001600160a01b031681565b6005546001600160a01b031633146126bf5760405162461bcd60e51b8152600401808060200182810382526026815260200180613dc86026913960400191505060405180910390fd5b600054600160a01b900460ff161515600114612710576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600a548111156127515760405162461bcd60e51b8152600401808060200182810382526037815260200180613caa6037913960400191505060405180910390fd5b600a54612764908263ffffffff6133df16565b600a5560095461277a908263ffffffff6133df16565b6009556004805460055460408051634decdde360e11b81526001600160a01b0392831694810194909452602484018590526060604485015260006064850181905290519190921692639bd9bbc69260a480830193919282900301818387803b1580156127e557600080fd5b505af1158015611741573d6000803e3d6000fd5b6004546001600160a01b031681565b6000805b60145460ff908116908216116128445760ff8116600090815260136020526040902054831161283c579050611d30565b60010161280c565b505060145460ff16919050565b6008546001600160a01b0316331461289a5760405162461bcd60e51b815260040180806020018281038252602e815260200180613dee602e913960400191505060405180910390fd5b600054600160a81b900460ff1615156001146128f6576040805162461bcd60e51b81526020600482015260166024820152757249434f2068617320746f2062652066726f7a656e2160501b604482015290519081900360640190fd5b60025461290b9061465063ffffffff612ea016565b612913612c89565b1461294f5760405162461bcd60e51b8152600401808060200182810382526047815260200180613d1d6047913960600191505060405180910390fd5b60048054604080516370a0823160e01b81523093810193909352516000926001600160a01b03909216916370a08231916024808301926020929190829003018186803b15801561299e57600080fd5b505afa1580156129b2573d6000803e3d6000fd5b505050506040513d60208110156129c857600080fd5b50516004805460408051634decdde360e11b81526001600160a01b0387811694820194909452602481018590526060604482015260006064820181905291519495503031949290931692639bd9bbc69260a4808301939282900301818387803b158015612a3457600080fd5b505af1158015612a48573d6000803e3d6000fd5b50506040516001600160a01b038616925083156108fc02915083906000818181858888f19350505050158015612a82573d6000803e3d6000fd5b50612a8b612e6a565b60085460ff91909116906001600160a01b0380861691167f97e1f0a494f6dcddabfe8372c43b6c3fb5a19759e98943fa5fffd36e13a7ca56612acb612c89565b60408051918252519081900360200190a460405182906001600160a01b03851690600790600080516020613f8683398151915290600090a460405181906001600160a01b03851690600890600080516020613f8683398151915290600090a4505050565b60115481565b601e5481565b601a5481565b60ff8116600090815260136020526040812060010154611ecf90670de0b6b3a764000090611ec390869063ffffffff613a4b16565b600080612b81612c89565b905083612b92576000915050611819565b601c548110158015612ba55750601d5481105b15612c3457601c548390811015612bcd57601c54612bca90600163ffffffff6133df16565b90505b6000612bdf838363ffffffff6133df16565b90506000612bf883601d546133df90919063ffffffff16565b9050612c2968056bc75e2d63100000611ec3612c1c8482878563ffffffff613a4b16565b8a9063ffffffff613a4b16565b945050505050611819565b601d548110612c465783915050611819565b5060009392505050565b600b5481565b60185481565b600080612c6d601f54602154612b76565b602054909150612c83908263ffffffff612ea016565b91505090565b6000611cff600154436133df90919063ffffffff16565b600d5481565b600054600160a01b900460ff161515600114612cf7576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612d48576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b612d52333461111a565b565b6007546001600160a01b03163314612d9d5760405162461bcd60e51b815260040180806020018281038252602e815260200180613fa6602e913960400191505060405180910390fd5b600054600160a81b900460ff1615612dee576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600780546001600160a01b0319908116909155600880549091169055612e12612c89565b612e1a612e6a565b60075460405160ff92909216916001600160a01b03909116907f67418f39698b6c86da32d11c63208a646f1d27fe8c0ad2236320488f7e391c8b90600090a4565b60095481565b6000611cff611d285b6000611cff612e86600a546009546133df90919063ffffffff16565b612808565b600e5481565b60145460ff1681565b60105481565b600082820183811015611ecf576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600054600160a01b900460ff161515600114612f4b576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615612f9c576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b6000612fa6612c89565b90506019548110158015612fbc5750601d548111155b612ff75760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b0382166000908152601560205260409020600481015461301e575061134a565b6000613028612e6a565b905060008061303686613b63565b600384015461304a57600784015460018501555b60005b60145460ff908116908216116132e35760ff811660009081526008860160205260409020805461307d57506132db565b8460ff168260ff1610156130d057805460ff861660009081526008880160205260409020546130b19163ffffffff612ea016565b60ff8616600090815260088801602052604081209190915590556132db565b60006130dc8387611748565b825490915060008083831115613181576130fc838563ffffffff6133df16565b60145485945090915060ff8781169116141561312c57905080613125888263ffffffff612ea016565b9750613181565b60ff6001870116600090815260088b016020526040902054613154908263ffffffff612ea016565b60ff6001880116600090815260088c016020526040902055845461317e908263ffffffff6133df16565b85555b600061318d8488611e91565b905061319f888263ffffffff612ea016565b60058c01549098506131b7908263ffffffff612ea016565b60058c015560028b01546131d1908263ffffffff612ea016565b60028c015560038b01546131eb908563ffffffff612ea016565b60038c015560048b015461320b90849061264f908763ffffffff6133df16565b60048c0155855461322890849061264f908763ffffffff6133df16565b8655600a5461323d908263ffffffff6133df16565b600a55600c5461325990849061264f908763ffffffff6133df16565b600c55600b5461326f908563ffffffff612ea016565b600b55601f54613285908563ffffffff612ea016565b601f8190555080848e6001600160a01b03167fb2164840ce0fc0bd8bb63f912be03052e55ed2918270ca7f3a3d1b28b6df76118a604051808260ff1660ff16815260200191505060405180910390a45050505050505b60010161304d565b5081156133495760405182906001600160a01b03881690600390600080516020613f8683398151915290600090a46040516001600160a01b0387169083156108fc029084906000818181858888f19350505050158015613347573d6000803e3d6000fd5b505b6004805460408051634decdde360e11b81526001600160a01b038a811694820194909452602481018590526060604482015260006064820181905291519390921692639bd9bbc69260a480820193929182900301818387803b1580156133ae57600080fd5b505af11580156133c2573d6000803e3d6000fd5b505050506133cf8661343c565b6133d76134ae565b505050505050565b600082821115613436576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03811660009081526015602052604090206006810154600582015461346d9163ffffffff612ea016565b81600201541461134a5760405162461bcd60e51b8152600401808060200182810382526046815260200180613ef66046913960600191505060405180910390fd5b602054601f546134c39163ffffffff612ea016565b600b54146135025760405162461bcd60e51b8152600401808060200182810382526046815260200180613e1c6046913960600191505060405180910390fd5b61352560105461264f600c54611b22601f54602054612ea090919063ffffffff16565b303114612d525760405162461bcd60e51b8152600401808060200182810382526044815260200180613bad6044913960600191505060405180910390fd5b600054600160a01b900460ff1615156001146135b4576040805162461bcd60e51b815260206004820152601d6024820152600080516020613ed6833981519152604482015290519081900360640190fd5b600054600160a81b900460ff1615613605576040805162461bcd60e51b815260206004820152600f60248201526e7249434f2069732066726f7a656e2160881b604482015290519081900360640190fd5b600061360f612c89565b905060195481101580156136255750601d548111155b6136605760405162461bcd60e51b8152600401808060200182810382526029815260200180613f5d6029913960400191505060405180910390fd5b6001600160a01b038316600090815260156020526040902061368184613b63565b600083116136c05760405162461bcd60e51b815260040180806020018281038252602c815260200180613eaa602c913960400191505060405180910390fd5b600081600501541180156136d8575060008160020154115b6137135760405162461bcd60e51b8152600401808060200182810382526030815260200180613c246030913960400191505060405180910390fd5b6000839050600080836005015483111561374757600584015461373d90849063ffffffff6133df16565b9150836005015492505b61379d68056bc75e2d63100000611ec361378c8760020154611ec368056bc75e2d6310000061378060018b6133df90919063ffffffff16565b9063ffffffff613a4b16565b60038801549063ffffffff613a4b16565b845468ffffffff0000000000198116650100000000009182900463ffffffff908116600101811690920217865560058601549192506137df919085906133df16565b600585015560028401546137f9908463ffffffff6133df16565b60028501556003840154613813908263ffffffff6133df16565b6003850155600a5461382b908463ffffffff612ea016565b600a55600e54613841908263ffffffff612ea016565b600e55600b54613857908263ffffffff6133df16565b600b55601f5461386d908263ffffffff6133df16565b601f55811561397d5760405160609083906001600160a01b038a1690600590600080516020613f8683398151915290600090a460048054604051634decdde360e11b81526001600160a01b038b8116938201938452602482018790526060604483019081528551606484015285519190931693639bd9bbc6938d9389938893929160840190602085019080838360005b838110156139155781810151838201526020016138fd565b50505050905090810190601f1680156139425780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561396357600080fd5b505af1158015613977573d6000803e3d6000fd5b50505050505b83546040805163ffffffff6501000000000090930492909216825251849183916001600160a01b038b16917fd7c6db51aa831aa589cb4100184601073068b102f0a83dd5beccc7afdf7d1df5919081900360200190a460405181906001600160a01b03891690600490600080516020613f8683398151915290600090a46040516001600160a01b0388169082156108fc029083906000818181858888f19350505050158015613a30573d6000803e3d6000fd5b50613a3a8761343c565b613a426134ae565b50505050505050565b600082613a5a57506000611819565b82820282848281613a6757fe5b0414611ecf5760405162461bcd60e51b8152600401808060200182810382526021815260200180613e626021913960400191505060405180910390fd5b6000808211613afa576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b6000828481613b0557fe5b04949350505050565b6000613b1e601f54602154612b76565b601f54909150613b34908263ffffffff6133df16565b601f55602054613b4a908263ffffffff612ea016565b602055613b55612c89565b602155613b606134ae565b50565b6001600160a01b0381166000908152601560205260409020613b8482612395565b6006820155613b9282611eeb565b6005820155613b9f612c89565b600782015561134a613b0e56fe50726f6a6563742073616e69747920636865636b206661696c6564212062616c616e6365203d20556e6c6f636b202b205265736572766564202d2057697468647261776e56616c75652073656e74206973206c6172676572207468616e20746865206d6178696d756d20636f6e747269627574696f6e2e596f752063616e206e6f742077697468647261772c20796f752068617665206e6f206c6f636b656420746f6b656e732e556e6b6e6f776e20746f6b656e20636f6e74726163742073656e7420746f6b656e732e4f6e6c79207468652077686974656c69737420636f6e74726f6c6c65722063616e2063616c6c2074686973206d6574686f642e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f75676820746f6b656e7320617661696c61626c652e546f20636f6e747269627574652063616c6c20636f6d6d69742829205b307833633761336166665d20616e642073656e642045544820616c6f6e672e4c657420697420636f6f6c2e2e2057616974206174206c65617374207e3320646179732028313830303020626c6b29206265666f7265206d6f76696e6720616e797468696e672e56616c75652073656e74206973206c657373207468616e20746865206d696e696d756d20636f6e747269627574696f6e2e52657175657374656420616d6f756e7420746f6f20686967682c206e6f7420656e6f7567682045544820756e6c6f636b65642e4f6e6c79207468652070726f6a6563742063616e2063616c6c2074686973206d6574686f642e4f6e6c7920746865207265736375657220616464726573732063616e2063616c6c2074686973206d6574686f642e50726f6a6563742053616e69747920636865636b206661696c656421205265736572766564202b20556e6c6f636b206d75737420657175616c20636f6d6d6974746564455448536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f6e6c7920746865206465706c6f7965722063616e2063616c6c2074686973206d6574686f642e596f752063616e206e6f7420776974686472617720776974686f75742073656e64696e6720746f6b656e732e436f6e7472616374206d75737420626520696e697469616c697a65642e0000005061727469636970616e742053616e69747920636865636b206661696c6564212052657365722e202b20556e6c6f636b206d75737420657175616c20746f74616c52657365725f77686974656c697374696e67416464726573732063616e6e6f7420626520307843757272656e7420626c6f636b206973206f75747369646520746865207249434f20706572696f642e2938c8ea03db725889f8f57dcc5e7e6e60a26dada7197cd0c4261bcc035d6fbc4f6e6c792074686520667265657a657220616464726573732063616e2063616c6c2074686973206d6574686f642ea265627a7a72315820453ed0f045b785f726ff75ef544b1e3d0e8582f04313972828329af94cc9057864736f6c63430005110032

Deployed Bytecode Sourcemap

5155:32074:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;12784:10;12732:36;12771:24;;;:12;:24;;;;;12822:28;;;;:36;;:28;:36;:74;;;;-1:-1:-1;12862:30:0;;;;;;;:34;;12822:74;12818:340;;;12913:8;:6;:8::i;:::-;12818:340;;;12986:15;;12974:9;:27;12966:100;;;;-1:-1:-1;;;12966:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13097:49;13124:10;13136:9;13097:26;:49::i;:::-;36961:1;5155:32074;13179:605;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13179:605:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;13179:605:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13179:605:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13179:605:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;13179:605:0;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;13179:605:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;13179:605:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;13179:605:0;;-1:-1:-1;13179:605:0;-1:-1:-1;13179:605:0;:::i;:::-;;15329:1192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15329:1192:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15329:1192:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;15329:1192:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;15329:1192:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;15329:1192:0;;-1:-1:-1;15329:1192:0;-1:-1:-1;15329:1192:0;;;;:::i;23316:736::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23316:736:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23316:736:0;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5746:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5746:34:0;;;:::i;:::-;;;;-1:-1:-1;;;;;5746:34:0;;;;;;;;;;;;;;5512:18;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5512:18:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;6012:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6012:25:0;;;:::i;10216:2396::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10216:2396:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;10216:2396:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;6409:51::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6409:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6409:51:0;-1:-1:-1;;;;;6409:51:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6473;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6473:51:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6473:51:0;;:::i;22038:200::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22038:200:0;;;:::i;5474:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5474:23:0;;;:::i;5571:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5571:26:0;;;:::i;22804:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22804:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22804:158:0;;:::i;6327:37::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6327:37:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6327:37:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5620:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5620:31:0;;;:::i;18631:266::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18631:266:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18631:266:0;-1:-1:-1;;;;;18631:266:0;;:::i;5537:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5537:27:0;;;:::i;6537:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6537:31:0;;;:::i;6633:36::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6633:36:0;;;:::i;6729:::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6729:36:0;;;:::i;13798:1349::-;;;:::i;5704:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5704:29:0;;;:::i;6834:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6834:31:0;;;:::i;24291:206::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24291:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24291:206:0;;;;;;;;;:::i;5793:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5793:29:0;;;:::i;6788:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6788:33:0;;;:::i;21191:461::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21191:461:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21191:461:0;-1:-1:-1;;;;;21191:461:0;;:::i;18921:257::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18921:257:0;;;:::i;19192:368::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19192:368:0;;;:::i;18335:286::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18335:286:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18335:286:0;-1:-1:-1;;;;;18335:286:0;;:::i;17886:439::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17886:439:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17886:439:0;;;;;;;;;;;;;;:::i;24511:110::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24511:110:0;;;:::i;21666:358::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21666:358:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21666:358:0;-1:-1:-1;;;;;21666:358:0;;:::i;17004:872::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17004:872:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17004:872:0;;:::i;5933:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5933:26:0;;;:::i;22563:225::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22563:225:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22563:225:0;;;;:::i;21025:152::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21025:152:0;;;:::i;6275:43::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6275:43:0;;;:::i;6129:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6129:35:0;;;:::i;5835:29::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5835:29:0;;;:::i;16535:455::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16535:455:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16535:455:0;;:::i;5664:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5664:27:0;;;:::i;22976:326::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22976:326:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22976:326:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;19885:843;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19885:843:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19885:843:0;-1:-1:-1;;;;;19885:843:0;;:::i;6226:42::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6226:42:0;;;:::i;6878:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6878:33:0;;;:::i;6682:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6682:34:0;;;:::i;24066:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24066:211:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24066:211:0;;;;;;;;;:::i;24797:974::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24797:974:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24797:974:0;;;;;;;:::i;5972:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5972:27:0;;;:::i;6589:31::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6589:31:0;;;:::i;20752:259::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20752:259:0;;;:::i;24635:148::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24635:148:0;;;:::i;6050:26::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6050:26:0;;;:::i;15161:154::-;;;:::i;19574:297::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19574:297:0;;;:::i;5887:33::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5887:33:0;;;:::i;22430:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22430:117:0;;;:::i;22254:162::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22254:162:0;;;:::i;6089:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6089:27:0;;;:::i;6371:23::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6371:23:0;;;:::i;6177:34::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6177:34:0;;;:::i;13798:1349::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13939:15;;13926:9;:28;;13918:90;;;;-1:-1:-1;;;13918:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14031:18;14052:17;:15;:17::i;:::-;14132:10;14080:36;14119:24;;;:12;:24;;;;;;;;14196:37;;;;;:23;;;:37;;;;;;14302:15;;14254:29;;;;14031:38;;-1:-1:-1;14119:24:0;;14196:37;;14302:15;14254:44;;14288:9;14254:44;:33;:44;:::i;:::-;:63;;14246:127;;;;-1:-1:-1;;;14246:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14400:30;;;;;;;14396:176;;14483:16;;;14466:34;;;;:16;:34;;;;;:47;;-1:-1:-1;;;;;;14466:47:0;14503:10;14466:47;;;14542:18;;14466:47;14542:18;;;14396:176;14594:32;;;;;;;;;:30;:32;;;;-1:-1:-1;;14594:32:0;;;;;;;;;14667:27;;;;:42;;14699:9;;14667:31;:42;:::i;:::-;14637:27;;;:72;14741:18;;:33;;14764:9;14741:33;:22;:33;:::i;:::-;14720:54;;14810:10;;:25;;14825:9;14810:25;:14;:25;:::i;:::-;14797:10;:38;14948:30;;14853:164;;;;;;;;;;14948:30;;;;;;;14917:9;;14892:10;;14853:164;;;;;;;;;;15044:28;;;;:36;;:28;:36;15040:100;;;15097:31;15117:10;15097:19;:31::i;:::-;37217:1;;;36961;13798:1349::o;27729:1385::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27919:33:0;;27880:36;27919:33;;;:12;:33;;;;;27995:27;;;;28048:26;28045:204;;28108:14;;28105:112;;28143:58;;-1:-1:-1;;;;;28143:46:0;;;:58;;;;;28190:10;;28143:58;;;;28190:10;28143:46;:58;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28143:58:0;28105:112;28231:7;;;;28045:204;28276:13;28271:132;28306:10;;;;;;28295:21;;;;28271:132;;28344:32;;;28390:1;28344:32;;;:23;;;:32;;;;;:47;28318:9;;28271:132;;;-1:-1:-1;28455:1:0;28425:27;;;:31;28493:11;;:38;;28509:21;28493:38;:15;:38;:::i;:::-;28479:11;:52;28555:10;;:37;;28570:21;28555:37;:14;:37;:::i;:::-;28542:10;:50;28700:30;;28620:112;;28700:30;;;;;;;28670:21;;-1:-1:-1;;;;;28620:112:0;;;;;28700:30;;28620:112;28748:151;;28867:21;;-1:-1:-1;;;;;28748:151:0;;;28782:35;;-1:-1:-1;;;;;;;;;;;28748:151:0;;;;-1:-1:-1;;;;;28924:46:0;;:85;28971:37;:21;28997:10;28971:37;:25;:37;:::i;:::-;28924:85;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28924:85:0;29032:43;29055:19;29032:22;:43::i;:::-;29086:20;:18;:20::i;36961:1::-;27729:1385;;:::o;13179:605::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;13454:12;;-1:-1:-1;;;;;13454:12:0;13440:10;:26;13432:74;;;;-1:-1:-1;;;13432:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13542:14;;-1:-1:-1;;;;;13533:23:0;;;13542:14;;13533:23;13529:248;;;13601:11;;:24;;13617:7;13601:24;:15;:24;:::i;:::-;13587:11;:38;13661:18;;:31;;13684:7;13661:31;:22;:31;:::i;:::-;13640:18;:52;13529:248;;;13741:24;13750:5;13757:7;13741:8;:24::i;:::-;13179:605;;;;;;;;:::o;15329:1192::-;36057:19;;-1:-1:-1;;;;;36057:19:0;36043:10;:33;36035:97;;;;-1:-1:-1;;;36035:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15522:21;15514:66;;;;;-1:-1:-1;;;15514:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15598:9;15593:921;15613:21;;;15593:921;;;15656:26;15685:10;;15696:1;15685:13;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15685:13:0;15715:36;15754:32;;;:12;:32;;;;;;;15685:13;;-1:-1:-1;;15803:700:0;;;;15840:28;;;;15836:277;;15924:35;;15955:4;-1:-1:-1;;15924:35:0;;;;;;;16025:27;;;;15987:106;;15924:35;16061:30;;;;;;-1:-1:-1;;;;;15987:106:0;;;;;-1:-1:-1;;15987:106:0;15836:277;16151:39;16171:18;16151:19;:39::i;:::-;15803:700;;;16233:36;;-1:-1:-1;;16233:36:0;;;;16331:27;;;;16293:106;;16233:36;16367:30;;;;;;-1:-1:-1;;;;;16293:106:0;;;;;-1:-1:-1;;16293:106:0;16438:49;16465:18;16485:1;16438:26;:49::i;:::-;-1:-1:-1;;15636:3:0;;15593:921;;;;36961:1;15329:1192;;;:::o;23316:736::-;23405:7;23425:14;23476:13;23465:24;;:8;:24;;;23462:493;;;23513:1;23506:8;;;;;23462:493;23559:10;;;;;;23547:22;;;;23544:411;;-1:-1:-1;23595:11:0;;23544:411;;;23651:13;23639:25;;:8;:25;;;23636:319;;;23690:105;23745:35;23768:11;;23745:18;;:22;;:35;;;;:::i;:::-;23690:21;;;;;;;:6;:21;;;;;:32;;:105;:36;:105;:::i;:::-;23681:114;;23636:319;;;23839:13;23828:24;;:8;:24;;;23825:130;;;23910:20;-1:-1:-1;;23917:12:0;;23910:20;;;;;;:6;:20;;;;;;:31;23878:16;;;;;;;:27;:64;;;:31;:64;:::i;:::-;23869:73;;23825:130;23974:70;24017:6;24035:8;23974:28;:70::i;:::-;23967:77;;;23316:736;;;;;:::o;5746:34::-;;;-1:-1:-1;;;;;5746:34:0;;:::o;5512:18::-;;;-1:-1:-1;;;5512:18:0;;;;;:::o;6012:25::-;;;;:::o;10216:2396::-;35895:16;;-1:-1:-1;;;;;35895:16:0;35881:10;:30;35873:82;;;;-1:-1:-1;;;35873:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36668:11;;-1:-1:-1;;;36668:11:0;;;;:20;36660:65;;;;;-1:-1:-1;;;36660:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10751:27:0;;10743:66;;;;;-1:-1:-1;;;10743:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10828:34:0;;10820:80;;;;-1:-1:-1;;;10820:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10919:29:0;;10911:70;;;;;-1:-1:-1;;;10911:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11000:29:0;;10992:70;;;;;-1:-1:-1;;;10992:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11081:29:0;;11073:70;;;;;-1:-1:-1;;;11073:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11176:12;:28;;-1:-1:-1;;;;;;11176:28:0;;;-1:-1:-1;;;;;11176:28:0;;;;;;;;;;11215:19;:42;;;;;;;;;;11268:14;:32;;;;;;;;;;11311:14;:32;;;;;;;;;;11354:14;:32;;;;;;;;;;;;;;11409:21;:46;;;11488:26;:19;-1:-1:-1;11488:23:0;:26::i;:::-;11466:19;:48;;;11573:21;;11549:53;;11600:1;;11549:46;;11466:48;11549:46;:23;:46;:::i;:::-;:50;:53;:50;:53;:::i;:::-;11525:21;:77;11613:16;:32;;;11658:10;:24;;-1:-1:-1;;11658:24:0;;;;;;;-1:-1:-1;11735:9:0;;:6;:9;;;11755:49;;;11815:22;:38;;;11755:49;-1:-1:-1;11959:386:0;11982:11;11977:16;;:1;:16;;;11959:386;;12053:9;;;12029:21;12053:9;;;:6;:9;;;;;12112:53;:23;12140:24;12112:53;:27;:53;:::i;:::-;12091:74;;;;-1:-1:-1;12288:45:0;12306:26;:19;:26;;;;:23;:26;:::i;:::-;12288:13;;:45;:17;:45;:::i;:::-;12267:18;;;;:66;11995:3;11959:386;;;-1:-1:-1;12377:18:0;:40;;;12438:16;:36;;;12516:47;12561:1;12516:40;12457:17;12398:19;12516:40;:20;:40;:::i;:47::-;12495:18;:68;-1:-1:-1;;12586:11:0;:18;;-1:-1:-1;;;;12586:18:0;-1:-1:-1;;;12586:18:0;;;-1:-1:-1;;;;;;;;;;;;10216:2396:0:o;6409:51::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6473:::-;;;;;;;;;;;;-1:-1:-1;;;;;6473:51:0;;:::o;22038:200::-;22102:7;22129:101;22184:35;22207:11;;22184:18;;:22;;:35;;;;:::i;:::-;22129:6;:25;22136:17;:15;:17::i;:::-;22129:25;;;;;;;;;;;;;-1:-1:-1;22129:25:0;:36;;:101;:40;:101;:::i;:::-;22122:108;;22038:200;:::o;5474:23::-;;;-1:-1:-1;;;5474:23:0;;;;;:::o;5571:26::-;;;;:::o;22804:158::-;22877:7;22904:50;22920:33;22941:11;22920:20;:33::i;:::-;22904:15;:50::i;:::-;22897:57;;22804:158;;;;:::o;6327:37::-;;;;;;;;;;;;;;;;;;;:::o;5620:31::-;;;-1:-1:-1;;;;;5620:31:0;;:::o;18631:266::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;18755:14;:28;;-1:-1:-1;;;;;;18755:28:0;-1:-1:-1;;;;;18755:28:0;;;;;18856:32;:30;:32::i;:::-;18837:17;:15;:17::i;:::-;18821:14;;18799:90;;;;;;;;-1:-1:-1;;;;;18821:14:0;;;;18799:90;;18821:14;;18799:90;18631:266;:::o;5537:27::-;;;;:::o;6537:31::-;;;;:::o;6633:36::-;;;;:::o;6729:::-;;;;:::o;5704:29::-;;;-1:-1:-1;;;;;5704:29:0;;:::o;6834:31::-;;;;:::o;24291:206::-;24461:16;;;24385:7;24461:16;;;:6;:16;;;;;:27;;;24412:77;;:34;:10;24437:8;24412:34;:24;:34;:::i;:::-;:48;:77;:48;:77;:::i;:::-;24405:84;24291:206;-1:-1:-1;;;24291:206:0:o;5793:29::-;;;-1:-1:-1;;;;;5793:29:0;;:::o;6788:33::-;;;;:::o;21191:461::-;-1:-1:-1;;;;;21338:33:0;;21279:7;21338:33;;;:12;:33;;;;;21387:39;;;;21384:84;;21455:1;21448:8;;;;;21384:84;21487:157;21545:88;21564:16;:39;;;21605:16;:27;;;21545:18;:88::i;:::-;21487:39;;;;;:157;:43;:157;:::i;18921:257::-;36229:14;;-1:-1:-1;;;;;36229:14:0;36215:10;:28;36207:87;;;;-1:-1:-1;;;36207:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;19010:6;:13;;-1:-1:-1;;;;19010:13:0;-1:-1:-1;;;19010:13:0;;;19048:32;:30;:32::i;:::-;19034:11;:46;;;19139:17;:15;:17::i;:::-;19123:14;;19108:62;;;;;;;;-1:-1:-1;;;;;19123:14:0;;;;19108:62;;19123:14;;19108:62;18921:257::o;19192:368::-;36229:14;;-1:-1:-1;;;;;36229:14:0;36215:10;:28;36207:87;;;;-1:-1:-1;;;36207:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36798:6;;-1:-1:-1;;;36798:6:0;;;;:14;;36808:4;36798:14;36790:49;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;;;;19280:20;19303:32;:30;:32::i;:::-;19357:5;19348:14;;-1:-1:-1;;;;19348:14:0;;;19436:11;;19280:55;;-1:-1:-1;19388:71:0;;19419:29;;19280:55;;19419:29;:16;:29;:::i;:::-;19388:12;;;:71;:16;:71;:::i;:::-;19373:12;:86;19539:12;19520:17;:15;:17::i;:::-;19504:14;;19487:65;;;;;;;;-1:-1:-1;;;;;19504:14:0;;;;19487:65;;19504:14;;19487:65;36850:1;19192:368::o;18335:286::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;18464:19;:33;;-1:-1:-1;;;;;;18464:33:0;-1:-1:-1;;;;;18464:33:0;;;;;18580:32;:30;:32::i;:::-;18561:17;:15;:17::i;:::-;18540:19;;18513:100;;;;;;;;-1:-1:-1;;;;;18540:19:0;;;;18513:100;;18540:19;;18513:100;18335:286;:::o;17886:439::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;18038:16;;;;;;;;:6;:16;;;;;:41;;;18090:27;;:41;;;18158:10;;;;;-1:-1:-1;18144:74:0;;;18185:10;:21;;-1:-1:-1;;18185:21:0;;;;;;;18144:74;18271:11;18258;18248:8;18235:82;;;18284:32;:30;:32::i;:::-;18235:82;;;;;;;;;;;;;;;17886:439;;;:::o;24511:110::-;24600:12;24511:110;:::o;21666:358::-;-1:-1:-1;;;;;21813:33:0;;21754:7;21813:33;;;:12;:33;;;;;21936:39;;;;21977:27;;;;21866:150;;21917:88;;:18;:88::i;:::-;21866:32;;;;;:150;:36;:150;:::i;17004:872::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;17149:23;:21;:23::i;:::-;17195:28;17226:44;17250:19;;17226;;:23;;:44;;;;:::i;:::-;17195:75;;17305:20;17291:10;:34;;17283:98;;;;-1:-1:-1;;;17283:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17404:20;:22;;;;;;17459:19;;:35;;17483:10;17459:35;:23;:35;:::i;:::-;17437:19;:57;17613:20;;17552:14;;17522:123;;;;;;;17581:10;;-1:-1:-1;;;;;17552:14:0;;17522:123;;17552:14;;17522:123;17742:14;;17661:131;;17771:10;;-1:-1:-1;;;;;17742:14:0;;17695:31;;-1:-1:-1;;;;;;;;;;;17661:131:0;;;;17831:14;;17815:53;;-1:-1:-1;;;;;17831:14:0;;;;17815:53;;;;;17857:10;;17831:14;17815:53;17831:14;17815:53;17857:10;17831:14;17815:53;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17815:53:0;36961:1;17004:872;:::o;5933:26::-;;;;:::o;22563:225::-;22661:10;;22625:7;;22661:10;;;;22649:22;;;;22645:89;;-1:-1:-1;22695:16:0;;;;;;;:6;:16;;;;;:27;;;22688:34;;22645:89;-1:-1:-1;;22758:10:0;;;;22751:18;;;;:6;:18;;;;;22758:10;22751:29;;;22563:225::o;21025:152::-;21080:7;21107:62;21149:19;;21107:23;:21;:23::i;:::-;:41;:62;:41;:62;:::i;6275:43::-;;;;:::o;6129:35::-;;;;:::o;5835:29::-;;;-1:-1:-1;;;;;5835:29:0;;:::o;16535:455::-;35739:14;;-1:-1:-1;;;;;35739:14:0;35725:10;:28;35717:79;;;;-1:-1:-1;;;35717:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;16684:11;;16668:12;:27;;16660:95;;;;-1:-1:-1;;;16660:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16792:11;;:29;;16808:12;16792:29;:15;:29;:::i;:::-;16778:11;:43;16853:18;;:36;;16876:12;16853:36;:22;:36;:::i;:::-;16832:18;:57;16930:12;;;16949:14;;16922:60;;;-1:-1:-1;;;16922:60:0;;-1:-1:-1;;;;;16949:14:0;;;16922:60;;;;;;;;;;;;;;;;;;16930:12;16922:60;;;;;;;;16930:12;;;;;16922:26;;:60;;;;;16930:12;;16922:60;;;;;16930:12;;16922:60;;;5:2:-1;;;;30:1;27;20:12;5:2;16922:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5664::0;;;-1:-1:-1;;;;;5664:27:0;;:::o;22976:326::-;23048:5;;23078:179;23113:10;;;;;;23102:21;;;;23078:179;;23169:15;;;;;;;:6;:15;;;;;:26;23154:41;;23151:95;;23223:7;-1:-1:-1;23216:14:0;;23151:95;23125:9;;23078:179;;;-1:-1:-1;;23284:10:0;;;;22976:326;;;:::o;19885:843::-;36391:14;;-1:-1:-1;;;;;36391:14:0;36377:10;:28;36369:87;;;;-1:-1:-1;;;36369:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36798:6;;-1:-1:-1;;;36798:6:0;;;;:14;;36808:4;36798:14;36790:49;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;-1:-1:-1;;;36790:49:0;;;;;;;;;;;;;;;20031:11;;:22;;20047:5;20031:22;:15;:22;:::i;:::-;19995:32;:30;:32::i;:::-;:58;19987:142;;;;-1:-1:-1;;;19987:142:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20173:12;;;20165:46;;;-1:-1:-1;;;20165:46:0;;20205:4;20165:46;;;;;;;;20142:20;;-1:-1:-1;;;;;20173:12:0;;;;20165:31;;:46;;;;;;;;;;;;;;20173:12;20165:46;;;5:2:-1;;;;30:1;27;20:12;5:2;20165:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20165:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20165:46:0;20305:12;;;20297:49;;;-1:-1:-1;;;20297:49:0;;-1:-1:-1;;;;;20297:49:0;;;;;;;;;;;;;;;;;;;;;20222:18;20297:49;;;;;;;;20165:46;;-1:-1:-1;20251:4:0;20243:21;;20305:12;;;;;20297:26;;:49;;;;;20222:18;20297:49;;;;;20222:18;20305:12;20297:49;;;5:2:-1;;;;30:1;27;20:12;5:2;20297:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;20369:42:0;;-1:-1:-1;;;;;20369:30:0;;;-1:-1:-1;20369:42:0;;;;;-1:-1:-1;20400:10:0;;20369:42;;;;20400:10;20369:30;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20369:42:0;20480:17;:15;:17::i;:::-;20459:14;;20439:93;;;;;;-1:-1:-1;;;;;20439:93:0;;;;20459:14;20439:93;20499:32;:30;:32::i;:::-;20439:93;;;;;;;;;;;;;;;20550:79;;20616:12;;-1:-1:-1;;;;;20550:79:0;;;20570:38;;-1:-1:-1;;;;;;;;;;;20550:79:0;;;;20645:75;;20709:10;;-1:-1:-1;;;;;20645:75:0;;;20665:36;;-1:-1:-1;;;;;;;;;;;20645:75:0;;;;36850:1;;19885:843;:::o;6226:42::-;;;;:::o;6878:33::-;;;;:::o;6682:34::-;;;;:::o;24066:211::-;24217:16;;;24163:7;24217:16;;;:6;:16;;;;;:27;;;24190:79;;24260:8;;24190:55;;:12;;:55;:26;:55;:::i;24797:974::-;24883:7;24905:20;24928:32;:30;:32::i;:::-;24905:55;-1:-1:-1;24976:12:0;24973:52;;25012:1;25005:8;;;;;24973:52;25067:18;;25051:12;:34;;:69;;;;;25104:16;;25089:12;:31;25051:69;25047:688;;;25213:18;;25173:10;;25201:30;;25198:108;;;25264:18;;:25;;25287:1;25264:25;:22;:25;:::i;:::-;25252:37;;25198:108;25336:20;25359:27;:12;25376:9;25359:27;:16;:27;:::i;:::-;25336:50;;25417:23;25443:31;25464:9;25443:16;;:20;;:31;;;;:::i;:::-;25417:57;-1:-1:-1;25498:124:0;25613:8;25498:110;25528:65;25417:57;25498:110;25528:12;25613:8;25528:26;:16;:26;:::i;:65::-;25498:7;;:110;:11;:110;:::i;:124::-;25491:131;;;;;;;;25047:688;25676:16;;25660:12;:32;25656:79;;25716:7;25709:14;;;;;25656:79;-1:-1:-1;25762:1:0;;24797:974;-1:-1:-1;;;24797:974:0:o;5972:27::-;;;;:::o;6589:31::-;;;;:::o;20752:259::-;20806:7;20838:24;20865:67;20884:28;;20914:17;;20865:18;:67::i;:::-;20952:19;;20838:94;;-1:-1:-1;20952:51:0;;20838:94;20952:51;:33;:51;:::i;:::-;20945:58;;;20752:259;:::o;24635:148::-;24698:7;24725:49;24761:12;;24733;24725:35;;:49;;;;:::i;6050:26::-;;;;:::o;15161:154::-;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;15258:49;15285:10;15297:9;15258:26;:49::i;:::-;15161:154::o;19574:297::-;36229:14;;-1:-1:-1;;;;;36229:14:0;36215:10;:28;36207:87;;;;-1:-1:-1;;;36207:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;19675:14;:27;;-1:-1:-1;;;;;;19675:27:0;;;;;;19713:14;:27;;;;;;;19830:32;:30;:32::i;:::-;19811:17;:15;:17::i;:::-;19795:14;;19768:95;;;;;;;;-1:-1:-1;;;;;19795:14:0;;;;19768:95;;19795:14;;19768:95;19574:297::o;5887:33::-;;;;:::o;22430:117::-;22478:7;22505:34;22521:17;22254:162;22302:5;22327:81;22362:35;22385:11;;22362:18;;:22;;:35;;;;:::i;:::-;22327:20;:81::i;6089:27::-;;;;:::o;6371:23::-;;;;;;:::o;6177:34::-;;;;:::o;942:181::-;1000:7;1032:5;;;1056:6;;;;1048:46;;;;;-1:-1:-1;;;1048:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;29130:3887;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29308:33:0;;29269:36;29308:33;;;:12;:33;;;;;29368:27;;;;29364:71;;29417:7;;;29364:71;29447:18;29468:17;:15;:17::i;:::-;29447:38;;29496:24;29531:30;29574:46;29600:19;29574:25;:46::i;:::-;29646:29;;;;29643:136;;29739:27;;;;29697:39;;;:69;29643:136;29806:13;29801:2740;29836:10;;;;;;29825:21;;;;29801:2740;;29916:32;;;29874:39;29916:32;;;:23;;;:32;;;;;29983:18;;29979:72;;30027:8;;;29979:72;30094:12;30084:22;;:7;:22;;;30081:289;;;30249:18;;30196:37;;;30249:18;30196:37;;;:23;;;:37;;;;;:48;:72;;;:52;:72;:::i;:::-;30145:37;;;;;;;:23;;;:37;;;;;:123;;;;30305:22;;30346:8;;30081:289;30402:25;30430:44;30452:7;30461:12;30430:21;:44::i;:::-;30519:18;;30402:72;;-1:-1:-1;30489:27:0;;30660:39;;;30656:660;;;30734:42;:19;30758:17;30734:42;:23;:42;:::i;:::-;30888:10;;30817:17;;-1:-1:-1;30720:56:0;;-1:-1:-1;30888:10:0;30877:21;;;30888:10;;30877:21;30873:428;;;30935:11;-1:-1:-1;30935:11:0;30988:31;:16;30935:11;30988:31;:20;:31;:::i;:::-;30969:50;;30873:428;;;31138:36;31172:1;31162:11;;31138:36;;;;;:23;;;:36;;;;;:47;:64;;31190:11;31138:64;:51;:64;:::i;:::-;31088:36;31122:1;31112:11;;31088:36;;;;;:23;;;:36;;;;;:114;31246:18;;:35;;31269:11;31246:35;:22;:35;:::i;:::-;31225:56;;30873:428;31346:22;31371:89;31417:19;31438:7;31371:27;:89::i;:::-;31346:114;-1:-1:-1;31502:42:0;:22;31346:114;31502:42;:26;:42;:::i;:::-;31617:39;;;;31477:67;;-1:-1:-1;31617:59:0;;31661:14;31617:59;:43;:59;:::i;:::-;31575:39;;;:101;31725:31;;;;:51;;31761:14;31725:51;:35;:51;:::i;:::-;31691:31;;;:85;31823:29;;;;:54;;31857:19;31823:54;:33;:54;:::i;:::-;31791:29;;;:86;31922:27;;;;:67;;31979:9;;31922:52;;31954:19;31922:52;:31;:52;:::i;:67::-;31892:27;;;:97;32027:18;;:58;;32075:9;;32027:43;;32050:19;32027:43;:22;:43;:::i;:58::-;32006:79;;32130:11;;:31;;32146:14;32130:31;:15;:31;:::i;:::-;32116:11;:45;32189:10;;:50;;32229:9;;32189:35;;32204:19;32189:35;:14;:35;:::i;:50::-;32176:10;:63;32269:12;;:37;;32286:19;32269:37;:16;:37;:::i;:::-;32254:12;:52;32352:28;;:53;;32385:19;32352:53;:32;:53;:::i;:::-;32321:28;:84;;;;32505:14;32484:19;32463;-1:-1:-1;;;;;32441:88:0;;32521:7;32441:88;;;;;;;;;;;;;;;;;;;;;;29801:2740;;;;;;;29848:9;;29801:2740;;;-1:-1:-1;32567:20:0;;32563:242;;32609:105;;32697:16;;-1:-1:-1;;;;;32609:105:0;;;32629:44;;-1:-1:-1;;;;;;;;;;;32609:105:0;;;;32729:64;;-1:-1:-1;;;;;32729:46:0;;;:64;;;;;32776:16;;32729:64;;;;32776:16;32729:46;:64;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32729:64:0;32563:242;32845:12;;;32837:75;;;-1:-1:-1;;;32837:75:0;;-1:-1:-1;;;;;32837:75:0;;;;;;;;;;;;;;;;;;;;;32845:12;32837:75;;;;;;;;32845:12;;;;;32837:26;;:75;;;;;32845:12;32837:75;;;;;;32845:12;;32837:75;;;5:2:-1;;;;30:1;27;20:12;5:2;32837:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32837:75:0;;;;32935:43;32958:19;32935:22;:43::i;:::-;32989:20;:18;:20::i;:::-;37217:1;;;;36961;29130:3887;:::o;1137:184::-;1195:7;1228:1;1223;:6;;1215:49;;;;;-1:-1:-1;;;1215:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1287:5:0;;;1137:184::o;26331:421::-;-1:-1:-1;;;;;26456:33:0;;26417:36;26456:33;;;:12;:33;;;;;26613:32;;;;26569:39;;;;:77;;;:43;:77;:::i;:::-;26534:16;:31;;;:112;26512:232;;;;-1:-1:-1;;;26512:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25795:522;25931:19;;25898:28;;:53;;;:32;:53;:::i;:::-;25882:12;;:69;25860:189;;;;-1:-1:-1;;;25860:189:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26119:94;26193:19;;26119:69;26177:10;;26119:53;26143:28;;26119:19;;:23;;:53;;;;:::i;:94::-;26102:4;26094:21;:119;26072:237;;;;-1:-1:-1;;;26072:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33033:2621;36534:11;;-1:-1:-1;;;36534:11:0;;;;:19;;36549:4;36534:19;36526:61;;;;;-1:-1:-1;;;36526:61:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36526:61:0;;;;;;;;;;;;;;;36915:6;;-1:-1:-1;;;36915:6:0;;;;:15;36907:43;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;-1:-1:-1;;;36907:43:0;;;;;;;;;;;;;;;37016:19;37038:32;:30;:32::i;:::-;37016:54;;37104:21;;37089:11;:36;;:71;;;;;37144:16;;37129:11;:31;;37089:71;37081:125;;;;-1:-1:-1;;;37081:125:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33230:33:0;;33191:36;33230:33;;;:12;:33;;;;;33276:46;33243:19;33276:25;:46::i;:::-;33366:1;33343:20;:24;33335:81;;;;-1:-1:-1;;;33335:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33477:1;33435:16;:39;;;:43;:82;;;;;33516:1;33482:16;:31;;;:35;33435:82;33427:143;;;;-1:-1:-1;;;33427:143:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33583:27;33613:20;33583:50;;33644:30;33685:23;33757:16;:39;;;33735:19;:61;33731:259;;;33862:39;;;;33838:64;;:19;;:64;:23;:64;:::i;:::-;33813:89;;33939:16;:39;;;33917:61;;33731:259;34030:165;34186:8;34030:151;34078:92;34138:16;:31;;;34078:40;34109:8;34078:26;34102:1;34078:19;:23;;:26;;;;:::i;:::-;:30;:40;:30;:40;:::i;:92::-;34030:29;;;;;:151;:33;:151;:::i;:165::-;34220:28;;-1:-1:-1;;34220:28:0;;;;;;;;;;;;;;;;;;;;;:26;34301:39;;;34012:183;;-1:-1:-1;34301:64:0;;:39;34345:19;;34301:43;:64;:::i;:::-;34259:39;;;:106;34410:31;;;;:56;;34446:19;34410:56;:35;:56;:::i;:::-;34376:31;;;:90;34509:29;;;;:50;;34543:15;34509:50;:33;:50;:::i;:::-;34477:29;;;:82;34596:11;;:36;;34612:19;34596:36;:15;:36;:::i;:::-;34582:11;:50;34658:12;;:33;;34675:15;34658:33;:16;:33;:::i;:::-;34643:12;:48;34717:12;;:33;;34734:15;34717:33;:16;:33;:::i;:::-;34702:12;:48;34794:28;;:49;;34827:15;34794:49;:32;:49;:::i;:::-;34763:28;:80;34872:26;;34868:344;;34982:110;;34929:17;;35069:22;;-1:-1:-1;;;;;34982:110:0;;;35002:43;;-1:-1:-1;;;;;;;;;;;34982:110:0;;;;35131:12;;;35123:77;;-1:-1:-1;;;35123:77:0;;-1:-1:-1;;;;;35123:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35131:12;;;;;35123:26;;35150:19;;35171:22;;35195:4;;35123:77;;;;;;;;;;;;35131:12;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;35123:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35123:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35123:77:0;;;;34868:344;;35325:26;;35239:114;;;35325:26;;;;;;;;;35239:114;;;35297:19;;35280:15;;-1:-1:-1;;;;;35239:114:0;;;;;;;;;;;;;35369:94;;35447:15;;-1:-1:-1;;;;;35369:94:0;;;35389:34;;-1:-1:-1;;;;;;;;;;;35369:94:0;;;;35486:63;;-1:-1:-1;;;;;35486:46:0;;;:63;;;;;35533:15;;35486:63;;;;35533:15;35486:46;:63;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35486:63:0;35572:43;35595:19;35572:22;:43::i;:::-;35626:20;:18;:20::i;:::-;37217:1;;;;36961;33033:2621;;:::o;1335:280::-;1393:7;1447:6;1443:47;;-1:-1:-1;1477:1:0;1470:8;;1443:47;1514:5;;;1518:1;1514;:5;:1;1538:5;;;;;:10;1530:56;;;;-1:-1:-1;;;1530:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1629:199;1687:7;1729:1;1725;:5;1717:44;;;;;-1:-1:-1;;;1717:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1772:9;1788:1;1784;:5;;;;;;;1629:199;-1:-1:-1;;;;1629:199:0:o;26766:431::-;26821:24;26848:67;26867:28;;26897:17;;26848:18;:67::i;:::-;26969:28;;26821:94;;-1:-1:-1;26969:50:0;;26821:94;26969:50;:32;:50;:::i;:::-;26938:28;:81;27052:19;;:41;;27076:16;27052:41;:23;:41;:::i;:::-;27030:19;:63;27124:32;:30;:32::i;:::-;27104:17;:52;27169:20;:18;:20::i;:::-;26766:431;:::o;27211:504::-;-1:-1:-1;;;;;27334:33:0;;27295:36;27334:33;;;:12;:33;;;;;27425:49;27347:19;27425:28;:49::i;:::-;27390:32;;;:84;27527:49;27556:19;27527:28;:49::i;:::-;27485:39;;;:91;27629:32;:30;:32::i;:::-;27599:27;;;:62;27684:23;:21;:23::i

Swarm Source

bzzr://453ed0f045b785f726ff75ef544b1e3d0e8582f04313972828329af94cc90578

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

It allows to reserve LYXe tokens and buy them over time without price risk. As tokens are gradually bought, exposure to LYXe is predictable. Sending returnable LYXe back to the rICO smart contract returns the equivalent of ETH back to the sender.

The Reversible ICO is a concept by Fabian Vogelsteller, former Ethereum lead dApp developer, Author fo ERC 20 and developer of web3.js and the Mist Browser. 

 A full explanation can be found here: https://medium.com/lukso/rico-the-reversible-ico-5392bf64318b

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.