ETH Price: $3,325.48 (-2.62%)

Contract

0x97875355eF55Ae35613029df8B1C8Cf8f89c9066
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Claim150683282022-07-03 7:54:20877 days ago1656834860IN
0x97875355...8f89c9066
0 ETH0.000207388.06457793
Claim123334592021-04-29 5:21:181307 days ago1619673678IN
0x97875355...8f89c9066
0 ETH0.0011821937.1
Move Assets123333212021-04-29 4:54:011307 days ago1619672041IN
0x97875355...8f89c9066
0 ETH0.008618450
Move Assets123333122021-04-29 4:50:141307 days ago1619671814IN
0x97875355...8f89c9066
0 ETH0.009976750
Move Assets123333052021-04-29 4:48:291307 days ago1619671709IN
0x97875355...8f89c9066
0 ETH0.007337750
Move Assets123332992021-04-29 4:46:431307 days ago1619671603IN
0x97875355...8f89c9066
0 ETH0.0125719555
Move Assets123332902021-04-29 4:44:291307 days ago1619671469IN
0x97875355...8f89c9066
0 ETH0.012675355
Move Assets123332842021-04-29 4:43:191307 days ago1619671399IN
0x97875355...8f89c9066
0 ETH0.0231591855
Move Assets123332732021-04-29 4:41:461307 days ago1619671306IN
0x97875355...8f89c9066
0 ETH0.0545134155
Move Assets123332032021-04-29 4:25:421307 days ago1619670342IN
0x97875355...8f89c9066
0 ETH0.0313596855
Move Assets123331872021-04-29 4:22:471307 days ago1619670167IN
0x97875355...8f89c9066
0 ETH0.0328560655
Move Assets123331462021-04-29 4:13:341307 days ago1619669614IN
0x97875355...8f89c9066
0 ETH0.0446798460
Retire123330352021-04-29 3:45:511307 days ago1619667951IN
0x97875355...8f89c9066
0 ETH0.0014036445
Migrate123330322021-04-29 3:45:321307 days ago1619667932IN
0x97875355...8f89c9066
0 ETH0.0015161445
Move Assets123330272021-04-29 3:44:311307 days ago1619667871IN
0x97875355...8f89c9066
0 ETH0.0036340245
Migrate123330232021-04-29 3:43:401307 days ago1619667820IN
0x97875355...8f89c9066
0 ETH0.0015161445
Move Assets123330172021-04-29 3:42:541307 days ago1619667774IN
0x97875355...8f89c9066
0 ETH0.1579880745
Migrate123330112021-04-29 3:41:451307 days ago1619667705IN
0x97875355...8f89c9066
0 ETH0.0015161445
Pause123329952021-04-29 3:38:321307 days ago1619667512IN
0x97875355...8f89c9066
0 ETH0.0014324845
Claim123329222021-04-29 3:20:031307 days ago1619666403IN
0x97875355...8f89c9066
0 ETH0.0014339245
Retire123328972021-04-29 3:14:421307 days ago1619666082IN
0x97875355...8f89c9066
0 ETH0.001528449
Deposit123327112021-04-29 2:32:191307 days ago1619663539IN
0x97875355...8f89c9066
0.03684585 ETH0.00603927177.6465
Deposit123326942021-04-29 2:29:171307 days ago1619663357IN
0x97875355...8f89c9066
0.022 ETH0.00379735111.7
Deposit123325442021-04-29 1:53:091307 days ago1619661189IN
0x97875355...8f89c9066
0.15 ETH0.0041918123.303
Withdraw123322822021-04-29 0:57:131307 days ago1619657833IN
0x97875355...8f89c9066
0 ETH0.02799328135.631
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
123330272021-04-29 3:44:311307 days ago1619667871
0x97875355...8f89c9066
2,444.30905112 ETH
123322822021-04-29 0:57:131307 days ago1619657833
0x97875355...8f89c9066
2 ETH
123314042021-04-28 21:38:161308 days ago1619645896
0x97875355...8f89c9066
10.95643048 ETH
123309482021-04-28 19:55:211308 days ago1619639721
0x97875355...8f89c9066
0.5 ETH
123303882021-04-28 17:50:171308 days ago1619632217
0x97875355...8f89c9066
1 ETH
123299612021-04-28 16:20:091308 days ago1619626809
0x97875355...8f89c9066
1.80898726 ETH
123288802021-04-28 12:14:101308 days ago1619612050
0x97875355...8f89c9066
10 ETH
123288672021-04-28 12:11:171308 days ago1619611877
0x97875355...8f89c9066
10.98109171 ETH
123286152021-04-28 11:10:521308 days ago1619608252
0x97875355...8f89c9066
0.51222925 ETH
123285642021-04-28 10:58:261308 days ago1619607506
0x97875355...8f89c9066
5 ETH
123265882021-04-28 3:50:011308 days ago1619581801
0x97875355...8f89c9066
5 ETH
123264362021-04-28 3:16:391308 days ago1619579799
0x97875355...8f89c9066
0.5 ETH
123262222021-04-28 2:28:011308 days ago1619576881
0x97875355...8f89c9066
0.696497 ETH
123238712021-04-27 17:45:051309 days ago1619545505
0x97875355...8f89c9066
0.2 ETH
123236212021-04-27 16:47:131309 days ago1619542033
0x97875355...8f89c9066
0.29828413 ETH
123235292021-04-27 16:28:551309 days ago1619540935
0x97875355...8f89c9066
2.9482395 ETH
123225452021-04-27 12:57:191309 days ago1619528239
0x97875355...8f89c9066
0.16162432 ETH
123220742021-04-27 11:17:181309 days ago1619522238
0x97875355...8f89c9066
22 ETH
123215582021-04-27 9:20:151309 days ago1619515215
0x97875355...8f89c9066
0.94725196 ETH
123207802021-04-27 6:33:101309 days ago1619505190
0x97875355...8f89c9066
0.1 ETH
123200672021-04-27 3:53:581309 days ago1619495638
0x97875355...8f89c9066
21.06150035 ETH
123194722021-04-27 1:32:511309 days ago1619487171
0x97875355...8f89c9066
0.35622699 ETH
123191912021-04-27 0:32:391309 days ago1619483559
0x97875355...8f89c9066
12 ETH
123189902021-04-26 23:40:211310 days ago1619480421
0x97875355...8f89c9066
2.31930487 ETH
123180622021-04-26 20:13:571310 days ago1619468037
0x97875355...8f89c9066
0.05041844 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Vault

Compiler Version
v0.6.6+commit.6c089d02

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 1 of 3: vault.sol
pragma solidity ^0.6.6;
pragma experimental ABIEncoderV2;

import "./IERC20.sol";
import "./pause.sol";

/**
 * Math operations with safety checks
 */
library SafeMath {
  function safeMul(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a * b;
    require(a == 0 || c / a == b);
    return c;
  }

  function safeDiv(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0);
    uint256 c = a / b;
    require(a == b * c + a % b);
    return c;
  }

  function safeSub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    return a - b;
  }

  function safeAdd(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c>=a && c>=b);
    return c;
  }
}


/**
 * @dev Interface of the contract capable of checking if an instruction is
 * confirmed over at Incognito Chain
 */
interface Incognito {
    function instructionApproved(
        bool,
        bytes32,
        uint,
        bytes32[] calldata,
        bool[] calldata,
        bytes32,
        bytes32,
        uint[] calldata,
        uint8[] calldata,
        bytes32[] calldata,
        bytes32[] calldata
    ) external view returns (bool);
}

/**
 * @dev Interface of the previous Vault contract to query burn proof status
 */
interface Withdrawable {
    function isWithdrawed(bytes32)  external view returns (bool);
    function isSigDataUsed(bytes32)  external view returns (bool);
    function getDepositedBalance(address, address)  external view returns (uint);
    function updateAssets(address[] calldata, uint[] calldata) external returns (bool);
    function paused() external view returns (bool);
}

/**
 * @dev Responsible for holding the assets and issue minting instruction to
 * Incognito Chain. Also, when presented with a burn proof created over at
 * Incognito Chain, releases the tokens back to user
 */
contract Vault is AdminPausable {
    using SafeMath for uint;
    address constant public ETH_TOKEN = 0x0000000000000000000000000000000000000000;
    mapping(bytes32 => bool) public withdrawed;
    mapping(bytes32 => bool) public sigDataUsed;
    // address => token => amount
    mapping(address => mapping(address => uint)) public withdrawRequests;
    mapping(address => mapping(address => bool)) public migration;
    mapping(address => uint) public totalDepositedToSCAmount;
    Incognito public incognito;
    Withdrawable public prevVault;
    address payable public newVault;
    bool public notEntered = true;

    struct BurnInstData {
        uint8 meta; // type of the instruction
        uint8 shard; // ID of the Incognito shard containing the instruction, must be 1
        address token; // ETH address of the token contract (0x0 for ETH)
        address payable to; // ETH address of the receiver of the token
        uint amount; // burned amount (on Incognito)
        bytes32 itx; // Incognito's burning tx
    }

    // error code
    enum Errors {
        EMPTY,
        NO_REENTRANCE,
        MAX_UINT_REACHED,
        VALUE_OVER_FLOW,
        INTERNAL_TX_ERROR,
        ALREADY_USED,
        INVALID_DATA,
        TOKEN_NOT_ENOUGH,
        WITHDRAW_REQUEST_TOKEN_NOT_ENOUGH,
        INVALID_RETURN_DATA,
        NOT_EQUAL,
        NULL_VALUE,
        ONLY_PREVAULT,
        PREVAULT_NOT_PAUSED
    }

    event Deposit(address token, string incognitoAddress, uint amount);
    event Withdraw(address token, address to, uint amount);
    event Migrate(address newVault);
    event MoveAssets(address[] assets);
    event UpdateTokenTotal(address[] assets, uint[] amounts);
    event UpdateIncognitoProxy(address newIncognitoProxy);

    /**
     * modifier for contract version
     */
     modifier onlyPreVault(){
        require(address(prevVault) != address(0x0) && msg.sender == address(prevVault), errorToString(Errors.ONLY_PREVAULT));
        _;
     }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, notEntered will be true
        require(notEntered, errorToString(Errors.NO_REENTRANCE));

        // Any calls to nonReentrant after this point will fail
        notEntered = false;

        _;

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

    /**
     * @dev Creates new Vault to hold assets for Incognito Chain
     * @param admin: authorized address to Pause and migrate contract
     * @param incognitoProxyAddress: contract containing Incognito's committees
     * @param _prevVault: previous version of the Vault to refer back if necessary
     * After migrating all assets to a new Vault, we still need to refer
     * back to previous Vault to make sure old withdrawals aren't being reused
     */
    constructor(address admin, address incognitoProxyAddress, address _prevVault) public AdminPausable(admin) {
        incognito = Incognito(incognitoProxyAddress);
        prevVault = Withdrawable(_prevVault);
        newVault = address(0);
    }

    /**
     * @dev Makes a ETH deposit to the vault to mint pETH over at Incognito Chain
     * @notice This only works when the contract is not Paused
     * @notice The maximum amount to deposit is capped since Incognito balance is stored as uint64
     * @param incognitoAddress: Incognito Address to receive pETH
     */
    function deposit(string memory incognitoAddress) public payable isNotPaused nonReentrant {
        require(address(this).balance <= 10 ** 27, errorToString(Errors.MAX_UINT_REACHED));
        emit Deposit(ETH_TOKEN, incognitoAddress, msg.value);
    }

    /**
     * @dev Makes a ERC20 deposit to the vault to mint pERC20 over at Incognito Chain
     * @notice This only works when the contract is not Paused
     * @notice The maximum amount to deposit is capped since Incognito balance is stored as uint64
     * @notice Before calling this function, enough ERC20 must be allowed to
     * tranfer from msg.sender to this contract
     * @param token: address of the ERC20 token
     * @param amount: to deposit to the vault and mint on Incognito Chain
     * @param incognitoAddress: Incognito Address to receive pERC20
     */
    function depositERC20(address token, uint amount, string memory incognitoAddress) public payable isNotPaused nonReentrant {
        IERC20 erc20Interface = IERC20(token);
        uint8 decimals = getDecimals(address(token));
        uint tokenBalance = erc20Interface.balanceOf(address(this));
        uint beforeTransfer = tokenBalance;
        uint emitAmount = amount;
        if (decimals > 9) {
            emitAmount = emitAmount / (10 ** (uint(decimals) - 9));
            tokenBalance = tokenBalance / (10 ** (uint(decimals) - 9));
        }
        require(emitAmount <= 10 ** 18 && tokenBalance <= 10 ** 18 && emitAmount.safeAdd(tokenBalance) <= 10 ** 18, errorToString(Errors.VALUE_OVER_FLOW));
        erc20Interface.transferFrom(msg.sender, address(this), amount);
        require(checkSuccess(), errorToString(Errors.INTERNAL_TX_ERROR));
        require(balanceOf(token).safeSub(beforeTransfer) == amount, errorToString(Errors.NOT_EQUAL));

        emit Deposit(token, incognitoAddress, emitAmount);
    }

    /**
     * @dev Checks if a burn proof has been used before
     * @notice First, we check inside the storage of this contract itself. If the
     * hash has been used before, we return the result. Otherwise, we query
     * previous vault recursively until the first Vault (prevVault address is 0x0)
     * @param hash: of the burn proof
     * @return bool: whether the proof has been used or not
     */
    function isWithdrawed(bytes32 hash) public view returns(bool) {
        if (withdrawed[hash]) {
            return true;
        } else if (address(prevVault) == address(0)) {
            return false;
        }
        return prevVault.isWithdrawed(hash);
    }

    /**
     * @dev Parses a burn instruction and returns the components
     * @param inst: the full instruction, containing both metadata and body
     */
    function parseBurnInst(bytes memory inst) public pure returns (BurnInstData memory) {
        BurnInstData memory data;
        data.meta = uint8(inst[0]);
        data.shard = uint8(inst[1]);
        address token;
        address payable to;
        uint amount;
        bytes32 itx;
        assembly {
            // skip first 0x20 bytes (stored length of inst)
            token := mload(add(inst, 0x22)) // [3:34]
            to := mload(add(inst, 0x42)) // [34:66]
            amount := mload(add(inst, 0x62)) // [66:98]
            itx := mload(add(inst, 0x82)) // [98:130]
        }
        data.token = token;
        data.to = to;
        data.amount = amount;
        data.itx = itx;
        return data;
    }

    /**
     * @dev Verifies that a burn instruction is valid
     * @notice All params except inst are the list of 2 elements corresponding to
     * the proof on beacon and bridge
     * @notice All params are the same as in `withdraw`
     */
    function verifyInst(
        bytes memory inst,
        uint heights,
        bytes32[] memory instPaths,
        bool[] memory instPathIsLefts,
        bytes32 instRoots,
        bytes32 blkData,
        uint[] memory sigIdxs,
        uint8[] memory sigVs,
        bytes32[] memory sigRs,
        bytes32[] memory sigSs
    ) view internal {
        // Each instruction can only by redeemed once
        bytes32 beaconInstHash = keccak256(abi.encodePacked(inst, heights));

        // Verify instruction on beacon
        require(incognito.instructionApproved(
            true, // Only check instruction on beacon
            beaconInstHash,
            heights,
            instPaths,
            instPathIsLefts,
            instRoots,
            blkData,
            sigIdxs,
            sigVs,
            sigRs,
            sigSs
        ), errorToString(Errors.INVALID_DATA));
    }

    /**
     * @dev Withdraws pETH/pIERC20 by providing a burn proof over at Incognito Chain
     * @notice This function takes a burn instruction on Incognito Chain, checks
     * for its validity and returns the token back to ETH chain
     * @notice This only works when the contract is not Paused
     * @param inst: the decoded instruction as a list of bytes
     * @param heights: the blocks containing the instruction
     * @param instPaths: merkle path of the instruction
     * @param instPathIsLefts: whether each node on the path is the left or right child
     * @param instRoots: root of the merkle tree contains all instructions
     * @param blkData: merkle has of the block body
     * @param sigIdxs: indices of the validators who signed this block
     * @param sigVs: part of the signatures of the validators
     * @param sigRs: part of the signatures of the validators
     * @param sigSs: part of the signatures of the validators
     */
    function withdraw(
        bytes memory inst,
        uint heights,
        bytes32[] memory instPaths,
        bool[] memory instPathIsLefts,
        bytes32 instRoots,
        bytes32 blkData,
        uint[] memory sigIdxs,
        uint8[] memory sigVs,
        bytes32[] memory sigRs,
        bytes32[] memory sigSs
    ) public isNotPaused nonReentrant {
        BurnInstData memory data = parseBurnInst(inst);
        require(data.meta == 241 && data.shard == 1); // Check instruction type

        // Not withdrawed
        require(!isWithdrawed(data.itx), errorToString(Errors.ALREADY_USED));
        withdrawed[data.itx] = true;

        // Check if balance is enough
        if (data.token == ETH_TOKEN) {
            require(address(this).balance >= data.amount.safeAdd(totalDepositedToSCAmount[data.token]), errorToString(Errors.TOKEN_NOT_ENOUGH));
        } else {
            uint8 decimals = getDecimals(data.token);
            if (decimals > 9) {
                data.amount = data.amount * (10 ** (uint(decimals) - 9));
            }
            require(IERC20(data.token).balanceOf(address(this)) >= data.amount.safeAdd(totalDepositedToSCAmount[data.token]), errorToString(Errors.TOKEN_NOT_ENOUGH));
        }

        verifyInst(
            inst,
            heights,
            instPaths,
            instPathIsLefts,
            instRoots,
            blkData,
            sigIdxs,
            sigVs,
            sigRs,
            sigSs
        );

        // Send and notify
        if (data.token == ETH_TOKEN) {
          (bool success, ) =  data.to.call{value: data.amount}("");
          require(success, errorToString(Errors.INTERNAL_TX_ERROR));
        } else {
            IERC20(data.token).transfer(data.to, data.amount);
            require(checkSuccess(), errorToString(Errors.INTERNAL_TX_ERROR));
        }
        emit Withdraw(data.token, data.to, data.amount);
    }

    /**
     * @dev Burnt Proof is submited to store burnt amount of p-token/p-ETH and receiver's address
     * Receiver then can call withdrawRequest to withdraw these token to he/she incognito address.
     * @notice This function takes a burn instruction on Incognito Chain, checks
     * for its validity and returns the token back to ETH chain
     * @notice This only works when the contract is not Paused
     * @param inst: the decoded instruction as a list of bytes
     * @param heights: the blocks containing the instruction
     * @param instPaths: merkle path of the instruction
     * @param instPathIsLefts: whether each node on the path is the left or right child
     * @param instRoots: root of the merkle tree contains all instructions
     * @param blkData: merkle has of the block body
     * @param sigIdxs: indices of the validators who signed this block
     * @param sigVs: part of the signatures of the validators
     * @param sigRs: part of the signatures of the validators
     * @param sigSs: part of the signatures of the validators
     */
    function submitBurnProof(
        bytes memory inst,
        uint heights,
        bytes32[] memory instPaths,
        bool[] memory instPathIsLefts,
        bytes32 instRoots,
        bytes32 blkData,
        uint[] memory sigIdxs,
        uint8[] memory sigVs,
        bytes32[] memory sigRs,
        bytes32[] memory sigSs
    ) public isNotPaused nonReentrant {
        BurnInstData memory data = parseBurnInst(inst);
        require(data.meta == 243 && data.shard == 1); // Check instruction type

        // Not withdrawed
        require(!isWithdrawed(data.itx), errorToString(Errors.ALREADY_USED));
        withdrawed[data.itx] = true;

        // Check if balance is enough
        if (data.token == ETH_TOKEN) {
            require(address(this).balance >= data.amount.safeAdd(totalDepositedToSCAmount[data.token]), errorToString(Errors.TOKEN_NOT_ENOUGH));
        } else {
            uint8 decimals = getDecimals(data.token);
            if (decimals > 9) {
                data.amount = data.amount * (10 ** (uint(decimals) - 9));
            }
            require(IERC20(data.token).balanceOf(address(this)) >= data.amount.safeAdd(totalDepositedToSCAmount[data.token]), errorToString(Errors.TOKEN_NOT_ENOUGH));
        }

        verifyInst(
            inst,
            heights,
            instPaths,
            instPathIsLefts,
            instRoots,
            blkData,
            sigIdxs,
            sigVs,
            sigRs,
            sigSs
        );

        withdrawRequests[data.to][data.token] = withdrawRequests[data.to][data.token].safeAdd(data.amount);
        totalDepositedToSCAmount[data.token] = totalDepositedToSCAmount[data.token].safeAdd(data.amount);
    }

    /**
     * @dev generate address from signature data and hash.
     */
    function sigToAddress(bytes memory signData, bytes32 hash) public pure returns (address) {
        bytes32 s;
        bytes32 r;
        uint8 v;
        assembly {
            r := mload(add(signData, 0x20))
            s := mload(add(signData, 0x40))
        }
        v = uint8(signData[64]) + 27;
        return ecrecover(hash, v, r, s);
    }

    /**
     * @dev Checks if a sig data has been used before
     * @notice First, we check inside the storage of this contract itself. If the
     * hash has been used before, we return the result. Otherwise, we query
     * previous vault recursively until the first Vault (prevVault address is 0x0)
     * @param hash: of the sig data
     * @return bool: whether the sig data has been used or not
     */
    function isSigDataUsed(bytes32 hash) public view returns(bool) {
        if (sigDataUsed[hash]) {
            return true;
        } else if (address(prevVault) == address(0)) {
            return false;
        }
        return prevVault.isSigDataUsed(hash);
    }

    /**
     * @dev User requests withdraw token contains in withdrawRequests.
     * Deposit event will be emitted to let incognito recognize and mint new p-tokens for the user.
     * @param incognitoAddress: incognito's address that will receive minted p-tokens.
     * @param token: ethereum's token address (eg., ETH, DAI, ...)
     * @param amount: amount of the token in ethereum's denomination
     * @param signData: signature of an unique data that is signed by an account which is generated from user's incognito privkey
     * @param timestamp: unique data generated from client (timestamp for example)
     */
    function requestWithdraw(
        string memory incognitoAddress,
        address token,
        uint amount,
        bytes memory signData,
        bytes memory timestamp
    ) public isNotPaused nonReentrant {
        // verify owner signs data
        address verifier = verifySignData(abi.encodePacked(incognitoAddress, token, timestamp, amount), signData);

        // migrate from preVault
        migrateBalance(verifier, token);

        require(withdrawRequests[verifier][token] >= amount, errorToString(Errors.WITHDRAW_REQUEST_TOKEN_NOT_ENOUGH));
        withdrawRequests[verifier][token] = withdrawRequests[verifier][token].safeSub(amount);
        totalDepositedToSCAmount[token] = totalDepositedToSCAmount[token].safeSub(amount);

        // convert denomination from ethereum's to incognito's (pcoin)
        uint emitAmount = amount;
        if (token != ETH_TOKEN) {
            uint8 decimals = getDecimals(token);
            if (decimals > 9) {
                emitAmount = amount / (10 ** (uint(decimals) - 9));
            }
        }

        emit Deposit(token, incognitoAddress, emitAmount);
    }

    /**
     * @dev execute is a general function that plays a role as proxy to interact to other smart contracts.
     * @param token: ethereum's token address (eg., ETH, DAI, ...)
     * @param amount: amount of the token in ethereum's denomination
     * @param recipientToken: received token address.
     * @param exchangeAddress: address of targeting smart contract that actually executes the desired logics like trade, invest, borrow and so on.
     * @param callData: encoded with signature and params of function from targeting smart contract.
     * @param timestamp: unique data generated from client (timestamp for example)
     * @param signData: signature of an unique data that is signed by an account which is generated from user's incognito privkey
     */
    function execute(
        address token,
        uint amount,
        address recipientToken,
        address exchangeAddress,
        bytes memory callData,
        bytes memory timestamp,
        bytes memory signData
    ) public payable isNotPaused nonReentrant {
        //verify ower signs data from input
        address verifier = verifySignData(abi.encodePacked(exchangeAddress, callData, timestamp, amount), signData);

        // migrate from preVault
        migrateBalance(verifier, token);
        require(withdrawRequests[verifier][token] >= amount, errorToString(Errors.WITHDRAW_REQUEST_TOKEN_NOT_ENOUGH));

        // update balance of verifier
        totalDepositedToSCAmount[token] = totalDepositedToSCAmount[token].safeSub(amount);
        withdrawRequests[verifier][token] = withdrawRequests[verifier][token].safeSub(amount);

        // define number of eth spent for forwarder.
        uint ethAmount = msg.value;
        if (token == ETH_TOKEN) {
            ethAmount = ethAmount.safeAdd(amount);
        } else {
            // transfer token to exchangeAddress.
            require(IERC20(token).balanceOf(address(this)) >= amount, errorToString(Errors.TOKEN_NOT_ENOUGH));
            IERC20(token).transfer(exchangeAddress, amount);
            require(checkSuccess(), errorToString(Errors.INTERNAL_TX_ERROR));
        }
        uint returnedAmount = callExtFunc(recipientToken, ethAmount, callData, exchangeAddress);

        // update withdrawRequests
        withdrawRequests[verifier][recipientToken] = withdrawRequests[verifier][recipientToken].safeAdd(returnedAmount);
        totalDepositedToSCAmount[recipientToken] = totalDepositedToSCAmount[recipientToken].safeAdd(returnedAmount);
    }

    /**
     * @dev single trade
     */
    function callExtFunc(address recipientToken, uint ethAmount, bytes memory callData, address exchangeAddress) internal returns (uint) {
         // get balance of recipient token before trade to compare after trade.
        uint balanceBeforeTrade = balanceOf(recipientToken);
        if (recipientToken == ETH_TOKEN) {
            balanceBeforeTrade = balanceBeforeTrade.safeSub(msg.value);
        }
        require(address(this).balance >= ethAmount, errorToString(Errors.TOKEN_NOT_ENOUGH));
        (bool success, bytes memory result) = exchangeAddress.call{value: ethAmount}(callData);
        require(success);

        (address returnedTokenAddress, uint returnedAmount) = abi.decode(result, (address, uint));
        require(returnedTokenAddress == recipientToken && balanceOf(recipientToken).safeSub(balanceBeforeTrade) == returnedAmount, errorToString(Errors.INVALID_RETURN_DATA));

        return returnedAmount;
    }

    /**
     * @dev verify sign data
     */
     function verifySignData(bytes memory data, bytes memory signData) internal returns(address){
        bytes32 hash = keccak256(data);
        require(!isSigDataUsed(hash), errorToString(Errors.ALREADY_USED));
        address verifier = sigToAddress(signData, hash);
       // mark data hash of sig as used
        sigDataUsed[hash] = true;

        return verifier;
     }

    /**
      * @dev migrate balance from previous vault
      * Note: uncomment for next version
      */
    function migrateBalance(address owner, address token) internal {
        if (address(prevVault) != address(0x0) && !migration[owner][token]) {
            withdrawRequests[owner][token] = withdrawRequests[owner][token].safeAdd(prevVault.getDepositedBalance(token, owner));
  	        migration[owner][token] = true;
  	   }
    }

    /**
     * @dev Get the amount of specific coin for specific wallet
     */
    function getDepositedBalance(
        address token,
        address owner
    ) public view returns (uint) {
        if (address(prevVault) != address(0x0) && !migration[owner][token]) {
 	        return withdrawRequests[owner][token].safeAdd(prevVault.getDepositedBalance(token, owner));
 	    }
        return withdrawRequests[owner][token];
    }

    /**
     * @dev Saves the address of the new Vault to migrate assets to
     * @notice In case of emergency, Admin will Pause the contract, shutting down
     * all incoming transactions. After a new contract with the fix is deployed,
     * they will migrate assets to it and allow normal operations to resume
     * @notice This only works when the contract is Paused
     * @notice This can only be called by Admin
     * @param _newVault: address to save
     */
    function migrate(address payable _newVault) public onlyAdmin isPaused {
        require(_newVault != address(0), errorToString(Errors.NULL_VALUE));
        newVault = _newVault;
        emit Migrate(_newVault);
    }

    /**
     * @dev Move some assets to newVault
     * @notice This only works when the contract is Paused
     * @notice This can only be called by Admin
     * @param assets: address of the ERC20 tokens to move, 0x0 for ETH
     */
    function moveAssets(address[] memory assets) public onlyAdmin isPaused {
        require(newVault != address(0), errorToString(Errors.NULL_VALUE));
        uint[] memory amounts = new uint[](assets.length);
        for (uint i = 0; i < assets.length; i++) {
            if (assets[i] == ETH_TOKEN) {
                amounts[i] = totalDepositedToSCAmount[ETH_TOKEN];
                (bool success, ) = newVault.call{value: address(this).balance}("");
                require(success, errorToString(Errors.INTERNAL_TX_ERROR));
            } else {
                uint bal = IERC20(assets[i]).balanceOf(address(this));
                if (bal > 0) {
                    IERC20(assets[i]).transfer(newVault, bal);
                    require(checkSuccess());
                }
                amounts[i] = totalDepositedToSCAmount[assets[i]];
            }
            totalDepositedToSCAmount[assets[i]] = 0;
        }
        require(Withdrawable(newVault).updateAssets(assets, amounts), errorToString(Errors.INTERNAL_TX_ERROR));

        emit MoveAssets(assets);
    }

    /**
     * @dev Move total number of assets to newVault
     * @notice This only works when the preVault is Paused
     * @notice This can only be called by preVault
     * @param assets: address of the ERC20 tokens to move, 0x0 for ETH
     * @param amounts: total number of the ERC20 tokens to move, 0x0 for ETH
     */
    function updateAssets(address[] calldata assets, uint[] calldata amounts) external onlyPreVault returns(bool) {
        require(assets.length == amounts.length,  errorToString(Errors.NOT_EQUAL));
        require(Withdrawable(prevVault).paused(), errorToString(Errors.PREVAULT_NOT_PAUSED));
        for (uint i = 0; i < assets.length; i++) {
            totalDepositedToSCAmount[assets[i]] = totalDepositedToSCAmount[assets[i]].safeAdd(amounts[i]);
        }
        emit UpdateTokenTotal(assets, amounts);

        return true;
    }

    /**
     * @dev Changes the IncognitoProxy to use
     * @notice If the IncognitoProxy contract malfunctioned, Admin could config
     * the Vault to use a new fixed IncognitoProxy contract
     * @notice This only works when the contract is Paused
     * @notice This can only be called by Admin
     * @param newIncognitoProxy: address of the new contract
     */
    function updateIncognitoProxy(address newIncognitoProxy) public onlyAdmin isPaused {
        require(newIncognitoProxy != address(0), errorToString(Errors.NULL_VALUE));
        incognito = Incognito(newIncognitoProxy);
        emit UpdateIncognitoProxy(newIncognitoProxy);
    }

    /**
     * @dev Payable receive function to receive Ether from oldVault when migrating
     */
    receive() external payable {}

    /**
     * @dev Check if transfer() and transferFrom() of ERC20 succeeded or not
     * This check is needed to fix https://github.com/ethereum/solidity/issues/4116
     * This function is copied from https://github.com/AdExNetwork/adex-protocol-eth/blob/master/contracts/libs/SafeERC20.sol
     */
    function checkSuccess() private pure returns (bool) {
		uint256 returnValue = 0;
		assembly {
			// check number of bytes returned from last function call
			switch returndatasize()

			// no bytes returned: assume success
			case 0x0 {
				returnValue := 1
			}

			// 32 bytes returned: check if non-zero
			case 0x20 {
				// copy 32 bytes into scratch space
				returndatacopy(0x0, 0x0, 0x20)

				// load those bytes into returnValue
				returnValue := mload(0x0)
			}

			// not sure what was returned: don't mark as success
			default { }
		}
		return returnValue != 0;
	}

    /**
     * @dev convert enum to string value
     */
     function errorToString(Errors error) internal pure returns(string memory) {
        uint8 erroNum = uint8(error);
        uint maxlength = 10;
        bytes memory reversed = new bytes(maxlength);
        uint i = 0;
        while (erroNum != 0) {
            uint8 remainder = erroNum % 10;
            erroNum = erroNum / 10;
            reversed[i++] = byte(48 + remainder);
        }
        bytes memory s = new bytes(i + 1);
        for (uint j = 0; j <= i; j++) {
            s[j] = reversed[i - j];
        }
        return string(s);
    }

    /**
     * @dev Get the decimals of an ERC20 token, return 0 if it isn't defined
     * We check the returndatasize to covert both cases that the token has
     * and doesn't have the function decimals()
     */
    function getDecimals(address token) public view returns (uint8) {
        IERC20 erc20 = IERC20(token);
        return uint8(erc20.decimals());
    }

    /**
     * @dev Get the amount of coin deposited to this smartcontract
     */
    function balanceOf(address token) public view returns (uint) {
        if (token == ETH_TOKEN) {
            return address(this).balance;
        }
        return IERC20(token).balanceOf(address(this));
    }
}

File 2 of 3: IERC20.sol
pragma solidity ^0.6.6;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see `ERC20Detailed`.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint);

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

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

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

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

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

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() external view returns (uint);

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

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

File 3 of 3: pause.sol
pragma solidity ^0.6.6;

contract AdminPausable {
    address public admin;
    address public successor;
    bool public paused;
    uint public expire;

    constructor(address _admin) public {
        admin = _admin;
        paused = false;
        expire = block.timestamp + 3 * 365 days;
    }

    event Paused(address pauser);
    event Unpaused(address pauser);
    event Extend(uint ndays);
    event Claim(address claimer);

    modifier onlyAdmin() {
        require(msg.sender == admin, "not admin");
        _;
    }

    modifier isPaused() {
        require(paused, "not paused right now");
        _;
    }

    modifier isNotPaused() {
        require(!paused, "paused right now");
        _;
    }

    modifier isNotExpired() {
        require(block.timestamp < expire, "expired");
        _;
    }

    function retire(address _successor) public onlyAdmin isNotExpired {
        successor = _successor;
    }

    function claim() public isNotExpired {
        require(msg.sender == successor, "unauthorized");
        admin = successor;
        emit Claim(admin);
    }

    function extend(uint n) public onlyAdmin isNotExpired {
        require(n < 366, "cannot extend for too long"); // To prevent overflow
        expire = expire + n * 1 days;
        emit Extend(n);
    }

    function pause() public onlyAdmin isNotPaused isNotExpired {
        paused = true;
        emit Paused(msg.sender);
    }

    function unpause() public onlyAdmin isPaused {
        paused = false;
        emit Unpaused(msg.sender);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"admin","type":"address"},{"internalType":"address","name":"incognitoProxyAddress","type":"address"},{"internalType":"address","name":"_prevVault","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"claimer","type":"address"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"string","name":"incognitoAddress","type":"string"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"ndays","type":"uint256"}],"name":"Extend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newVault","type":"address"}],"name":"Migrate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"assets","type":"address[]"}],"name":"MoveAssets","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pauser","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pauser","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newIncognitoProxy","type":"address"}],"name":"UpdateIncognitoProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"assets","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"UpdateTokenTotal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ETH_TOKEN","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"incognitoAddress","type":"string"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"incognitoAddress","type":"string"}],"name":"depositERC20","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"recipientToken","type":"address"},{"internalType":"address","name":"exchangeAddress","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"},{"internalType":"bytes","name":"timestamp","type":"bytes"},{"internalType":"bytes","name":"signData","type":"bytes"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"expire","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"n","type":"uint256"}],"name":"extend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"getDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"getDepositedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"incognito","outputs":[{"internalType":"contract Incognito","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"isSigDataUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"isWithdrawed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newVault","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"migration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"}],"name":"moveAssets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newVault","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notEntered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"inst","type":"bytes"}],"name":"parseBurnInst","outputs":[{"components":[{"internalType":"uint8","name":"meta","type":"uint8"},{"internalType":"uint8","name":"shard","type":"uint8"},{"internalType":"address","name":"token","type":"address"},{"internalType":"address payable","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32","name":"itx","type":"bytes32"}],"internalType":"struct Vault.BurnInstData","name":"","type":"tuple"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"prevVault","outputs":[{"internalType":"contract Withdrawable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"incognitoAddress","type":"string"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes","name":"timestamp","type":"bytes"}],"name":"requestWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_successor","type":"address"}],"name":"retire","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"sigDataUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"signData","type":"bytes"},{"internalType":"bytes32","name":"hash","type":"bytes32"}],"name":"sigToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes","name":"inst","type":"bytes"},{"internalType":"uint256","name":"heights","type":"uint256"},{"internalType":"bytes32[]","name":"instPaths","type":"bytes32[]"},{"internalType":"bool[]","name":"instPathIsLefts","type":"bool[]"},{"internalType":"bytes32","name":"instRoots","type":"bytes32"},{"internalType":"bytes32","name":"blkData","type":"bytes32"},{"internalType":"uint256[]","name":"sigIdxs","type":"uint256[]"},{"internalType":"uint8[]","name":"sigVs","type":"uint8[]"},{"internalType":"bytes32[]","name":"sigRs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"sigSs","type":"bytes32[]"}],"name":"submitBurnProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"successor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalDepositedToSCAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"assets","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"updateAssets","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newIncognitoProxy","type":"address"}],"name":"updateIncognitoProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"inst","type":"bytes"},{"internalType":"uint256","name":"heights","type":"uint256"},{"internalType":"bytes32[]","name":"instPaths","type":"bytes32[]"},{"internalType":"bool[]","name":"instPathIsLefts","type":"bool[]"},{"internalType":"bytes32","name":"instRoots","type":"bytes32"},{"internalType":"bytes32","name":"blkData","type":"bytes32"},{"internalType":"uint256[]","name":"sigIdxs","type":"uint256[]"},{"internalType":"uint8[]","name":"sigVs","type":"uint8[]"},{"internalType":"bytes32[]","name":"sigRs","type":"bytes32[]"},{"internalType":"bytes32[]","name":"sigSs","type":"bytes32[]"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"withdrawRequests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"withdrawed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a805460ff60a01b1916600160a01b1790553480156200002457600080fd5b5060405162003cbd38038062003cbd8339810160408190526200004791620000aa565b600080546001600160a01b03199081166001600160a01b03958616179091556001805460ff60a01b19169055426305a39a8001600255600880548216938516939093179092556009805483169190931617909155600a8054909116905562000116565b600080600060608486031215620000bf578283fd5b8351620000cc81620000fd565b6020850151909350620000df81620000fd565b6040850151909250620000f281620000fd565b809150509250925092565b6001600160a01b03811681146200011357600080fd5b50565b613b9780620001266000396000f3fe6080604052600436106102135760003560e01c80637e16e6e111610118578063a26e1186116100a0578063dca40d9e1161006f578063dca40d9e146105b6578063e4bd7074146105d6578063f75b98ce146105f6578063f851a44014610616578063fa84702e1461062b5761021a565b8063a26e118614610541578063a3f5d8cc14610554578063ce5494bb14610569578063cf54aaa0146105895761021a565b806388aaf0c8116100e757806388aaf0c8146104b75780638a984538146104cc5780639714378c146104e1578063995fac11146105015780639e6371ba146105215761021a565b80637e16e6e1146104425780638456cb591461046f5780638588ccd61461048457806387add440146104975761021a565b80635a67cb871161019b5780636ff968c31161016a5780636ff968c3146103b857806370a08231146103cd57806373bf9651146103ed578063749c5f861461040d57806379599f961461042d5761021a565b80635a67cb87146103435780635c975abb146103565780636304541c1461036b57806365b5a00f146103985761021a565b80633a51913d116101e25780633a51913d146102b75780633f4ba83a146102d75780633fec6b40146102ec5780634e71d92d1461031957806358bc83371461032e5761021a565b80630c4f50391461021f5780631beb7de2146102415780631ea1940e146102615780631ed4276d146102975761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a36600461320e565b610640565b005b34801561024d57600080fd5b5061023f61025c366004613358565b610acb565b34801561026d57600080fd5b5061028161027c3660046132c4565b610f07565b60405161028e9190613878565b60405180910390f35b3480156102a357600080fd5b506102816102b23660046131a6565b610f1c565b3480156102c357600080fd5b5061023f6102d236600461300b565b611143565b3480156102e357600080fd5b5061023f611221565b3480156102f857600080fd5b5061030c610307366004613316565b6112bb565b60405161028e9190613719565b34801561032557600080fd5b5061023f61134a565b34801561033a57600080fd5b5061030c6113e6565b61023f610351366004613150565b6113eb565b34801561036257600080fd5b506102816116ba565b34801561037757600080fd5b5061038b61038636600461300b565b6116ca565b60405161028e919061392d565b3480156103a457600080fd5b5061038b6103b3366004613054565b6116dc565b3480156103c457600080fd5b5061030c6116f9565b3480156103d957600080fd5b5061038b6103e836600461300b565b611708565b3480156103f957600080fd5b5061023f610408366004613358565b6117a3565b34801561041957600080fd5b506102816104283660046132c4565b611b06565b34801561043957600080fd5b5061038b611bbd565b34801561044e57600080fd5b5061046261045d3660046132dc565b611bc3565b60405161028e9190613a60565b34801561047b57600080fd5b5061023f611c45565b61023f61049236600461308c565b611cfd565b3480156104a357600080fd5b5061023f6104b2366004613489565b6120b0565b3480156104c357600080fd5b5061030c6122d2565b3480156104d857600080fd5b5061030c6122e1565b3480156104ed57600080fd5b5061023f6104fc3660046132c4565b6122f0565b34801561050d57600080fd5b5061028161051c366004613054565b612399565b34801561052d57600080fd5b5061023f61053c36600461300b565b6123b9565b61023f61054f3660046132dc565b612426565b34801561056057600080fd5b5061028161251e565b34801561057557600080fd5b5061023f61058436600461300b565b61252e565b34801561059557600080fd5b506105a96105a436600461300b565b612601565b60405161028e9190613ab8565b3480156105c257600080fd5b506102816105d13660046132c4565b61267f565b3480156105e257600080fd5b506102816105f13660046132c4565b612694565b34801561060257600080fd5b5061038b610611366004613054565b6126fb565b34801561062257600080fd5b5061030c61282d565b34801561063757600080fd5b5061030c61283c565b6000546001600160a01b031633146106735760405162461bcd60e51b815260040161066a90613a3d565b60405180910390fd5b600154600160a01b900460ff1661069c5760405162461bcd60e51b815260040161066a90613967565b600a546001600160a01b031615156106b4600b61284b565b906106d25760405162461bcd60e51b815260040161066a9190613954565b50606081516001600160401b03811180156106ec57600080fd5b50604051908082528060200260200182016040528015610716578160200160208202803683370190505b50905060005b82518110156109e25760006001600160a01b031683828151811061073c57fe5b60200260200101516001600160a01b0316141561082b576000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54825183908390811061078c57fe5b6020908102919091010152600a546040516000916001600160a01b03169047906107b590613716565b60006040518083038185875af1925050503d80600081146107f2576040519150601f19603f3d011682016040523d82523d6000602084013e6107f7565b606091505b5050905080610806600461284b565b906108245760405162461bcd60e51b815260040161066a9190613954565b50506109a4565b600083828151811061083957fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161086c9190613719565b60206040518083038186803b15801561088457600080fd5b505afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc919061352b565b90508015610951578382815181106108d057fe5b6020908102919091010151600a5460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb9261090e929116908590600401613751565b600060405180830381600087803b15801561092857600080fd5b505af115801561093c573d6000803e3d6000fd5b50505050610948612974565b61095157600080fd5b6007600085848151811061096157fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205483838151811061099657fe5b602002602001018181525050505b6000600760008584815181106109b657fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205560010161071c565b50600a54604051631ed4276d60e01b81526001600160a01b0390911690631ed4276d90610a15908590859060040161384a565b602060405180830381600087803b158015610a2f57600080fd5b505af1158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6791906132a8565b610a71600461284b565b90610a8f5760405162461bcd60e51b815260040161066a9190613954565b507f492fc8b292f2a2a9b328a366b83745f30c024056d12aa118a15966d26a8ce65882604051610abf9190613837565b60405180910390a15050565b600154600160a01b900460ff1615610af55760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff16610b0c600161284b565b90610b2a5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b19169055610b40612dcd565b610b498b611bc3565b9050806000015160ff1660f1148015610b695750806020015160ff166001145b610b7257600080fd5b610b7f8160a00151611b06565b15610b8a600561284b565b90610ba85760405162461bcd60e51b815260040161066a9190613954565b5060a081015160009081526003602052604090819020805460ff191660011790558101516001600160a01b0316610c39576040808201516001600160a01b03166000908152600760205220546080820151610c089163ffffffff6129a816565b471015610c15600761284b565b90610c335760405162461bcd60e51b815260040161066a9190613954565b50610d47565b6000610c488260400151612601565b905060098160ff161115610c6b5760808201805160081960ff841601600a0a0290525b6040808301516001600160a01b03166000908152600760205220546080830151610c9a9163ffffffff6129a816565b82604001516001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610cca9190613719565b60206040518083038186803b158015610ce257600080fd5b505afa158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a919061352b565b1015610d26600761284b565b90610d445760405162461bcd60e51b815260040161066a9190613954565b50505b610d598b8b8b8b8b8b8b8b8b8b6129c6565b60408101516001600160a01b0316610e0257600081606001516001600160a01b03168260800151604051610d8c90613716565b60006040518083038185875af1925050503d8060008114610dc9576040519150601f19603f3d011682016040523d82523d6000602084013e610dce565b606091505b5050905080610ddd600461284b565b90610dfb5760405162461bcd60e51b815260040161066a9190613954565b5050610ea0565b80604001516001600160a01b031663a9059cbb826060015183608001516040518363ffffffff1660e01b8152600401610e3c929190613751565b600060405180830381600087803b158015610e5657600080fd5b505af1158015610e6a573d6000803e3d6000fd5b50505050610e76612974565b610e80600461284b565b90610e9e5760405162461bcd60e51b815260040161066a9190613954565b505b7f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb816040015182606001518360800151604051610edf9392919061372d565b60405180910390a15050600a805460ff60a01b1916600160a01b179055505050505050505050565b60046020526000908152604090205460ff1681565b6009546000906001600160a01b031615801590610f4357506009546001600160a01b031633145b610f4d600c61284b565b90610f6b5760405162461bcd60e51b815260040161066a9190613954565b50838214610f79600a61284b565b90610f975760405162461bcd60e51b815260040161066a9190613954565b50600960009054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fe657600080fd5b505afa158015610ffa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101e91906132a8565b611028600d61284b565b906110465760405162461bcd60e51b815260040161066a9190613954565b5060005b848110156110fa576110b384848381811061106157fe5b905060200201356007600089898681811061107857fe5b905060200201602081019061108d919061300b565b6001600160a01b031681526020810191909152604001600020549063ffffffff6129a816565b600760008888858181106110c357fe5b90506020020160208101906110d8919061300b565b6001600160a01b0316815260208101919091526040016000205560010161104a565b507f6a7fbbcddfd518bb8c56b28ac6c7acb0f7ca093ed232eb3306e53d14e469895f8585858560405161113094939291906137b8565b60405180910390a1506001949350505050565b6000546001600160a01b0316331461116d5760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff166111965760405162461bcd60e51b815260040161066a90613967565b6001600160a01b03811615156111ac600b61284b565b906111ca5760405162461bcd60e51b815260040161066a9190613954565b50600880546001600160a01b0319166001600160a01b0383161790556040517f204252dfe190ad6ef63db40a490f048b39f661de74628408f13cd0bb2d4c344690611216908390613719565b60405180910390a150565b6000546001600160a01b0316331461124b5760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff166112745760405162461bcd60e51b815260040161066a90613967565b6001805460ff60a01b191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906112b1903390613719565b60405180910390a1565b6000806000806020860151915060408601519250856040815181106112dc57fe5b602001015160f81c60f81b60f81c601b019050600185828486604051600081526020016040526040516113129493929190613936565b6020604051602081039080840390855afa158015611334573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600254421061136b5760405162461bcd60e51b815260040161066a90613995565b6001546001600160a01b031633146113955760405162461bcd60e51b815260040161066a906139ed565b600154600080546001600160a01b0319166001600160a01b0392831617908190556040517f0c7ef932d3b91976772937f18d5ef9b39a9930bef486b576c374f047c4b512dc926112b1921690613719565b600081565b600154600160a01b900460ff16156114155760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff1661142c600161284b565b9061144a5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b1916905582600061146482612601565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016114949190613719565b60206040518083038186803b1580156114ac57600080fd5b505afa1580156114c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e4919061352b565b90508085600960ff8516111561151f5760098460ff1603600a0a818161150657fe5b04905060098460ff1603600a0a838161151b57fe5b0492505b670de0b6b3a7640000811115801561153f5750670de0b6b3a76400008311155b80156115625750670de0b6b3a764000061155f828563ffffffff6129a816565b11155b61156c600361284b565b9061158a5760405162461bcd60e51b815260040161066a9190613954565b506040516323b872dd60e01b81526001600160a01b038616906323b872dd906115bb90339030908c9060040161372d565b600060405180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050506115f5612974565b6115ff600461284b565b9061161d5760405162461bcd60e51b815260040161066a9190613954565b50866116388361162c8b611708565b9063ffffffff612abd16565b14611643600a61284b565b906116615760405162461bcd60e51b815260040161066a9190613954565b507f2d4b597935f3cd67fb2eebf1db4debc934cee5c7baa7153f980fdbeb2e74084e88878360405161169593929190613784565b60405180910390a15050600a805460ff60a01b1916600160a01b179055505050505050565b600154600160a01b900460ff1681565b60076020526000908152604090205481565b600560209081526000928352604080842090915290825290205481565b6001546001600160a01b031681565b60006001600160a01b03821661171f57504761179e565b6040516370a0823160e01b81526001600160a01b038316906370a082319061174b903090600401613719565b60206040518083038186803b15801561176357600080fd5b505afa158015611777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179b919061352b565b90505b919050565b600154600160a01b900460ff16156117cd5760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff166117e4600161284b565b906118025760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b19169055611818612dcd565b6118218b611bc3565b9050806000015160ff1660f31480156118415750806020015160ff166001145b61184a57600080fd5b6118578160a00151611b06565b15611862600561284b565b906118805760405162461bcd60e51b815260040161066a9190613954565b5060a081015160009081526003602052604090819020805460ff191660011790558101516001600160a01b0316611911576040808201516001600160a01b031660009081526007602052205460808201516118e09163ffffffff6129a816565b4710156118ed600761284b565b9061190b5760405162461bcd60e51b815260040161066a9190613954565b50611a1f565b60006119208260400151612601565b905060098160ff1611156119435760808201805160081960ff841601600a0a0290525b6040808301516001600160a01b031660009081526007602052205460808301516119729163ffffffff6129a816565b82604001516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016119a29190613719565b60206040518083038186803b1580156119ba57600080fd5b505afa1580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f2919061352b565b10156119fe600761284b565b90611a1c5760405162461bcd60e51b815260040161066a9190613954565b50505b611a318b8b8b8b8b8b8b8b8b8b6129c6565b608081015160608201516001600160a01b0390811660009081526005602090815260408083208187015190941683529290522054611a749163ffffffff6129a816565b60608201516001600160a01b03908116600090815260056020908152604080832081870180518616855290835281842095909555608086015194519093168252600790522054611ac99163ffffffff6129a816565b6040918201516001600160a01b03166000908152600760205291909120555050600a805460ff60a01b1916600160a01b1790555050505050505050565b60008181526003602052604081205460ff1615611b255750600161179e565b6009546001600160a01b0316611b3d5750600061179e565b600954604051633a4e2fc360e11b81526001600160a01b039091169063749c5f8690611b6d90859060040161392d565b60206040518083038186803b158015611b8557600080fd5b505afa158015611b99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179b91906132a8565b60025481565b611bcb612dcd565b611bd3612dcd565b82600081518110611be057fe5b016020015160f81c8152825183906001908110611bf957fe5b0160209081015160f81c9082015260228301516042840151606285015160828601516001600160a01b039384166040860152929091166060840152608083015260a08201529050919050565b6000546001600160a01b03163314611c6f5760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff1615611c995760405162461bcd60e51b815260040161066a90613a13565b6002544210611cba5760405162461bcd60e51b815260040161066a90613995565b6001805460ff60a01b1916600160a01b1790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906112b1903390613719565b600154600160a01b900460ff1615611d275760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff16611d3e600161284b565b90611d5c5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b19169055604051600090611d9d90611d88908790879087908c90602001613644565b60405160208183030381529060405283612ad2565b9050611da98189612b3e565b6001600160a01b038082166000908152600560209081526040808320938c1683529290522054871115611ddc600861284b565b90611dfa5760405162461bcd60e51b815260040161066a9190613954565b506001600160a01b038816600090815260076020526040902054611e24908863ffffffff612abd16565b6001600160a01b03808a1660008181526007602090815260408083209590955592851681526005835283812091815291522054611e67908863ffffffff612abd16565b6001600160a01b038083166000908152600560209081526040808320938d16808452939091529020919091553490611eb057611ea9818963ffffffff6129a816565b9050611feb565b6040516370a0823160e01b815288906001600160a01b038b16906370a0823190611ede903090600401613719565b60206040518083038186803b158015611ef657600080fd5b505afa158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e919061352b565b1015611f3a600761284b565b90611f585760405162461bcd60e51b815260040161066a9190613954565b5060405163a9059cbb60e01b81526001600160a01b038a169063a9059cbb90611f879089908c90600401613751565b600060405180830381600087803b158015611fa157600080fd5b505af1158015611fb5573d6000803e3d6000fd5b50505050611fc1612974565b611fcb600461284b565b90611fe95760405162461bcd60e51b815260040161066a9190613954565b505b6000611ff98883888a612c86565b6001600160a01b038085166000908152600560209081526040808320938d1683529290522054909150612032908263ffffffff6129a816565b6001600160a01b038085166000908152600560209081526040808320938d168352928152828220939093556007909252902054612075908263ffffffff6129a816565b6001600160a01b039098166000908152600760205260409020979097555050600a805460ff60a01b1916600160a01b17905550505050505050565b600154600160a01b900460ff16156120da5760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff166120f1600161284b565b9061210f5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b191690556040516000906121509061213b9088908890869089906020016136d7565b60405160208183030381529060405284612ad2565b905061215c8186612b3e565b6001600160a01b0380821660009081526005602090815260408083209389168352929052205484111561218f600861284b565b906121ad5760405162461bcd60e51b815260040161066a9190613954565b506001600160a01b038082166000908152600560209081526040808320938916835292905220546121e4908563ffffffff612abd16565b6001600160a01b038083166000908152600560209081526040808320938a168352928152828220939093556007909252902054612227908563ffffffff612abd16565b6001600160a01b03861660008181526007602052604090209190915584901561227b57600061225587612601565b905060098160ff1611156122795760098160ff1603600a0a868161227557fe5b0491505b505b7f2d4b597935f3cd67fb2eebf1db4debc934cee5c7baa7153f980fdbeb2e74084e8688836040516122ae93929190613784565b60405180910390a15050600a805460ff60a01b1916600160a01b1790555050505050565b600a546001600160a01b031681565b6008546001600160a01b031681565b6000546001600160a01b0316331461231a5760405162461bcd60e51b815260040161066a90613a3d565b600254421061233b5760405162461bcd60e51b815260040161066a90613995565b61016e811061235c5760405162461bcd60e51b815260040161066a906139b6565b600280546201518083020190556040517f02ef6561d311451dadc920679eb21192a61d96ee8ead94241b8ff073029ca6e89061121690839061392d565b600660209081526000928352604080842090915290825290205460ff1681565b6000546001600160a01b031633146123e35760405162461bcd60e51b815260040161066a90613a3d565b60025442106124045760405162461bcd60e51b815260040161066a90613995565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b900460ff16156124505760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff16612467600161284b565b906124855760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b191690556b033b2e3c9fd0803ce80000004711156124ad600261284b565b906124cb5760405162461bcd60e51b815260040161066a9190613954565b507f2d4b597935f3cd67fb2eebf1db4debc934cee5c7baa7153f980fdbeb2e74084e6000823460405161250093929190613784565b60405180910390a150600a805460ff60a01b1916600160a01b179055565b600a54600160a01b900460ff1681565b6000546001600160a01b031633146125585760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff166125815760405162461bcd60e51b815260040161066a90613967565b6001600160a01b0381161515612597600b61284b565b906125b55760405162461bcd60e51b815260040161066a9190613954565b50600a80546001600160a01b0319166001600160a01b0383161790556040517fd58a618a39de682696ea37dd9a6bf9c793afa426fa1438e75c3966e3b541e45a90611216908390613719565b600080829050806001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561264057600080fd5b505afa158015612654573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612678919061352b565b9392505050565b60036020526000908152604090205460ff1681565b60008181526004602052604081205460ff16156126b35750600161179e565b6009546001600160a01b03166126cb5750600061179e565b60095460405163392f5c1d60e21b81526001600160a01b039091169063e4bd707490611b6d90859060040161392d565b6009546000906001600160a01b03161580159061273e57506001600160a01b0380831660009081526006602090815260408083209387168352929052205460ff16155b1561280057600954604051637badcc6760e11b81526127f9916001600160a01b03169063f75b98ce90612777908790879060040161376a565b60206040518083038186803b15801561278f57600080fd5b505afa1580156127a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c7919061352b565b6001600160a01b038085166000908152600560209081526040808320938916835292905220549063ffffffff6129a816565b9050611344565b506001600160a01b0380821660009081526005602090815260408083209386168352929052205492915050565b6000546001600160a01b031681565b6009546001600160a01b031681565b6060600082600d81111561285b57fe5b60408051600a808252818301909252919250906060908260208201818036833701905050905060005b60ff8416156128d2578151600a60ff959095168581049560018401939106916030830160f81b91859181106128b557fe5b60200101906001600160f81b031916908160001a90535050612884565b6060816001016001600160401b03811180156128ed57600080fd5b506040519080825280601f01601f191660200182016040528015612918576020820181803683370190505b50905060005b82811161296957838184038151811061293357fe5b602001015160f81c60f81b82828151811061294a57fe5b60200101906001600160f81b031916908160001a90535060010161291e565b509695505050505050565b6000803d801561298b5760208114612994576129a0565b600191506129a0565b60206000803e60005191505b501515905090565b60008282018381108015906129bd5750828110155b61267857600080fd5b60008a8a6040516020016129db9291906136b5565b60408051601f19818403018152908290528051602090910120600854637b2e908b60e11b83529092506001600160a01b03169063f65d211690612a379060019085908f908f908f908f908f908f908f908f908f90600401613883565b60206040518083038186803b158015612a4f57600080fd5b505afa158015612a63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8791906132a8565b612a91600661284b565b90612aaf5760405162461bcd60e51b815260040161066a9190613954565b505050505050505050505050565b600082821115612acc57600080fd5b50900390565b81516020830120600090612ae581612694565b15612af0600561284b565b90612b0e5760405162461bcd60e51b815260040161066a9190613954565b506000612b1b84836112bb565b600092835260046020526040909220805460ff1916600117905550905092915050565b6009546001600160a01b031615801590612b7e57506001600160a01b0380831660009081526006602090815260408083209385168352929052205460ff16155b15612c8257600954604051637badcc6760e11b8152612c39916001600160a01b03169063f75b98ce90612bb7908590879060040161376a565b60206040518083038186803b158015612bcf57600080fd5b505afa158015612be3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c07919061352b565b6001600160a01b038085166000908152600560209081526040808320938716835292905220549063ffffffff6129a816565b6001600160a01b038084166000818152600560209081526040808320948716808452948252808320959095559181526006825283812092815291905220805460ff191660011790555b5050565b600080612c9286611708565b90506001600160a01b038616612cb557612cb2813463ffffffff612abd16565b90505b84471015612cc3600761284b565b90612ce15760405162461bcd60e51b815260040161066a9190613954565b5060006060846001600160a01b03168787604051612cff9190613699565b60006040518083038185875af1925050503d8060008114612d3c576040519150601f19603f3d011682016040523d82523d6000602084013e612d41565b606091505b509150915081612d5057600080fd5b60008082806020019051810190612d679190613027565b91509150896001600160a01b0316826001600160a01b0316148015612d97575080612d958661162c8d611708565b145b612da1600961284b565b90612dbf5760405162461bcd60e51b815260040161066a9190613954565b509998505050505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b803561134481613b3b565b60008083601f840112612e1e578182fd5b5081356001600160401b03811115612e34578182fd5b6020830191508360208083028501011115612e4e57600080fd5b9250929050565b600082601f830112612e65578081fd5b8135612e78612e7382613aec565b613ac6565b818152915060208083019084810181840286018201871015612e9957600080fd5b60005b84811015612ec1578135612eaf81613b53565b84529282019290820190600101612e9c565b505050505092915050565b600082601f830112612edc578081fd5b8135612eea612e7382613aec565b818152915060208083019084810181840286018201871015612f0b57600080fd5b60005b84811015612ec157813584529282019290820190600101612f0e565b600082601f830112612f3a578081fd5b8135612f48612e7382613aec565b818152915060208083019084810181840286018201871015612f6957600080fd5b6000805b85811015612f9757823560ff81168114612f85578283fd5b85529383019391830191600101612f6d565b50505050505092915050565b600082601f830112612fb3578081fd5b81356001600160401b03811115612fc8578182fd5b612fdb601f8201601f1916602001613ac6565b9150808252836020828501011115612ff257600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561301c578081fd5b813561267881613b3b565b60008060408385031215613039578081fd5b825161304481613b3b565b6020939093015192949293505050565b60008060408385031215613066578182fd5b823561307181613b3b565b9150602083013561308181613b3b565b809150509250929050565b600080600080600080600060e0888a0312156130a6578283fd5b87356130b181613b3b565b96506020880135955060408801356130c881613b3b565b94506130d78960608a01612e02565b935060808801356001600160401b03808211156130f2578485fd5b6130fe8b838c01612fa3565b945060a08a0135915080821115613113578384fd5b61311f8b838c01612fa3565b935060c08a0135915080821115613134578283fd5b506131418a828b01612fa3565b91505092959891949750929550565b600080600060608486031215613164578081fd5b833561316f81613b3b565b92506020840135915060408401356001600160401b03811115613190578182fd5b61319c86828701612fa3565b9150509250925092565b600080600080604085870312156131bb578182fd5b84356001600160401b03808211156131d1578384fd5b6131dd88838901612e0d565b909650945060208701359150808211156131f5578384fd5b5061320287828801612e0d565b95989497509550505050565b60006020808385031215613220578182fd5b82356001600160401b03811115613235578283fd5b80840185601f820112613246578384fd5b80359150613256612e7383613aec565b8281528381019082850185850284018601891015613272578687fd5b8693505b8484101561329c576132888982612e02565b835260019390930192918501918501613276565b50979650505050505050565b6000602082840312156132b9578081fd5b815161267881613b53565b6000602082840312156132d5578081fd5b5035919050565b6000602082840312156132ed578081fd5b81356001600160401b03811115613302578182fd5b61330e84828501612fa3565b949350505050565b60008060408385031215613328578182fd5b82356001600160401b0381111561333d578283fd5b61334985828601612fa3565b95602094909401359450505050565b6000806000806000806000806000806101408b8d031215613377578384fd5b8a356001600160401b038082111561338d578586fd5b6133998e838f01612fa3565b9b5060208d01359a5060408d01359150808211156133b5578586fd5b6133c18e838f01612ecc565b995060608d01359150808211156133d6578586fd5b6133e28e838f01612e55565b985060808d0135975060a08d0135965060c08d0135915080821115613405578586fd5b6134118e838f01612ecc565b955060e08d0135915080821115613426578485fd5b6134328e838f01612f2a565b94506101008d0135915080821115613448578384fd5b6134548e838f01612ecc565b93506101208d013591508082111561346a578283fd5b506134778d828e01612ecc565b9150509295989b9194979a5092959850565b600080600080600060a086880312156134a0578283fd5b85356001600160401b03808211156134b6578485fd5b6134c289838a01612fa3565b9650602088013591506134d482613b3b565b90945060408701359350606087013590808211156134f0578283fd5b6134fc89838a01612fa3565b93506080880135915080821115613511578283fd5b5061351e88828901612fa3565b9150509295509295909350565b60006020828403121561353c578081fd5b5051919050565b6000815180845260208085019450808401835b8381101561357b5781516001600160a01b031687529582019590820190600101613556565b509495945050505050565b6000815180845260208085019450808401835b8381101561357b578151151587529582019590820190600101613599565b6000815180845260208085019450808401835b8381101561357b578151875295820195908201906001016135ca565b6000815180845260208085019450808401835b8381101561357b57815160ff16875295820195908201906001016135f9565b60008151808452613630816020860160208601613b0b565b601f01601f19169290920160200192915050565b60006bffffffffffffffffffffffff198660601b168252845161366e816014850160208901613b0b565b8451908301613684826014830160208901613b0b565b01601481019390935250506034019392505050565b600082516136ab818460208701613b0b565b9190910192915050565b600083516136c7818460208801613b0b565b9190910191825250602001919050565b600085516136e9818460208a01613b0b565b8083016bffffffffffffffffffffffff198760601b16815285519150613684826014830160208901613b0b565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03841681526060602082018190526000906137a890830185613618565b9050826040830152949350505050565b6040808252810184905260008560608301825b878110156137fb57602083356137e081613b3b565b6001600160a01b0316835292830192909101906001016137cb565b5083810360208501528481526001600160fb1b0385111561381a578283fd5b602085029150818660208301370160200190815295945050505050565b6000602082526126786020830184613543565b60006040825261385d6040830185613543565b828103602084015261386f81856135b7565b95945050505050565b901515815260200190565b60006101608d151583528c60208401528b60408401528060608401526138ab8184018c6135b7565b83810360808501526138bd818c613586565b9150508860a08401528760c084015282810360e08401526138de81886135b7565b8381036101008501526138f181886135e6565b91505082810361012084015261390781866135b7565b83810361014085015261391a81866135b7565b9f9e505050505050505050505050505050565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526126786020830184613618565b6020808252601490820152736e6f7420706175736564207269676874206e6f7760601b604082015260600190565b602080825260079082015266195e1c1a5c995960ca1b604082015260600190565b6020808252601a908201527f63616e6e6f7420657874656e6420666f7220746f6f206c6f6e67000000000000604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b60208082526010908201526f706175736564207269676874206e6f7760801b604082015260600190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b600060c08201905060ff835116825260ff6020840151166020830152604083015160018060a01b03808216604085015280606086015116606085015250506080830151608083015260a083015160a083015292915050565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715613ae457600080fd5b604052919050565b60006001600160401b03821115613b01578081fd5b5060209081020190565b60005b83811015613b26578181015183820152602001613b0e565b83811115613b35576000848401525b50505050565b6001600160a01b0381168114613b5057600080fd5b50565b8015158114613b5057600080fdfea264697066735822122059b85149cf13a2ce7eaeb95101a95dff9fa34316c48d141b3d33ca36e225a28964736f6c63430006060033000000000000000000000000e2516f0f38d9400a8cece5672884de72fbd01ce1000000000000000000000000e34ebff7af293dcddf0443818442bb5d558662dd000000000000000000000000ed5309daac912a52d985c317576a1b3f5020fdc9

Deployed Bytecode

0x6080604052600436106102135760003560e01c80637e16e6e111610118578063a26e1186116100a0578063dca40d9e1161006f578063dca40d9e146105b6578063e4bd7074146105d6578063f75b98ce146105f6578063f851a44014610616578063fa84702e1461062b5761021a565b8063a26e118614610541578063a3f5d8cc14610554578063ce5494bb14610569578063cf54aaa0146105895761021a565b806388aaf0c8116100e757806388aaf0c8146104b75780638a984538146104cc5780639714378c146104e1578063995fac11146105015780639e6371ba146105215761021a565b80637e16e6e1146104425780638456cb591461046f5780638588ccd61461048457806387add440146104975761021a565b80635a67cb871161019b5780636ff968c31161016a5780636ff968c3146103b857806370a08231146103cd57806373bf9651146103ed578063749c5f861461040d57806379599f961461042d5761021a565b80635a67cb87146103435780635c975abb146103565780636304541c1461036b57806365b5a00f146103985761021a565b80633a51913d116101e25780633a51913d146102b75780633f4ba83a146102d75780633fec6b40146102ec5780634e71d92d1461031957806358bc83371461032e5761021a565b80630c4f50391461021f5780631beb7de2146102415780631ea1940e146102615780631ed4276d146102975761021a565b3661021a57005b600080fd5b34801561022b57600080fd5b5061023f61023a36600461320e565b610640565b005b34801561024d57600080fd5b5061023f61025c366004613358565b610acb565b34801561026d57600080fd5b5061028161027c3660046132c4565b610f07565b60405161028e9190613878565b60405180910390f35b3480156102a357600080fd5b506102816102b23660046131a6565b610f1c565b3480156102c357600080fd5b5061023f6102d236600461300b565b611143565b3480156102e357600080fd5b5061023f611221565b3480156102f857600080fd5b5061030c610307366004613316565b6112bb565b60405161028e9190613719565b34801561032557600080fd5b5061023f61134a565b34801561033a57600080fd5b5061030c6113e6565b61023f610351366004613150565b6113eb565b34801561036257600080fd5b506102816116ba565b34801561037757600080fd5b5061038b61038636600461300b565b6116ca565b60405161028e919061392d565b3480156103a457600080fd5b5061038b6103b3366004613054565b6116dc565b3480156103c457600080fd5b5061030c6116f9565b3480156103d957600080fd5b5061038b6103e836600461300b565b611708565b3480156103f957600080fd5b5061023f610408366004613358565b6117a3565b34801561041957600080fd5b506102816104283660046132c4565b611b06565b34801561043957600080fd5b5061038b611bbd565b34801561044e57600080fd5b5061046261045d3660046132dc565b611bc3565b60405161028e9190613a60565b34801561047b57600080fd5b5061023f611c45565b61023f61049236600461308c565b611cfd565b3480156104a357600080fd5b5061023f6104b2366004613489565b6120b0565b3480156104c357600080fd5b5061030c6122d2565b3480156104d857600080fd5b5061030c6122e1565b3480156104ed57600080fd5b5061023f6104fc3660046132c4565b6122f0565b34801561050d57600080fd5b5061028161051c366004613054565b612399565b34801561052d57600080fd5b5061023f61053c36600461300b565b6123b9565b61023f61054f3660046132dc565b612426565b34801561056057600080fd5b5061028161251e565b34801561057557600080fd5b5061023f61058436600461300b565b61252e565b34801561059557600080fd5b506105a96105a436600461300b565b612601565b60405161028e9190613ab8565b3480156105c257600080fd5b506102816105d13660046132c4565b61267f565b3480156105e257600080fd5b506102816105f13660046132c4565b612694565b34801561060257600080fd5b5061038b610611366004613054565b6126fb565b34801561062257600080fd5b5061030c61282d565b34801561063757600080fd5b5061030c61283c565b6000546001600160a01b031633146106735760405162461bcd60e51b815260040161066a90613a3d565b60405180910390fd5b600154600160a01b900460ff1661069c5760405162461bcd60e51b815260040161066a90613967565b600a546001600160a01b031615156106b4600b61284b565b906106d25760405162461bcd60e51b815260040161066a9190613954565b50606081516001600160401b03811180156106ec57600080fd5b50604051908082528060200260200182016040528015610716578160200160208202803683370190505b50905060005b82518110156109e25760006001600160a01b031683828151811061073c57fe5b60200260200101516001600160a01b0316141561082b576000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54825183908390811061078c57fe5b6020908102919091010152600a546040516000916001600160a01b03169047906107b590613716565b60006040518083038185875af1925050503d80600081146107f2576040519150601f19603f3d011682016040523d82523d6000602084013e6107f7565b606091505b5050905080610806600461284b565b906108245760405162461bcd60e51b815260040161066a9190613954565b50506109a4565b600083828151811061083957fe5b60200260200101516001600160a01b03166370a08231306040518263ffffffff1660e01b815260040161086c9190613719565b60206040518083038186803b15801561088457600080fd5b505afa158015610898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108bc919061352b565b90508015610951578382815181106108d057fe5b6020908102919091010151600a5460405163a9059cbb60e01b81526001600160a01b039283169263a9059cbb9261090e929116908590600401613751565b600060405180830381600087803b15801561092857600080fd5b505af115801561093c573d6000803e3d6000fd5b50505050610948612974565b61095157600080fd5b6007600085848151811061096157fe5b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000205483838151811061099657fe5b602002602001018181525050505b6000600760008584815181106109b657fe5b6020908102919091018101516001600160a01b031682528101919091526040016000205560010161071c565b50600a54604051631ed4276d60e01b81526001600160a01b0390911690631ed4276d90610a15908590859060040161384a565b602060405180830381600087803b158015610a2f57600080fd5b505af1158015610a43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6791906132a8565b610a71600461284b565b90610a8f5760405162461bcd60e51b815260040161066a9190613954565b507f492fc8b292f2a2a9b328a366b83745f30c024056d12aa118a15966d26a8ce65882604051610abf9190613837565b60405180910390a15050565b600154600160a01b900460ff1615610af55760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff16610b0c600161284b565b90610b2a5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b19169055610b40612dcd565b610b498b611bc3565b9050806000015160ff1660f1148015610b695750806020015160ff166001145b610b7257600080fd5b610b7f8160a00151611b06565b15610b8a600561284b565b90610ba85760405162461bcd60e51b815260040161066a9190613954565b5060a081015160009081526003602052604090819020805460ff191660011790558101516001600160a01b0316610c39576040808201516001600160a01b03166000908152600760205220546080820151610c089163ffffffff6129a816565b471015610c15600761284b565b90610c335760405162461bcd60e51b815260040161066a9190613954565b50610d47565b6000610c488260400151612601565b905060098160ff161115610c6b5760808201805160081960ff841601600a0a0290525b6040808301516001600160a01b03166000908152600760205220546080830151610c9a9163ffffffff6129a816565b82604001516001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610cca9190613719565b60206040518083038186803b158015610ce257600080fd5b505afa158015610cf6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d1a919061352b565b1015610d26600761284b565b90610d445760405162461bcd60e51b815260040161066a9190613954565b50505b610d598b8b8b8b8b8b8b8b8b8b6129c6565b60408101516001600160a01b0316610e0257600081606001516001600160a01b03168260800151604051610d8c90613716565b60006040518083038185875af1925050503d8060008114610dc9576040519150601f19603f3d011682016040523d82523d6000602084013e610dce565b606091505b5050905080610ddd600461284b565b90610dfb5760405162461bcd60e51b815260040161066a9190613954565b5050610ea0565b80604001516001600160a01b031663a9059cbb826060015183608001516040518363ffffffff1660e01b8152600401610e3c929190613751565b600060405180830381600087803b158015610e5657600080fd5b505af1158015610e6a573d6000803e3d6000fd5b50505050610e76612974565b610e80600461284b565b90610e9e5760405162461bcd60e51b815260040161066a9190613954565b505b7f9b1bfa7fa9ee420a16e124f794c35ac9f90472acc99140eb2f6447c714cad8eb816040015182606001518360800151604051610edf9392919061372d565b60405180910390a15050600a805460ff60a01b1916600160a01b179055505050505050505050565b60046020526000908152604090205460ff1681565b6009546000906001600160a01b031615801590610f4357506009546001600160a01b031633145b610f4d600c61284b565b90610f6b5760405162461bcd60e51b815260040161066a9190613954565b50838214610f79600a61284b565b90610f975760405162461bcd60e51b815260040161066a9190613954565b50600960009054906101000a90046001600160a01b03166001600160a01b0316635c975abb6040518163ffffffff1660e01b815260040160206040518083038186803b158015610fe657600080fd5b505afa158015610ffa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061101e91906132a8565b611028600d61284b565b906110465760405162461bcd60e51b815260040161066a9190613954565b5060005b848110156110fa576110b384848381811061106157fe5b905060200201356007600089898681811061107857fe5b905060200201602081019061108d919061300b565b6001600160a01b031681526020810191909152604001600020549063ffffffff6129a816565b600760008888858181106110c357fe5b90506020020160208101906110d8919061300b565b6001600160a01b0316815260208101919091526040016000205560010161104a565b507f6a7fbbcddfd518bb8c56b28ac6c7acb0f7ca093ed232eb3306e53d14e469895f8585858560405161113094939291906137b8565b60405180910390a1506001949350505050565b6000546001600160a01b0316331461116d5760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff166111965760405162461bcd60e51b815260040161066a90613967565b6001600160a01b03811615156111ac600b61284b565b906111ca5760405162461bcd60e51b815260040161066a9190613954565b50600880546001600160a01b0319166001600160a01b0383161790556040517f204252dfe190ad6ef63db40a490f048b39f661de74628408f13cd0bb2d4c344690611216908390613719565b60405180910390a150565b6000546001600160a01b0316331461124b5760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff166112745760405162461bcd60e51b815260040161066a90613967565b6001805460ff60a01b191690556040517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906112b1903390613719565b60405180910390a1565b6000806000806020860151915060408601519250856040815181106112dc57fe5b602001015160f81c60f81b60f81c601b019050600185828486604051600081526020016040526040516113129493929190613936565b6020604051602081039080840390855afa158015611334573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600254421061136b5760405162461bcd60e51b815260040161066a90613995565b6001546001600160a01b031633146113955760405162461bcd60e51b815260040161066a906139ed565b600154600080546001600160a01b0319166001600160a01b0392831617908190556040517f0c7ef932d3b91976772937f18d5ef9b39a9930bef486b576c374f047c4b512dc926112b1921690613719565b600081565b600154600160a01b900460ff16156114155760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff1661142c600161284b565b9061144a5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b1916905582600061146482612601565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016114949190613719565b60206040518083038186803b1580156114ac57600080fd5b505afa1580156114c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114e4919061352b565b90508085600960ff8516111561151f5760098460ff1603600a0a818161150657fe5b04905060098460ff1603600a0a838161151b57fe5b0492505b670de0b6b3a7640000811115801561153f5750670de0b6b3a76400008311155b80156115625750670de0b6b3a764000061155f828563ffffffff6129a816565b11155b61156c600361284b565b9061158a5760405162461bcd60e51b815260040161066a9190613954565b506040516323b872dd60e01b81526001600160a01b038616906323b872dd906115bb90339030908c9060040161372d565b600060405180830381600087803b1580156115d557600080fd5b505af11580156115e9573d6000803e3d6000fd5b505050506115f5612974565b6115ff600461284b565b9061161d5760405162461bcd60e51b815260040161066a9190613954565b50866116388361162c8b611708565b9063ffffffff612abd16565b14611643600a61284b565b906116615760405162461bcd60e51b815260040161066a9190613954565b507f2d4b597935f3cd67fb2eebf1db4debc934cee5c7baa7153f980fdbeb2e74084e88878360405161169593929190613784565b60405180910390a15050600a805460ff60a01b1916600160a01b179055505050505050565b600154600160a01b900460ff1681565b60076020526000908152604090205481565b600560209081526000928352604080842090915290825290205481565b6001546001600160a01b031681565b60006001600160a01b03821661171f57504761179e565b6040516370a0823160e01b81526001600160a01b038316906370a082319061174b903090600401613719565b60206040518083038186803b15801561176357600080fd5b505afa158015611777573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179b919061352b565b90505b919050565b600154600160a01b900460ff16156117cd5760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff166117e4600161284b565b906118025760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b19169055611818612dcd565b6118218b611bc3565b9050806000015160ff1660f31480156118415750806020015160ff166001145b61184a57600080fd5b6118578160a00151611b06565b15611862600561284b565b906118805760405162461bcd60e51b815260040161066a9190613954565b5060a081015160009081526003602052604090819020805460ff191660011790558101516001600160a01b0316611911576040808201516001600160a01b031660009081526007602052205460808201516118e09163ffffffff6129a816565b4710156118ed600761284b565b9061190b5760405162461bcd60e51b815260040161066a9190613954565b50611a1f565b60006119208260400151612601565b905060098160ff1611156119435760808201805160081960ff841601600a0a0290525b6040808301516001600160a01b031660009081526007602052205460808301516119729163ffffffff6129a816565b82604001516001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016119a29190613719565b60206040518083038186803b1580156119ba57600080fd5b505afa1580156119ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119f2919061352b565b10156119fe600761284b565b90611a1c5760405162461bcd60e51b815260040161066a9190613954565b50505b611a318b8b8b8b8b8b8b8b8b8b6129c6565b608081015160608201516001600160a01b0390811660009081526005602090815260408083208187015190941683529290522054611a749163ffffffff6129a816565b60608201516001600160a01b03908116600090815260056020908152604080832081870180518616855290835281842095909555608086015194519093168252600790522054611ac99163ffffffff6129a816565b6040918201516001600160a01b03166000908152600760205291909120555050600a805460ff60a01b1916600160a01b1790555050505050505050565b60008181526003602052604081205460ff1615611b255750600161179e565b6009546001600160a01b0316611b3d5750600061179e565b600954604051633a4e2fc360e11b81526001600160a01b039091169063749c5f8690611b6d90859060040161392d565b60206040518083038186803b158015611b8557600080fd5b505afa158015611b99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179b91906132a8565b60025481565b611bcb612dcd565b611bd3612dcd565b82600081518110611be057fe5b016020015160f81c8152825183906001908110611bf957fe5b0160209081015160f81c9082015260228301516042840151606285015160828601516001600160a01b039384166040860152929091166060840152608083015260a08201529050919050565b6000546001600160a01b03163314611c6f5760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff1615611c995760405162461bcd60e51b815260040161066a90613a13565b6002544210611cba5760405162461bcd60e51b815260040161066a90613995565b6001805460ff60a01b1916600160a01b1790556040517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906112b1903390613719565b600154600160a01b900460ff1615611d275760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff16611d3e600161284b565b90611d5c5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b19169055604051600090611d9d90611d88908790879087908c90602001613644565b60405160208183030381529060405283612ad2565b9050611da98189612b3e565b6001600160a01b038082166000908152600560209081526040808320938c1683529290522054871115611ddc600861284b565b90611dfa5760405162461bcd60e51b815260040161066a9190613954565b506001600160a01b038816600090815260076020526040902054611e24908863ffffffff612abd16565b6001600160a01b03808a1660008181526007602090815260408083209590955592851681526005835283812091815291522054611e67908863ffffffff612abd16565b6001600160a01b038083166000908152600560209081526040808320938d16808452939091529020919091553490611eb057611ea9818963ffffffff6129a816565b9050611feb565b6040516370a0823160e01b815288906001600160a01b038b16906370a0823190611ede903090600401613719565b60206040518083038186803b158015611ef657600080fd5b505afa158015611f0a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f2e919061352b565b1015611f3a600761284b565b90611f585760405162461bcd60e51b815260040161066a9190613954565b5060405163a9059cbb60e01b81526001600160a01b038a169063a9059cbb90611f879089908c90600401613751565b600060405180830381600087803b158015611fa157600080fd5b505af1158015611fb5573d6000803e3d6000fd5b50505050611fc1612974565b611fcb600461284b565b90611fe95760405162461bcd60e51b815260040161066a9190613954565b505b6000611ff98883888a612c86565b6001600160a01b038085166000908152600560209081526040808320938d1683529290522054909150612032908263ffffffff6129a816565b6001600160a01b038085166000908152600560209081526040808320938d168352928152828220939093556007909252902054612075908263ffffffff6129a816565b6001600160a01b039098166000908152600760205260409020979097555050600a805460ff60a01b1916600160a01b17905550505050505050565b600154600160a01b900460ff16156120da5760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff166120f1600161284b565b9061210f5760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b191690556040516000906121509061213b9088908890869089906020016136d7565b60405160208183030381529060405284612ad2565b905061215c8186612b3e565b6001600160a01b0380821660009081526005602090815260408083209389168352929052205484111561218f600861284b565b906121ad5760405162461bcd60e51b815260040161066a9190613954565b506001600160a01b038082166000908152600560209081526040808320938916835292905220546121e4908563ffffffff612abd16565b6001600160a01b038083166000908152600560209081526040808320938a168352928152828220939093556007909252902054612227908563ffffffff612abd16565b6001600160a01b03861660008181526007602052604090209190915584901561227b57600061225587612601565b905060098160ff1611156122795760098160ff1603600a0a868161227557fe5b0491505b505b7f2d4b597935f3cd67fb2eebf1db4debc934cee5c7baa7153f980fdbeb2e74084e8688836040516122ae93929190613784565b60405180910390a15050600a805460ff60a01b1916600160a01b1790555050505050565b600a546001600160a01b031681565b6008546001600160a01b031681565b6000546001600160a01b0316331461231a5760405162461bcd60e51b815260040161066a90613a3d565b600254421061233b5760405162461bcd60e51b815260040161066a90613995565b61016e811061235c5760405162461bcd60e51b815260040161066a906139b6565b600280546201518083020190556040517f02ef6561d311451dadc920679eb21192a61d96ee8ead94241b8ff073029ca6e89061121690839061392d565b600660209081526000928352604080842090915290825290205460ff1681565b6000546001600160a01b031633146123e35760405162461bcd60e51b815260040161066a90613a3d565b60025442106124045760405162461bcd60e51b815260040161066a90613995565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b600154600160a01b900460ff16156124505760405162461bcd60e51b815260040161066a90613a13565b600a54600160a01b900460ff16612467600161284b565b906124855760405162461bcd60e51b815260040161066a9190613954565b50600a805460ff60a01b191690556b033b2e3c9fd0803ce80000004711156124ad600261284b565b906124cb5760405162461bcd60e51b815260040161066a9190613954565b507f2d4b597935f3cd67fb2eebf1db4debc934cee5c7baa7153f980fdbeb2e74084e6000823460405161250093929190613784565b60405180910390a150600a805460ff60a01b1916600160a01b179055565b600a54600160a01b900460ff1681565b6000546001600160a01b031633146125585760405162461bcd60e51b815260040161066a90613a3d565b600154600160a01b900460ff166125815760405162461bcd60e51b815260040161066a90613967565b6001600160a01b0381161515612597600b61284b565b906125b55760405162461bcd60e51b815260040161066a9190613954565b50600a80546001600160a01b0319166001600160a01b0383161790556040517fd58a618a39de682696ea37dd9a6bf9c793afa426fa1438e75c3966e3b541e45a90611216908390613719565b600080829050806001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561264057600080fd5b505afa158015612654573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612678919061352b565b9392505050565b60036020526000908152604090205460ff1681565b60008181526004602052604081205460ff16156126b35750600161179e565b6009546001600160a01b03166126cb5750600061179e565b60095460405163392f5c1d60e21b81526001600160a01b039091169063e4bd707490611b6d90859060040161392d565b6009546000906001600160a01b03161580159061273e57506001600160a01b0380831660009081526006602090815260408083209387168352929052205460ff16155b1561280057600954604051637badcc6760e11b81526127f9916001600160a01b03169063f75b98ce90612777908790879060040161376a565b60206040518083038186803b15801561278f57600080fd5b505afa1580156127a3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127c7919061352b565b6001600160a01b038085166000908152600560209081526040808320938916835292905220549063ffffffff6129a816565b9050611344565b506001600160a01b0380821660009081526005602090815260408083209386168352929052205492915050565b6000546001600160a01b031681565b6009546001600160a01b031681565b6060600082600d81111561285b57fe5b60408051600a808252818301909252919250906060908260208201818036833701905050905060005b60ff8416156128d2578151600a60ff959095168581049560018401939106916030830160f81b91859181106128b557fe5b60200101906001600160f81b031916908160001a90535050612884565b6060816001016001600160401b03811180156128ed57600080fd5b506040519080825280601f01601f191660200182016040528015612918576020820181803683370190505b50905060005b82811161296957838184038151811061293357fe5b602001015160f81c60f81b82828151811061294a57fe5b60200101906001600160f81b031916908160001a90535060010161291e565b509695505050505050565b6000803d801561298b5760208114612994576129a0565b600191506129a0565b60206000803e60005191505b501515905090565b60008282018381108015906129bd5750828110155b61267857600080fd5b60008a8a6040516020016129db9291906136b5565b60408051601f19818403018152908290528051602090910120600854637b2e908b60e11b83529092506001600160a01b03169063f65d211690612a379060019085908f908f908f908f908f908f908f908f908f90600401613883565b60206040518083038186803b158015612a4f57600080fd5b505afa158015612a63573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a8791906132a8565b612a91600661284b565b90612aaf5760405162461bcd60e51b815260040161066a9190613954565b505050505050505050505050565b600082821115612acc57600080fd5b50900390565b81516020830120600090612ae581612694565b15612af0600561284b565b90612b0e5760405162461bcd60e51b815260040161066a9190613954565b506000612b1b84836112bb565b600092835260046020526040909220805460ff1916600117905550905092915050565b6009546001600160a01b031615801590612b7e57506001600160a01b0380831660009081526006602090815260408083209385168352929052205460ff16155b15612c8257600954604051637badcc6760e11b8152612c39916001600160a01b03169063f75b98ce90612bb7908590879060040161376a565b60206040518083038186803b158015612bcf57600080fd5b505afa158015612be3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c07919061352b565b6001600160a01b038085166000908152600560209081526040808320938716835292905220549063ffffffff6129a816565b6001600160a01b038084166000818152600560209081526040808320948716808452948252808320959095559181526006825283812092815291905220805460ff191660011790555b5050565b600080612c9286611708565b90506001600160a01b038616612cb557612cb2813463ffffffff612abd16565b90505b84471015612cc3600761284b565b90612ce15760405162461bcd60e51b815260040161066a9190613954565b5060006060846001600160a01b03168787604051612cff9190613699565b60006040518083038185875af1925050503d8060008114612d3c576040519150601f19603f3d011682016040523d82523d6000602084013e612d41565b606091505b509150915081612d5057600080fd5b60008082806020019051810190612d679190613027565b91509150896001600160a01b0316826001600160a01b0316148015612d97575080612d958661162c8d611708565b145b612da1600961284b565b90612dbf5760405162461bcd60e51b815260040161066a9190613954565b509998505050505050505050565b6040805160c081018252600080825260208201819052918101829052606081018290526080810182905260a081019190915290565b803561134481613b3b565b60008083601f840112612e1e578182fd5b5081356001600160401b03811115612e34578182fd5b6020830191508360208083028501011115612e4e57600080fd5b9250929050565b600082601f830112612e65578081fd5b8135612e78612e7382613aec565b613ac6565b818152915060208083019084810181840286018201871015612e9957600080fd5b60005b84811015612ec1578135612eaf81613b53565b84529282019290820190600101612e9c565b505050505092915050565b600082601f830112612edc578081fd5b8135612eea612e7382613aec565b818152915060208083019084810181840286018201871015612f0b57600080fd5b60005b84811015612ec157813584529282019290820190600101612f0e565b600082601f830112612f3a578081fd5b8135612f48612e7382613aec565b818152915060208083019084810181840286018201871015612f6957600080fd5b6000805b85811015612f9757823560ff81168114612f85578283fd5b85529383019391830191600101612f6d565b50505050505092915050565b600082601f830112612fb3578081fd5b81356001600160401b03811115612fc8578182fd5b612fdb601f8201601f1916602001613ac6565b9150808252836020828501011115612ff257600080fd5b8060208401602084013760009082016020015292915050565b60006020828403121561301c578081fd5b813561267881613b3b565b60008060408385031215613039578081fd5b825161304481613b3b565b6020939093015192949293505050565b60008060408385031215613066578182fd5b823561307181613b3b565b9150602083013561308181613b3b565b809150509250929050565b600080600080600080600060e0888a0312156130a6578283fd5b87356130b181613b3b565b96506020880135955060408801356130c881613b3b565b94506130d78960608a01612e02565b935060808801356001600160401b03808211156130f2578485fd5b6130fe8b838c01612fa3565b945060a08a0135915080821115613113578384fd5b61311f8b838c01612fa3565b935060c08a0135915080821115613134578283fd5b506131418a828b01612fa3565b91505092959891949750929550565b600080600060608486031215613164578081fd5b833561316f81613b3b565b92506020840135915060408401356001600160401b03811115613190578182fd5b61319c86828701612fa3565b9150509250925092565b600080600080604085870312156131bb578182fd5b84356001600160401b03808211156131d1578384fd5b6131dd88838901612e0d565b909650945060208701359150808211156131f5578384fd5b5061320287828801612e0d565b95989497509550505050565b60006020808385031215613220578182fd5b82356001600160401b03811115613235578283fd5b80840185601f820112613246578384fd5b80359150613256612e7383613aec565b8281528381019082850185850284018601891015613272578687fd5b8693505b8484101561329c576132888982612e02565b835260019390930192918501918501613276565b50979650505050505050565b6000602082840312156132b9578081fd5b815161267881613b53565b6000602082840312156132d5578081fd5b5035919050565b6000602082840312156132ed578081fd5b81356001600160401b03811115613302578182fd5b61330e84828501612fa3565b949350505050565b60008060408385031215613328578182fd5b82356001600160401b0381111561333d578283fd5b61334985828601612fa3565b95602094909401359450505050565b6000806000806000806000806000806101408b8d031215613377578384fd5b8a356001600160401b038082111561338d578586fd5b6133998e838f01612fa3565b9b5060208d01359a5060408d01359150808211156133b5578586fd5b6133c18e838f01612ecc565b995060608d01359150808211156133d6578586fd5b6133e28e838f01612e55565b985060808d0135975060a08d0135965060c08d0135915080821115613405578586fd5b6134118e838f01612ecc565b955060e08d0135915080821115613426578485fd5b6134328e838f01612f2a565b94506101008d0135915080821115613448578384fd5b6134548e838f01612ecc565b93506101208d013591508082111561346a578283fd5b506134778d828e01612ecc565b9150509295989b9194979a5092959850565b600080600080600060a086880312156134a0578283fd5b85356001600160401b03808211156134b6578485fd5b6134c289838a01612fa3565b9650602088013591506134d482613b3b565b90945060408701359350606087013590808211156134f0578283fd5b6134fc89838a01612fa3565b93506080880135915080821115613511578283fd5b5061351e88828901612fa3565b9150509295509295909350565b60006020828403121561353c578081fd5b5051919050565b6000815180845260208085019450808401835b8381101561357b5781516001600160a01b031687529582019590820190600101613556565b509495945050505050565b6000815180845260208085019450808401835b8381101561357b578151151587529582019590820190600101613599565b6000815180845260208085019450808401835b8381101561357b578151875295820195908201906001016135ca565b6000815180845260208085019450808401835b8381101561357b57815160ff16875295820195908201906001016135f9565b60008151808452613630816020860160208601613b0b565b601f01601f19169290920160200192915050565b60006bffffffffffffffffffffffff198660601b168252845161366e816014850160208901613b0b565b8451908301613684826014830160208901613b0b565b01601481019390935250506034019392505050565b600082516136ab818460208701613b0b565b9190910192915050565b600083516136c7818460208801613b0b565b9190910191825250602001919050565b600085516136e9818460208a01613b0b565b8083016bffffffffffffffffffffffff198760601b16815285519150613684826014830160208901613b0b565b90565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03841681526060602082018190526000906137a890830185613618565b9050826040830152949350505050565b6040808252810184905260008560608301825b878110156137fb57602083356137e081613b3b565b6001600160a01b0316835292830192909101906001016137cb565b5083810360208501528481526001600160fb1b0385111561381a578283fd5b602085029150818660208301370160200190815295945050505050565b6000602082526126786020830184613543565b60006040825261385d6040830185613543565b828103602084015261386f81856135b7565b95945050505050565b901515815260200190565b60006101608d151583528c60208401528b60408401528060608401526138ab8184018c6135b7565b83810360808501526138bd818c613586565b9150508860a08401528760c084015282810360e08401526138de81886135b7565b8381036101008501526138f181886135e6565b91505082810361012084015261390781866135b7565b83810361014085015261391a81866135b7565b9f9e505050505050505050505050505050565b90815260200190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082526126786020830184613618565b6020808252601490820152736e6f7420706175736564207269676874206e6f7760601b604082015260600190565b602080825260079082015266195e1c1a5c995960ca1b604082015260600190565b6020808252601a908201527f63616e6e6f7420657874656e6420666f7220746f6f206c6f6e67000000000000604082015260600190565b6020808252600c908201526b1d5b985d5d1a1bdc9a5e995960a21b604082015260600190565b60208082526010908201526f706175736564207269676874206e6f7760801b604082015260600190565b6020808252600990820152683737ba1030b236b4b760b91b604082015260600190565b600060c08201905060ff835116825260ff6020840151166020830152604083015160018060a01b03808216604085015280606086015116606085015250506080830151608083015260a083015160a083015292915050565b60ff91909116815260200190565b6040518181016001600160401b0381118282101715613ae457600080fd5b604052919050565b60006001600160401b03821115613b01578081fd5b5060209081020190565b60005b83811015613b26578181015183820152602001613b0e565b83811115613b35576000848401525b50505050565b6001600160a01b0381168114613b5057600080fd5b50565b8015158114613b5057600080fdfea264697066735822122059b85149cf13a2ce7eaeb95101a95dff9fa34316c48d141b3d33ca36e225a28964736f6c63430006060033

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

000000000000000000000000e2516f0f38d9400a8cece5672884de72fbd01ce1000000000000000000000000e34ebff7af293dcddf0443818442bb5d558662dd000000000000000000000000ed5309daac912a52d985c317576a1b3f5020fdc9

-----Decoded View---------------
Arg [0] : admin (address): 0xE2516f0F38d9400a8ceCe5672884De72FBD01cE1
Arg [1] : incognitoProxyAddress (address): 0xE34ebFf7aF293dcdDf0443818442BB5d558662Dd
Arg [2] : _prevVault (address): 0xED5309daac912a52d985c317576a1b3f5020FDc9

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000e2516f0f38d9400a8cece5672884de72fbd01ce1
Arg [1] : 000000000000000000000000e34ebff7af293dcddf0443818442bb5d558662dd
Arg [2] : 000000000000000000000000ed5309daac912a52d985c317576a1b3f5020fdc9


Deployed Bytecode Sourcemap

1890:27517:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;24515:1068:2;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;24515:1068:2;;;;;;;;:::i;:::-;;11256:1906;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;11256:1906:2;;;;;;;;:::i;2089:43::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;2089:43:2;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25915:533;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;25915:533:2;;;;;;;;:::i;26824:278::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;26824:278:2;;;;;;;;:::i;1432:111:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1432:111:1;;;:::i;16021:347:2:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;16021:347:2;;;;;;;;:::i;:::-;;;;;;;;934:156:1;;5:9:-1;2:2;;;27:1;24;17:12;2:2;934:156:1;;;:::i;1957:78:2:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1957:78:2;;;:::i;6563:1019::-;;;;;;;;;:::i;110:18:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;110:18:1;;;:::i;2313:56:2:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;2313:56:2;;;;;;;;:::i;:::-;;;;;;;;2172:68;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;2172:68:2;;;;;;;;:::i;80:24:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;80:24:1;;;:::i;29196:209:2:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;29196:209:2;;;;;;;;:::i;14241:1699::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;14241:1699:2;;;;;;;;:::i;7999:262::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;7999:262:2;;;;;;;;:::i;134:18:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;134:18:1;;;:::i;8424:722:2:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;8424:722:2;;;;;;;;:::i;:::-;;;;;;;;1304:122:1;;5:9:-1;2:2;;;27:1;24;17:12;2:2;1304:122:1;;;:::i;19579:1726:2:-;;;;;;;;;:::i;17678:1121::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;17678:1121:2;;;;;;;;:::i;2442:31::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2442:31:2;;;:::i;2375:26::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2375:26:2;;;:::i;1096:202:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;1096:202:1;;;;;;;;:::i;2246:61:2:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;2246:61:2;;;;;;;;:::i;823:105:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;823:105:1;;;;;;;;:::i;5728:250:2:-;;;;;;;;;:::i;2479:29::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2479:29:2;;;:::i;24058:216::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;24058:216:2;;;;;;;;:::i;28958:149::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;28958:149:2;;;;;;;;:::i;:::-;;;;;;;;2041:42;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;2041:42:2;;;;;;;;:::i;16784:265::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;16784:265:2;;;;;;;;:::i;23231:350::-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;-1:-1;23231:350:2;;;;;;;;:::i;54:20:1:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;54:20:1;;;:::i;2407:29:2:-;;5:9:-1;2:2;;;27:1;24;17:12;2:2;2407:29:2;;;:::i;24515:1068::-;492:5:1;;-1:-1:-1;;;;;492:5:1;478:10;:19;470:41;;;;-1:-1:-1;;;470:41:1;;;;;;;;;;;;;;;;;573:6:::1;::::0;-1:-1:-1;;;573:6:1;::::1;;;565:39;;;;-1:-1:-1::0;;;565:39:1::1;;;;;;;;;24604:8:2::2;::::0;-1:-1:-1;;;;;24604:8:2::2;:22:::0;::::2;24628:32;24642:17;24628:13;:32::i;:::-;24596:65;;;;;-1:-1:-1::0;;;24596:65:2::2;;;;;;;;;;;24671:21;24706:6;:13;-1:-1:-1::0;;;;;24695:25:2::2;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;24695:25:2;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;::::0;-1:-1;24695:25:2::2;-1:-1:-1::0;24671:49:2;-1:-1:-1;24735:6:2::2;24730:701;24751:6;:13;24747:1;:17;24730:701;;;1993:42;-1:-1:-1::0;;;;;24789:22:2::2;:6;24796:1;24789:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;24789:22:2::2;;24785:583;;;24844:35;::::0;;:24:::2;:35;::::0;;;24831:10;;:7;;24839:1;;24831:10;::::2;;;;;;::::0;;::::2;::::0;;;;;:48;24916:8:::2;::::0;:47:::2;::::0;24898:12:::2;::::0;-1:-1:-1;;;;;24916:8:2::2;::::0;24937:21:::2;::::0;24916:47:::2;::::0;::::2;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;24897:66:2;;;24989:7;24998:39;25012:24;24998:13;:39::i;:::-;24981:57;;;;;-1:-1:-1::0;;;24981:57:2::2;;;;;;;;;;;24785:583;;;;25077:8;25095:6;25102:1;25095:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25088:27:2::2;;25124:4;25088:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;25088:42:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;25088:42:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25088:42:2;;;;;;;;;25077:53:::0;-1:-1:-1;25152:7:2;;25148:140:::2;;25190:6;25197:1;25190:9;;;;;;;;;::::0;;::::2;::::0;;;;;;25210:8:::2;::::0;25183:41:::2;::::0;-1:-1:-1;;;25183:41:2;;-1:-1:-1;;;;;25183:26:2;;::::2;::::0;::::2;::::0;:41:::2;::::0;25210:8;::::2;::::0;25220:3;;25183:41:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;25183:41:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;25183:41:2;;;;25254:14;:12;:14::i;:::-;25246:23;;12:1:-1;9::::0;2:12:::2;25246:23:2;25318:24;:35;25343:6;25350:1;25343:9;;;;;;;;;;;;;;-1:-1:-1::0;;;;;25318:35:2::2;-1:-1:-1::0;;;;;25318:35:2::2;;;;;;;;;;;;;25305:7;25313:1;25305:10;;;;;;;;;;;;;:48;;;::::0;::::2;24785:583;;25419:1;25381:24;:35;25406:6;25413:1;25406:9;;;;;;;;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;25381:35:2::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;25381:35:2;:39;24766:3:::2;;24730:701;;;-1:-1:-1::0;25461:8:2::2;::::0;25448:52:::2;::::0;-1:-1:-1;;;25448:52:2;;-1:-1:-1;;;;;25461:8:2;;::::2;::::0;25448:35:::2;::::0;:52:::2;::::0;25484:6;;25492:7;;25448:52:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;25448:52:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;25448:52:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;25448:52:2;;;;;;;;;25502:39;25516:24;25502:13;:39::i;:::-;25440:102;;;;;-1:-1:-1::0;;;25440:102:2::2;;;;;;;;;;;25558:18;25569:6;25558:18;;;;;;;;;;;;;;;614:1:1;24515:1068:2::0;:::o;11256:1906::-;670:6:1;;-1:-1:-1;;;670:6:1;;;;669:7;661:36;;;;-1:-1:-1;;;661:36:1;;;;;;;;;4360:10:2::1;::::0;-1:-1:-1;;;4360:10:2;::::1;;;4372:35;4386:20;4372:13;:35::i;:::-;4352:56;;;;;-1:-1:-1::0;;;4352:56:2::1;;;;;;;;;;-1:-1:-1::0;4483:10:2::1;:18:::0;;-1:-1:-1;;;;4483:18:2::1;::::0;;11623:24:::2;;:::i;:::-;11650:19;11664:4;11650:13;:19::i;:::-;11623:46;;11687:4;:9;;;:16;;11700:3;11687:16;:35;;;;;11707:4;:10;;;:15;;11721:1;11707:15;11687:35;11679:44;;12:1:-1;9::::0;2:12:::2;11679:44:2;11795:22;11808:4;:8;;;11795:12;:22::i;:::-;11794:23;11819:34;11833:19;11819:13;:34::i;:::-;11786:68;;;;;-1:-1:-1::0;;;11786:68:2::2;;;;;;;;;;-1:-1:-1::0;11875:8:2::2;::::0;::::2;::::0;11864:20:::2;::::0;;;:10:::2;:20;::::0;;;;;;:27;;-1:-1:-1;;11864:27:2::2;11887:4;11864:27;::::0;;11944:10;::::2;::::0;-1:-1:-1;;;;;11944:23:2::2;11940:543;;12061:10;::::0;;::::2;::::0;-1:-1:-1;;;;;12036:36:2::2;;::::0;;;:24:::2;:36;::::0;;;12016:11:::2;::::0;::::2;::::0;:57:::2;::::0;::::2;:19;:57;:::i;:::-;11991:21;:82;;12075:38;12089:23;12075:13;:38::i;:::-;11983:131;;;;;-1:-1:-1::0;;;11983:131:2::2;;;;;;;;;;;11940:543;;;12145:14;12162:23;12174:4;:10;;;12162:11;:23::i;:::-;12145:40;;12214:1;12203:8;:12;;;12199:107;;;12249:11;::::0;::::2;::::0;;-1:-1:-1;;12271:14:2::2;::::0;::::2;:18:::0;12264:2:::2;:26;12249:42;12235:56:::0;;12199:107:::2;12419:10;::::0;;::::2;::::0;-1:-1:-1;;;;;12394:36:2::2;;::::0;;;:24:::2;:36;::::0;;;12374:11:::2;::::0;::::2;::::0;:57:::2;::::0;::::2;:19;:57;:::i;:::-;12334:4;:10;;;-1:-1:-1::0;;;;;12327:28:2::2;;12364:4;12327:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;12327:43:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;12327:43:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12327:43:2;;;;;;;;;:104;;12433:38;12447:23;12433:13;:38::i;:::-;12319:153;;;;;-1:-1:-1::0;;;12319:153:2::2;;;;;;;;;;;11940:543;;12493:233;12517:4;12535:7;12556:9;12579:15;12608:9;12631:7;12652;12673:5;12692;12711;12493:10;:233::i;:::-;12768:10;::::0;::::2;::::0;-1:-1:-1;;;;;12768:23:2::2;12764:335;;12806:12;12825:4;:7;;;-1:-1:-1::0;;;;;12825:12:2::2;12845:4;:11;;;12825:36;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;12805:56:2;;;12881:7;12890:39;12904:24;12890:13;:39::i;:::-;12873:57;;;;;-1:-1:-1::0;;;12873:57:2::2;;;;;;;;;;;12764:335;;;;12968:4;:10;;;-1:-1:-1::0;;;;;12961:27:2::2;;12989:4;:7;;;12998:4;:11;;;12961:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;12961:49:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;12961:49:2;;;;13032:14;:12;:14::i;:::-;13048:39;13062:24;13048:13;:39::i;:::-;13024:64;;;;;-1:-1:-1::0;;;13024:64:2::2;;;;;;;;;;;12764:335;13113:42;13122:4;:10;;;13134:4;:7;;;13143:4;:11;;;13113:42;;;;;;;;;;;;;;;;;-1:-1:-1::0;;4656:10:2::1;:17:::0;;-1:-1:-1;;;;4656:17:2::1;-1:-1:-1::0;;;4656:17:2::1;::::0;;-1:-1:-1;;;;;;;;;11256:1906:2:o;2089:43::-;;;;;;;;;;;;;;;:::o;25915:533::-;3754:9;;26019:4;;-1:-1:-1;;;;;3754:9:2;3746:34;;;;:70;;-1:-1:-1;3806:9:2;;-1:-1:-1;;;;;3806:9:2;3784:10;:32;3746:70;3818:35;3832:20;3818:13;:35::i;:::-;3738:116;;;;;-1:-1:-1;;;3738:116:2;;;;;;;;;;-1:-1:-1;26043:31:2;;::::1;26077;26091:16;26077:13;:31::i;:::-;26035:74;;;;;-1:-1:-1::0;;;26035:74:2::1;;;;;;;;;;;26140:9;;;;;;;;;-1:-1:-1::0;;;;;26140:9:2::1;-1:-1:-1::0;;;;;26127:30:2::1;;:32;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::1;2:2;26127:32:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::1;77:16;74:1;67:27;5:2;26127:32:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;26127:32:2;;;;;;;;;26161:41;26175:26;26161:13;:41::i;:::-;26119:84;;;;;-1:-1:-1::0;;;26119:84:2::1;;;;;;;;;;-1:-1:-1::0;26218:6:2::1;26213:159;26230:17:::0;;::::1;26213:159;;;26306:55;26350:7;;26358:1;26350:10;;;;;;;;;;;;;26306:24;:35;26331:6;;26338:1;26331:9;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26306:35:2::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26306:35:2;;;:55:::1;:43;:55;:::i;:::-;26268:24;:35;26293:6;;26300:1;26293:9;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;26268:35:2::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;26268:35:2;:93;26249:3:::1;;26213:159;;;;26386:33;26403:6;;26411:7;;26386:33;;;;;;;;;;;;;;;;;;-1:-1:-1::0;26437:4:2::1;25915:533:::0;;;;;;:::o;26824:278::-;492:5:1;;-1:-1:-1;;;;;492:5:1;478:10;:19;470:41;;;;-1:-1:-1;;;470:41:1;;;;;;;;;573:6:::1;::::0;-1:-1:-1;;;573:6:1;::::1;;;565:39;;;;-1:-1:-1::0;;;565:39:1::1;;;;;;;;;-1:-1:-1::0;;;;;26925:31:2;::::2;::::0;::::2;26958:32;26972:17;26958:13;:32::i;:::-;26917:74;;;;;-1:-1:-1::0;;;26917:74:2::2;;;;;;;;;;-1:-1:-1::0;27001:9:2::2;:40:::0;;-1:-1:-1;;;;;;27001:40:2::2;-1:-1:-1::0;;;;;27001:40:2;::::2;;::::0;;27056:39:::2;::::0;::::2;::::0;::::2;::::0;27001:40;;27056:39:::2;;;;;;;;;;26824:278:::0;:::o;1432:111:1:-;492:5;;-1:-1:-1;;;;;492:5:1;478:10;:19;470:41;;;;-1:-1:-1;;;470:41:1;;;;;;;;;573:6:::1;::::0;-1:-1:-1;;;573:6:1;::::1;;;565:39;;;;-1:-1:-1::0;;;565:39:1::1;;;;;;;;;1487:6:::2;:14:::0;;-1:-1:-1;;;;1487:14:1::2;::::0;;1516:20:::2;::::0;::::2;::::0;::::2;::::0;1525:10:::2;::::0;1516:20:::2;;;;;;;;;;1432:111::o:0;16021:347:2:-;16101:7;16120:9;16139;16158:7;16223:4;16213:8;16209:19;16203:26;16198:31;;16267:4;16257:8;16253:19;16247:26;16242:31;;16302:8;16311:2;16302:12;;;;;;;;;;;;;;;;16296:19;;16318:2;16296:24;16292:28;;16337:24;16347:4;16353:1;16356;16359;16337:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16337:24:2;;;;;;;;16330:31;;;;;16021:347;;;;;:::o;934:156:1:-;781:6;;763:15;:24;755:44;;;;-1:-1:-1;;;755:44:1;;;;;;;;;1003:9:::1;::::0;-1:-1:-1;;;;;1003:9:1::1;989:10;:23;981:48;;;;-1:-1:-1::0;;;981:48:1::1;;;;;;;;;1047:9;::::0;::::1;1039:17:::0;;-1:-1:-1;;;;;;1039:17:1::1;-1:-1:-1::0;;;;;1047:9:1;;::::1;1039:17;::::0;;;;1071:12:::1;::::0;::::1;::::0;::::1;::::0;1077:5:::1;::::0;1071:12:::1;;1957:78:2::0;1993:42;1957:78;:::o;6563:1019::-;670:6:1;;-1:-1:-1;;;670:6:1;;;;669:7;661:36;;;;-1:-1:-1;;;661:36:1;;;;;;;;;4360:10:2::1;::::0;-1:-1:-1;;;4360:10:2;::::1;;;4372:35;4386:20;4372:13;:35::i;:::-;4352:56;;;;;-1:-1:-1::0;;;4352:56:2::1;;;;;;;;;;-1:-1:-1::0;4483:10:2::1;:18:::0;;-1:-1:-1;;;;4483:18:2::1;::::0;;6726:5;4496::::1;6759:27:::2;6726:5:::0;6759:11:::2;:27::i;:::-;6742:44;;6796:17;6816:14;-1:-1:-1::0;;;;;6816:24:2::2;;6849:4;6816:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;6816:39:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;6816:39:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;6816:39:2;;;;;;;;;6796:59:::0;-1:-1:-1;6796:59:2;6927:6;6958:1:::2;6947:12;::::0;::::2;;6943:169;;;7026:1;7014:8;7009:14;;:18;7002:2;:26;6988:10;:41;;;;;;6975:54;;7098:1;7086:8;7081:14;;:18;7074:2;:26;7058:12;:43;;;;;;7043:58;;6943:169;7143:8;7129:10;:22;;:50;;;;;7171:8;7155:12;:24;;7129:50;:98;;;;-1:-1:-1::0;7219:8:2::2;7183:32;:10:::0;7202:12;7183:32:::2;:18;:32;:::i;:::-;:44;;7129:98;7229:37;7243:22;7229:13;:37::i;:::-;7121:146;;;;;-1:-1:-1::0;;;7121:146:2::2;;;;;;;;;;-1:-1:-1::0;7277:62:2::2;::::0;-1:-1:-1;;;7277:62:2;;-1:-1:-1;;;;;7277:27:2;::::2;::::0;::::2;::::0;:62:::2;::::0;7305:10:::2;::::0;7325:4:::2;::::0;7332:6;;7277:62:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;7277:62:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;7277:62:2;;;;7357:14;:12;:14::i;:::-;7373:39;7387:24;7373:13;:39::i;:::-;7349:64;;;;;-1:-1:-1::0;;;7349:64:2::2;;;;;;;;;;;7475:6;7431:40;7456:14;7431:16;7441:5;7431:9;:16::i;:::-;:24:::0;:40:::2;:24;:40;:::i;:::-;:50;7483:31;7497:16;7483:13;:31::i;:::-;7423:92;;;;;-1:-1:-1::0;;;7423:92:2::2;;;;;;;;;;;7531:44;7539:5;7546:16;7564:10;7531:44;;;;;;;;;;;;;;;;;-1:-1:-1::0;;4656:10:2::1;:17:::0;;-1:-1:-1;;;;4656:17:2::1;-1:-1:-1::0;;;4656:17:2::1;::::0;;-1:-1:-1;;;;;;6563:1019:2:o;110:18:1:-;;;-1:-1:-1;;;110:18:1;;;;;:::o;2313:56:2:-;;;;;;;;;;;;;:::o;2172:68::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;80:24:1:-;;;-1:-1:-1;;;;;80:24:1;;:::o;29196:209:2:-;29251:4;-1:-1:-1;;;;;29271:18:2;;29267:77;;-1:-1:-1;29312:21:2;29305:28;;29267:77;29360:38;;-1:-1:-1;;;29360:38:2;;-1:-1:-1;;;;;29360:23:2;;;;;:38;;29392:4;;29360:38;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29360:38:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29360:38:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;29360:38:2;;;;;;;;;29353:45;;29196:209;;;;:::o;14241:1699::-;670:6:1;;-1:-1:-1;;;670:6:1;;;;669:7;661:36;;;;-1:-1:-1;;;661:36:1;;;;;;;;;4360:10:2::1;::::0;-1:-1:-1;;;4360:10:2;::::1;;;4372:35;4386:20;4372:13;:35::i;:::-;4352:56;;;;;-1:-1:-1::0;;;4352:56:2::1;;;;;;;;;;-1:-1:-1::0;4483:10:2::1;:18:::0;;-1:-1:-1;;;;4483:18:2::1;::::0;;14615:24:::2;;:::i;:::-;14642:19;14656:4;14642:13;:19::i;:::-;14615:46;;14679:4;:9;;;:16;;14692:3;14679:16;:35;;;;;14699:4;:10;;;:15;;14713:1;14699:15;14679:35;14671:44;;12:1:-1;9::::0;2:12:::2;14671:44:2;14787:22;14800:4;:8;;;14787:12;:22::i;:::-;14786:23;14811:34;14825:19;14811:13;:34::i;:::-;14778:68;;;;;-1:-1:-1::0;;;14778:68:2::2;;;;;;;;;;-1:-1:-1::0;14867:8:2::2;::::0;::::2;::::0;14856:20:::2;::::0;;;:10:::2;:20;::::0;;;;;;:27;;-1:-1:-1;;14856:27:2::2;14879:4;14856:27;::::0;;14936:10;::::2;::::0;-1:-1:-1;;;;;14936:23:2::2;14932:543;;15053:10;::::0;;::::2;::::0;-1:-1:-1;;;;;15028:36:2::2;;::::0;;;:24:::2;:36;::::0;;;15008:11:::2;::::0;::::2;::::0;:57:::2;::::0;::::2;:19;:57;:::i;:::-;14983:21;:82;;15067:38;15081:23;15067:13;:38::i;:::-;14975:131;;;;;-1:-1:-1::0;;;14975:131:2::2;;;;;;;;;;;14932:543;;;15137:14;15154:23;15166:4;:10;;;15154:11;:23::i;:::-;15137:40;;15206:1;15195:8;:12;;;15191:107;;;15241:11;::::0;::::2;::::0;;-1:-1:-1;;15263:14:2::2;::::0;::::2;:18:::0;15256:2:::2;:26;15241:42;15227:56:::0;;15191:107:::2;15411:10;::::0;;::::2;::::0;-1:-1:-1;;;;;15386:36:2::2;;::::0;;;:24:::2;:36;::::0;;;15366:11:::2;::::0;::::2;::::0;:57:::2;::::0;::::2;:19;:57;:::i;:::-;15326:4;:10;;;-1:-1:-1::0;;;;;15319:28:2::2;;15356:4;15319:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;15319:43:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;15319:43:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15319:43:2;;;;;;;;;:104;;15425:38;15439:23;15425:13;:38::i;:::-;15311:153;;;;;-1:-1:-1::0;;;15311:153:2::2;;;;;;;;;;;14932:543;;15485:233;15509:4;15527:7;15548:9;15571:15;15600:9;15623:7;15644;15665:5;15684;15703;15485:10;:233::i;:::-;15815:11;::::0;::::2;::::0;15786:7:::2;::::0;::::2;::::0;-1:-1:-1;;;;;15769:25:2;;::::2;;::::0;;;:16:::2;:25;::::0;;;;;;;15795:10;;::::2;::::0;15769:37;;::::2;::::0;;;;;;;:58:::2;::::0;::::2;:45;:58;:::i;:::-;15746:7;::::0;::::2;::::0;-1:-1:-1;;;;;15729:25:2;;::::2;;::::0;;;:16:::2;:25;::::0;;;;;;;15755:10;;::::2;::::0;;15729:37;::::2;::::0;;;;;;;;:98;;;;15921:11:::2;::::0;::::2;::::0;15901:10;;15876:36;;::::2;::::0;;:24:::2;:36:::0;;;;:57:::2;::::0;::::2;:44;:57;:::i;:::-;15862:10;::::0;;::::2;::::0;-1:-1:-1;;;;;15837:36:2::2;;::::0;;;:24:::2;:36;::::0;;;;;:96;-1:-1:-1;;4656:10:2::1;:17:::0;;-1:-1:-1;;;;4656:17:2::1;-1:-1:-1::0;;;4656:17:2::1;::::0;;-1:-1:-1;;;;;;;;14241:1699:2:o;7999:262::-;8055:4;8075:16;;;:10;:16;;;;;;;;8071:139;;;-1:-1:-1;8114:4:2;8107:11;;8071:139;8147:9;;-1:-1:-1;;;;;8147:9:2;8135:75;;-1:-1:-1;8194:5:2;8187:12;;8135:75;8226:9;;:28;;-1:-1:-1;;;8226:28:2;;-1:-1:-1;;;;;8226:9:2;;;;:22;;:28;;8249:4;;8226:28;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;8226:28:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8226:28:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;8226:28:2;;;;;;;;134:18:1;;;;:::o;8424:722:2:-;8487:19;;:::i;:::-;8518:24;;:::i;:::-;8570:4;8575:1;8570:7;;;;;;;;;;;;;;8552:26;;8607:7;;:4;;8612:1;;8607:7;;;;;;;;;;;;;;8588:10;;;:27;8827:4;8817:15;;8811:22;8878:4;8868:15;;8862:22;8934:4;8924:15;;8918:22;8987:4;8977:15;;8971:22;-1:-1:-1;;;;;9024:18:2;;;:10;;;:18;9052:12;;;;:7;;;:12;9074:11;;;:20;9104:8;;;:14;8588:4;-1:-1:-1;8424:722:2;;;:::o;1304:122:1:-;492:5;;-1:-1:-1;;;;;492:5:1;478:10;:19;470:41;;;;-1:-1:-1;;;470:41:1;;;;;;;;;670:6:::1;::::0;-1:-1:-1;;;670:6:1;::::1;;;669:7;661:36;;;;-1:-1:-1::0;;;661:36:1::1;;;;;;;;;781:6:::2;;763:15;:24;755:44;;;;-1:-1:-1::0;;;755:44:1::2;;;;;;;;;1382:4:::3;1373:13:::0;;-1:-1:-1;;;;1373:13:1::3;-1:-1:-1::0;;;1373:13:1::3;::::0;;1401:18:::3;::::0;::::3;::::0;::::3;::::0;1408:10:::3;::::0;1401:18:::3;;19579:1726:2::0;670:6:1;;-1:-1:-1;;;670:6:1;;;;669:7;661:36;;;;-1:-1:-1;;;661:36:1;;;;;;;;;4360:10:2::1;::::0;-1:-1:-1;;;4360:10:2;::::1;;;4372:35;4386:20;4372:13;:35::i;:::-;4352:56;;;;;-1:-1:-1::0;;;4352:56:2::1;;;;;;;;;;-1:-1:-1::0;4483:10:2::1;:18:::0;;-1:-1:-1;;;;4483:18:2::1;::::0;;19933:62:::2;::::0;4496:5:::1;::::0;19918:88:::2;::::0;19933:62:::2;::::0;19950:15;;19967:8;;19977:9;;19988:6;;19933:62:::2;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;19933:62:2;;;19997:8;19918:14;:88::i;:::-;19899:107;;20050:31;20065:8;20075:5;20050:14;:31::i;:::-;-1:-1:-1::0;;;;;20099:26:2;;::::2;;::::0;;;:16:::2;:26;::::0;;;;;;;:33;;::::2;::::0;;;;;;;:43;-1:-1:-1;20099:43:2::2;20144:55;20158:40;20144:13;:55::i;:::-;20091:109;;;;;-1:-1:-1::0;;;20091:109:2::2;;;;;;;;;;-1:-1:-1::0;;;;;;20283:31:2;::::2;;::::0;;;:24:::2;:31;::::0;;;;;:47:::2;::::0;20323:6;20283:47:::2;:39;:47;:::i;:::-;-1:-1:-1::0;;;;;20249:31:2;;::::2;;::::0;;;:24:::2;:31;::::0;;;;;;;:81;;;;20376:26;;::::2;::::0;;:16:::2;:26:::0;;;;;:33;;;;;;;:49:::2;::::0;20418:6;20376:49:::2;:41;:49;:::i;:::-;-1:-1:-1::0;;;;;20340:26:2;;::::2;;::::0;;;:16:::2;:26;::::0;;;;;;;:33;;::::2;::::0;;;;;;;;;:85;;;;20506:9:::2;::::0;20525:403:::2;;20575:25;:9:::0;20593:6;20575:25:::2;:17;:25;:::i;:::-;20563:37;;20525:403;;;20689:38;::::0;-1:-1:-1;;;20689:38:2;;20731:6;;-1:-1:-1;;;;;20689:23:2;::::2;::::0;::::2;::::0;:38:::2;::::0;20721:4:::2;::::0;20689:38:::2;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;20689:38:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;20689:38:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20689:38:2;;;;;;;;;:48;;20739:38;20753:23;20739:13;:38::i;:::-;20681:97;;;;;-1:-1:-1::0;;;20681:97:2::2;;;;;;;;;;-1:-1:-1::0;20792:47:2::2;::::0;-1:-1:-1;;;20792:47:2;;-1:-1:-1;;;;;20792:22:2;::::2;::::0;::::2;::::0;:47:::2;::::0;20815:15;;20832:6;;20792:47:::2;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24::::0;17:12:::2;2:2;20792:47:2;;;;8:9:-1;5:2;;;45:16;42:1;39::::0;24:38:::2;77:16;74:1;67:27;5:2;20792:47:2;;;;20861:14;:12;:14::i;:::-;20877:39;20891:24;20877:13;:39::i;:::-;20853:64;;;;;-1:-1:-1::0;;;20853:64:2::2;;;;;;;;;;;20525:403;20937:19;20959:65;20971:14;20987:9;20998:8;21008:15;20959:11;:65::i;:::-;-1:-1:-1::0;;;;;21115:26:2;;::::2;;::::0;;;:16:::2;:26;::::0;;;;;;;:42;;::::2;::::0;;;;;;;20937:87;;-1:-1:-1;21115:66:2::2;::::0;20937:87;21115:66:::2;:50;:66;:::i;:::-;-1:-1:-1::0;;;;;21070:26:2;;::::2;;::::0;;;:16:::2;:26;::::0;;;;;;;:42;;::::2;::::0;;;;;;;;:111;;;;21234:24:::2;:40:::0;;;;;;:64:::2;::::0;21283:14;21234:64:::2;:48;:64;:::i;:::-;-1:-1:-1::0;;;;;21191:40:2;;::::2;;::::0;;;:24:::2;:40;::::0;;;;:107;;;;-1:-1:-1;;4656:10:2::1;:17:::0;;-1:-1:-1;;;;4656:17:2::1;-1:-1:-1::0;;;4656:17:2::1;::::0;;-1:-1:-1;;;;;;;19579:1726:2:o;17678:1121::-;670:6:1;;-1:-1:-1;;;670:6:1;;;;669:7;661:36;;;;-1:-1:-1;;;661:36:1;;;;;;;;;4360:10:2::1;::::0;-1:-1:-1;;;4360:10:2;::::1;;;4372:35;4386:20;4372:13;:35::i;:::-;4352:56;;;;;-1:-1:-1::0;;;4352:56:2::1;;;;;;;;;;-1:-1:-1::0;4483:10:2::1;:18:::0;;-1:-1:-1;;;;4483:18:2::1;::::0;;17967:60:::2;::::0;4496:5:::1;::::0;17952:86:::2;::::0;17967:60:::2;::::0;17984:16;;18002:5;;18009:9;;18020:6;;17967:60:::2;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;17967:60:2;;;18029:8;17952:14;:86::i;:::-;17933:105;;18082:31;18097:8;18107:5;18082:14;:31::i;:::-;-1:-1:-1::0;;;;;18132:26:2;;::::2;;::::0;;;:16:::2;:26;::::0;;;;;;;:33;;::::2;::::0;;;;;;;:43;-1:-1:-1;18132:43:2::2;18177:55;18191:40;18177:13;:55::i;:::-;18124:109;;;;;-1:-1:-1::0;;;18124:109:2::2;;;;;;;;;;-1:-1:-1::0;;;;;;18279:26:2;;::::2;;::::0;;;:16:::2;:26;::::0;;;;;;;:33;;::::2;::::0;;;;;;;:49:::2;::::0;18321:6;18279:49:::2;:41;:49;:::i;:::-;-1:-1:-1::0;;;;;18243:26:2;;::::2;;::::0;;;:16:::2;:26;::::0;;;;;;;:33;;::::2;::::0;;;;;;;;:85;;;;18372:24:::2;:31:::0;;;;;;:47:::2;::::0;18412:6;18372:47:::2;:39;:47;:::i;:::-;-1:-1:-1::0;;;;;18338:31:2;::::2;;::::0;;;:24:::2;:31;::::0;;;;:81;;;;18519:6;;18539:18;18535:198:::2;;18573:14;18590:18;18602:5;18590:11;:18::i;:::-;18573:35;;18637:1;18626:8;:12;;;18622:101;;;18705:1;18693:8;18688:14;;:18;18681:2;:26;18671:6;:37;;;;;;18658:50;;18622:101;18535:198;;18748:44;18756:5;18763:16;18781:10;18748:44;;;;;;;;;;;;;;;;;-1:-1:-1::0;;4656:10:2::1;:17:::0;;-1:-1:-1;;;;4656:17:2::1;-1:-1:-1::0;;;4656:17:2::1;::::0;;-1:-1:-1;;;;;17678:1121:2:o;2442:31::-;;;-1:-1:-1;;;;;2442:31:2;;:::o;2375:26::-;;;-1:-1:-1;;;;;2375:26:2;;:::o;1096:202:1:-;492:5;;-1:-1:-1;;;;;492:5:1;478:10;:19;470:41;;;;-1:-1:-1;;;470:41:1;;;;;;;;;781:6:::1;;763:15;:24;755:44;;;;-1:-1:-1::0;;;755:44:1::1;;;;;;;;;1172:3:::2;1168:1;:7;1160:46;;;;-1:-1:-1::0;;;1160:46:1::2;;;;;;;;;1248:6;::::0;;1261::::2;1257:10:::0;::::2;1248:19;1239:28:::0;;1282:9:::2;::::0;::::2;::::0;::::2;::::0;1257:1;;1282:9:::2;;2246:61:2::0;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;823:105:1:-;492:5;;-1:-1:-1;;;;;492:5:1;478:10;:19;470:41;;;;-1:-1:-1;;;470:41:1;;;;;;;;;781:6:::1;;763:15;:24;755:44;;;;-1:-1:-1::0;;;755:44:1::1;;;;;;;;;899:9:::2;:22:::0;;-1:-1:-1;;;;;;899:22:1::2;-1:-1:-1::0;;;;;899:22:1;;;::::2;::::0;;;::::2;::::0;;823:105::o;5728:250:2:-;670:6:1;;-1:-1:-1;;;670:6:1;;;;669:7;661:36;;;;-1:-1:-1;;;661:36:1;;;;;;;;;4360:10:2::1;::::0;-1:-1:-1;;;4360:10:2;::::1;;;4372:35;4386:20;4372:13;:35::i;:::-;4352:56;;;;;-1:-1:-1::0;;;4352:56:2::1;;;;;;;;;;-1:-1:-1::0;4483:10:2::1;:18:::0;;-1:-1:-1;;;;4483:18:2::1;::::0;;5860:8:::2;5835:21;:33;;5870:38;5884:23;5870:13;:38::i;:::-;5827:82;;;;;-1:-1:-1::0;;;5827:82:2::2;;;;;;;;;;;5924:47;1993:42;5943:16;5961:9;5924:47;;;;;;;;;;;;;;;;;-1:-1:-1::0;4656:10:2::1;:17:::0;;-1:-1:-1;;;;4656:17:2::1;-1:-1:-1::0;;;4656:17:2::1;::::0;;5728:250::o;2479:29::-;;;-1:-1:-1;;;2479:29:2;;;;;:::o;24058:216::-;492:5:1;;-1:-1:-1;;;;;492:5:1;478:10;:19;470:41;;;;-1:-1:-1;;;470:41:1;;;;;;;;;573:6:::1;::::0;-1:-1:-1;;;573:6:1;::::1;;;565:39;;;;-1:-1:-1::0;;;565:39:1::1;;;;;;;;;-1:-1:-1::0;;;;;24146:23:2;::::2;::::0;::::2;24171:32;24185:17;24171:13;:32::i;:::-;24138:66;;;;;-1:-1:-1::0;;;24138:66:2::2;;;;;;;;;;-1:-1:-1::0;24214:8:2::2;:20:::0;;-1:-1:-1;;;;;;24214:20:2::2;-1:-1:-1::0;;;;;24214:20:2;::::2;;::::0;;24249:18:::2;::::0;::::2;::::0;::::2;::::0;24214:20;;24249:18:::2;;28958:149:::0;29015:5;29032:12;29054:5;29032:28;;29083:5;-1:-1:-1;;;;;29083:14:2;;:16;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;29083:16:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29083:16:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;29083:16:2;;;;;;;;;29070:30;28958:149;-1:-1:-1;;;28958:149:2:o;2041:42::-;;;;;;;;;;;;;;;:::o;16784:265::-;16841:4;16861:17;;;:11;:17;;;;;;;;16857:140;;;-1:-1:-1;16901:4:2;16894:11;;16857:140;16934:9;;-1:-1:-1;;;;;16934:9:2;16922:75;;-1:-1:-1;16981:5:2;16974:12;;16922:75;17013:9;;:29;;-1:-1:-1;;;17013:29:2;;-1:-1:-1;;;;;17013:9:2;;;;:23;;:29;;17037:4;;17013:29;;;;23231:350;23361:9;;23333:4;;-1:-1:-1;;;;;23361:9:2;23353:34;;;;:62;;-1:-1:-1;;;;;;23392:16:2;;;;;;;:9;:16;;;;;;;;:23;;;;;;;;;;;;23391:24;23353:62;23349:179;;;23475:9;;:43;;-1:-1:-1;;;23475:43:2;;23436:83;;-1:-1:-1;;;;;23475:9:2;;:29;;:43;;23505:5;;23512;;23475:43;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23475:43:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23475:43:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23475:43:2;;;;;;;;;-1:-1:-1;;;;;23436:23:2;;;;;;;:16;:23;;;;;;;;:30;;;;;;;;;;;:83;:38;:83;:::i;:::-;23429:90;;;;23349:179;-1:-1:-1;;;;;;23544:23:2;;;;;;;:16;:23;;;;;;;;:30;;;;;;;;;;23231:350;;;;:::o;54:20:1:-;;;-1:-1:-1;;;;;54:20:1;;:::o;2407:29:2:-;;;-1:-1:-1;;;;;2407:29:2;;:::o;28188:548::-;28247:13;28272;28294:5;28288:12;;;;;;;;28363:20;;;28327:2;28363:20;;;;;;;;;28272:28;;-1:-1:-1;28327:2:2;28339:21;;28327:2;28363:20;;;21:6:-1;;108:14;28363:20:2;87:42:-1;143:17;;-1:-1;;28339:44:2;-1:-1:-1;28393:6:2;28413:162;28420:12;;;;28413:162;;28528:13;;28476:2;28466:12;;;;;28502;;;;28537:3;;;;28466:12;;;28549:2;:14;;28544:20;;;28528:8;;:13;;;;;;;;;:36;-1:-1:-1;;;;;28528:36:2;;;;;;;;;28413:162;;;;28584:14;28611:1;28615;28611:5;-1:-1:-1;;;;;28601:16:2;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28601:16:2;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;28601:16:2;87:42:-1;143:17;;-1:-1;28601:16:2;-1:-1:-1;28584:33:2;-1:-1:-1;28632:6:2;28627:77;28649:1;28644;:6;28627:77;;28678:8;28691:1;28687;:5;28678:15;;;;;;;;;;;;;;;;28671:1;28673;28671:4;;;;;;;;;;;:22;-1:-1:-1;;;;;28671:22:2;;;;;;;;-1:-1:-1;28652:3:2;;28627:77;;;-1:-1:-1;28727:1:2;28188:548;-1:-1:-1;;;;;;28188:548:2:o;27545:579::-;27591:4;;27710:16;27771:36;;;;27860:4;27855:163;;;;27703:387;;27771:36;27801:1;27786:16;;27771:36;;27855:163;27936:4;27931:3;27926;27911:30;28009:3;28003:10;27988:25;;27703:387;-1:-1:-1;28104:16:2;;;-1:-1:-1;27545:579:2;:::o;613:140::-;675:7;702:5;;;721:4;;;;;;:12;;;732:1;729;:4;;721:12;713:21;;12:1:-1;9;2:12;9398:891:2;9803:22;9855:4;9861:7;9838:31;;;;;;;;;;;;;;-1:-1:-1;;26:21;;;22:32;6:49;;9838:31:2;;;;9828:42;;49:4:-1;9828:42:2;;;;9929:9;;-1:-1:-1;;;9929:316:2;;9828:42;;-1:-1:-1;;;;;;9929:9:2;;:29;;:316;;:9;;9828:42;;10054:7;;10075:9;;10098:15;;10127:9;;10150:7;;10171;;10192:5;;10211;;10230;;9929:316;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9929:316:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9929:316:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;9929:316:2;;;;;;;;;10247:34;10261:19;10247:13;:34::i;:::-;9921:361;;;;;-1:-1:-1;;;9921:361:2;;;;;;;;;;;9398:891;;;;;;;;;;;:::o;494:115::-;556:7;584:1;579;:6;;571:15;;12:1:-1;9;2:12;571:15:2;-1:-1:-1;599:5:2;;;494:115::o;22332:371::-;22448:15;;;;;;22415:7;;22482:19;22448:15;22482:13;:19::i;:::-;22481:20;22503:34;22517:19;22503:13;:34::i;:::-;22473:65;;;;;-1:-1:-1;;;22473:65:2;;;;;;;;;;;22548:16;22567:28;22580:8;22590:4;22567:12;:28::i;:::-;22645:17;;;;:11;:17;;;;;;:24;;-1:-1:-1;;22645:24:2;22665:4;22645:24;;;-1:-1:-1;22548:47:2;-1:-1:-1;22332:371:2;;;;:::o;22816:329::-;22901:9;;-1:-1:-1;;;;;22901:9:2;22893:34;;;;:62;;-1:-1:-1;;;;;;22932:16:2;;;;;;;:9;:16;;;;;;;;:23;;;;;;;;;;;;22931:24;22893:62;22889:250;;;23043:9;;:43;;-1:-1:-1;;;23043:43:2;;23004:83;;-1:-1:-1;;;;;23043:9:2;;:29;;:43;;23073:5;;23080;;23043:43;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;23043:43:2;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23043:43:2;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;23043:43:2;;;;;;;;;-1:-1:-1;;;;;23004:23:2;;;;;;;:16;:23;;;;;;;;:30;;;;;;;;;;;:83;:38;:83;:::i;:::-;-1:-1:-1;;;;;22971:23:2;;;;;;;:16;:23;;;;;;;;:30;;;;;;;;;;;;:116;;;;23100:16;;;:9;:16;;;;;:23;;;;;;;:30;;-1:-1:-1;;23100:30:2;23126:4;23100:30;;;22889:250;22816:329;;:::o;21352:928::-;21479:4;21575:23;21601:25;21611:14;21601:9;:25::i;:::-;21575:51;-1:-1:-1;;;;;;21640:27:2;;21636:116;;21704:37;:18;21731:9;21704:37;:26;:37;:::i;:::-;21683:58;;21636:116;21794:9;21769:21;:34;;21805:38;21819:23;21805:13;:38::i;:::-;21761:83;;;;;-1:-1:-1;;;21761:83:2;;;;;;;;;;;21855:12;21869:19;21892:15;-1:-1:-1;;;;;21892:20:2;21920:9;21931:8;21892:48;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;19;14:27;;;;67:4;61:11;56:16;;134:4;130:9;123:4;105:16;101:27;97:43;94:1;90:51;84:4;77:65;157:16;154:1;147:27;211:16;208:1;201:4;198:1;194:12;179:49;5:228;;14:27;32:4;27:9;;5:228;;21854:86:2;;;;21958:7;21950:16;;12:1:-1;9;2:12;21950:16:2;21978:28;22008:19;22042:6;22031:35;;;;;;;;;;;;;;21977:89;;;;22108:14;-1:-1:-1;;;;;22084:38:2;:20;-1:-1:-1;;;;;22084:38:2;;:113;;;;;22183:14;22126:53;22160:18;22126:25;22136:14;22126:9;:25::i;:53::-;:71;22084:113;22199:41;22213:26;22199:13;:41::i;:::-;22076:165;;;;;-1:-1:-1;;;22076:165:2;;;;;;;;;;-1:-1:-1;22259:14:2;21352:928;-1:-1:-1;;;;;;;;;21352:928:2:o;1890:27517::-;;;;;;;;;-1:-1:-1;1890:27517:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;72:20;;97:33;72:20;97:33;;470:352;;;600:3;593:4;585:6;581:17;577:27;567:2;;-1:-1;;608:12;567:2;-1:-1;638:20;;-1:-1;;;;;667:30;;664:2;;;-1:-1;;700:12;664:2;744:4;736:6;732:17;720:29;;795:3;744:4;;779:6;775:17;736:6;761:32;;758:41;755:2;;;812:1;;802:12;755:2;560:262;;;;;;1578:698;;1692:3;1685:4;1677:6;1673:17;1669:27;1659:2;;-1:-1;;1700:12;1659:2;1747:6;1734:20;1769:77;1784:61;1838:6;1784:61;;;1769:77;;;1874:21;;;1760:86;-1:-1;1918:4;1931:14;;;;1906:17;;;2020;;;2011:27;;;;2008:36;-1:-1;2005:2;;;2057:1;;2047:12;2005:2;2082:1;2067:203;2092:6;2089:1;2086:13;2067:203;;;4930:6;4917:20;4942:30;4966:5;4942:30;;;2160:47;;2221:14;;;;2249;;;;2114:1;2107:9;2067:203;;;2071:14;;;;;1652:624;;;;;2302:707;;2419:3;2412:4;2404:6;2400:17;2396:27;2386:2;;-1:-1;;2427:12;2386:2;2474:6;2461:20;2496:80;2511:64;2568:6;2511:64;;2496:80;2604:21;;;2487:89;-1:-1;2648:4;2661:14;;;;2636:17;;;2750;;;2741:27;;;;2738:36;-1:-1;2735:2;;;2787:1;;2777:12;2735:2;2812:1;2797:206;2822:6;2819:1;2816:13;2797:206;;;5186:20;;2890:50;;2954:14;;;;2982;;;;2844:1;2837:9;2797:206;;4144:701;;4259:3;4252:4;4244:6;4240:17;4236:27;4226:2;;-1:-1;;4267:12;4226:2;4314:6;4301:20;4336:78;4351:62;4406:6;4351:62;;4336:78;4442:21;;;4327:87;-1:-1;4486:4;4499:14;;;;4474:17;;;4588;;;4579:27;;;;4576:36;-1:-1;4573:2;;;4625:1;;4615:12;4573:2;4650:1;;4635:204;4660:6;4657:1;4654:13;4635:204;;;6512:6;6499:20;50617:4;53240:5;50606:16;53217:5;53214:33;53204:2;;4650:1;;53251:12;53204:2;4728:48;;4790:14;;;;4818;;;;4682:1;4675:9;4635:204;;;4639:14;;;;;;4219:626;;;;;5257:440;;5358:3;5351:4;5343:6;5339:17;5335:27;5325:2;;-1:-1;;5366:12;5325:2;5413:6;5400:20;-1:-1;;;;;45336:6;45333:30;45330:2;;;-1:-1;;45366:12;45330:2;5435:64;45439:9;45420:17;;-1:-1;;45416:33;45507:4;45497:15;5435:64;;;5426:73;;5519:6;5512:5;5505:21;5623:3;45507:4;5614:6;5547;5605:16;;5602:25;5599:2;;;5640:1;;5630:12;5599:2;51692:6;45507:4;5547:6;5543:17;45507:4;5581:5;5577:16;51669:30;51748:1;51730:16;;;45507:4;51730:16;51723:27;5581:5;5318:379;-1:-1;;5318:379;6567:241;;6671:2;6659:9;6650:7;6646:23;6642:32;6639:2;;;-1:-1;;6677:12;6639:2;85:6;72:20;97:33;124:5;97:33;;7079:415;;;7219:2;7207:9;7198:7;7194:23;7190:32;7187:2;;;-1:-1;;7225:12;7187:2;387:6;381:13;399:41;434:5;399:41;;;7396:2;7446:22;;;;6371:13;7277:82;;6371:13;;-1:-1;;;7181:313;7501:366;;;7622:2;7610:9;7601:7;7597:23;7593:32;7590:2;;;-1:-1;;7628:12;7590:2;85:6;72:20;97:33;124:5;97:33;;;7680:63;-1:-1;7780:2;7819:22;;72:20;97:33;72:20;97:33;;;7788:63;;;;7584:283;;;;;;7874:1307;;;;;;;;8107:3;8095:9;8086:7;8082:23;8078:33;8075:2;;;-1:-1;;8114:12;8075:2;85:6;72:20;97:33;124:5;97:33;;;8166:63;-1:-1;8266:2;8305:22;;6223:20;;-1:-1;8374:2;8413:22;;72:20;97:33;72:20;97:33;;;8382:63;-1:-1;8500:53;8545:7;8482:2;8521:22;;8500:53;;;8490:63;;8618:3;8607:9;8603:19;8590:33;-1:-1;;;;;8643:18;8635:6;8632:30;8629:2;;;-1:-1;;8665:12;8629:2;8695:62;8749:7;8740:6;8729:9;8725:22;8695:62;;;8685:72;;8822:3;8811:9;8807:19;8794:33;8780:47;;8643:18;8839:6;8836:30;8833:2;;;-1:-1;;8869:12;8833:2;8899:62;8953:7;8944:6;8933:9;8929:22;8899:62;;;8889:72;;9026:3;9015:9;9011:19;8998:33;8984:47;;8643:18;9043:6;9040:30;9037:2;;;-1:-1;;9073:12;9037:2;;9103:62;9157:7;9148:6;9137:9;9133:22;9103:62;;;9093:72;;;8069:1112;;;;;;;;;;;9188:597;;;;9336:2;9324:9;9315:7;9311:23;9307:32;9304:2;;;-1:-1;;9342:12;9304:2;85:6;72:20;97:33;124:5;97:33;;;9394:63;-1:-1;9494:2;9533:22;;6223:20;;-1:-1;9630:2;9615:18;;9602:32;-1:-1;;;;;9643:30;;9640:2;;;-1:-1;;9676:12;9640:2;9706:63;9761:7;9752:6;9741:9;9737:22;9706:63;;;9696:73;;;9298:487;;;;;;9792:678;;;;;9983:2;9971:9;9962:7;9958:23;9954:32;9951:2;;;-1:-1;;9989:12;9951:2;10047:17;10034:31;-1:-1;;;;;10085:18;10077:6;10074:30;10071:2;;;-1:-1;;10107:12;10071:2;10145:80;10217:7;10208:6;10197:9;10193:22;10145:80;;;10135:90;;-1:-1;10135:90;-1:-1;10290:2;10275:18;;10262:32;;-1:-1;10303:30;;;10300:2;;;-1:-1;;10336:12;10300:2;;10374:80;10446:7;10437:6;10426:9;10422:22;10374:80;;;9945:525;;;;-1:-1;10364:90;-1:-1;;;;9945:525;10477:377;;10606:2;;10594:9;10585:7;10581:23;10577:32;10574:2;;;-1:-1;;10612:12;10574:2;10670:17;10657:31;-1:-1;;;;;10700:6;10697:30;10694:2;;;-1:-1;;10730:12;10694:2;10821:6;10810:9;10806:22;965:3;958:4;950:6;946:17;942:27;932:2;;-1:-1;;973:12;932:2;1020:6;1007:20;993:34;;1042:80;1057:64;1114:6;1057:64;;1042:80;1150:21;;;1207:14;;;;1182:17;;;1296;;;1287:27;;;;1284:36;-1:-1;1281:2;;;-1:-1;;1323:12;1281:2;-1:-1;1349:10;;1343:206;1368:6;1365:1;1362:13;1343:206;;;1448:37;1481:3;1469:10;1448:37;;;1436:50;;1390:1;1383:9;;;;;1500:14;;;;1528;;1343:206;;;-1:-1;10750:88;10568:286;-1:-1;;;;;;;10568:286;10861:257;;10973:2;10961:9;10952:7;10948:23;10944:32;10941:2;;;-1:-1;;10979:12;10941:2;5065:6;5059:13;5077:30;5101:5;5077:30;;11125:241;;11229:2;11217:9;11208:7;11204:23;11200:32;11197:2;;;-1:-1;;11235:12;11197:2;-1:-1;5186:20;;11191:175;-1:-1;11191:175;11373:345;;11486:2;11474:9;11465:7;11461:23;11457:32;11454:2;;;-1:-1;;11492:12;11454:2;11550:17;11537:31;-1:-1;;;;;11580:6;11577:30;11574:2;;;-1:-1;;11610:12;11574:2;11640:62;11694:7;11685:6;11674:9;11670:22;11640:62;;;11630:72;11448:270;-1:-1;;;;11448:270;11725:470;;;11855:2;11843:9;11834:7;11830:23;11826:32;11823:2;;;-1:-1;;11861:12;11823:2;11919:17;11906:31;-1:-1;;;;;11949:6;11946:30;11943:2;;;-1:-1;;11979:12;11943:2;12009:62;12063:7;12054:6;12043:9;12039:22;12009:62;;;11999:72;12108:2;12147:22;;;;5186:20;;-1:-1;;;;11817:378;12202:2283;;;;;;;;;;;12613:3;12601:9;12592:7;12588:23;12584:33;12581:2;;;-1:-1;;12620:12;12581:2;12678:17;12665:31;-1:-1;;;;;12716:18;12708:6;12705:30;12702:2;;;-1:-1;;12738:12;12702:2;12768:62;12822:7;12813:6;12802:9;12798:22;12768:62;;;12758:72;;12867:2;12910:9;12906:22;6223:20;12875:63;;13003:2;12992:9;12988:18;12975:32;12961:46;;12716:18;13019:6;13016:30;13013:2;;;-1:-1;;13049:12;13013:2;13079:78;13149:7;13140:6;13129:9;13125:22;13079:78;;;13069:88;;13222:2;13211:9;13207:18;13194:32;13180:46;;12716:18;13238:6;13235:30;13232:2;;;-1:-1;;13268:12;13232:2;13298:75;13365:7;13356:6;13345:9;13341:22;13298:75;;;13288:85;;13410:3;13454:9;13450:22;5186:20;13419:63;;13519:3;13563:9;13559:22;5186:20;13528:63;;13656:3;13645:9;13641:19;13628:33;13614:47;;12716:18;13673:6;13670:30;13667:2;;;-1:-1;;13703:12;13667:2;13733:78;13803:7;13794:6;13783:9;13779:22;13733:78;;;13723:88;;13876:3;13865:9;13861:19;13848:33;13834:47;;12716:18;13893:6;13890:30;13887:2;;;-1:-1;;13923:12;13887:2;13953:76;14021:7;14012:6;14001:9;13997:22;13953:76;;;13943:86;;14094:3;14083:9;14079:19;14066:33;14052:47;;12716:18;14111:6;14108:30;14105:2;;;-1:-1;;14141:12;14105:2;14171:78;14241:7;14232:6;14221:9;14217:22;14171:78;;;14161:88;;14314:3;14303:9;14299:19;14286:33;14272:47;;12716:18;14331:6;14328:30;14325:2;;;-1:-1;;14361:12;14325:2;;14391:78;14461:7;14452:6;14441:9;14437:22;14391:78;;;14381:88;;;12575:1910;;;;;;;;;;;;;;14846:1057;;;;;;15046:3;15034:9;15025:7;15021:23;15017:33;15014:2;;;-1:-1;;15053:12;15014:2;15111:17;15098:31;-1:-1;;;;;15149:18;15141:6;15138:30;15135:2;;;-1:-1;;15171:12;15135:2;15201:63;15256:7;15247:6;15236:9;15232:22;15201:63;;;15191:73;;15301:2;15344:9;15340:22;72:20;63:29;;97:33;124:5;97:33;;;15309:63;;-1:-1;15409:2;15448:22;;6223:20;;-1:-1;15545:2;15530:18;;15517:32;;15558:30;;;15555:2;;;-1:-1;;15591:12;15555:2;15621:62;15675:7;15666:6;15655:9;15651:22;15621:62;;;15611:72;;15748:3;15737:9;15733:19;15720:33;15706:47;;15149:18;15765:6;15762:30;15759:2;;;-1:-1;;15795:12;15759:2;;15825:62;15879:7;15870:6;15859:9;15855:22;15825:62;;;15815:72;;;15008:895;;;;;;;;;16158:263;;16273:2;16261:9;16252:7;16248:23;16244:32;16241:2;;;-1:-1;;16279:12;16241:2;-1:-1;6371:13;;16235:186;-1:-1;16235:186;18869:690;;19062:5;46871:12;48558:6;48553:3;48546:19;48595:4;;48590:3;48586:14;19074:93;;48595:4;19238:5;46098:14;-1:-1;19277:260;19302:6;19299:1;19296:13;19277:260;;;19363:13;;-1:-1;;;;;50401:54;17544:45;;16582:14;;;;47831;;;;678:18;19317:9;19277:260;;;-1:-1;19543:10;;18993:566;-1:-1;;;;;18993:566;19592:666;;19776:5;46871:12;48558:6;48553:3;48546:19;48595:4;;48590:3;48586:14;19788:90;;48595:4;19946:5;46098:14;-1:-1;19985:251;20010:6;20007:1;20004:13;19985:251;;;20071:13;;50234;50227:21;22994:34;;16752:14;;;;47831;;;;20032:1;20025:9;19985:251;;20297:690;;20490:5;46871:12;48558:6;48553:3;48546:19;48595:4;;48590:3;48586:14;20502:93;;48595:4;20666:5;46098:14;-1:-1;20705:260;20730:6;20727:1;20724:13;20705:260;;;20791:13;;23212:37;;16934:14;;;;47831;;;;20752:1;20745:9;20705:260;;22257:674;;22444:5;46871:12;48558:6;48553:3;48546:19;48595:4;;48590:3;48586:14;22456:91;;48595:4;22616:5;46098:14;-1:-1;22655:254;22680:6;22677:1;22674:13;22655:254;;;22741:13;;50617:4;50606:16;28675:35;;17290:14;;;;47831;;;;22702:1;22695:9;22655:254;;24084:347;;24229:5;46871:12;48558:6;48553:3;48546:19;24323:52;24368:6;48595:4;48590:3;48586:14;48595:4;24349:5;24345:16;24323:52;;;45439:9;52388:14;-1:-1;;52384:28;24387:39;;;;48595:4;24387:39;;24176:255;-1:-1;;24176:255;28836:697;;52495:14;;18114:5;52499:2;52495:14;;18071:3;18064:58;23541:5;46871:12;23652:52;23697:6;29172:2;29167:3;29163:12;23685:4;23678:5;23674:16;23652:52;;;46871:12;;;23716:16;;23652:52;46871:12;29172:2;23716:16;;23685:4;23674:16;;23652:52;;;23716:16;29172:2;23716:16;;23212:37;;;;-1:-1;;29496:12;;;;-1:-1;;;29063:470;29540:262;;23541:5;46871:12;23652:52;23697:6;23692:3;23685:4;23678:5;23674:16;23652:52;;;23716:16;;;;;29665:137;-1:-1;;29665:137;29809:401;;23541:5;46871:12;23652:52;23697:6;23692:3;23685:4;23678:5;23674:16;23652:52;;;23716:16;;;;23212:37;;;-1:-1;23685:4;30173:12;;29962:248;-1:-1;29962:248;30217:701;;23541:5;46871:12;23652:52;23697:6;23692:3;23685:4;23678:5;23674:16;23652:52;;;23725:6;23720:3;23716:16;52495:14;;50044:5;52499:2;52495:14;;18071:3;18064:58;23541:5;46871:12;23495:52;;23652;23697:6;30668:2;30663:3;30659:12;23685:4;23678:5;23674:16;23652:52;;30925:370;31280:10;31104:191;31302:213;-1:-1;;;;;50401:54;;;;17544:45;;31420:2;31405:18;;31391:124;32010:467;-1:-1;;;;;50401:54;;;17397:58;;50401:54;;;;32380:2;32365:18;;17397:58;32463:2;32448:18;;23212:37;;;;32200:2;32185:18;;32171:306;32484:340;-1:-1;;;;;50401:54;;;;17397:58;;32810:2;32795:18;;23212:37;32638:2;32623:18;;32609:215;32831:324;-1:-1;;;;;50401:54;;;17544:45;;50401:54;;33141:2;33126:18;;17544:45;32977:2;32962:18;;32948:207;33620:523;-1:-1;;;;;50401:54;;17544:45;;33814:2;33932;33917:18;;33910:48;;;33620:523;;33972:78;;33799:18;;34036:6;33972:78;;;33964:86;;23242:5;34129:2;34118:9;34114:18;23212:37;33785:358;;;;;;;34481:660;34747:2;34761:47;;;34732:18;;48546:19;;;34481:660;18490:21;48586:14;;;34481:660;18517:291;18542:6;18539:1;18536:13;18517:291;;;48595:4;85:6;72:20;97:33;124:5;97:33;;;-1:-1;;;;;50401:54;17544:45;;49937:12;;;;16582:14;;;;678:18;18557:9;18517:291;;;-1:-1;34978:20;;;48595:4;34958:18;;34951:48;48546:19;;;-1:-1;;;;;21274:78;;21271:2;;;-1:-1;;21355:12;21271:2;48595:4;21390:6;21386:17;21376:27;;51692:6;51687:3;48595:4;48590:3;48586:14;51669:30;51730:16;48595:4;51730:16;51723:27;;;51730:16;34718:423;-1:-1;;;;;34718:423;35148:361;;35316:2;35337:17;35330:47;35391:108;35316:2;35305:9;35301:18;35485:6;35391:108;;35516:620;;35762:2;35783:17;35776:47;35837:108;35762:2;35751:9;35747:18;35931:6;35837:108;;;35993:9;35987:4;35983:20;35978:2;35967:9;35963:18;35956:48;36018:108;36121:4;36112:6;36018:108;;;36010:116;35733:403;-1:-1;;;;;35733:403;36143:201;50234:13;;50227:21;22994:34;;36255:2;36240:18;;36226:118;36351:2189;;37034:3;23021:5;50234:13;50227:21;23001:3;22994:34;23242:5;37193:2;37182:9;37178:18;23212:37;23242:5;37276:2;37265:9;37261:18;23212:37;37034:3;37313:2;37302:9;37298:18;37291:48;37353:108;37034:3;37023:9;37019:19;37447:6;37353:108;;;37510:9;37504:4;37500:20;37494:3;37483:9;37479:19;37472:49;37535:102;37632:4;37623:6;37535:102;;;37527:110;;;23242:5;37716:3;37705:9;37701:19;23212:37;23242:5;37800:3;37789:9;37785:19;23212:37;37854:9;37848:4;37844:20;37838:3;37827:9;37823:19;37816:49;37879:108;37982:4;37973:6;37879:108;;;38036:9;38030:4;38026:20;38020:3;38009:9;38005:19;37998:49;38061:104;38160:4;38151:6;38061:104;;;38053:112;;;38214:9;38208:4;38204:20;38198:3;38187:9;38183:19;38176:49;38239:108;38342:4;38333:6;38239:108;;;38396:9;38390:4;38386:20;38380:3;38369:9;38365:19;38358:49;38421:109;38525:4;38515:7;38421:109;;;38413:117;37005:1535;-1:-1;;;;;;;;;;;;;;;37005:1535;38547:213;23212:37;;;38665:2;38650:18;;38636:124;38767:539;23212:37;;;50617:4;50606:16;;;;39126:2;39111:18;;28675:35;39209:2;39194:18;;23212:37;39292:2;39277:18;;23212:37;38965:3;38950:19;;38936:370;39827:301;;39965:2;39986:17;39979:47;40040:78;39965:2;39954:9;39950:18;40104:6;40040:78;;40135:407;40326:2;40340:47;;;25030:2;40311:18;;;48546:19;-1:-1;;;48586:14;;;25046:43;25108:12;;;40297:245;40549:407;40740:2;40754:47;;;25359:1;40725:18;;;48546:19;-1:-1;;;48586:14;;;25374:30;25423:12;;;40711:245;40963:407;41154:2;41168:47;;;25674:2;41139:18;;;48546:19;25710:28;48586:14;;;25690:49;25758:12;;;41125:245;41377:407;41568:2;41582:47;;;26009:2;41553:18;;;48546:19;-1:-1;;;48586:14;;;26025:35;26079:12;;;41539:245;41791:407;41982:2;41996:47;;;26635:2;41967:18;;;48546:19;-1:-1;;;48586:14;;;26651:39;26709:12;;;41953:245;42205:407;42396:2;42410:47;;;26960:1;42381:18;;;48546:19;-1:-1;;;48586:14;;;26975:32;27026:12;;;42367:245;42619:330;;42795:3;42784:9;42780:19;42772:27;;50617:4;27336:16;27330:23;50606:16;28682:3;28675:35;50617:4;27498;27491:5;27487:16;27481:23;50606:16;27498:4;27558:3;27554:14;28675:35;27649:4;27642:5;27638:16;27632:23;678:18;;50412:42;;;;50044:5;50401:54;27649:4;27713:3;27709:14;17544:45;50412:42;27801:4;27794:5;27790:16;27784:23;50401:54;27801:4;27881:3;27877:14;17544:45;;;27973:4;27966:5;27962:16;27956:23;27973:4;28037:3;28033:14;23212:37;28126:4;28119:5;28115:16;28109:23;28126:4;28190:3;28186:14;23212:37;42766:183;;;;;43176:205;50617:4;50606:16;;;;28675:35;;43290:2;43275:18;;43261:120;43388:256;43450:2;43444:9;43476:17;;;-1:-1;;;;;43536:34;;43572:22;;;43533:62;43530:2;;;43608:1;;43598:12;43530:2;43450;43617:22;43428:216;;-1:-1;43428:216;43651:304;;-1:-1;;;;;43802:6;43799:30;43796:2;;;-1:-1;;43832:12;43796:2;-1:-1;43877:4;43865:17;;;43930:15;;43733:222;51765:268;51830:1;51837:101;51851:6;51848:1;51845:13;51837:101;;;51918:11;;;51912:18;51899:11;;;51892:39;51873:2;51866:10;51837:101;;;51953:6;51950:1;51947:13;51944:2;;;51830:1;52009:6;52004:3;52000:16;51993:27;51944:2;;51814:219;;;;52527:117;-1:-1;;;;;50401:54;;52586:35;;52576:2;;52635:1;;52625:12;52576:2;52570:74;;52791:111;52872:5;50234:13;50227:21;52850:5;52847:32;52837:2;;52893:1;;52883:12

Swarm Source

ipfs://59b85149cf13a2ce7eaeb95101a95dff9fa34316c48d141b3d33ca36e225a289

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  ]
[ 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.