ETH Price: $2,490.31 (-1.54%)

Contract

0x36A8E573ae3F98765EF9568b2c40608b73963efd
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer188490062023-12-23 14:07:47252 days ago1703340467IN
0x36A8E573...b73963efd
0 ETH0.0011647536.37807235
Transfer188489972023-12-23 14:05:47252 days ago1703340347IN
0x36A8E573...b73963efd
0 ETH0.0010954834.21480264
Transfer188484922023-12-23 12:23:47252 days ago1703334227IN
0x36A8E573...b73963efd
0 ETH0.0006315519.72506105
Transfer188484882023-12-23 12:22:59252 days ago1703334179IN
0x36A8E573...b73963efd
0 ETH0.0006728721.01544639
Transfer188484802023-12-23 12:21:23252 days ago1703334083IN
0x36A8E573...b73963efd
0 ETH0.0006343619.81273566
Transfer188484562023-12-23 12:16:35252 days ago1703333795IN
0x36A8E573...b73963efd
0 ETH0.001013920.64729587
Transfer165396252023-02-02 7:27:35576 days ago1675322855IN
0x36A8E573...b73963efd
0 ETH0.0009107216.88713951
Transfer154390572022-08-30 7:23:56732 days ago1661844236IN
0x36A8E573...b73963efd
0 ETH0.0006159511.4265344
Transfer154137882022-08-26 6:26:26736 days ago1661495186IN
0x36A8E573...b73963efd
0 ETH0.000318265.90273648
Transfer154137432022-08-26 6:17:33736 days ago1661494653IN
0x36A8E573...b73963efd
0 ETH0.000394177.31055784
Transfer152735132022-08-04 3:32:17759 days ago1659583937IN
0x36A8E573...b73963efd
0 ETH0.000455378.44570787
Transfer152283252022-07-28 2:34:34766 days ago1658975674IN
0x36A8E573...b73963efd
0 ETH0.0006410611.88969129
Transfer152177702022-07-26 11:13:22767 days ago1658834002IN
0x36A8E573...b73963efd
0 ETH0.00049389.15849718
Transfer151923632022-07-22 12:27:40771 days ago1658492860IN
0x36A8E573...b73963efd
0 ETH0.0004280713.37973391
Transfer151922732022-07-22 12:07:55771 days ago1658491675IN
0x36A8E573...b73963efd
0 ETH0.000433948.83904272
Transfer151922532022-07-22 12:03:42771 days ago1658491422IN
0x36A8E573...b73963efd
0 ETH0.000502049.31542722
Transfer150175052022-06-24 8:57:05799 days ago1656061025IN
0x36A8E573...b73963efd
0 ETH0.0010525132.83562277
Charge149360612022-06-10 2:42:35814 days ago1654828955IN
0x36A8E573...b73963efd
0 ETH0.0030479349.14749626
Transfer149360592022-06-10 2:42:27814 days ago1654828947IN
0x36A8E573...b73963efd
0 ETH0.0025030446.4231362
Transfer148394932022-05-25 3:17:36830 days ago1653448656IN
0x36A8E573...b73963efd
0 ETH0.0012843623.82592433
Charge147406232022-05-09 5:35:28845 days ago1652074528IN
0x36A8E573...b73963efd
0 ETH0.0017726928.59007335
Transfer134071952021-10-13 1:37:121054 days ago1634089032IN
0x36A8E573...b73963efd
0 ETH0.0025404469
Transfer134071662021-10-13 1:30:411054 days ago1634088641IN
0x36A8E573...b73963efd
0 ETH0.0037195169
Transfer133072232021-09-27 10:21:041069 days ago1632738064IN
0x36A8E573...b73963efd
0 ETH0.0033429162
Transfer132985412021-09-26 1:36:051071 days ago1632620165IN
0x36A8E573...b73963efd
0 ETH0.0023179543
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NiX

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2019-06-25
*/

/*
 * 컨트랙트 개요
 * 1. 목적
 *  메인넷 운영이 시작되기 전까지 한시적인 운영을 목적으로 하고 있다.
 *  메인넷이 운영되면 컨트랙트의 거래는 모두 중단되며, 메인넷 코인트로 전환을 시작하며,
 *  전환 절차를 간단하게 수행할 수 있으며, 블록체인 내 기록을 통해 신뢰도를 얻을 수 있도록 설계 되었다.
 * 2. 용어 설명
 *  Owner : 컨트랙트를 생성한 컨트랙트의 주인
 *  Delegator : Owner의 Private Key를 매번 사용하기에는 보안적인 이슈가 발생할 수 있기 때문에 도입된
 *              일부 Owner 권한을 실행할 수 있도록 임명한 대행자
 *              특히, 컨트랙트의 거래가 중단된 상태에서 Delegator만 실행할 수 있는 전용 함수를 실행하여
 *              컨트랙트의 토큰을 회수하고, 메인넷의 코인으로 전환해주는 핵심적인 기능을 수행
 *  Holder : 토큰을 보유할 수 있는 Address를 가지고 있는 계정
 * 3. 운용
 *  3.1. TokenContainer Structure
 *   3.1.1 Charge Amount
 *    Charge Amount는 Holder가 구매하여 충전한 토큰량입니다.
 *    Owner의 경우에는 컨트랙트 전체에 충전된 토큰량. 즉, Total Supply와 같습니다.
 *   3.1.2 Unlock Amount
 *    기본적으로 모든 토큰은 Lock 상태인 것이 기본 상태이며, Owner 또는 Delegator가 Unlock 해준 만큼 Balance로 전환됩니다.
 *    Unlock Amount는 Charge Amount 중 Unlock 된 만큼만 표시합니다.
 *    Unlock Amount는 Charge Amount 보다 커질 수 없습니다.
 *   3.1.3 Balance
 *    ERC20의 Balance와 같으며, 기본적으로는 Charge Amount - Unlock Amount 값에서 부터 시작합니다.
 *    자유롭게 거래가 가능하므로 Balance는 더 크거나 작아질 수 있습니다.
 * 4. 토큰 -> 코인 전환 절차
 *  4.1. Owner 권한으로 컨트랙트의 거래를 완전히 중단 시킴(lock())
 *  4.2. 교환을 실행하기 위한 ExchangeContract를 생성
 *  4.3. ExchangeContract의 Address를 Owner의 권한으로 Delegator로 지정
 *  4.4. Holder가 ExchangeContract의 exchangeSYM()을 실행하여 잔액을 ExchangeHolder에게 모두 전달
 *  4.5. ExchangeHolder로의 입금을 확인
 *  4.6. 요청에 대응되는 메인넷의 계정으로 해당되는 양만큼 송금
 *  4.7. ExchangeContract의 withdraw()를 사용하여 Owner가 최종적으로 회수하는 것으로 전환절차 완료
 */
 /*
  *  * Contract Overview 
 * 1. Purpose
 *  It is intended to operate for a limited time until mainnet launch.
 *  When the mainnet is launched, all transactions of the contract will be suspended from that day on forward and will initiate the token swap to the mainnet.
 * 2. Key Definitions
 *  Owner : An entity from which smart contract is created
 *  Delegator : The appointed agent is created to prevent from using the contract owner's private key for every transaction made, since it can cause a serious security issue.  
 *              In particular, it performs core functons at the time of the token swap event, such as executing a dedicated, Delegator-specific function while contract transaction is under suspension and
 *              withdraw contract's tokens. 
 *  Holder : An account in which tokens can be stored (also referrs to all users of the contract: Owner, Delegator, Spender, ICO buyers, ect.)
 * 3. Operation
 *  3.1. TokenContainer Structure
 *   3.1.1 Charge Amount
 *    Charge Amount is the charged token amount purcahsed by Holder.
 *    In case for the Owner, the total charged amount in the contract equates to the Total Supply.
 *   3.1.2 Unlock Amount
 *    Generally, all tokens are under a locked state by default and balance appears according to the amount that Owner or Delegator Unlocks.
 *    Unlock Amount only displays tokens that are unlocked from the Charge Amount.
 *    Unlock Amount cannot be greater than the Charge Amount.
 *   3.1.3 Balance
 *     Similiar to the ERC20 Balance; It starts from Charged Amount - Unlock Amount value.
 *     You can send & receive tokens at will and it will offset the Balance amount accordingly.
 * 4. Token Swap Process
 *  4.1. Completely suspend trading operations from the contract address with owner privileges (lock ()).
 *  4.2. Create an ExchangeContract contract to execute the exchange.
 *  4.3. Owner appoints the ExchangeContract address to the Delegator.
 *  4.4. The Holder executes an exchangeSYM() embedded in the ExchangeContract to transfer all the Balance to ExchangeHolder
 *  4.5. Verify ExchangeHolder's deposit amount. 
 *  4.6. Remit an appropriate amount into the mainnet account that corresponds to the request.  
 *  4.7. By using the ExchangeContract's withdraw(), the token swap process completes as the Owner makes the final withdrawal.
  */

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

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

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

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

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

contract Ownable {
    address private _owner;

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

    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /*
     * 운용상 Owner 변경은 사용하지 않으므로 권한 변경 함수 제거하였다.
     */
    /*
     * The privilege change function is removed since the Owner change isn't used during the operation.
     */
    /* not used
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
    */
}

/*
 * Owner의 권한 중 일부를 대신 행사할 수 있도록 대행자를 지정/해제 할 수 있는 인터페이스를 정의하고 있다.
 */
 /*
 * It defines an interface where the Owner can appoint / dismiss an agent that can partially excercize privileges in lieu of the Owner's 
 */
contract Delegable is Ownable {
    address private _delegator;
    
    event DelegateAppointed(address indexed previousDelegator, address indexed newDelegator);
    
    constructor () internal {
        _delegator = address(0);
    }
    
    /*
     * delegator를 가져옴
     */
    /*
     * Call-up Delegator
     */
    function delegator() public view returns (address) {
        return _delegator;
    }
    
    /*
     * delegator만 실행 가능하도록 지정하는 접근 제한
     */
    /*
     * Access restriction in which only appointed delegator is executable
     */
    modifier onlyDelegator() {
        require(isDelegator());
        _;
    }
    
    /*
     * owner 또는 delegator가 실행 가능하도록 지정하는 접근 제한
     */
    /*
     * Access restriction in which only appointed delegator or Owner are executable
     */
    modifier ownerOrDelegator() {
        require(isOwner() || isDelegator());
        _;
    }
    
    function isDelegator() public view returns (bool) {
        return msg.sender == _delegator;
    }
    
    /*
     * delegator를 임명
     */
    /*
     * Appoint the delegator
     */
    function appointDelegator(address delegator) public onlyOwner returns (bool) {
        require(delegator != address(0));
        require(delegator != owner());
        return _appointDelegator(delegator);
    }
    
    /*
     * 지정된 delegator를 해임
     */
    /*
     * Dimiss the appointed delegator
     */
    function dissmissDelegator() public onlyOwner returns (bool) {
        require(_delegator != address(0));
        return _appointDelegator(address(0));
    }
    
    /*
     * delegator를 변경하는 내부 함수
     */
    /*
     * An internal function that allows delegator changes 
     */
    function _appointDelegator(address delegator) private returns (bool) {
        require(_delegator != delegator);
        emit DelegateAppointed(_delegator, delegator);
        _delegator = delegator;
        return true;
    }
}

/*
 * ERC20의 기본 인터페이스는 유지하여 일반적인 토큰 전송이 가능하면서,
 * 일부 추가 관리 기능을 구현하기 위한 Struct 및 함수가 추가되어 있습니다.
 * 특히, 토큰 -> 코인 교환을 위한 Delegator 임명은 Owner가 직접 수행할 컨트랙트의 주소를 임명하기 때문에
 * 외부에서 임의로 권한을 획득하기 매우 어려운 구조를 가집니다.
 * 또한, exchange() 함수의 실행은 ExchangeContract에서 Holder가 직접 exchangeSYM() 함수를
 * 실행한 것이 트리거가 되기 때문에 임의의 사용자가 다른 사람의 토큰을 탈취할 수 없습니다.
 */
 /*
 * The basic interface of ERC20 is remained untouched therefore basic functions like token transactions will be available. 
 * On top of that, Structs and functions have been added to implement some additional management functions.
 * In particular, we created an additional Delegator agent to initiate the token swap so that the swap is performed by the delegator but directly from the Owner's contract address.
 * By implementing an additional agent, it has built a difficult structure to acquire rights arbitrarily from the outside.
 * In addition, the execution of exchange() cannot be taken by any other Holders' because the exchangeSYM() is triggered directly by the Holder's execution 
 */
contract ERC20Like is IERC20, Delegable {
    using SafeMath for uint256;

    uint256 internal _totalSupply;  // 총 발행량 // Total Supply
    bool isLock = false;  // 계약 잠금 플래그 // Contract Lock Flag

    /*
     * 토큰 정보(충전량, 해금량, 가용잔액) 및 Spender 정보를 저장하는 구조체
     */
    /*
     * Structure that stores token information (charge, unlock, balance) as well as Spender information
     */
    struct TokenContainer {
        uint256 chargeAmount; // 충전량 // charge amount
        uint256 unlockAmount; // 해금량 // unlock amount
        uint256 balance;  // 가용잔액 // available balance
        mapping (address => uint256) allowed; // Spender
    }

    mapping (address => TokenContainer) internal _tokenContainers;
    
    event ChangeCirculation(uint256 circulationAmount);
    event Charge(address indexed holder, uint256 chargeAmount, uint256 unlockAmount);
    event IncreaseUnlockAmount(address indexed holder, uint256 unlockAmount);
    event DecreaseUnlockAmount(address indexed holder, uint256 unlockAmount);
    event Exchange(address indexed holder, address indexed exchangeHolder, uint256 amount);
    event Withdraw(address indexed holder, uint256 amount);

    // 총 발행량 
    // Total token supply 
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    // 가용잔액 가져오기
    // Call-up available balance
    function balanceOf(address holder) public view returns (uint256) {
        return _tokenContainers[holder].balance;
    }

    // Spender의 남은 잔액 가져오기
    // Call-up Spender's remaining balance
    function allowance(address holder, address spender) public view returns (uint256) {
        return _tokenContainers[holder].allowed[spender];
    }

    // 토큰송금
    // Transfer token
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    // Spender 지정 및 금액 지정
    // Appoint a Spender and set an amount 
    function approve(address spender, uint256 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        return true;
    }

    // Spender 토큰송금
    // Transfer token via Spender 
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        _transfer(from, to, value);
        _approve(from, msg.sender, _tokenContainers[from].allowed[msg.sender].sub(value));
        return true;
    }

    // Spender가 할당 받은 양 증가
    // Increase a Spender amount alloted by the Owner/Delegator
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        require(!isLock);
        uint256 value = _tokenContainers[msg.sender].allowed[spender].add(addedValue);
        if (msg.sender == owner()) {  // Sender가 계약 소유자인 경우 전체 발행량 조절
            require(_tokenContainers[msg.sender].chargeAmount >= _tokenContainers[msg.sender].unlockAmount.add(addedValue));
            _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.add(addedValue);
            _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.add(addedValue);
        }
        _approve(msg.sender, spender, value);
        return true;
    }

    // Spender가 할당 받은 양 감소
    // Decrease a Spender amount alloted by the Owner/Delegator
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        require(!isLock);
        // 기존에 할당된 금액의 잔액보다 더 많은 금액을 줄이려고 하는 경우 할당액이 0이 되도록 처리
        //// If you reduce more than the alloted amount in the balance, we made sure the alloted amount is set to zero instead of minus
        if (_tokenContainers[msg.sender].allowed[spender] < subtractedValue) {
            subtractedValue = _tokenContainers[msg.sender].allowed[spender];
        }
        
        uint256 value = _tokenContainers[msg.sender].allowed[spender].sub(subtractedValue);
        if (msg.sender == owner()) {  // Sender가 계약 소유자인 경우 전체 발행량 조절 // // Adjust the total circulation amount if the Sender equals the contract owner
            _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.sub(subtractedValue);
            _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.sub(subtractedValue);
        }
        _approve(msg.sender, spender, value);
        return true;
    }

    // 토큰송금 내부 실행 함수 
    // An internal execution function for troken transfer
    function _transfer(address from, address to, uint256 value) private {
        require(!isLock);
        // 3.1. Known vulnerabilities of ERC-20 token
        // 현재 컨트랙트로는 송금할 수 없도록 예외 처리 // Exceptions were added to not allow deposits to be made in the current contract . 
        require(to != address(this));
        require(to != address(0));

        _tokenContainers[from].balance = _tokenContainers[from].balance.sub(value);
        _tokenContainers[to].balance = _tokenContainers[to].balance.add(value);
        emit Transfer(from, to, value);
    }

    // Spender 지정 내부 실행 함수
    // Internal execution function for assigning a Spender
    function _approve(address holder, address spender, uint256 value) private {
        require(!isLock);
        require(spender != address(0));
        require(holder != address(0));

        _tokenContainers[holder].allowed[spender] = value;
        emit Approval(holder, spender, value);
    }

    /* extension */
    /**
     * 충전량 
     */
    /**
     * Charge Amount 
     */
    function chargeAmountOf(address holder) external view returns (uint256) {
        return _tokenContainers[holder].chargeAmount;
    }

    /**
     * 해금량
     */
    /**
     * Unlock Amount
     */
    function unlockAmountOf(address holder) external view returns (uint256) {
        return _tokenContainers[holder].unlockAmount;
    }

    /**
     * 가용잔액
     */
    /**
     * Available amount in the balance
     */
    function availableBalanceOf(address holder) external view returns (uint256) {
        return _tokenContainers[holder].balance;
    }

    /**
     * Holder의 계정 잔액 요약 출력(JSON 포맷)
     */
    /**
     * An output of Holder's account balance summary (JSON format)
     */
    function receiptAccountOf(address holder) external view returns (string memory) {
        bytes memory blockStart = bytes("{");
        bytes memory chargeLabel = bytes("\"chargeAmount\" : \"");
        bytes memory charge = bytes(uint2str(_tokenContainers[holder].chargeAmount));
        bytes memory unlockLabel = bytes("\", \"unlockAmount\" : \"");
        bytes memory unlock = bytes(uint2str(_tokenContainers[holder].unlockAmount));
        bytes memory balanceLabel = bytes("\", \"availableBalance\" : \"");
        bytes memory balance = bytes(uint2str(_tokenContainers[holder].balance));
        bytes memory blockEnd = bytes("\"}");

        string memory receipt = new string(blockStart.length + chargeLabel.length + charge.length + unlockLabel.length + unlock.length + balanceLabel.length + balance.length + blockEnd.length);
        bytes memory receiptBytes = bytes(receipt);

        uint readIndex = 0;
        uint writeIndex = 0;

        for (readIndex = 0; readIndex < blockStart.length; readIndex++) {
            receiptBytes[writeIndex++] = blockStart[readIndex];
        }
        for (readIndex = 0; readIndex < chargeLabel.length; readIndex++) {
            receiptBytes[writeIndex++] = chargeLabel[readIndex];
        }
        for (readIndex = 0; readIndex < charge.length; readIndex++) {
            receiptBytes[writeIndex++] = charge[readIndex];
        }
        for (readIndex = 0; readIndex < unlockLabel.length; readIndex++) {
            receiptBytes[writeIndex++] = unlockLabel[readIndex];
        }
        for (readIndex = 0; readIndex < unlock.length; readIndex++) {
            receiptBytes[writeIndex++] = unlock[readIndex];
        }
        for (readIndex = 0; readIndex < balanceLabel.length; readIndex++) {
            receiptBytes[writeIndex++] = balanceLabel[readIndex];
        }
        for (readIndex = 0; readIndex < balance.length; readIndex++) {
            receiptBytes[writeIndex++] = balance[readIndex];
        }
        for (readIndex = 0; readIndex < blockEnd.length; readIndex++) {
            receiptBytes[writeIndex++] = blockEnd[readIndex];
        }

        return string(receiptBytes);
    }

    // uint 값을 string 으로 변환하는 내부 함수
    // An internal function that converts an uint value to a string
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len - 1;
        while (_i != 0) {
            bstr[k--] = byte(uint8(48 + _i % 10));
            _i /= 10;
        }
        return string(bstr);
    }

    // 전체 유통량 - Owner의 unlockAmount
    // Total circulation supply, or the unlockAmount of the Owner's
    function circulationAmount() external view returns (uint256) {
        return _tokenContainers[owner()].unlockAmount;
    }

    // 전체 유통량 증가
    // Increase the token's total circulation supply 
    /*
     * 컨트랙트 상에 유통되는 토큰량을 증가 시킵니다.
     * Owner가 보유한 전체 토큰량에서 Unlock 된 양 만큼이 현재 유통량이므로,
     * Unlock Amount와 Balance 가 증가하며, Charge Amount는 변동되지 않습니다.
     */
    /*
     * This function increases the amount of circulated tokens that are distributed on the contract.
     * The circulated token is referring to the Unlock tokens out of the contract Owner's total supply, so the Charge Amount is not affected (refer back to the Balance definition above).
     * This function increases in the Unlock Amount as well as in the Balance.
     */
    function increaseCirculation(uint256 amount) external onlyOwner returns (uint256) {
        require(!isLock);
        require(_tokenContainers[msg.sender].chargeAmount >= _tokenContainers[msg.sender].unlockAmount.add(amount));
        _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.add(amount);
        _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.add(amount);
        emit ChangeCirculation(_tokenContainers[msg.sender].unlockAmount);
        return _tokenContainers[msg.sender].unlockAmount;
    }

    // 전체 유통량 감소
    // Reduction of the token's total supply
    /*
     * 컨트랙트 상에 유통되는 토큰량을 감소 시킵니다.
     * Owner가 보유한 전체 토큰량에서 Unlock 된 양 만큼이 현재 유통량이므로,
     * Unlock Amount와 Balance 가 감소하며, Charge Amount는 변동되지 않습니다.
     * Owner만 실행할 수 있으며, 정책적인 계획에 맞추어 실행되어야하므로 0보다 작아지는 값이 입력되는 경우 실행을 중단합니다.
     */
    /*
     * This function decreases the amount of circulated tokens that are distributed on the contract.
     * The circulated token is referring to the Unlock tokens out of the contract Owner's total supply, so the Charge Amount is not affected (refer back to the Balance definition above).
     * This function decreases in the Unlock Amount as well as in the Balance.
     */
    function decreaseCirculation(uint256 amount) external onlyOwner returns (uint256) {
        require(!isLock);
        _tokenContainers[msg.sender].unlockAmount = _tokenContainers[msg.sender].unlockAmount.sub(amount);
        _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.sub(amount);
        emit ChangeCirculation(_tokenContainers[msg.sender].unlockAmount);
        return _tokenContainers[msg.sender].unlockAmount;
    }

    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 만큼의 충전량을 직접 입력할 때 사용합니다.
     * 컨트랙트 내 토큰의 유통량에 맞추어 동작하므로, Owner의 Balance가 부족하면 실행을 중단힙니다.
     * 충전한 토큰은 lock인 상태로 시작되며, charge() 함수는 충전과 동시에 Unlock하는 양을 지정하여
     * increaseUnlockAmount() 함수의 실행 횟수를 줄일 수 있다.
     */
    /*
     * This function is used to directly input the token amount that is purchased by particular Holders (ICO, Pre-sale buyers). It can be performed by the Owner or the Delegator.
     * Since the contract operates in concurrent to the tokens in circulation, the function will fail to execute when Owner's balance is insuffient. 
     * All charged tokens are locked amount. 
     */
    function charge(address holder, uint256 chargeAmount, uint256 unlockAmount) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());
        require(chargeAmount > 0);
        require(chargeAmount >= unlockAmount);
        require(_tokenContainers[owner()].balance >= chargeAmount);

        _tokenContainers[owner()].balance = _tokenContainers[owner()].balance.sub(chargeAmount);

        _tokenContainers[holder].chargeAmount = _tokenContainers[holder].chargeAmount.add(chargeAmount);
        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.add(unlockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.add(unlockAmount);
        
        emit Charge(holder, chargeAmount, unlockAmount);
    }
    
    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 안에서 해금량을 변경할 때 사용합니다.
     * 총 충전량 안에서 변화가 일어나므로 Unlock Amount가 Charge Amount보다 커질 수 없습니다.
     */
    /*
     * This function is used to change the Unlock Amount of tokens that is purchased by particular Holders (ICO, Pre-sale buyers).
     * Unlock Amount cannot be larger than Charge Amount because changes occur within the total charge amount.
     */
    function increaseUnlockAmount(address holder, uint256 unlockAmount) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());
        require(_tokenContainers[holder].chargeAmount >= _tokenContainers[holder].unlockAmount.add(unlockAmount));

        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.add(unlockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.add(unlockAmount);
        
        emit IncreaseUnlockAmount(holder, unlockAmount);
    }
    
    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 안에서 해금량을 변경할 때 사용합니다.
     * Balance를 Lock 상태로 전환하는 것이므로 Lock Amount의 값은 Balance보다 커질 수 없습니다.
     */
    /*
     * This function is used to change the Unlock Amount of tokens that is purchased by particular Holders (ICO, Pre-sale buyers).
     * Since the Balance starts from a locked state, the number of locked tokens cannot be greater than the Balance.
     */
    function decreaseUnlockAmount(address holder, uint256 lockAmount) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());
        require(_tokenContainers[holder].balance >= lockAmount);

        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.sub(lockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.sub(lockAmount);
        
        emit DecreaseUnlockAmount(holder, lockAmount);
    }

    /*
     * 특정 사용자(ICO, PreSale 구매자)가 구매한 금액 안에서 전체를 해금할 때 사용합니다.
     * Charge Amount 중 Unlock Amount 량을 제외한 나머지 만큼을 일괄적으로 해제합니다.
     */
    /*
     * This function is used to change the Unlock Amount of tokens that is purchased by particular Holders (ICO, Pre-sale buyers).
     * It unlocks all locked tokens in the Charge Amount, other than tokens already unlocked. 
     */
    function unlockAmountAll(address holder) external ownerOrDelegator {
        require(!isLock);
        require(holder != address(0));
        require(holder != owner());

        uint256 unlockAmount = _tokenContainers[holder].chargeAmount.sub(_tokenContainers[holder].unlockAmount);

        require(unlockAmount > 0);
        
        _tokenContainers[holder].unlockAmount = _tokenContainers[holder].unlockAmount.add(unlockAmount);
        _tokenContainers[holder].balance = _tokenContainers[holder].balance.add(unlockAmount);
    }

    /*
     * 계약 잠금
     * 계약이 잠기면 컨트랙트의 거래가 중단된 상태가 되며,
     * 거래가 중단된 상태에서는 Owner와 Delegator를 포함한 모든 Holder는 거래를 할 수 없게 된다.
     * 모든 거래가 중단된 상태에서 모든 Holder의 상태가 변경되지 않게 만든 후에
     * 토큰 -> 코인 전환 절차를 진행하기 위함이다.
     * 단, 이 상태에서는 Exchange Contract를 Owner가 직접 Delegator로 임명하여
     * Holder의 요청을 처리하도록 하며, 이때는 토큰 -> 코인 교환회수를 위한 exchange(), withdraw() 함수 실행만 허용이 된다.
     */
    /*
     * Contract lock
     * If the contract is locked, all transactions will be suspended.
     * All Holders including Owner and Delegator will not be able to make transaction during suspension.
     * After all transactions have been stopped and all Holders have not changed their status
     * This function is created primarily for the token swap event. 
     * In this process, it's important to note that the Owner of the Exchange contract should directly appoint a delegator when handling Holders' requests.
     * Only the exchange () and withdraw () are allowed to be executed for token swap.
     */
    function lock() external onlyOwner returns (bool) {
        isLock = true;
        return isLock;
    }

    /*
     * 계약 잠금 해제
     * 잠긴 계약을 해제할 때 사용된다.
     */
    /*
     * Release contract lock
     * The function is used to revert a locked contract to a normal state. 
     */
    function unlock() external onlyOwner returns (bool) {
        isLock = false;
        return isLock;
    }
    
    /*
     * 토큰 교환 처리용 외부 호출 함수
     * 계약 전체가 잠긴 상태일 때(교환 처리 중 계약 중단),
     * 외부에서만 호출 가능하며, Delegator이면서 Contract인 경우에만 호출 가능하다.
     */
    /*
     * It is an external call function for token exchange processing
     * This function is used when the entire contract is locked (contract lock during the token swap),
     * It can be called only externally. Also, it can be only called when the agent is both Delegator and Contract.
     */
    function exchange(address holder) external onlyDelegator returns (bool) {
        require(isLock);    // lock state only
        require((delegator() == msg.sender) && isContract(msg.sender));    // contract delegator only
        
        uint256 balance = _tokenContainers[holder].balance;
        _tokenContainers[holder].balance = 0;
        _tokenContainers[msg.sender].balance = _tokenContainers[msg.sender].balance.add(balance);
        
        emit Exchange(holder, msg.sender, balance);
        return true;
    }
    
    /*
     * 토큰 교환 처리 후 회수된 토큰을 Owner한테 돌려주는 함수
     * 계약 전체가 잠긴 상태일 때(교환 처리 중 계약 중단),
     * 외부에서만 호출 가능하며, Delegator이면서 Contract인 경우에만 호출 가능하다.
     */
    /*
     * This is a function in which the Delegator returns tokens to the Owner after the token swap process
     * This function is used when the entire contract is locked (contract lock during the token swap),
     * It can be called only externally. Also, it can be only called when the agent is both Delegator and Contract Owner.
     */
    function withdraw() external onlyDelegator returns (bool) {
        require(isLock);    // lock state only
        require((delegator() == msg.sender) && isContract(msg.sender));    // contract delegator only
        
        uint256 balance = _tokenContainers[msg.sender].balance;
        _tokenContainers[msg.sender].balance = 0;
        _tokenContainers[owner()].balance = _tokenContainers[owner()].balance.add(balance);
        
        emit Withdraw(msg.sender, balance);
    }
    
    /*
     * 현재의 주소가 엔진내에 차지하고 있는 코드의 크기를 계산하여 컨트랙트인지 확인하는 도구
     * 컨트랙트인 경우에만 저장된 코드의 크기가 존재하므로 코드의 크기가 존재한다면
     * 컨트랙트로 판단할 수있다.
     */
    /*
     * This is a tool used for confirming a contract. It determines the size of code that the current address occupies within the blockchain network.
     * Since the size of a stored code exists only in the case of a contract, it is can be used as a validation tool.
     */
    function isContract(address addr) private returns (bool) {
      uint size;
      assembly { size := extcodesize(addr) }
      return size > 0;
    }
}

contract NiX is ERC20Like {
    string public name = "NiX";
    string public symbol = "NiX";
    uint256 public decimals = 18;

    constructor () public {
        _totalSupply = 3000000000 * (10 ** decimals);
        _tokenContainers[msg.sender].chargeAmount = _totalSupply;
        emit Charge(msg.sender, _tokenContainers[msg.sender].chargeAmount, _tokenContainers[msg.sender].unlockAmount);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"increaseCirculation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"receiptAccountOf","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isDelegator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"}],"name":"exchange","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"chargeAmount","type":"uint256"},{"name":"unlockAmount","type":"uint256"}],"name":"charge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"chargeAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"circulationAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"dissmissDelegator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unlock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"unlockAmount","type":"uint256"}],"name":"increaseUnlockAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"}],"name":"unlockAmountOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"delegator","type":"address"}],"name":"appointDelegator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"decreaseCirculation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"delegator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"holder","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"},{"name":"lockAmount","type":"uint256"}],"name":"decreaseUnlockAmount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"holder","type":"address"}],"name":"unlockAmountAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"lock","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"circulationAmount","type":"uint256"}],"name":"ChangeCirculation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"chargeAmount","type":"uint256"},{"indexed":false,"name":"unlockAmount","type":"uint256"}],"name":"Charge","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"unlockAmount","type":"uint256"}],"name":"IncreaseUnlockAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"unlockAmount","type":"uint256"}],"name":"DecreaseUnlockAmount","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"exchangeHolder","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Exchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousDelegator","type":"address"},{"indexed":true,"name":"newDelegator","type":"address"}],"name":"DelegateAppointed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]

60806040526000600360006101000a81548160ff0219169083151502179055506040518060400160405280600381526020017f4e69580000000000000000000000000000000000000000000000000000000000815250600590805190602001906200006c92919062000307565b506040518060400160405280600381526020017f4e6958000000000000000000000000000000000000000000000000000000000081525060069080519060200190620000ba92919062000307565b506012600755348015620000cd57600080fd5b50336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600754600a0a63b2d05e0002600281905550600254600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055503373ffffffffffffffffffffffffffffffffffffffff167f720e2015c6c49aa255ac152528ef75a8d12b40300a289e74c701a97c42865485600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154604051808381526020018281526020019250505060405180910390a2620003b6565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200034a57805160ff19168380011785556200037b565b828001600101855582156200037b579182015b828111156200037a5782518255916020019190600101906200035d565b5b5090506200038a91906200038e565b5090565b620003b391905b80821115620003af57600081600090555060010162000395565b5090565b90565b613a6c80620003c66000396000f3fe608060405234801561001057600080fd5b50600436106101f05760003560e01c80638da5cb5b1161010f578063b473b70d116100a2578063dd62ed3e11610071578063dd62ed3e14610ab0578063ea4ca47c14610b28578063f65decc614610b76578063f83d08ba14610bba576101f0565b8063b473b70d14610970578063ba9ae895146109c8578063c0e22f9714610a24578063ce9b793014610a66576101f0565b8063a457c2d7116100de578063a457c2d714610834578063a69df4b51461089a578063a9059cbb146108bc578063b1c1feb714610922576101f0565b80638da5cb5b146107235780638f32d59b1461076d57806395d89b411461078f5780639a94325014610812576101f0565b806325d998bb1161018757806354a9409e1161015657806354a9409e146105fd5780636803f6121461065557806370a08231146106ad5780637f6ab84114610705576101f0565b806325d998bb146104ff578063313ce5671461055757806339509351146105755780633ccfd60b146105db576101f0565b806318160ddd116101c357806318160ddd146103dd578063185ed831146103fb57806323b872dd1461041d5780632412bdb8146104a3576101f0565b806305259891146101f557806306fdde0314610237578063095ea7b3146102ba578063120cb15c14610320575b600080fd5b6102216004803603602081101561020b57600080fd5b8101908080359060200190929190505050610bdc565b6040518082815260200191505060405180910390f35b61023f610ea5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027f578082015181840152602081019050610264565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610306600480360360408110156102d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f43565b604051808215151515815260200191505060405180910390f35b6103626004803603602081101561033657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103a2578082015181840152602081019050610387565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e5611573565b6040518082815260200191505060405180910390f35b61040361157d565b604051808215151515815260200191505060405180910390f35b6104896004803603606081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d5565b604051808215151515815260200191505060405180910390f35b6104e5600480360360208110156104b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611689565b604051808215151515815260200191505060405180910390f35b6105416004803603602081101561051557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189e565b6040518082815260200191505060405180910390f35b61055f6118ea565b6040518082815260200191505060405180910390f35b6105c16004803603604081101561058b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118f0565b604051808215151515815260200191505060405180910390f35b6105e3611bcd565b604051808215151515815260200191505060405180910390f35b6106536004803603606081101561061357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611dd3565b005b6106976004803603602081101561066b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121cc565b6040518082815260200191505060405180910390f35b6106ef600480360360208110156106c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612218565b6040518082815260200191505060405180910390f35b61070d612264565b6040518082815260200191505060405180910390f35b61072b6122b5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107756122de565b604051808215151515815260200191505060405180910390f35b610797612335565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107d75780820151818401526020810190506107bc565b50505050905090810190601f1680156108045780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61081a6123d3565b604051808215151515815260200191505060405180910390f35b6108806004803603604081101561084a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612451565b604051808215151515815260200191505060405180910390f35b6108a2612795565b604051808215151515815260200191505060405180910390f35b610908600480360360408110156108d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127d8565b604051808215151515815260200191505060405180910390f35b61096e6004803603604081101561093857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127ef565b005b6109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ace565b6040518082815260200191505060405180910390f35b610a0a600480360360208110156109de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b1a565b604051808215151515815260200191505060405180910390f35b610a5060048036036020811015610a3a57600080fd5b8101908080359060200190929190505050612bb7565b6040518082815260200191505060405180910390f35b610a6e612ddd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b1260048036036040811015610ac657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e07565b6040518082815260200191505060405180910390f35b610b7460048036036040811015610b3e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e91565b005b610bb860048036036020811015610b8c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061311c565b005b610bc26133b2565b604051808215151515815260200191505060405180910390f35b6000610be66122de565b610bef57600080fd5b600360009054906101000a900460ff1615610c0957600080fd5b610c5e82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610cac57600080fd5b610d0182600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610d9c82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f3b5780601f10610f1057610100808354040283529160200191610f3b565b820191906000526020600020905b815481529060010190602001808311610f1e57829003601f168201915b505050505081565b6000610f50338484613414565b6001905092915050565b6060806040518060400160405280600181526020017f7b00000000000000000000000000000000000000000000000000000000000000815250905060606040518060400160405280601281526020017f22636861726765416d6f756e7422203a202200000000000000000000000000008152509050606061101c600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613590565b905060606040518060400160405280601581526020017f222c2022756e6c6f636b416d6f756e7422203a20220000000000000000000000815250905060606110a5600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613590565b905060606040518060400160405280601981526020017f222c2022617661696c61626c6542616c616e636522203a2022000000000000008152509050606061112e600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613590565b905060606040518060400160405280600281526020017f227d00000000000000000000000000000000000000000000000000000000000081525090506060815183518551875189518b518d518f51010101010101016040519080825280601f01601f1916602001820160405280156111b55781602001600182028038833980820191505090505b509050606081905060008090506000809050600091505b8b5182101561123a578b82815181106111e157fe5b602001015160f81c60f81b8382806001019350815181106111fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506111cc565b600091505b8a518210156112ad578a828151811061125457fe5b602001015160f81c60f81b83828060010193508151811061127157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061123f565b600091505b8951821015611320578982815181106112c757fe5b602001015160f81c60f81b8382806001019350815181106112e457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506112b2565b600091505b88518210156113935788828151811061133a57fe5b602001015160f81c60f81b83828060010193508151811061135757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611325565b600091505b8751821015611406578782815181106113ad57fe5b602001015160f81c60f81b8382806001019350815181106113ca57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611398565b600091505b86518210156114795786828151811061142057fe5b602001015160f81c60f81b83828060010193508151811061143d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061140b565b600091505b85518210156114ec5785828151811061149357fe5b602001015160f81c60f81b8382806001019350815181106114b057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061147e565b600091505b845182101561155f5784828151811061150657fe5b602001015160f81c60f81b83828060010193508151811061152357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506114f1565b829c50505050505050505050505050919050565b6000600254905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006115e28484846136bd565b61167e843361167985600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b613414565b600190509392505050565b600061169361157d565b61169c57600080fd5b600360009054906101000a900460ff166116b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166116d4612ddd565b73ffffffffffffffffffffffffffffffffffffffff161480156116fc57506116fb3361390a565b5b61170557600080fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506117e981600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f477b65cf658c5207a9d60bb5ebe4f60a504af024949bdffa6efc396d01ced3f6836040518082815260200191505060405180910390a36001915050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b60075481565b6000600360009054906101000a900460ff161561190c57600080fd5b60006119a083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133f590919063ffffffff16565b90506119aa6122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611bb757611a3283600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015611a8057600080fd5b611ad583600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550611b7083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b611bc2338583613414565b600191505092915050565b6000611bd761157d565b611be057600080fd5b600360009054906101000a900460ff16611bf957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16611c18612ddd565b73ffffffffffffffffffffffffffffffffffffffff16148015611c405750611c3f3361390a565b5b611c4957600080fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611d348160046000611ce86122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b60046000611d406122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040518082815260200191505060405180910390a25090565b611ddb6122de565b80611dea5750611de961157d565b5b611df357600080fd5b600360009054906101000a900460ff1615611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4757600080fd5b611e4f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e8757600080fd5b60008211611e9457600080fd5b80821015611ea157600080fd5b8160046000611eae6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015611ef757600080fd5b611f538260046000611f076122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b60046000611f5f6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611ff582600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061209081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061212b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508273ffffffffffffffffffffffffffffffffffffffff167f720e2015c6c49aa255ac152528ef75a8d12b40300a289e74c701a97c428654858383604051808381526020018281526020019250505060405180910390a2505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b6000600460006122726122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123cb5780601f106123a0576101008083540402835291602001916123cb565b820191906000526020600020905b8154815290600101906020018083116123ae57829003601f168201915b505050505081565b60006123dd6122de565b6123e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561244257600080fd5b61244c600061391d565b905090565b6000600360009054906101000a900460ff161561246d57600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561257757600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505b600061260b83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b90506126156122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561277f5761269d83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061273883600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b61278a338583613414565b600191505092915050565b600061279f6122de565b6127a857600080fd5b6000600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60006127e53384846136bd565b6001905092915050565b6127f76122de565b80612806575061280561157d565b5b61280f57600080fd5b600360009054906101000a900460ff161561282957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561286357600080fd5b61286b6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a357600080fd5b6128f881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101561294657600080fd5b61299b81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612a3681600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f84a2be98ade81115c3a7fc4e3f8f8b7d2ce22bb482f7270108a03034579aedad826040518082815260200191505060405180910390a25050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000612b246122de565b612b2d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b6757600080fd5b612b6f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba757600080fd5b612bb08261391d565b9050919050565b6000612bc16122de565b612bca57600080fd5b600360009054906101000a900460ff1615612be457600080fd5b612c3982600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612cd482600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612e996122de565b80612ea85750612ea761157d565b5b612eb157600080fd5b600360009054906101000a900460ff1615612ecb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f0557600080fd5b612f0d6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4557600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015612f9457600080fd5b612fe981600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061308481600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167fd85f893defab26c8b95a9d1a6aec387c0f5f6fb6581d53df79b83ef7b2061873826040518082815260200191505060405180910390a25050565b6131246122de565b80613133575061313261157d565b5b61313c57600080fd5b600360009054906101000a900460ff161561315657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561319057600080fd5b6131986122b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131d057600080fd5b6000613269600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546138ea90919063ffffffff16565b90506000811161327857600080fd5b6132cd81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061336881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050565b60006133bc6122de565b6133c557600080fd5b6001600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60008082840190508381101561340a57600080fd5b8091505092915050565b600360009054906101000a900460ff161561342e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561346857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134a257600080fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b606060008214156135d8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136b8565b600082905060005b60008214613602578080600101915050600a82816135fa57fe5b0491506135e0565b6060816040519080825280601f01601f1916602001820160405280156136375781602001600182028038833980820191505090505b50905060006001830390505b600086146136b057600a868161365557fe5b0660300160f81b8282806001900393508151811061366f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816136a857fe5b049550613643565b819450505050505b919050565b600360009054906101000a900460ff16156136d757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561371057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374a57600080fd5b61379f81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061383a81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211156138f957600080fd5b600082840390508091505092915050565b600080823b905060008111915050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561397a57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7ae02edfa8fcf8e6ab0735af4a8724ca06b091b99194712358a6da6146107a8f60405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905091905056fea165627a7a72305820b077605f3bde73c0ebc691471e741cd86ca2f18b38ea493b05c6a4a7e98a449e0029

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101f05760003560e01c80638da5cb5b1161010f578063b473b70d116100a2578063dd62ed3e11610071578063dd62ed3e14610ab0578063ea4ca47c14610b28578063f65decc614610b76578063f83d08ba14610bba576101f0565b8063b473b70d14610970578063ba9ae895146109c8578063c0e22f9714610a24578063ce9b793014610a66576101f0565b8063a457c2d7116100de578063a457c2d714610834578063a69df4b51461089a578063a9059cbb146108bc578063b1c1feb714610922576101f0565b80638da5cb5b146107235780638f32d59b1461076d57806395d89b411461078f5780639a94325014610812576101f0565b806325d998bb1161018757806354a9409e1161015657806354a9409e146105fd5780636803f6121461065557806370a08231146106ad5780637f6ab84114610705576101f0565b806325d998bb146104ff578063313ce5671461055757806339509351146105755780633ccfd60b146105db576101f0565b806318160ddd116101c357806318160ddd146103dd578063185ed831146103fb57806323b872dd1461041d5780632412bdb8146104a3576101f0565b806305259891146101f557806306fdde0314610237578063095ea7b3146102ba578063120cb15c14610320575b600080fd5b6102216004803603602081101561020b57600080fd5b8101908080359060200190929190505050610bdc565b6040518082815260200191505060405180910390f35b61023f610ea5565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561027f578082015181840152602081019050610264565b50505050905090810190601f1680156102ac5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610306600480360360408110156102d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f43565b604051808215151515815260200191505060405180910390f35b6103626004803603602081101561033657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f5a565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156103a2578082015181840152602081019050610387565b50505050905090810190601f1680156103cf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e5611573565b6040518082815260200191505060405180910390f35b61040361157d565b604051808215151515815260200191505060405180910390f35b6104896004803603606081101561043357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506115d5565b604051808215151515815260200191505060405180910390f35b6104e5600480360360208110156104b957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611689565b604051808215151515815260200191505060405180910390f35b6105416004803603602081101561051557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061189e565b6040518082815260200191505060405180910390f35b61055f6118ea565b6040518082815260200191505060405180910390f35b6105c16004803603604081101561058b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506118f0565b604051808215151515815260200191505060405180910390f35b6105e3611bcd565b604051808215151515815260200191505060405180910390f35b6106536004803603606081101561061357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919080359060200190929190505050611dd3565b005b6106976004803603602081101561066b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506121cc565b6040518082815260200191505060405180910390f35b6106ef600480360360208110156106c357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612218565b6040518082815260200191505060405180910390f35b61070d612264565b6040518082815260200191505060405180910390f35b61072b6122b5565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6107756122de565b604051808215151515815260200191505060405180910390f35b610797612335565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156107d75780820151818401526020810190506107bc565b50505050905090810190601f1680156108045780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61081a6123d3565b604051808215151515815260200191505060405180910390f35b6108806004803603604081101561084a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612451565b604051808215151515815260200191505060405180910390f35b6108a2612795565b604051808215151515815260200191505060405180910390f35b610908600480360360408110156108d257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127d8565b604051808215151515815260200191505060405180910390f35b61096e6004803603604081101561093857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127ef565b005b6109b26004803603602081101561098657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612ace565b6040518082815260200191505060405180910390f35b610a0a600480360360208110156109de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b1a565b604051808215151515815260200191505060405180910390f35b610a5060048036036020811015610a3a57600080fd5b8101908080359060200190929190505050612bb7565b6040518082815260200191505060405180910390f35b610a6e612ddd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610b1260048036036040811015610ac657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612e07565b6040518082815260200191505060405180910390f35b610b7460048036036040811015610b3e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612e91565b005b610bb860048036036020811015610b8c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061311c565b005b610bc26133b2565b604051808215151515815260200191505060405180910390f35b6000610be66122de565b610bef57600080fd5b600360009054906101000a900460ff1615610c0957600080fd5b610c5e82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015610cac57600080fd5b610d0182600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550610d9c82600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b60058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610f3b5780601f10610f1057610100808354040283529160200191610f3b565b820191906000526020600020905b815481529060010190602001808311610f1e57829003601f168201915b505050505081565b6000610f50338484613414565b6001905092915050565b6060806040518060400160405280600181526020017f7b00000000000000000000000000000000000000000000000000000000000000815250905060606040518060400160405280601281526020017f22636861726765416d6f756e7422203a202200000000000000000000000000008152509050606061101c600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154613590565b905060606040518060400160405280601581526020017f222c2022756e6c6f636b416d6f756e7422203a20220000000000000000000000815250905060606110a5600460008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154613590565b905060606040518060400160405280601981526020017f222c2022617661696c61626c6542616c616e636522203a2022000000000000008152509050606061112e600460008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154613590565b905060606040518060400160405280600281526020017f227d00000000000000000000000000000000000000000000000000000000000081525090506060815183518551875189518b518d518f51010101010101016040519080825280601f01601f1916602001820160405280156111b55781602001600182028038833980820191505090505b509050606081905060008090506000809050600091505b8b5182101561123a578b82815181106111e157fe5b602001015160f81c60f81b8382806001019350815181106111fe57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506111cc565b600091505b8a518210156112ad578a828151811061125457fe5b602001015160f81c60f81b83828060010193508151811061127157fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061123f565b600091505b8951821015611320578982815181106112c757fe5b602001015160f81c60f81b8382806001019350815181106112e457fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506112b2565b600091505b88518210156113935788828151811061133a57fe5b602001015160f81c60f81b83828060010193508151811061135757fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611325565b600091505b8751821015611406578782815181106113ad57fe5b602001015160f81c60f81b8382806001019350815181106113ca57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053508180600101925050611398565b600091505b86518210156114795786828151811061142057fe5b602001015160f81c60f81b83828060010193508151811061143d57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061140b565b600091505b85518210156114ec5785828151811061149357fe5b602001015160f81c60f81b8382806001019350815181106114b057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350818060010192505061147e565b600091505b845182101561155f5784828151811061150657fe5b602001015160f81c60f81b83828060010193508151811061152357fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535081806001019250506114f1565b829c50505050505050505050505050919050565b6000600254905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60006115e28484846136bd565b61167e843361167985600460008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b613414565b600190509392505050565b600061169361157d565b61169c57600080fd5b600360009054906101000a900460ff166116b557600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166116d4612ddd565b73ffffffffffffffffffffffffffffffffffffffff161480156116fc57506116fb3361390a565b5b61170557600080fd5b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506117e981600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f477b65cf658c5207a9d60bb5ebe4f60a504af024949bdffa6efc396d01ced3f6836040518082815260200191505060405180910390a36001915050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b60075481565b6000600360009054906101000a900460ff161561190c57600080fd5b60006119a083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546133f590919063ffffffff16565b90506119aa6122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611bb757611a3283600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541015611a8057600080fd5b611ad583600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550611b7083600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b611bc2338583613414565b600191505092915050565b6000611bd761157d565b611be057600080fd5b600360009054906101000a900460ff16611bf957600080fd5b3373ffffffffffffffffffffffffffffffffffffffff16611c18612ddd565b73ffffffffffffffffffffffffffffffffffffffff16148015611c405750611c3f3361390a565b5b611c4957600080fd5b6000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015490506000600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611d348160046000611ce86122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b60046000611d406122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364826040518082815260200191505060405180910390a25090565b611ddb6122de565b80611dea5750611de961157d565b5b611df357600080fd5b600360009054906101000a900460ff1615611e0d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e4757600080fd5b611e4f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611e8757600080fd5b60008211611e9457600080fd5b80821015611ea157600080fd5b8160046000611eae6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015611ef757600080fd5b611f538260046000611f076122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b60046000611f5f6122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550611ff582600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555061209081600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061212b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508273ffffffffffffffffffffffffffffffffffffffff167f720e2015c6c49aa255ac152528ef75a8d12b40300a289e74c701a97c428654858383604051808381526020018281526020019250505060405180910390a2505050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001549050919050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549050919050565b6000600460006122726122b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b60068054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156123cb5780601f106123a0576101008083540402835291602001916123cb565b820191906000526020600020905b8154815290600101906020018083116123ae57829003601f168201915b505050505081565b60006123dd6122de565b6123e657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561244257600080fd5b61244c600061391d565b905090565b6000600360009054906101000a900460ff161561246d57600080fd5b81600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561257757600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505b600061260b83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546138ea90919063ffffffff16565b90506126156122b5565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141561277f5761269d83600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061273883600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505b61278a338583613414565b600191505092915050565b600061279f6122de565b6127a857600080fd5b6000600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60006127e53384846136bd565b6001905092915050565b6127f76122de565b80612806575061280561157d565b5b61280f57600080fd5b600360009054906101000a900460ff161561282957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561286357600080fd5b61286b6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128a357600080fd5b6128f881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154101561294657600080fd5b61299b81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612a3681600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167f84a2be98ade81115c3a7fc4e3f8f8b7d2ce22bb482f7270108a03034579aedad826040518082815260200191505060405180910390a25050565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000612b246122de565b612b2d57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b6757600080fd5b612b6f6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ba757600080fd5b612bb08261391d565b9050919050565b6000612bc16122de565b612bca57600080fd5b600360009054906101000a900460ff1615612be457600080fd5b612c3982600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550612cd482600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055507fff8ec5d2b7f799353c995f253a6beef49d9d48b7526099e872af2cfe7a888b1d600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546040518082815260200191505060405180910390a1600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612e996122de565b80612ea85750612ea761157d565b5b612eb157600080fd5b600360009054906101000a900460ff1615612ecb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f0557600080fd5b612f0d6122b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f4557600080fd5b80600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201541015612f9457600080fd5b612fe981600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061308481600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff167fd85f893defab26c8b95a9d1a6aec387c0f5f6fb6581d53df79b83ef7b2061873826040518082815260200191505060405180910390a25050565b6131246122de565b80613133575061313261157d565b5b61313c57600080fd5b600360009054906101000a900460ff161561315657600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561319057600080fd5b6131986122b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156131d057600080fd5b6000613269600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546138ea90919063ffffffff16565b90506000811161327857600080fd5b6132cd81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555061336881600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055505050565b60006133bc6122de565b6133c557600080fd5b6001600360006101000a81548160ff021916908315150217905550600360009054906101000a900460ff16905090565b60008082840190508381101561340a57600080fd5b8091505092915050565b600360009054906101000a900460ff161561342e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561346857600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156134a257600080fd5b80600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b606060008214156135d8576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506136b8565b600082905060005b60008214613602578080600101915050600a82816135fa57fe5b0491506135e0565b6060816040519080825280601f01601f1916602001820160405280156136375781602001600182028038833980820191505090505b50905060006001830390505b600086146136b057600a868161365557fe5b0660300160f81b8282806001900393508151811061366f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a86816136a857fe5b049550613643565b819450505050505b919050565b600360009054906101000a900460ff16156136d757600080fd5b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561371057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561374a57600080fd5b61379f81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546138ea90919063ffffffff16565b600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061383a81600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201546133f590919063ffffffff16565b600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000828211156138f957600080fd5b600082840390508091505092915050565b600080823b905060008111915050919050565b60008173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561397a57600080fd5b8173ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f7ae02edfa8fcf8e6ab0735af4a8724ca06b091b99194712358a6da6146107a8f60405160405180910390a381600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001905091905056fea165627a7a72305820b077605f3bde73c0ebc691471e741cd86ca2f18b38ea493b05c6a4a7e98a449e0029

Deployed Bytecode Sourcemap

34095:413:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34095:413:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22344:576;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;22344:576:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34128:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34128:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13898:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13898:148:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18503:2199;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18503:2199:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;18503:2199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13075:91;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9258:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;14119:244;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14119:244:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31643:533;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31643:533:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18198:134;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18198:134:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34196:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;14480:740;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;14480:740:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;32831:491;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25209:845;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25209:845:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17739:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17739:135:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;13242:123;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13242:123:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21448:125;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6943:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;7108:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34161:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;34161:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9799:160;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;15337:1170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;15337:1170:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;30954:109;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13664:140;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13664:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;26587:594;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26587:594:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;17958:135;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17958:135:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9462:214;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;9462:214:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;23857:458;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23857:458:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;8580:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13463:149;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;13463:149:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27721:536;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27721:536:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28757:545;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;28757:545:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30617:106;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22344:576;22417:7;7070:9;:7;:9::i;:::-;7062:18;;;;;;22446:6;;;;;;;;;;;22445:7;22437:16;;;;;;22517:53;22563:6;22517:16;:28;22534:10;22517:28;;;;;;;;;;;;;;;:41;;;:45;;:53;;;;:::i;:::-;22472:16;:28;22489:10;22472:28;;;;;;;;;;;;;;;:41;;;:98;;22464:107;;;;;;22626:53;22672:6;22626:16;:28;22643:10;22626:28;;;;;;;;;;;;;;;:41;;;:45;;:53;;;;:::i;:::-;22582:16;:28;22599:10;22582:28;;;;;;;;;;;;;;;:41;;:97;;;;22729:48;22770:6;22729:16;:28;22746:10;22729:28;;;;;;;;;;;;;;;:36;;;:40;;:48;;;;:::i;:::-;22690:16;:28;22707:10;22690:28;;;;;;;;;;;;;;;:36;;:87;;;;22793:60;22811:16;:28;22828:10;22811:28;;;;;;;;;;;;;;;:41;;;22793:60;;;;;;;;;;;;;;;;;;22871:16;:28;22888:10;22871:28;;;;;;;;;;;;;;;:41;;;22864:48;;22344:576;;;:::o;34128:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13898:148::-;13963:4;13980:36;13989:10;14001:7;14010:5;13980:8;:36::i;:::-;14034:4;14027:11;;13898:148;;;;:::o;18503:2199::-;18568:13;18594:23;18620:10;;;;;;;;;;;;;;;;;18594:36;;18641:24;18668:30;;;;;;;;;;;;;;;;;18641:57;;18709:19;18737:47;18746:16;:24;18763:6;18746:24;;;;;;;;;;;;;;;:37;;;18737:8;:47::i;:::-;18709:76;;18796:24;18823:34;;;;;;;;;;;;;;;;;18796:61;;18868:19;18896:47;18905:16;:24;18922:6;18905:24;;;;;;;;;;;;;;;:37;;;18896:8;:47::i;:::-;18868:76;;18955:25;18983:38;;;;;;;;;;;;;;;;;18955:66;;19032:20;19061:42;19070:16;:24;19087:6;19070:24;;;;;;;;;;;;;;;:32;;;19061:8;:42::i;:::-;19032:72;;19115:21;19139:12;;;;;;;;;;;;;;;;;19115:36;;19164:21;19332:8;:15;19315:7;:14;19293:12;:19;19277:6;:13;19256:11;:18;19240:6;:13;19219:11;:18;19199:10;:17;:38;:54;:75;:91;:113;:130;:148;19188:160;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;19188:160:0;;;;19164:184;;19359:25;19393:7;19359:42;;19414:14;19431:1;19414:18;;19443:15;19461:1;19443:19;;19492:1;19480:13;;19475:141;19507:10;:17;19495:9;:29;19475:141;;;19583:10;19594:9;19583:21;;;;;;;;;;;;;;;;19554:12;19567;;;;;;19554:26;;;;;;;;;;;:50;;;;;;;;;;;19526:11;;;;;;;19475:141;;;19643:1;19631:13;;19626:143;19658:11;:18;19646:9;:30;19626:143;;;19735:11;19747:9;19735:22;;;;;;;;;;;;;;;;19706:12;19719;;;;;;19706:26;;;;;;;;;;;:51;;;;;;;;;;;19678:11;;;;;;;19626:143;;;19796:1;19784:13;;19779:133;19811:6;:13;19799:9;:25;19779:133;;;19883:6;19890:9;19883:17;;;;;;;;;;;;;;;;19854:12;19867;;;;;;19854:26;;;;;;;;;;;:46;;;;;;;;;;;19826:11;;;;;;;19779:133;;;19939:1;19927:13;;19922:143;19954:11;:18;19942:9;:30;19922:143;;;20031:11;20043:9;20031:22;;;;;;;;;;;;;;;;20002:12;20015;;;;;;20002:26;;;;;;;;;;;:51;;;;;;;;;;;19974:11;;;;;;;19922:143;;;20092:1;20080:13;;20075:133;20107:6;:13;20095:9;:25;20075:133;;;20179:6;20186:9;20179:17;;;;;;;;;;;;;;;;20150:12;20163;;;;;;20150:26;;;;;;;;;;;:46;;;;;;;;;;;20122:11;;;;;;;20075:133;;;20235:1;20223:13;;20218:145;20250:12;:19;20238:9;:31;20218:145;;;20328:12;20341:9;20328:23;;;;;;;;;;;;;;;;20299:12;20312;;;;;;20299:26;;;;;;;;;;;:52;;;;;;;;;;;20271:11;;;;;;;20218:145;;;20390:1;20378:13;;20373:135;20405:7;:14;20393:9;:26;20373:135;;;20478:7;20486:9;20478:18;;;;;;;;;;;;;;;;20449:12;20462;;;;;;20449:26;;;;;;;;;;;:47;;;;;;;;;;;20421:11;;;;;;;20373:135;;;20535:1;20523:13;;20518:137;20550:8;:15;20538:9;:27;20518:137;;;20624:8;20633:9;20624:19;;;;;;;;;;;;;;;;20595:12;20608;;;;;;20595:26;;;;;;;;;;;:48;;;;;;;;;;;20567:11;;;;;;;20518:137;;;20681:12;20667:27;;;;;;;;;;;;;;18503:2199;;;:::o;13075:91::-;13119:7;13146:12;;13139:19;;13075:91;:::o;9258:100::-;9302:4;9340:10;;;;;;;;;;;9326:24;;:10;:24;;;9319:31;;9258:100;:::o;14119:244::-;14198:4;14215:26;14225:4;14231:2;14235:5;14215:9;:26::i;:::-;14252:81;14261:4;14267:10;14279:53;14326:5;14279:16;:22;14296:4;14279:22;;;;;;;;;;;;;;;:30;;:42;14310:10;14279:42;;;;;;;;;;;;;;;;:46;;:53;;;;:::i;:::-;14252:8;:81::i;:::-;14351:4;14344:11;;14119:244;;;;;:::o;31643:533::-;31709:4;8903:13;:11;:13::i;:::-;8895:22;;;;;;31734:6;;;;;;;;;;;31726:15;;;;;;31798:10;31783:25;;:11;:9;:11::i;:::-;:25;;;31782:53;;;;;31813:22;31824:10;31813;:22::i;:::-;31782:53;31774:62;;;;;;31887:15;31905:16;:24;31922:6;31905:24;;;;;;;;;;;;;;;:32;;;31887:50;;31983:1;31948:16;:24;31965:6;31948:24;;;;;;;;;;;;;;;:32;;:36;;;;32034:49;32075:7;32034:16;:28;32051:10;32034:28;;;;;;;;;;;;;;;:36;;;:40;;:49;;;;:::i;:::-;31995:16;:28;32012:10;31995:28;;;;;;;;;;;;;;;:36;;:88;;;;32126:10;32109:37;;32118:6;32109:37;;;32138:7;32109:37;;;;;;;;;;;;;;;;;;32164:4;32157:11;;;31643:533;;;:::o;18198:134::-;18265:7;18292:16;:24;18309:6;18292:24;;;;;;;;;;;;;;;:32;;;18285:39;;18198:134;;;:::o;34196:28::-;;;;:::o;14480:740::-;14560:4;14586:6;;;;;;;;;;;14585:7;14577:16;;;;;;14604:13;14620:61;14670:10;14620:16;:28;14637:10;14620:28;;;;;;;;;;;;;;;:36;;:45;14657:7;14620:45;;;;;;;;;;;;;;;;:49;;:61;;;;:::i;:::-;14604:77;;14710:7;:5;:7::i;:::-;14696:21;;:10;:21;;;14692:452;;;14852:57;14898:10;14852:16;:28;14869:10;14852:28;;;;;;;;;;;;;;;:41;;;:45;;:57;;;;:::i;:::-;14807:16;:28;14824:10;14807:28;;;;;;;;;;;;;;;:41;;;:102;;14799:111;;;;;;14969:57;15015:10;14969:16;:28;14986:10;14969:28;;;;;;;;;;;;;;;:41;;;:45;;:57;;;;:::i;:::-;14925:16;:28;14942:10;14925:28;;;;;;;;;;;;;;;:41;;:101;;;;15080:52;15121:10;15080:16;:28;15097:10;15080:28;;;;;;;;;;;;;;;:36;;;:40;;:52;;;;:::i;:::-;15041:16;:28;15058:10;15041:28;;;;;;;;;;;;;;;:36;;:91;;;;14692:452;15154:36;15163:10;15175:7;15184:5;15154:8;:36::i;:::-;15208:4;15201:11;;;14480:740;;;;:::o;32831:491::-;32883:4;8903:13;:11;:13::i;:::-;8895:22;;;;;;32908:6;;;;;;;;;;;32900:15;;;;;;32972:10;32957:25;;:11;:9;:11::i;:::-;:25;;;32956:53;;;;;32987:22;32998:10;32987;:22::i;:::-;32956:53;32948:62;;;;;;33061:15;33079:16;:28;33096:10;33079:28;;;;;;;;;;;;;;;:36;;;33061:54;;33165:1;33126:16;:28;33143:10;33126:28;;;;;;;;;;;;;;;:36;;:40;;;;33213:46;33251:7;33213:16;:25;33230:7;:5;:7::i;:::-;33213:25;;;;;;;;;;;;;;;:33;;;:37;;:46;;;;:::i;:::-;33177:16;:25;33194:7;:5;:7::i;:::-;33177:25;;;;;;;;;;;;;;;:33;;:82;;;;33294:10;33285:29;;;33306:7;33285:29;;;;;;;;;;;;;;;;;;8928:1;32831:491;:::o;25209:845::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;25331:6;;;;;;;;;;;25330:7;25322:16;;;;;;25375:1;25357:20;;:6;:20;;;;25349:29;;;;;;25407:7;:5;:7::i;:::-;25397:17;;:6;:17;;;;25389:26;;;;;;25449:1;25434:12;:16;25426:25;;;;;;25486:12;25470;:28;;25462:37;;;;;;25555:12;25518:16;:25;25535:7;:5;:7::i;:::-;25518:25;;;;;;;;;;;;;;;:33;;;:49;;25510:58;;;;;;25617:51;25655:12;25617:16;:25;25634:7;:5;:7::i;:::-;25617:25;;;;;;;;;;;;;;;:33;;;:37;;:51;;;;:::i;:::-;25581:16;:25;25598:7;:5;:7::i;:::-;25581:25;;;;;;;;;;;;;;;:33;;:87;;;;25721:55;25763:12;25721:16;:24;25738:6;25721:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;25681:16;:24;25698:6;25681:24;;;;;;;;;;;;;;;:37;;:95;;;;25827:55;25869:12;25827:16;:24;25844:6;25827:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;25787:16;:24;25804:6;25787:24;;;;;;;;;;;;;;;:37;;:95;;;;25928:50;25965:12;25928:16;:24;25945:6;25928:24;;;;;;;;;;;;;;;:32;;;:36;;:50;;;;:::i;:::-;25893:16;:24;25910:6;25893:24;;;;;;;;;;;;;;;:32;;:85;;;;26011:6;26004:42;;;26019:12;26033;26004:42;;;;;;;;;;;;;;;;;;;;;;;;25209:845;;;:::o;17739:135::-;17802:7;17829:16;:24;17846:6;17829:24;;;;;;;;;;;;;;;:37;;;17822:44;;17739:135;;;:::o;13242:123::-;13298:7;13325:16;:24;13342:6;13325:24;;;;;;;;;;;;;;;:32;;;13318:39;;13242:123;;;:::o;21448:125::-;21500:7;21527:16;:25;21544:7;:5;:7::i;:::-;21527:25;;;;;;;;;;;;;;;:38;;;21520:45;;21448:125;:::o;6943:79::-;6981:7;7008:6;;;;;;;;;;;7001:13;;6943:79;:::o;7108:92::-;7148:4;7186:6;;;;;;;;;;;7172:20;;:10;:20;;;7165:27;;7108:92;:::o;34161:28::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9799:160::-;9854:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;9901:1;9879:24;;:10;;;;;;;;;;;:24;;;;9871:33;;;;;;9922:29;9948:1;9922:17;:29::i;:::-;9915:36;;9799:160;:::o;15337:1170::-;15422:4;15448:6;;;;;;;;;;;15447:7;15439:16;;;;;;15793:15;15745:16;:28;15762:10;15745:28;;;;;;;;;;;;;;;:36;;:45;15782:7;15745:45;;;;;;;;;;;;;;;;:63;15741:159;;;15843:16;:28;15860:10;15843:28;;;;;;;;;;;;;;;:36;;:45;15880:7;15843:45;;;;;;;;;;;;;;;;15825:63;;15741:159;15920:13;15936:66;15986:15;15936:16;:28;15953:10;15936:28;;;;;;;;;;;;;;;:36;;:45;15973:7;15936:45;;;;;;;;;;;;;;;;:49;;:66;;;;:::i;:::-;15920:82;;16031:7;:5;:7::i;:::-;16017:21;;:10;:21;;;16013:418;;;16246:62;16292:15;16246:16;:28;16263:10;16246:28;;;;;;;;;;;;;;;:41;;;:45;;:62;;;;:::i;:::-;16202:16;:28;16219:10;16202:28;;;;;;;;;;;;;;;:41;;:106;;;;16362:57;16403:15;16362:16;:28;16379:10;16362:28;;;;;;;;;;;;;;;:36;;;:40;;:57;;;;:::i;:::-;16323:16;:28;16340:10;16323:28;;;;;;;;;;;;;;;:36;;:96;;;;16013:418;16441:36;16450:10;16462:7;16471:5;16441:8;:36::i;:::-;16495:4;16488:11;;;15337:1170;;;;:::o;30954:109::-;31000:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;31026:5;31017:6;;:14;;;;;;;;;;;;;;;;;;31049:6;;;;;;;;;;;31042:13;;30954:109;:::o;13664:140::-;13725:4;13742:32;13752:10;13764:2;13768:5;13742:9;:32::i;:::-;13792:4;13785:11;;13664:140;;;;:::o;26587:594::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;26701:6;;;;;;;;;;;26700:7;26692:16;;;;;;26745:1;26727:20;;:6;:20;;;;26719:29;;;;;;26777:7;:5;:7::i;:::-;26767:17;;:6;:17;;;;26759:26;;;;;;26845:55;26887:12;26845:16;:24;26862:6;26845:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;26804:16;:24;26821:6;26804:24;;;;;;;;;;;;;;;:37;;;:96;;26796:105;;;;;;26954:55;26996:12;26954:16;:24;26971:6;26954:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;26914:16;:24;26931:6;26914:24;;;;;;;;;;;;;;;:37;;:95;;;;27055:50;27092:12;27055:16;:24;27072:6;27055:24;;;;;;;;;;;;;;;:32;;;:36;;:50;;;;:::i;:::-;27020:16;:24;27037:6;27020:24;;;;;;;;;;;;;;;:32;;:85;;;;27152:6;27131:42;;;27160:12;27131:42;;;;;;;;;;;;;;;;;;26587:594;;:::o;17958:135::-;18021:7;18048:16;:24;18065:6;18048:24;;;;;;;;;;;;;;;:37;;;18041:44;;17958:135;;;:::o;9462:214::-;9533:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;9579:1;9558:23;;:9;:23;;;;9550:32;;;;;;9614:7;:5;:7::i;:::-;9601:20;;:9;:20;;;;9593:29;;;;;;9640:28;9658:9;9640:17;:28::i;:::-;9633:35;;9462:214;;;:::o;23857:458::-;23930:7;7070:9;:7;:9::i;:::-;7062:18;;;;;;23959:6;;;;;;;;;;;23958:7;23950:16;;;;;;24021:53;24067:6;24021:16;:28;24038:10;24021:28;;;;;;;;;;;;;;;:41;;;:45;;:53;;;;:::i;:::-;23977:16;:28;23994:10;23977:28;;;;;;;;;;;;;;;:41;;:97;;;;24124:48;24165:6;24124:16;:28;24141:10;24124:28;;;;;;;;;;;;;;;:36;;;:40;;:48;;;;:::i;:::-;24085:16;:28;24102:10;24085:28;;;;;;;;;;;;;;;:36;;:87;;;;24188:60;24206:16;:28;24223:10;24206:28;;;;;;;;;;;;;;;:41;;;24188:60;;;;;;;;;;;;;;;;;;24266:16;:28;24283:10;24266:28;;;;;;;;;;;;;;;:41;;;24259:48;;23857:458;;;:::o;8580:87::-;8622:7;8649:10;;;;;;;;;;;8642:17;;8580:87;:::o;13463:149::-;13536:7;13563:16;:24;13580:6;13563:24;;;;;;;;;;;;;;;:32;;:41;13596:7;13563:41;;;;;;;;;;;;;;;;13556:48;;13463:149;;;;:::o;27721:536::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;27833:6;;;;;;;;;;;27832:7;27824:16;;;;;;27877:1;27859:20;;:6;:20;;;;27851:29;;;;;;27909:7;:5;:7::i;:::-;27899:17;;:6;:17;;;;27891:26;;;;;;27972:10;27936:16;:24;27953:6;27936:24;;;;;;;;;;;;;;;:32;;;:46;;27928:55;;;;;;28036:53;28078:10;28036:16;:24;28053:6;28036:24;;;;;;;;;;;;;;;:37;;;:41;;:53;;;;:::i;:::-;27996:16;:24;28013:6;27996:24;;;;;;;;;;;;;;;:37;;:93;;;;28135:48;28172:10;28135:16;:24;28152:6;28135:24;;;;;;;;;;;;;;;:32;;;:36;;:48;;;;:::i;:::-;28100:16;:24;28117:6;28100:24;;;;;;;;;;;;;;;:32;;:83;;;;28230:6;28209:40;;;28238:10;28209:40;;;;;;;;;;;;;;;;;;27721:536;;:::o;28757:545::-;9199:9;:7;:9::i;:::-;:26;;;;9212:13;:11;:13::i;:::-;9199:26;9191:35;;;;;;28844:6;;;;;;;;;;;28843:7;28835:16;;;;;;28888:1;28870:20;;:6;:20;;;;28862:29;;;;;;28920:7;:5;:7::i;:::-;28910:17;;:6;:17;;;;28902:26;;;;;;28941:20;28964:80;29006:16;:24;29023:6;29006:24;;;;;;;;;;;;;;;:37;;;28964:16;:24;28981:6;28964:24;;;;;;;;;;;;;;;:37;;;:41;;:80;;;;:::i;:::-;28941:103;;29080:1;29065:12;:16;29057:25;;;;;;29143:55;29185:12;29143:16;:24;29160:6;29143:24;;;;;;;;;;;;;;;:37;;;:41;;:55;;;;:::i;:::-;29103:16;:24;29120:6;29103:24;;;;;;;;;;;;;;;:37;;:95;;;;29244:50;29281:12;29244:16;:24;29261:6;29244:24;;;;;;;;;;;;;;;:32;;;:36;;:50;;;;:::i;:::-;29209:16;:24;29226:6;29209:24;;;;;;;;;;;;;;;:32;;:85;;;;9237:1;28757:545;:::o;30617:106::-;30661:4;7070:9;:7;:9::i;:::-;7062:18;;;;;;30687:4;30678:6;;:13;;;;;;;;;;;;;;;;;;30709:6;;;;;;;;;;;30702:13;;30617:106;:::o;5727:150::-;5785:7;5805:9;5821:1;5817;:5;5805:17;;5846:1;5841;:6;;5833:15;;;;;;5868:1;5861:8;;;5727:150;;;;:::o;17332:300::-;17426:6;;;;;;;;;;;17425:7;17417:16;;;;;;17471:1;17452:21;;:7;:21;;;;17444:30;;;;;;17511:1;17493:20;;:6;:20;;;;17485:29;;;;;;17571:5;17527:16;:24;17544:6;17527:24;;;;;;;;;;;;;;;:32;;:41;17560:7;17527:41;;;;;;;;;;;;;;;:49;;;;17609:7;17592:32;;17601:6;17592:32;;;17618:5;17592:32;;;;;;;;;;;;;;;;;;17332:300;;;:::o;20840:482::-;20890:27;20940:1;20934:2;:7;20930:50;;;20958:10;;;;;;;;;;;;;;;;;;;;;20930:50;20990:6;20999:2;20990:11;;21012:8;21031:69;21043:1;21038;:6;21031:69;;21061:5;;;;;;;21086:2;21081:7;;;;;;;;;21031:69;;;21110:17;21140:3;21130:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;21130:14:0;;;;21110:34;;21155:6;21170:1;21164:3;:7;21155:16;;21182:103;21195:1;21189:2;:7;21182:103;;21246:2;21241;:7;;;;;;21236:2;:12;21225:25;;21213:4;21218:3;;;;;;;21213:9;;;;;;;;;;;:37;;;;;;;;;;;21271:2;21265:8;;;;;;;;;21182:103;;;21309:4;21295:19;;;;;;20840:482;;;;:::o;16617:603::-;16705:6;;;;;;;;;;;16704:7;16696:16;;;;;;16961:4;16947:19;;:2;:19;;;;16939:28;;;;;;17000:1;16986:16;;:2;:16;;;;16978:25;;;;;;17049:41;17084:5;17049:16;:22;17066:4;17049:22;;;;;;;;;;;;;;;:30;;;:34;;:41;;;;:::i;:::-;17016:16;:22;17033:4;17016:22;;;;;;;;;;;;;;;:30;;:74;;;;17132:39;17165:5;17132:16;:20;17149:2;17132:20;;;;;;;;;;;;;;;:28;;;:32;;:39;;;;:::i;:::-;17101:16;:20;17118:2;17101:20;;;;;;;;;;;;;;;:28;;:70;;;;17202:2;17187:25;;17196:4;17187:25;;;17206:5;17187:25;;;;;;;;;;;;;;;;;;16617:603;;;:::o;5569:150::-;5627:7;5660:1;5655;:6;;5647:15;;;;;;5673:9;5689:1;5685;:5;5673:17;;5710:1;5703:8;;;5569:150;;;;:::o;33935:153::-;33986:4;34001:9;34050:4;34038:17;34030:25;;34079:1;34072:4;:8;34065:15;;;33935:153;;;:::o;10113:231::-;10176:4;10215:9;10201:23;;:10;;;;;;;;;;;:23;;;;10193:32;;;;;;10271:9;10241:40;;10259:10;;;;;;;;;;;10241:40;;;;;;;;;;;;10305:9;10292:10;;:22;;;;;;;;;;;;;;;;;;10332:4;10325:11;;10113:231;;;:::o

Swarm Source

bzzr://b077605f3bde73c0ebc691471e741cd86ca2f18b38ea493b05c6a4a7e98a449e

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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