ETH Price: $2,146.45 (+4.45%)
Gas: 0.06 Gwei

Contract

0x33D6461a9Dba4c234fC01BC4a2df59BF26720E66
 

Overview

ETH Balance

3.625592963 ETH

Eth Value

$7,782.15 (@ $2,146.45/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Withdraw227112052025-06-15 16:43:59262 days ago1750005839IN
0x33D6461a...F26720E66
0 ETH0.000045851.2102277
Admin Withdraw92929782020-01-16 15:24:022239 days ago1579188242IN
0x33D6461a...F26720E66
0 ETH0.0075817680
Deposit92929412020-01-16 15:13:192239 days ago1579187599IN
0x33D6461a...F26720E66
0.1 ETH0.000318758
Admin Withdraw91826382019-12-29 21:04:212257 days ago1577653461IN
0x33D6461a...F26720E66
0 ETH0.0008398410
Admin Withdraw89911062019-11-24 7:03:162293 days ago1574578996IN
0x33D6461a...F26720E66
0 ETH0.0011752312
Admin Withdraw89911042019-11-24 7:02:532293 days ago1574578973IN
0x33D6461a...F26720E66
0 ETH0.0009952312
Admin Withdraw89773192019-11-22 0:01:152295 days ago1574380875IN
0x33D6461a...F26720E66
0 ETH0.0011752312
Admin Withdraw89740052019-11-21 10:45:232296 days ago1574333123IN
0x33D6461a...F26720E66
0 ETH0.00137214
Admin Withdraw89685752019-11-20 13:23:502296 days ago1574256230IN
0x33D6461a...F26720E66
0 ETH0.0009320812
Admin Withdraw89685732019-11-20 13:23:132296 days ago1574256193IN
0x33D6461a...F26720E66
0 ETH0.0012936212
Admin Withdraw89583232019-11-18 19:57:302298 days ago1574107050IN
0x33D6461a...F26720E66
0 ETH0.00099612
Deposit89583152019-11-18 19:55:362298 days ago1574106936IN
0x33D6461a...F26720E66
1 ETH0.0006318212
Admin Withdraw89582062019-11-18 19:28:142298 days ago1574105294IN
0x33D6461a...F26720E66
0 ETH0.00099612
Deposit89581282019-11-18 19:08:502298 days ago1574104130IN
0x33D6461a...F26720E66
10 ETH0.000315916
Admin Withdraw89556202019-11-18 8:57:082299 days ago1574067428IN
0x33D6461a...F26720E66
0 ETH0.00099612
Admin Withdraw89549422019-11-18 6:20:472299 days ago1574058047IN
0x33D6461a...F26720E66
0 ETH0.00117612
Deposit89510862019-11-17 15:01:322299 days ago1574002892IN
0x33D6461a...F26720E66
10 ETH0.000225916
Admin Withdraw89510422019-11-17 14:52:382299 days ago1574002358IN
0x33D6461a...F26720E66
0 ETH0.00117612
Deposit89495472019-11-17 8:56:172300 days ago1573980977IN
0x33D6461a...F26720E66
20 ETH0.0005265210
Deposit89429822019-11-16 6:39:152301 days ago1573886355IN
0x33D6461a...F26720E66
10 ETH0.0003765210
Admin Withdraw89429772019-11-16 6:38:352301 days ago1573886315IN
0x33D6461a...F26720E66
0 ETH0.0011752312
Admin Withdraw89421542019-11-16 3:19:192301 days ago1573874359IN
0x33D6461a...F26720E66
0 ETH0.0009975312
Deposit89418982019-11-16 2:21:552301 days ago1573870915IN
0x33D6461a...F26720E66
24.11636736 ETH0.0003765210
Admin Withdraw89418752019-11-16 2:16:222301 days ago1573870582IN
0x33D6461a...F26720E66
0 ETH0.0011767612
Deposit89405332019-11-15 20:49:162301 days ago1573850956IN
0x33D6461a...F26720E66
14 ETH0.00007532
View all transactions

Latest 19 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Transfer227112052025-06-15 16:43:59262 days ago1750005839
0x33D6461a...F26720E66
0.01220004 ETH
-92929782020-01-16 15:24:022239 days ago1579188242
0x33D6461a...F26720E66
0.09 ETH
-91826382019-12-29 21:04:212257 days ago1577653461
0x33D6461a...F26720E66
1.63919972 ETH
-89911062019-11-24 7:03:162293 days ago1574578996
0x33D6461a...F26720E66
0.01726719 ETH
-89911042019-11-24 7:02:532293 days ago1574578973
0x33D6461a...F26720E66
1.36913216 ETH
-89773192019-11-22 0:01:152295 days ago1574380875
0x33D6461a...F26720E66
0.046507 ETH
-89740052019-11-21 10:45:232296 days ago1574333123
0x33D6461a...F26720E66
4.78985845 ETH
-89583232019-11-18 19:57:302298 days ago1574107050
0x33D6461a...F26720E66
10.1276587 ETH
-89582062019-11-18 19:28:142298 days ago1574105294
0x33D6461a...F26720E66
13.30919297 ETH
-89556202019-11-18 8:57:082299 days ago1574067428
0x33D6461a...F26720E66
20.8333031 ETH
-89549422019-11-18 6:20:472299 days ago1574058047
0x33D6461a...F26720E66
0.29338636 ETH
-89510422019-11-17 14:52:382299 days ago1574002358
0x33D6461a...F26720E66
1.96015786 ETH
-89429772019-11-16 6:38:352301 days ago1573886315
0x33D6461a...F26720E66
10 ETH
-89421542019-11-16 3:19:192301 days ago1573874359
0x33D6461a...F26720E66
24.38969541 ETH
-89418752019-11-16 2:16:222301 days ago1573870582
0x33D6461a...F26720E66
23.95128471 ETH
-89042932019-11-09 20:08:292307 days ago1573330109
0x33D6461a...F26720E66
2.90832244 ETH
-89039902019-11-09 18:57:322307 days ago1573325852
0x33D6461a...F26720E66
0.21281557 ETH
-89038742019-11-09 18:26:382307 days ago1573323998
0x33D6461a...F26720E66
6.5470241 ETH
-89038212019-11-09 18:17:032307 days ago1573323423
0x33D6461a...F26720E66
22.50659783 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x4E33a667...4bAE567aF
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
Exchange

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv2 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-10-12
*/

pragma solidity ^0.4.19;

/* Interface for ERC20 Tokens */
contract Token {
    bytes32 public standard;
    bytes32 public name;
    bytes32 public symbol;
    uint256 public totalSupply;
    uint8 public decimals;
    bool public allowTransactions;
    mapping (address => uint256) public balanceOf;
    mapping (address => mapping (address => uint256)) public allowance;
    function transfer(address _to, uint256 _value) returns (bool success);
    function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success);
    function approve(address _spender, uint256 _value) returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);
}

// The DMEX base Contract
contract Exchange {
    function assert(bool assertion) {
        if (!assertion) throw;
    }

    // Safe Multiply Function - prevents integer overflow 
    function safeMul(uint a, uint b) returns (uint) {
        uint c = a * b;
        assert(a == 0 || c / a == b);
        return c;
    }

    // Safe Subtraction Function - prevents integer overflow 
    function safeSub(uint a, uint b) returns (uint) {
        assert(b <= a);
        return a - b;
    }

    // Safe Addition Function - prevents integer overflow 
    function safeAdd(uint a, uint b) returns (uint) {
        uint c = a + b;
        assert(c>=a && c>=b);
        return c;
    }

    address public owner; // holds the address of the contract owner
    mapping (address => bool) public admins; // mapping of admin addresses
    mapping (address => bool) public futuresContracts; // mapping of connected futures contracts
    mapping (address => uint256) public futuresContractsAddedBlock; // mapping of connected futures contracts and connection block numbers
    event SetFuturesContract(address futuresContract, bool isFuturesContract);

    // Event fired when the owner of the contract is changed
    event SetOwner(address indexed previousOwner, address indexed newOwner);

    // Allows only the owner of the contract to execute the function
    modifier onlyOwner {
        assert(msg.sender == owner);
        _;
    }

    // Changes the owner of the contract
    function setOwner(address newOwner) onlyOwner {
        SetOwner(owner, newOwner);
        owner = newOwner;
    }

    // Owner getter function
    function getOwner() returns (address out) {
        return owner;
    }

    // Adds or disables an admin account
    function setAdmin(address admin, bool isAdmin) onlyOwner {
        admins[admin] = isAdmin;
    }


    // Adds or disables a futuresContract address
    function setFuturesContract(address futuresContract, bool isFuturesContract) onlyOwner {
        if (fistFuturesContract == address(0))
        {
            fistFuturesContract = futuresContract;            
        }

        futuresContracts[futuresContract] = isFuturesContract;

        futuresContractsAddedBlock[futuresContract] = block.number;
        emit SetFuturesContract(futuresContract, isFuturesContract);
    }

    // Allows for admins only to call the function
    modifier onlyAdmin {
        if (msg.sender != owner && !admins[msg.sender]) throw;
        _;
    }

    // Allows for futures contracts only to call the function
    modifier onlyFuturesContract {
        if (!futuresContracts[msg.sender]) throw;
        _;
    }

    function() external {
        throw;
    }

    //mapping (address => mapping (address => uint256)) public tokens; // mapping of token addresses to mapping of balances  // tokens[token][user]
    //mapping (address => mapping (address => uint256)) public reserve; // mapping of token addresses to mapping of reserved balances  // reserve[token][user]
    mapping (address => mapping (address => uint256)) public balances; // mapping of token addresses to mapping of balances and reserve (bitwise compressed) // balances[token][user]

    mapping (address => uint256) public lastActiveTransaction; // mapping of user addresses to last transaction block
    mapping (bytes32 => uint256) public orderFills; // mapping of orders to filled qunatity
    
    mapping (address => mapping (address => bool)) public userAllowedFuturesContracts; // mapping of allowed futures smart contracts per user
    mapping (address => uint256) public userFirstDeposits; // mapping of user addresses and block number of first deposit

    address public feeAccount; // the account that receives the trading fees
    address public EtmTokenAddress; // the address of the EtherMium token
    address public fistFuturesContract; // 0x if there are no futures contracts set yet

    uint256 public inactivityReleasePeriod; // period in blocks before a user can use the withdraw() function
    mapping (bytes32 => bool) public withdrawn; // mapping of withdraw requests, makes sure the same withdrawal is not executed twice
    uint256 public makerFee; // maker fee in percent expressed as a fraction of 1 ether (0.1 ETH = 10%)
    uint256 public takerFee; // taker fee in percent expressed as a fraction of 1 ether (0.1 ETH = 10%)

    enum Errors {
        INVLID_PRICE,           // Order prices don't match
        INVLID_SIGNATURE,       // Signature is invalid
        TOKENS_DONT_MATCH,      // Maker/taker tokens don't match
        ORDER_ALREADY_FILLED,   // Order was already filled
        GAS_TOO_HIGH            // Too high gas fee
    }

    // Trade event fired when a trade is executed
    event Trade(
        address takerTokenBuy, uint256 takerAmountBuy,
        address takerTokenSell, uint256 takerAmountSell,
        address maker, address indexed taker,
        uint256 makerFee, uint256 takerFee,
        uint256 makerAmountTaken, uint256 takerAmountTaken,
        bytes32 indexed makerOrderHash, bytes32 indexed takerOrderHash
    );

    // Deposit event fired when a deposit took place
    event Deposit(address indexed token, address indexed user, uint256 amount, uint256 balance);

    // Withdraw event fired when a withdrawal was executed
    event Withdraw(address indexed token, address indexed user, uint256 amount, uint256 balance, uint256 withdrawFee);
    
    // Fee change event
    event FeeChange(uint256 indexed makerFee, uint256 indexed takerFee);

    // Allow futuresContract 
    event AllowFuturesContract(address futuresContract, address user);


    // Log event, logs errors in contract execution (used for debugging)
    event LogError(uint8 indexed errorId, bytes32 indexed makerOrderHash, bytes32 indexed takerOrderHash);
    event LogUint(uint8 id, uint256 value);
    event LogBool(uint8 id, bool value);
    event LogAddress(uint8 id, address value);

    // Change inactivity release period event
    event InactivityReleasePeriodChange(uint256 value);

    // Order cancelation event
    event CancelOrder(
        bytes32 indexed cancelHash,
        bytes32 indexed orderHash,
        address indexed user,
        address tokenSell,
        uint256 amountSell,
        uint256 cancelFee
    );

    // Sets the inactivity period before a user can withdraw funds manually
    function setInactivityReleasePeriod(uint256 expiry) onlyOwner returns (bool success) {
        if (expiry > 1000000) throw;
        inactivityReleasePeriod = expiry;

        emit InactivityReleasePeriodChange(expiry);
        return true;
    }

    // Constructor function, initializes the contract and sets the core variables
    function Exchange(address feeAccount_, uint256 makerFee_, uint256 takerFee_, uint256 inactivityReleasePeriod_) {
        owner = msg.sender;
        feeAccount = feeAccount_;
        inactivityReleasePeriod = inactivityReleasePeriod_;
        makerFee = makerFee_;
        takerFee = takerFee_;
    }

    // Changes the fees
    function setFees(uint256 makerFee_, uint256 takerFee_) onlyOwner {
        require(makerFee_ < 10 finney && takerFee_ < 10 finney); // The fees cannot be set higher then 1%
        makerFee = makerFee_;
        takerFee = takerFee_;

        emit FeeChange(makerFee, takerFee);
    }

    



    function updateBalanceAndReserve (address token, address user, uint256 balance, uint256 reserve) private
    {
        uint256 character = uint256(balance);
        character |= reserve<<128;

        balances[token][user] = character;
    }

    function updateBalance (address token, address user, uint256 balance) private returns (bool)
    {
        uint256 character = uint256(balance);
        character |= getReserve(token, user)<<128;

        balances[token][user] = character;
        return true;
    }

    function updateReserve (address token, address user, uint256 reserve) private
    {
        uint256 character = uint256(balanceOf(token, user));
        character |= reserve<<128;

        balances[token][user] = character;
    }

    function decodeBalanceAndReserve (address token, address user) returns (uint256[2])
    {
        uint256 character = balances[token][user];
        uint256 balance = uint256(uint128(character));
        uint256 reserve = uint256(uint128(character>>128));

        return [balance, reserve];
    }

    function futuresContractAllowed (address futuresContract, address user) returns (bool)
    {
        if (fistFuturesContract == futuresContract) return true;
        if (userAllowedFuturesContracts[user][futuresContract] == true) return true;
        if (futuresContractsAddedBlock[futuresContract] < userFirstDeposits[user]) return true;

        return false;
    }

    // Returns the balance of a specific token for a specific user
    function balanceOf(address token, address user) view returns (uint256) {
        //return tokens[token][user];
        return decodeBalanceAndReserve(token, user)[0];
    }

    // Returns the reserved amound of token for user
    function getReserve(address token, address user) public view returns (uint256) { 
        //return reserve[token][user];  
        return decodeBalanceAndReserve(token, user)[1];
    }

    // Sets reserved amount for specific token and user (can only be called by futures contract)
    function setReserve(address token, address user, uint256 amount) onlyFuturesContract returns (bool success) { 
        if (!futuresContractAllowed(msg.sender, user)) throw;
        updateReserve(token, user, amount);
        return true; 
    }

    function setBalance(address token, address user, uint256 amount) onlyFuturesContract returns (bool success)     {
        if (msg.sender != fistFuturesContract) throw;
        updateBalance(token, user, amount);
        return true;
        
    }

    function subBalanceAddReserve(address token, address user, uint256 subBalance, uint256 addReserve) onlyFuturesContract returns (bool)
    {
        if (msg.sender != fistFuturesContract) throw;
        updateBalanceAndReserve(token, user, safeSub(balanceOf(token, user), subBalance), safeAdd(getReserve(token, user), addReserve));
    }

    function addBalanceSubReserve(address token, address user, uint256 addBalance, uint256 subReserve) onlyFuturesContract returns (bool)
    {
        if (msg.sender != fistFuturesContract) throw;
        updateBalanceAndReserve(token, user, safeAdd(balanceOf(token, user), addBalance), safeSub(getReserve(token, user), subReserve));
    }

    function addBalanceAddReserve(address token, address user, uint256 addBalance, uint256 addReserve) onlyFuturesContract returns (bool)
    {
        if (msg.sender != fistFuturesContract) throw;
        updateBalanceAndReserve(token, user, safeAdd(balanceOf(token, user), addBalance), safeAdd(getReserve(token, user), addReserve));
    }

    function subBalanceSubReserve(address token, address user, uint256 subBalance, uint256 subReserve) onlyFuturesContract returns (bool)
    {
        if (msg.sender != fistFuturesContract) throw;
        updateBalanceAndReserve(token, user, safeSub(balanceOf(token, user), subBalance), safeSub(getReserve(token, user), subReserve));
    }

    // Returns the available balance of a specific token for a specific user
    function availableBalanceOf(address token, address user) view returns (uint256) {
        return safeSub(balanceOf(token, user), getReserve(token, user));
    }

    // Returns the inactivity release perios
    function getInactivityReleasePeriod() view returns (uint256)
    {
        return inactivityReleasePeriod;
    }

    // Increases the user balance
    function addBalance(address token, address user, uint256 amount) private
    {
        updateBalance(token, user, safeAdd(balanceOf(token, user), amount));
    }

    // Decreases user balance
    function subBalance(address token, address user, uint256 amount) private
    {
        if (availableBalanceOf(token, user) < amount) throw; 
        updateBalance(token, user, safeSub(balanceOf(token, user), amount));
    }


    // Deposit ETH to contract
    function deposit() payable {
        //tokens[address(0)][msg.sender] = safeAdd(tokens[address(0)][msg.sender], msg.value); // adds the deposited amount to user balance
        addBalance(address(0), msg.sender, msg.value); // adds the deposited amount to user balance
        if (userFirstDeposits[msg.sender] == 0) userFirstDeposits[msg.sender] = block.number;
        lastActiveTransaction[msg.sender] = block.number; // sets the last activity block for the user
        emit Deposit(address(0), msg.sender, msg.value, balanceOf(address(0), msg.sender)); // fires the deposit event
    }

    // Deposit ETH to contract for a user
    function depositForUser(address user) payable {
        //tokens[address(0)][msg.sender] = safeAdd(tokens[address(0)][msg.sender], msg.value); // adds the deposited amount to user balance
        addBalance(address(0), user, msg.value); // adds the deposited amount to user balance
        if (userFirstDeposits[user] == 0) userFirstDeposits[user] = block.number;
        lastActiveTransaction[user] = block.number; // sets the last activity block for the user
        emit Deposit(address(0), user, msg.value, balanceOf(address(0), user)); // fires the deposit event
    }

    // Deposit token to contract
    function depositToken(address token, uint128 amount) {
        //tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount); // adds the deposited amount to user balance
        //if (amount != uint128(amount) || safeAdd(amount, balanceOf(token, msg.sender)) != uint128(amount)) throw;
        addBalance(token, msg.sender, amount); // adds the deposited amount to user balance

        if (userFirstDeposits[msg.sender] == 0) userFirstDeposits[msg.sender] = block.number;
        lastActiveTransaction[msg.sender] = block.number; // sets the last activity block for the user
        if (!Token(token).transferFrom(msg.sender, this, amount)) throw; // attempts to transfer the token to this contract, if fails throws an error
        emit Deposit(token, msg.sender, amount, balanceOf(token, msg.sender)); // fires the deposit event
    }

    // Deposit token to contract for a user
    function depositToken(address token, uint128 amount, address user) {
        //tokens[token][msg.sender] = safeAdd(tokens[token][msg.sender], amount); // adds the deposited amount to user balance
        //if (amount != uint128(amount) || safeAdd(amount, balanceOf(token, msg.sender)) != uint128(amount)) throw;
        addBalance(token, user, amount); // adds the deposited amount to user balance

        if (userFirstDeposits[user] == 0) userFirstDeposits[user] = block.number;
        lastActiveTransaction[user] = block.number; // sets the last activity block for the user
        if (!Token(token).transferFrom(msg.sender, this, amount)) throw; // attempts to transfer the token to this contract, if fails throws an error
        emit Deposit(token, user, amount, balanceOf(token, user)); // fires the deposit event
    }

    function withdraw(address token, uint256 amount) returns (bool success) {
        //if (safeSub(block.number, lastActiveTransaction[msg.sender]) < inactivityReleasePeriod) throw; // checks if the inactivity period has passed
        //if (tokens[token][msg.sender] < amount) throw; // checks that user has enough balance
        if (availableBalanceOf(token, msg.sender) < amount) throw;

        //tokens[token][msg.sender] = safeSub(tokens[token][msg.sender], amount); 
        subBalance(token, msg.sender, amount); // subtracts the withdrawed amount from user balance

        if (token == address(0)) { // checks if withdrawal is a token or ETH, ETH has address 0x00000... 
            if (!msg.sender.send(amount)) throw; // send ETH
        } else {
            if (!Token(token).transfer(msg.sender, amount)) throw; // Send token
        }
        emit Withdraw(token, msg.sender, amount, balanceOf(token, msg.sender), 0); // fires the Withdraw event
    }

    function userAllowFuturesContract(address futuresContract)
    {
        if (!futuresContracts[futuresContract]) throw;
        userAllowedFuturesContracts[msg.sender][futuresContract] = true;

        emit AllowFuturesContract(futuresContract, msg.sender);
    }

    function allowFuturesContractForUser(address futuresContract, address user, uint8 v, bytes32 r, bytes32 s) onlyAdmin
    {
        if (!futuresContracts[futuresContract]) throw;
        bytes32 hash = keccak256(this, 'allow', futuresContract, user); 
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", hash), v, r, s) != user) throw; // checks that the provided signature is valid
        userAllowedFuturesContracts[user][futuresContract] = true;

        emit AllowFuturesContract(futuresContract, user);
    }    

    // Withdrawal function used by the server to execute withdrawals
    function adminWithdraw(
        address token, // the address of the token to be withdrawn
        uint256 amount, // the amount to be withdrawn
        address user, // address of the user
        uint256 nonce, // nonce to make the request unique
        uint8 v, // part of user signature
        bytes32 r, // part of user signature
        bytes32 s, // part of user signature
        uint256 feeWithdrawal // the transaction gas fee that will be deducted from the user balance
    ) onlyAdmin returns (bool success) {
        bytes32 hash = keccak256(this, token, amount, user, nonce); // creates the hash for the withdrawal request
        if (withdrawn[hash]) throw; // checks if the withdrawal was already executed, if true, throws an error
        withdrawn[hash] = true; // sets the withdrawal as executed
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", hash), v, r, s) != user) throw; // checks that the provided signature is valid
        if (feeWithdrawal > 50 finney) feeWithdrawal = 50 finney; // checks that the gas fee is not higher than 0.05 ETH


        //if (tokens[token][user] < amount) throw; // checks that user has enough balance
        if (availableBalanceOf(token, user) < amount) throw; // checks that user has enough balance

        //tokens[token][user] = safeSub(tokens[token][user], amount); // subtracts the withdrawal amount from the user balance
        subBalance(token, user, amount); // subtracts the withdrawal amount from the user balance

        //tokens[address(0)][user] = safeSub(tokens[address(0x0)][user], feeWithdrawal); // subtracts the gas fee from the user ETH balance
        subBalance(address(0), user, feeWithdrawal); // subtracts the gas fee from the user ETH balance

        //tokens[address(0)][feeAccount] = safeAdd(tokens[address(0)][feeAccount], feeWithdrawal); // moves the gas fee to the feeAccount
        addBalance(address(0), feeAccount, feeWithdrawal); // moves the gas fee to the feeAccount

        if (token == address(0)) { // checks if the withdrawal is in ETH or Tokens
            if (!user.send(amount)) throw; // sends ETH
        } else {
            if (!Token(token).transfer(user, amount)) throw; // sends tokens
        }
        lastActiveTransaction[user] = block.number; // sets last user activity block
        emit Withdraw(token, user, amount, balanceOf(token, user), feeWithdrawal); // fires the withdraw event
    }

    function batchAdminWithdraw(
        address[] token, // the address of the token to be withdrawn
        uint256[] amount, // the amount to be withdrawn
        address[] user, // address of the user
        uint256[] nonce, // nonce to make the request unique
        uint8[] v, // part of user signature
        bytes32[] r, // part of user signature
        bytes32[] s, // part of user signature
        uint256[] feeWithdrawal // the transaction gas fee that will be deducted from the user balance
    ) onlyAdmin 
    {
        for (uint i = 0; i < amount.length; i++) {
            adminWithdraw(
                token[i],
                amount[i],
                user[i],
                nonce[i],
                v[i],
                r[i],
                s[i],
                feeWithdrawal[i]
            );
        }
    }

 

    function getMakerTakerBalances(address token, address maker, address taker) view returns (uint256[4])
    {
        return [
            balanceOf(token, maker),
            balanceOf(token, taker),
            getReserve(token, maker),
            getReserve(token, taker)
        ];
    }

    function getUserBalances(address token, address user) view returns (uint256[2])
    {
        return [
            balanceOf(token, user),
            getReserve(token, user)
        ];
    }

    

    // Structure that holds order values, used inside the trade() function
    struct OrderPair {
        uint256 makerAmountBuy;     // amount being bought by the maker
        uint256 makerAmountSell;    // amount being sold by the maker
        uint256 makerNonce;         // maker order nonce, makes the order unique
        uint256 takerAmountBuy;     // amount being bought by the taker
        uint256 takerAmountSell;    // amount being sold by the taker
        uint256 takerNonce;         // taker order nonce
        uint256 takerGasFee;        // taker gas fee, taker pays the gas
        uint256 takerIsBuying;      // true/false taker is the buyer

        address makerTokenBuy;      // token bought by the maker
        address makerTokenSell;     // token sold by the maker
        address maker;              // address of the maker
        address takerTokenBuy;      // token bought by the taker
        address takerTokenSell;     // token sold by the taker
        address taker;              // address of the taker

        bytes32 makerOrderHash;     // hash of the maker order
        bytes32 takerOrderHash;     // has of the taker order
    }

    // Structure that holds trade values, used inside the trade() function
    struct TradeValues {
        uint256 qty;                // amount to be trade
        uint256 invQty;             // amount to be traded in the opposite token
        uint256 makerAmountTaken;   // final amount taken by the maker
        uint256 takerAmountTaken;   // final amount taken by the taker
    }

    // Trades balances between user accounts
    function trade(
        uint8[2] v,
        bytes32[4] rs,
        uint256[8] tradeValues,
        address[6] tradeAddresses
    ) onlyAdmin returns (uint filledTakerTokenAmount)
    {

        /* tradeValues
          [0] makerAmountBuy
          [1] makerAmountSell
          [2] makerNonce
          [3] takerAmountBuy
          [4] takerAmountSell
          [5] takerNonce
          [6] takerGasFee
          [7] takerIsBuying

          tradeAddresses
          [0] makerTokenBuy
          [1] makerTokenSell
          [2] maker
          [3] takerTokenBuy
          [4] takerTokenSell
          [5] taker
        */

        OrderPair memory t  = OrderPair({
            makerAmountBuy  : tradeValues[0],
            makerAmountSell : tradeValues[1],
            makerNonce      : tradeValues[2],
            takerAmountBuy  : tradeValues[3],
            takerAmountSell : tradeValues[4],
            takerNonce      : tradeValues[5],
            takerGasFee     : tradeValues[6],
            takerIsBuying   : tradeValues[7],

            makerTokenBuy   : tradeAddresses[0],
            makerTokenSell  : tradeAddresses[1],
            maker           : tradeAddresses[2],
            takerTokenBuy   : tradeAddresses[3],
            takerTokenSell  : tradeAddresses[4],
            taker           : tradeAddresses[5],

            //                                tokenBuy           amountBuy       tokenSell          amountSell      nonce           user
            makerOrderHash  : keccak256(this, tradeAddresses[0], tradeValues[0], tradeAddresses[1], tradeValues[1], tradeValues[2], tradeAddresses[2]),
            takerOrderHash  : keccak256(this, tradeAddresses[3], tradeValues[3], tradeAddresses[4], tradeValues[4], tradeValues[5], tradeAddresses[5])
        });

        // Checks the signature for the maker order
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", t.makerOrderHash), v[0], rs[0], rs[1]) != t.maker)
        {
            emit LogError(uint8(Errors.INVLID_SIGNATURE), t.makerOrderHash, t.takerOrderHash);
            return 0;
        }
       
       // Checks the signature for the taker order
        if (ecrecover(keccak256("\x19Ethereum Signed Message:\n32", t.takerOrderHash), v[1], rs[2], rs[3]) != t.taker)
        {
            emit LogError(uint8(Errors.INVLID_SIGNATURE), t.makerOrderHash, t.takerOrderHash);
            return 0;
        }


        // Checks that orders trade the right tokens
        if (t.makerTokenBuy != t.takerTokenSell || t.makerTokenSell != t.takerTokenBuy)
        {
            emit LogError(uint8(Errors.TOKENS_DONT_MATCH), t.makerOrderHash, t.takerOrderHash);
            return 0;
        } // tokens don't match


        // Cheks that gas fee is not higher than 10%
        if (t.takerGasFee > 100 finney)
        {
            emit LogError(uint8(Errors.GAS_TOO_HIGH), t.makerOrderHash, t.takerOrderHash);
            return 0;
        } // takerGasFee too high


        // Checks that the prices match.
        // Taker always pays the maker price. This part checks that the taker price is as good or better than the maker price
        if (!(
        (t.takerIsBuying == 0 && safeMul(t.makerAmountSell, 1e18) / t.makerAmountBuy >= safeMul(t.takerAmountBuy, 1e18) / t.takerAmountSell)
        ||
        (t.takerIsBuying > 0 && safeMul(t.makerAmountBuy, 1e18) / t.makerAmountSell <= safeMul(t.takerAmountSell, 1e18) / t.takerAmountBuy)
        ))
        {
            emit LogError(uint8(Errors.INVLID_PRICE), t.makerOrderHash, t.takerOrderHash);
            return 0; // prices don't match
        }

        // Initializing trade values structure
        TradeValues memory tv = TradeValues({
            qty                 : 0,
            invQty              : 0,
            makerAmountTaken    : 0,
            takerAmountTaken    : 0
        });
        
        // maker buy, taker sell
        if (t.takerIsBuying == 0)
        {
            // traded quantity is the smallest quantity between the maker and the taker, takes into account amounts already filled on the orders
            tv.qty = min(safeSub(t.makerAmountBuy, orderFills[t.makerOrderHash]), safeSub(t.takerAmountSell, safeMul(orderFills[t.takerOrderHash], t.takerAmountSell) / t.takerAmountBuy));
            if (tv.qty == 0)
            {
                // order was already filled
                emit LogError(uint8(Errors.ORDER_ALREADY_FILLED), t.makerOrderHash, t.takerOrderHash);
                return 0;
            }

            // the traded quantity in opposite token terms
            tv.invQty = safeMul(tv.qty, t.makerAmountSell) / t.makerAmountBuy;

           
            // take fee from Token balance
            tv.makerAmountTaken                         = safeSub(tv.qty, safeMul(tv.qty, makerFee) / (1e18));                                       // net amount received by maker, excludes maker fee
            //tokens[t.makerTokenBuy][feeAccount]         = safeAdd(tokens[t.makerTokenBuy][feeAccount],      safeMul(tv.qty, makerFee) / (1 ether));     // add maker fee to feeAccount
            addBalance(t.makerTokenBuy, feeAccount, safeMul(tv.qty, makerFee) / (1e18)); // add maker fee to feeAccount
        

        
            // take fee from Token balance
            tv.takerAmountTaken                         = safeSub(safeSub(tv.invQty, safeMul(tv.invQty, takerFee) / (1e18)), safeMul(tv.invQty, t.takerGasFee) / (1e18));                             // amount taken from taker minus taker fee
            //tokens[t.takerTokenBuy][feeAccount]         = safeAdd(tokens[t.takerTokenBuy][feeAccount], safeAdd(safeMul(tv.invQty, takerFee) / (1 ether), safeMul(tv.invQty, t.takerGasFee) / (1 ether)));   // add taker fee to feeAccount
            addBalance(t.takerTokenBuy, feeAccount, safeAdd(safeMul(tv.invQty, takerFee) / (1e18), safeMul(tv.invQty, t.takerGasFee) / (1e18))); // add taker fee to feeAccount


            //tokens[t.makerTokenSell][t.maker]           = safeSub(tokens[t.makerTokenSell][t.maker],           tv.invQty);                              // subtract sold token amount from maker balance
            subBalance(t.makerTokenSell, t.maker, tv.invQty); // subtract sold token amount from maker balance

            //tokens[t.makerTokenBuy][t.maker]            = safeAdd(tokens[t.makerTokenBuy][t.maker],            tv.makerAmountTaken);                    // add bought token amount to maker
            addBalance(t.makerTokenBuy, t.maker, tv.makerAmountTaken); // add bought token amount to maker

            //tokens[t.makerTokenBuy][tv.makerReferrer]   = safeAdd(tokens[t.makerTokenBuy][tv.makerReferrer],   safeMul(tv.qty,    makerAffiliateFee) / (1 ether)); // add affiliate commission to maker affiliate balance


            //tokens[t.takerTokenSell][t.taker]           = safeSub(tokens[t.takerTokenSell][t.taker],           tv.qty);                                 // subtract the sold token amount from taker
            subBalance(t.takerTokenSell, t.taker, tv.qty); // subtract the sold token amount from taker

            //tokens[t.takerTokenBuy][t.taker]            = safeAdd(tokens[t.takerTokenBuy][t.taker],            tv.takerAmountTaken);                    // amount received by taker, excludes taker fee
            //tokens[t.takerTokenBuy][tv.takerReferrer]   = safeAdd(tokens[t.takerTokenBuy][tv.takerReferrer],   safeMul(tv.invQty, takerAffiliateFee) / (1 ether)); // add affiliate commission to taker affiliate balance
            addBalance(t.takerTokenBuy, t.taker, tv.takerAmountTaken); // amount received by taker, excludes taker fee
        
            orderFills[t.makerOrderHash]                = safeAdd(orderFills[t.makerOrderHash], tv.qty);                                                // increase the maker order filled amount
            orderFills[t.takerOrderHash]                = safeAdd(orderFills[t.takerOrderHash], safeMul(tv.qty, t.takerAmountBuy) / t.takerAmountSell); // increase the taker order filled amount
            lastActiveTransaction[t.maker]              = block.number; // set last activity block number for maker
            lastActiveTransaction[t.taker]              = block.number; // set last activity block number for taker

            // fire Trade event
            emit Trade(
                t.takerTokenBuy, tv.qty,
                t.takerTokenSell, tv.invQty,
                t.maker, t.taker,
                makerFee, takerFee,
                tv.makerAmountTaken , tv.takerAmountTaken,
                t.makerOrderHash, t.takerOrderHash
            );
            return tv.qty;
        }
        // maker sell, taker buy
        else
        {
            // traded quantity is the smallest quantity between the maker and the taker, takes into account amounts already filled on the orders
            tv.qty = min(safeSub(t.makerAmountSell,  safeMul(orderFills[t.makerOrderHash], t.makerAmountSell) / t.makerAmountBuy), safeSub(t.takerAmountBuy, orderFills[t.takerOrderHash]));
            if (tv.qty == 0)
            {
                // order was already filled
                emit LogError(uint8(Errors.ORDER_ALREADY_FILLED), t.makerOrderHash, t.takerOrderHash);
                return 0;
            }            

            // the traded quantity in opposite token terms
            tv.invQty = safeMul(tv.qty, t.makerAmountBuy) / t.makerAmountSell;
            
           
            // take fee from ETH balance
            tv.makerAmountTaken                         = safeSub(tv.invQty, safeMul(tv.invQty, makerFee) / 1e18);                                 // net amount received by maker, excludes maker fee
            //tokens[t.makerTokenBuy][feeAccount]         = safeAdd(tokens[t.makerTokenBuy][feeAccount],      safeMul(tv.invQty, makerFee) / (1 ether));  // add maker fee to feeAccount
            addBalance(t.makerTokenBuy, feeAccount, safeMul(tv.invQty, makerFee) / 1e18); // add maker fee to feeAccount
     

            // process fees for taker
            
            // take fee from ETH balance
            tv.takerAmountTaken                         = safeSub(safeSub(tv.qty, safeMul(tv.qty, takerFee) / 1e18), safeMul(tv.qty, t.takerGasFee) / 1e18);                                  // amount taken from taker minus taker fee
            //tokens[t.takerTokenBuy][feeAccount]         = safeAdd(tokens[t.takerTokenBuy][feeAccount], safeAdd(safeMul(tv.qty, takerFee) / (1 ether), safeMul(tv.qty, t.takerGasFee) / (1 ether)));     // add taker fee to feeAccount
            addBalance(t.takerTokenBuy, feeAccount, safeAdd(safeMul(tv.qty, takerFee) / 1e18, safeMul(tv.qty, t.takerGasFee) / 1e18)); // add taker fee to feeAccount



            //tokens[t.makerTokenSell][t.maker]           = safeSub(tokens[t.makerTokenSell][t.maker],           tv.qty); // subtract sold token amount from maker balance
            subBalance(t.makerTokenSell, t.maker, tv.qty); // subtract sold token amount from maker balance

            //tv.makerAmountTaken                         = safeSub(tv.invQty, safeMul(tv.invQty, makerFee) / (1 ether));   // net amount received by maker, excludes maker fee
            //tokens[t.makerTokenBuy][t.maker]            = safeAdd(tokens[t.makerTokenBuy][t.maker],            tv.makerAmountTaken); // add bought token amount to maker
            addBalance(t.makerTokenBuy, t.maker, tv.makerAmountTaken); // add bought token amount to maker

            //tokens[t.makerTokenBuy][tv.makerReferrer]   = safeAdd(tokens[t.makerTokenBuy][tv.makerReferrer],   safeMul(tv.invQty, makerAffiliateFee) / (1 ether)); // add affiliate commission to maker affiliate balance

            //tokens[t.takerTokenSell][t.taker]           = safeSub(tokens[t.takerTokenSell][t.taker],           tv.invQty); // subtract the sold token amount from taker
            subBalance(t.takerTokenSell, t.taker, tv.invQty);

            //tv.takerAmountTaken                         = safeSub(safeSub(tv.qty,    safeMul(tv.qty, takerFee) / (1 ether)), safeMul(tv.qty, t.takerGasFee) / (1 ether)); // amount taken from taker minus taker fee
            //tokens[t.takerTokenBuy][t.taker]            = safeAdd(tokens[t.takerTokenBuy][t.taker],            tv.takerAmountTaken); // amount received by taker, excludes taker fee
            addBalance(t.takerTokenBuy, t.taker, tv.takerAmountTaken); // amount received by taker, excludes taker fee

            //tokens[t.takerTokenBuy][tv.takerReferrer]   = safeAdd(tokens[t.takerTokenBuy][tv.takerReferrer],   safeMul(tv.qty,    takerAffiliateFee) / (1 ether)); // add affiliate commission to taker affiliate balance

            //tokens[t.makerTokenBuy][feeAccount]     = safeAdd(tokens[t.makerTokenBuy][feeAccount],      safeMul(tv.invQty, safeSub(makerFee, makerAffiliateFee)) / (1 ether)); // add maker fee excluding affiliate commission to feeAccount
            //tokens[t.takerTokenBuy][feeAccount]     = safeAdd(tokens[t.takerTokenBuy][feeAccount],      safeAdd(safeMul(tv.qty,    safeSub(takerFee, takerAffiliateFee)) / (1 ether), safeMul(tv.qty, t.takerGasFee) / (1 ether))); // add taker fee excluding affiliate commission to feeAccount

            orderFills[t.makerOrderHash]            = safeAdd(orderFills[t.makerOrderHash], tv.invQty); // increase the maker order filled amount
            orderFills[t.takerOrderHash]            = safeAdd(orderFills[t.takerOrderHash], tv.qty);  // increase the taker order filled amount
            lastActiveTransaction[t.maker]          = block.number; // set last activity block number for maker
            lastActiveTransaction[t.taker]          = block.number; // set last activity block number for taker

            // fire Trade event
            emit Trade(
                t.takerTokenBuy, tv.qty,
                t.takerTokenSell, tv.invQty,
                t.maker, t.taker,
                makerFee, takerFee,
                tv.makerAmountTaken , tv.takerAmountTaken,
                t.makerOrderHash, t.takerOrderHash
            );
            return tv.qty;
        }
    }


    // Executes multiple trades in one transaction, saves gas fees
    function batchOrderTrade(
        uint8[2][] v,
        bytes32[4][] rs,
        uint256[8][] tradeValues,
        address[6][] tradeAddresses
    ) onlyAdmin
    {
        for (uint i = 0; i < tradeAddresses.length; i++) {
            trade(
                v[i],
                rs[i],
                tradeValues[i],
                tradeAddresses[i]
            );
        }
    }

    // Cancels order by setting amount filled to toal order amount
    function cancelOrder(
		/*
		[0] orderV
		[1] cancelV
		*/
	    uint8[2] v,

		/*
		[0] orderR
		[1] orderS
		[2] cancelR
		[3] cancelS
		*/
	    bytes32[4] rs,

		/*
		[0] orderAmountBuy
		[1] orderAmountSell
		[2] orderNonce
		[3] cancelNonce
		[4] cancelFee
		*/
		uint256[5] cancelValues,

		/*
		[0] orderTokenBuy
		[1] orderTokenSell
		[2] orderUser
		[3] cancelUser
		*/
		address[4] cancelAddresses
    ) onlyAdmin {
        // Order values should be valid and signed by order owner
        bytes32 orderHash = keccak256(
	        this, cancelAddresses[0], cancelValues[0], cancelAddresses[1],
	        cancelValues[1], cancelValues[2], cancelAddresses[2]
        );
        require(ecrecover(keccak256("\x19Ethereum Signed Message:\n32", orderHash), v[0], rs[0], rs[1]) == cancelAddresses[2]);

        // Cancel action should be signed by order owner
        bytes32 cancelHash = keccak256(this, orderHash, cancelAddresses[3], cancelValues[3]);
        require(ecrecover(keccak256("\x19Ethereum Signed Message:\n32", cancelHash), v[1], rs[2], rs[3]) == cancelAddresses[3]);

        // Order owner should be the same as cancel's initiator
        require(cancelAddresses[2] == cancelAddresses[3]);

        // Do not allow to cancel already canceled or filled orders
        require(orderFills[orderHash] != cancelValues[0]);

        // Cancel gas fee cannot exceed 0.05 ETh
        if (cancelValues[4] > 50 finney) {
            cancelValues[4] = 50 finney;
        }

        // Take cancel fee
        // This operation throws an error if fee amount is greater than the user balance
        //tokens[address(0)][cancelAddresses[3]] = safeSub(tokens[address(0)][cancelAddresses[3]], cancelValues[4]);
        subBalance(address(0), cancelAddresses[3], cancelValues[4]);

        // Cancel order by setting amount filled to total order value, i.e. making the order filled
        orderFills[orderHash] = cancelValues[0];

        // Fire cancel order event
        emit CancelOrder(cancelHash, orderHash, cancelAddresses[3], cancelAddresses[1], cancelValues[1], cancelValues[4]);
    }

    // Returns the smaller of two values
    function min(uint a, uint b) private pure returns (uint) {
        return a < b ? a : b;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"futuresContracts","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"assertion","type":"bool"}],"name":"assert","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"makerFee_","type":"uint256"},{"name":"takerFee_","type":"uint256"}],"name":"setFees","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"subBalance","type":"uint256"},{"name":"addReserve","type":"uint256"}],"name":"subBalanceAddReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"},{"name":"isFuturesContract","type":"bool"}],"name":"setFuturesContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"},{"name":"user","type":"address"},{"name":"nonce","type":"uint256"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"},{"name":"feeWithdrawal","type":"uint256"}],"name":"adminWithdraw","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastActiveTransaction","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"},{"name":"user","type":"address"}],"name":"futuresContractAllowed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"EtmTokenAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"withdrawn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"amount","type":"uint256"}],"name":"setReserve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"admins","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"takerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"admin","type":"address"},{"name":"isAdmin","type":"bool"}],"name":"setAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"subBalance","type":"uint256"},{"name":"subReserve","type":"uint256"}],"name":"subBalanceSubReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"addBalance","type":"uint256"},{"name":"subReserve","type":"uint256"}],"name":"addBalanceSubReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint128"},{"name":"user","type":"address"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"feeAccount","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"depositForUser","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address[]"},{"name":"amount","type":"uint256[]"},{"name":"user","type":"address[]"},{"name":"nonce","type":"uint256[]"},{"name":"v","type":"uint8[]"},{"name":"r","type":"bytes32[]"},{"name":"s","type":"bytes32[]"},{"name":"feeWithdrawal","type":"uint256[]"}],"name":"batchAdminWithdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8[2][]"},{"name":"rs","type":"bytes32[4][]"},{"name":"tradeValues","type":"uint256[8][]"},{"name":"tradeAddresses","type":"address[6][]"}],"name":"batchOrderTrade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8[2]"},{"name":"rs","type":"bytes32[4]"},{"name":"cancelValues","type":"uint256[5]"},{"name":"cancelAddresses","type":"address[4]"}],"name":"cancelOrder","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"getOwner","outputs":[{"name":"out","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"maker","type":"address"},{"name":"taker","type":"address"}],"name":"getMakerTakerBalances","outputs":[{"name":"","type":"uint256[4]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"}],"name":"userAllowFuturesContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeSub","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInactivityReleasePeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"addBalance","type":"uint256"},{"name":"addReserve","type":"uint256"}],"name":"addBalanceAddReserve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"userFirstDeposits","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint128"}],"name":"depositToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"},{"name":"amount","type":"uint256"}],"name":"setBalance","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"balances","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getUserBalances","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"getReserve","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"decodeBalanceAndReserve","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeMul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"deposit","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"futuresContract","type":"address"},{"name":"user","type":"address"},{"name":"v","type":"uint8"},{"name":"r","type":"bytes32"},{"name":"s","type":"bytes32"}],"name":"allowFuturesContractForUser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"v","type":"uint8[2]"},{"name":"rs","type":"bytes32[4]"},{"name":"tradeValues","type":"uint256[8]"},{"name":"tradeAddresses","type":"address[6]"}],"name":"trade","outputs":[{"name":"filledTakerTokenAmount","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"expiry","type":"uint256"}],"name":"setInactivityReleasePeriod","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"safeAdd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"futuresContractsAddedBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"inactivityReleasePeriod","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"withdraw","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"orderFills","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"},{"name":"user","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"userAllowedFuturesContracts","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"makerFee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fistFuturesContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"feeAccount_","type":"address"},{"name":"makerFee_","type":"uint256"},{"name":"takerFee_","type":"uint256"},{"name":"inactivityReleasePeriod_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":false,"stateMutability":"nonpayable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"futuresContract","type":"address"},{"indexed":false,"name":"isFuturesContract","type":"bool"}],"name":"SetFuturesContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"SetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"takerTokenBuy","type":"address"},{"indexed":false,"name":"takerAmountBuy","type":"uint256"},{"indexed":false,"name":"takerTokenSell","type":"address"},{"indexed":false,"name":"takerAmountSell","type":"uint256"},{"indexed":false,"name":"maker","type":"address"},{"indexed":true,"name":"taker","type":"address"},{"indexed":false,"name":"makerFee","type":"uint256"},{"indexed":false,"name":"takerFee","type":"uint256"},{"indexed":false,"name":"makerAmountTaken","type":"uint256"},{"indexed":false,"name":"takerAmountTaken","type":"uint256"},{"indexed":true,"name":"makerOrderHash","type":"bytes32"},{"indexed":true,"name":"takerOrderHash","type":"bytes32"}],"name":"Trade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"token","type":"address"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"},{"indexed":false,"name":"withdrawFee","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"makerFee","type":"uint256"},{"indexed":true,"name":"takerFee","type":"uint256"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"futuresContract","type":"address"},{"indexed":false,"name":"user","type":"address"}],"name":"AllowFuturesContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"errorId","type":"uint8"},{"indexed":true,"name":"makerOrderHash","type":"bytes32"},{"indexed":true,"name":"takerOrderHash","type":"bytes32"}],"name":"LogError","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint8"},{"indexed":false,"name":"value","type":"uint256"}],"name":"LogUint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint8"},{"indexed":false,"name":"value","type":"bool"}],"name":"LogBool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"id","type":"uint8"},{"indexed":false,"name":"value","type":"address"}],"name":"LogAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"value","type":"uint256"}],"name":"InactivityReleasePeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"cancelHash","type":"bytes32"},{"indexed":true,"name":"orderHash","type":"bytes32"},{"indexed":true,"name":"user","type":"address"},{"indexed":false,"name":"tokenSell","type":"address"},{"indexed":false,"name":"amountSell","type":"uint256"},{"indexed":false,"name":"cancelFee","type":"uint256"}],"name":"CancelOrder","type":"event"}]

0x608060405234801561001057600080fd5b50604051608080613554833981016040908152815160208301519183015160609093015160008054600160a060020a0319908116331790915560098054600160a060020a039094169390911692909217909155600c55600e55600f556134d98061007b6000396000f3006080604052600436106102715763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302ce8c4d81146102835780630674763c146102b85780630b78f9c0146102d457806313af4035146102ef5780631e452a901461031057806320a0851f1461033d5780632295115b14610363578063254dcfe2146103a05780632a7575ee146103d35780632b197ef3146103fa57806337fd5940146104215780633823d66c146104525780633aa9f9911461046a578063429b62e51461049457806343f0179b146104b55780634b0bddd2146104ca5780634e5978e1146104f05780635278366a1461051d578063600f30c31461054a57806365e17c9d1461057e5780636a523c5e146105935780637869a950146105a757806378f767791461078b5780637b68be8114610961578063893d20e814610a135780638da5cb5b14610a2857806392c6061114610a3d5780639dbe267014610aa2578063a293d1e814610ac3578063a7a278b114610ade578063a874fe2f14610af3578063a99463bc14610b20578063ad895d7e14610b41578063b5c9cbbe14610b6e578063c23f001f14610b98578063c719e57f14610bbf578063cbc3ab5314610bfd578063ce4ff5e914610c24578063d05c78da14610c4b578063d0e30db014610c66578063d150126314610c6e578063d305785914610ca1578063dd93c74a14610d54578063e6cb901314610d6c578063e8689bb814610d87578063f31174ee14610da8578063f3fef3a314610dbd578063f7213db614610de1578063f7888aec14610df9578063fc5ef05714610e20578063fc741c7c14610e47578063fe05377214610e5c575b34801561027d57600080fd5b50600080fd5b34801561028f57600080fd5b506102a4600160a060020a0360043516610e71565b604080519115158252519081900360200190f35b3480156102c457600080fd5b506102d26004351515610e86565b005b3480156102e057600080fd5b506102d2600435602435610e95565b3480156102fb57600080fd5b506102d2600160a060020a0360043516610f0e565b34801561031c57600080fd5b506102a4600160a060020a0360043581169060243516604435606435610f8d565b34801561034957600080fd5b506102d2600160a060020a03600435166024351515610ffa565b34801561036f57600080fd5b506102a4600160a060020a03600435811690602435906044351660643560ff6084351660a43560c43560e4356110bd565b3480156103ac57600080fd5b506103c1600160a060020a03600435166113e8565b60408051918252519081900360200190f35b3480156103df57600080fd5b506103c1600160a060020a03600435811690602435166113fa565b34801561040657600080fd5b506102a4600160a060020a0360043581169060243516611421565b34801561042d57600080fd5b506104366114be565b60408051600160a060020a039092168252519081900360200190f35b34801561045e57600080fd5b506102a46004356114cd565b34801561047657600080fd5b506102a4600160a060020a03600435811690602435166044356114e2565b3480156104a057600080fd5b506102a4600160a060020a036004351661152a565b3480156104c157600080fd5b506103c161153f565b3480156104d657600080fd5b506102d2600160a060020a03600435166024351515611545565b3480156104fc57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611587565b34801561052957600080fd5b506102a4600160a060020a03600435811690602435166044356064356115db565b34801561055657600080fd5b506102d2600160a060020a036004358116906001608060020a03602435169060443516611622565b34801561058a57600080fd5b50610436611785565b6102d2600160a060020a0360043516611794565b3480156105b357600080fd5b50604080516020600480358082013583810280860185019096528085526102d295369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061182b9650505050505050565b34801561079757600080fd5b506040805160048035808201356020818102850181019095528084526102d2943694602493909290840191819060009085015b828210156108035760408051808201825290808402870190600290839083908082843750505091835250506001909101906020016107ca565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610872576040805160808181019092529080840287019060049083908390808284375050509183525050600190910190602001610836565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b828210156108e2576040805161010081810190925290808402870190600890839083908082843750505091835250506001909101906020016108a5565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610951576040805160c08181019092529080840287019060069083908390808284375050509183525050600190910190602001610915565b5093965061194a95505050505050565b34801561096d57600080fd5b506040805180820182526102d29136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805160a0818101909252949796958181019594509250600591508390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750939650611a0595505050505050565b348015610a1f57600080fd5b50610436611d48565b348015610a3457600080fd5b50610436611d57565b348015610a4957600080fd5b50610a6a600160a060020a0360043581169060243581169060443516611d66565b6040518082608080838360005b83811015610a8f578181015183820152602001610a77565b5050505090500191505060405180910390f35b348015610aae57600080fd5b506102d2600160a060020a0360043516611dbb565b348015610acf57600080fd5b506103c1600435602435611e4f565b348015610aea57600080fd5b506103c1611e63565b348015610aff57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611e69565b348015610b2c57600080fd5b506103c1600160a060020a0360043516611eb0565b348015610b4d57600080fd5b506102d2600160a060020a03600435166001608060020a0360243516611ec2565b348015610b7a57600080fd5b506102a4600160a060020a0360043581169060243516604435612008565b348015610ba457600080fd5b506103c1600160a060020a0360043581169060243516612053565b348015610bcb57600080fd5b50610be6600160a060020a0360043581169060243516612070565b604080518251815290819083908083836020610a77565b348015610c0957600080fd5b506103c1600160a060020a03600435811690602435166120a5565b348015610c3057600080fd5b50610be6600160a060020a03600435811690602435166120c0565b348015610c5757600080fd5b506103c1600435602435612124565b6102d261214f565b348015610c7a57600080fd5b506102d2600160a060020a036004358116906024351660ff604435166064356084356121ca565b348015610cad57600080fd5b506040805180820182526103c19136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805161010081810190925294979695818101959450925060089150839083908082843750506040805160c08181019092529497969581810195945092506006915083908390808284375093965061239895505050505050565b348015610d6057600080fd5b506102a4600435612fe8565b348015610d7857600080fd5b506103c1600435602435613050565b348015610d9357600080fd5b506103c1600160a060020a036004351661306c565b348015610db457600080fd5b506103c161307e565b348015610dc957600080fd5b506102a4600160a060020a0360043516602435613084565b348015610ded57600080fd5b506103c16004356131de565b348015610e0557600080fd5b506103c1600160a060020a03600435811690602435166131f0565b348015610e2c57600080fd5b506102a4600160a060020a0360043581169060243516613203565b348015610e5357600080fd5b506103c1613223565b348015610e6857600080fd5b50610436613229565b60026020526000908152604090205460ff1681565b801515610e9257600080fd5b50565b600054610eac90600160a060020a03163314610e86565b662386f26fc1000082108015610ec85750662386f26fc1000081105b1515610ed357600080fd5b600e829055600f819055604051819083907fa995ac7c2dc5fdc05b41983e69d4d9fbd224a8528bc7d86eabfd533cd3ca449790600090a35050565b600054610f2590600160a060020a03163314610e86565b60008054604051600160a060020a03808516939216917fcbf985117192c8f614a58aaf97226bb80a754772f5f6edf06f87c675f2e6c66391a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b3360009081526002602052604081205460ff161515610fab57600080fd5b600b54600160a060020a03163314610fc257600080fd5b610ff28585610fda610fd489896131f0565b87611e4f565b610fed610fe78a8a6120a5565b87613050565b613238565b949350505050565b60005461101190600160a060020a03163314610e86565b600b54600160a060020a0316151561104c57600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b600160a060020a0382166000818152600260209081526040808320805460ff1916861515908117909155600383529281902043905580519384529083019190915280517fd52650aadc7286c5cbc5259bdddd3d967821bd6bfd78babe1d68ba30a04743679281900390910190a15050565b600080548190600160a060020a031633148015906110eb57503360009081526001602052604090205460ff16155b156110f557600080fd5b50604080516c010000000000000000000000003081028252600160a060020a03808d1682026014840152602883018c90528a16026048820152605c8101889052815190819003607c0190206000818152600d602052919091205460ff161561115c57600080fd5b6000818152600d60209081526040808320805460ff19166001908117909155815160008051602061346e8339815191528152601c8101869052825190819003603c0181208582528185018085525260ff8b1681840152606081018a9052608081018990529151600160a060020a038d1694919360a0808501949193601f19840193928390039091019190865af11580156111fa573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561121957600080fd5b66b1a2bc2ec500008311156112335766b1a2bc2ec5000092505b8861123e8b8a6113fa565b101561124957600080fd5b6112548a898b61327c565b6112606000898561327c565b60095461127990600090600160a060020a0316856132b5565b600160a060020a038a1615156112be57604051600160a060020a038916908a156108fc02908b906000818181858888f1935050505015156112b957600080fd5b611371565b89600160a060020a031663a9059cbb898b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d602081101561136457600080fd5b5051151561137157600080fd5b600160a060020a038089166000818152600560205260409020439055908b167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8b6113bc8e8d6131f0565b604080519283526020830191909152818101889052519081900360600190a35098975050505050505050565b60056020526000908152604090205481565b600061141861140984846131f0565b61141385856120a5565b611e4f565b90505b92915050565b600b54600090600160a060020a03848116911614156114425750600161141b565b600160a060020a0380831660009081526007602090815260408083209387168352929052205460ff1615156001141561147d5750600161141b565b600160a060020a038083166000908152600860209081526040808320549387168352600390915290205410156114b55750600161141b565b50600092915050565b600a54600160a060020a031681565b600d6020526000908152604090205460ff1681565b3360009081526002602052604081205460ff16151561150057600080fd5b61150a3384611421565b151561151557600080fd5b6115208484846132cd565b5060019392505050565b60016020526000908152604090205460ff1681565b600f5481565b60005461155c90600160a060020a03163314610e86565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b3360009081526002602052604081205460ff1615156115a557600080fd5b600b54600160a060020a031633146115bc57600080fd5b610ff285856115ce610fd489896131f0565b610fed610fd48a8a6120a5565b3360009081526002602052604081205460ff1615156115f957600080fd5b600b54600160a060020a0316331461161057600080fd5b610ff285856115ce610fe789896131f0565b6116368382846001608060020a03166132b5565b600160a060020a038116600090815260086020526040902054151561167157600160a060020a03811660009081526008602052604090204390555b600160a060020a03808216600090815260056020908152604080832043905580517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051938716936323b872dd93606480840194938390030190829087803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b505050506040513d602081101561172357600080fd5b5051151561173057600080fd5b80600160a060020a031683600160a060020a031660008051602061348e8339815191528461175e87866131f0565b604080516001608060020a03909316835260208301919091528051918290030190a3505050565b600954600160a060020a031681565b6117a0600082346132b5565b600160a060020a03811660009081526008602052604090205415156117db57600160a060020a03811660009081526008602052604090204390555b600160a060020a038116600081815260056020526040812043905560008051602061348e8339815191523461181083866131f0565b6040805192835260208301919091528051918290030190a350565b60008054600160a060020a0316331480159061185757503360009081526001602052604090205460ff16155b1561186157600080fd5b5060005b875181101561193f57611936898281518110151561187f57fe5b90602001906020020151898381518110151561189757fe5b9060200190602002015189848151811015156118af57fe5b9060200190602002015189858151811015156118c757fe5b9060200190602002015189868151811015156118df57fe5b9060200190602002015189878151811015156118f757fe5b90602001906020020151898881518110151561190f57fe5b90602001906020020151898981518110151561192757fe5b906020019060200201516110bd565b50600101611865565b505050505050505050565b60008054600160a060020a0316331480159061197657503360009081526001602052604090205460ff16155b1561198057600080fd5b5060005b81518110156119fe576119f5858281518110151561199e57fe5b9060200190602002015185838151811015156119b657fe5b9060200190602002015185848151811015156119ce57fe5b9060200190602002015185858151811015156119e657fe5b90602001906020020151612398565b50600101611984565b5050505050565b600080548190600160a060020a03163314801590611a3357503360009081526001602052604090205460ff16155b15611a3d57600080fd5b82518451602080860151818801516040808a0151818a0180518351306c010000000000000000000000009081028252600160a060020a039a8b1681026014830152602882019990995295891688026048870152605c860194909452607c850191909152918616909402609c83015283519182900360b0018220905160008051602061346e8339815191528352601c8301829052845192839003603c0183208c518c518d8701516000808852878901808b529490945260ff909216868901526060860152608085015294519197509094169360019360a08084019493601f198401939081900390910191865af1158015611b3a573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611b5957600080fd5b50606082810180518583015160408051306c01000000000000000000000000908102825260148201889052600160a060020a0394851602603482015260488101929092528051918290036068018220935160008051602061346e8339815191528352601c8301859052815192839003603c01832060208c8101518c8501518d8a015160008089528489018089529590955260ff909216878701529886019890985260808501979097529151949593169360019360a0808501949193601f19840193928390039091019190865af1158015611c37573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611c5657600080fd5b60608301516040840151600160a060020a03908116911614611c7757600080fd5b83516000838152600660205260409020541415611c9357600080fd5b608084015166b1a2bc2ec500001015611cb45766b1a2bc2ec5000060808501525b60608301516080850151611cca9160009161327c565b835160008381526006602090815260409182902092909255606080860151868401518489015160808a01518551600160a060020a03938416815296870191909152858501529251921692859285927fd23bed568a5bf25c3577535afb4d173c4a6942e92812c0d105d94115d2beab72928290030190a4505050505050565b600054600160a060020a031690565b600054600160a060020a031681565b611d6e613386565b608060405190810160405280611d8486866131f0565b8152602001611d9386856131f0565b8152602001611da286866120a5565b8152602001611db186856120a5565b9052949350505050565b600160a060020a03811660009081526002602052604090205460ff161515611de257600080fd5b336000818152600760209081526040808320600160a060020a03861680855290835292819020805460ff1916600117905580519283529082019290925281517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb929181900390910190a150565b6000611e5d83831115610e86565b50900390565b600c5490565b3360009081526002602052604081205460ff161515611e8757600080fd5b600b54600160a060020a03163314611e9e57600080fd5b610ff28585610fda610fe789896131f0565b60086020526000908152604090205481565b611ed68233836001608060020a03166132b5565b336000908152600860205260409020541515611eff573360009081526008602052604090204390555b33600081815260056020908152604080832043905580517f23b872dd00000000000000000000000000000000000000000000000000000000815260048101949094523060248501526001608060020a038516604485015251600160a060020a038616936323b872dd9360648083019493928390030190829087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d6020811015611fb057600080fd5b50511515611fbd57600080fd5b33600160a060020a03831660008051602061348e83398151915283611fe286856131f0565b604080516001608060020a03909316835260208301919091528051918290030190a35050565b3360009081526002602052604081205460ff16151561202657600080fd5b600b54600160a060020a0316331461203d57600080fd5b612048848484613321565b506001949350505050565b600460209081526000928352604080842090915290825290205481565b6120786133a5565b604080519081016040528061208d85856131f0565b815260200161209c85856120a5565b90529392505050565b60006120b183836120c0565b60015b60200201519392505050565b6120c86133a5565b50600160a060020a0391821660009081526004602090815260408083209390941682529182528290205482518084019093526001608060020a038082168452700100000000000000000000000000000000909104169082015290565b6000828202612148841580612143575083858381151561214057fe5b04145b610e86565b9392505050565b61215b600033346132b5565b336000908152600860205260409020541515612184573360009081526008602052604090204390555b33600081815260056020526040812043905560008051602061348e833981519152346121b083856131f0565b6040805192835260208301919091528051918290030190a3565b60008054600160a060020a031633148015906121f657503360009081526001602052604090205460ff16155b1561220057600080fd5b600160a060020a03861660009081526002602052604090205460ff16151561222757600080fd5b50604080516c0100000000000000000000000030810282527f616c6c6f770000000000000000000000000000000000000000000000000000006014830152600160a060020a03808916820260198401528716908102602d830152825191829003604101822060008051602061346e8339815191528352601c8301819052835192839003603c018320600080855260208581018088529290925260ff891685870152606085018890526080850187905294519194929360019360a080830194601f1981019381900390910191865af1158015612306573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561232557600080fd5b600160a060020a038086166000818152600760209081526040808320948b1680845294825291829020805460ff19166001179055815193845283019190915280517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb9281900390910190a1505050505050565b60006123a26133c0565b6123aa613444565b600054600160a060020a031633148015906123d557503360009081526001602052604090205460ff16155b156123df57600080fd5b60408051610200810190915280866000602090810291909101518252018660016020908102919091015182520186600260209081029190910151825201866003602090810291909101518252018660046020908102919091015182520186600560209081029190910151825201866006602090810291909101518252018660076020908102919091015182520185600060209081029190910151600160a060020a031682520185600160209081029190910151600160a060020a031682520185600260209081029190910151600160a060020a031682520185600360209081029190910151600160a060020a031682520185600460209081029190910151600160a060020a031682520185600560209081029190910151600160a060020a0316825201308660006020020151886000602002015188600160200201518a600160200201518b600260200201518b600260209081029190910151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a1689026014820152602881019790975294881687026048870152605c860193909352607c8501919091529416909202609c82015290519081900360b0019020825201308660036020020151886003602002015188600460200201518a600460200201518b600560200201518b60056020020151604080516c01000000000000000000000000600160a060020a03998a168102825297891688026014820152602881019690965293871686026048860152605c850192909252607c8401528416909202609c82015281519081900360b00190209092526101408301516101c0840151835160008051602061346e8339815191528152601c810191909152925192839003603c019092209294501690600190896000602002015189600060200201518a6001602090810291909101516040805160008082528185018084529790975260ff9095168582015260608501939093526080840152905160a0808401949293601f19830193908390039091019190865af11580156126de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561273f576101e08201516101c083015160015b60ff167f14301341d034ec3c62a1eabc804a79abf3b8c16e6245e82ec572346aa452fabb60405160405180910390a460009250612fde565b6101a08201516101e08301516040805160008051602061346e8339815191528152601c810192909252805191829003603c01822060208b8101518b8401516060808e015160008089528589018089529690965260ff9093168787015286015260808501529151600160a060020a039094169360019360a08082019493601f19840193928390039091019190865af11580156127de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561280b576101e08201516101c08301516001612707565b816101800151600160a060020a0316826101000151600160a060020a03161415806128525750816101600151600160a060020a0316826101200151600160a060020a031614155b1561286a576101e08201516101c08301516002612707565b67016345785d8a00008260c001511115612891576101e08201516101c08301516004612707565b60e08201511580156128eb575081608001516128b98360600151670de0b6b3a7640000612124565b8115156128c257fe5b0482600001516128de8460200151670de0b6b3a7640000612124565b8115156128e757fe5b0410155b8061294d575060008260e0015111801561294d5750816060015161291b8360800151670de0b6b3a7640000612124565b81151561292457fe5b0482602001516129408460000151670de0b6b3a7640000612124565b81151561294957fe5b0411155b1515612966576101e08201516101c08301516000612707565b608060405190810160405280600081526020016000815260200160008152602001600081525090508160e0015160001415612d995781516101c0830151600090815260066020526040902054612a02916129bf91611e4f565b60808401805160608601516101e087015160009081526006602052604090205492516129fd936129ee91612124565b8115156129f757fe5b04611e4f565b613370565b8082521515612a1e576101e08201516101c08301516003612707565b815181516020840151612a319190612124565b811515612a3a57fe5b0460208201528051600e54612a5f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009548251600e54612aa49392600160a060020a031691670de0b6b3a764000091612a959190612124565b811515612a9e57fe5b046132b5565b612ae3612ac88260200151670de0b6b3a76400006129ee8560200151600f54612124565b670de0b6b3a76400006129ee84602001518660c00151612124565b60608201526101608201516009546020830151600f54612b589392600160a060020a031691612b5391670de0b6b3a764000091612b1f91612124565b811515612b2857fe5b04670de0b6b3a7640000612b4487602001518960c00151612124565b811515612b4d57fe5b04613050565b6132b5565b612b71826101200151836101400151836020015161327c565b612b8a82610100015183610140015183604001516132b5565b612ba3826101800151836101a00151836000015161327c565b612bbc826101600151836101a0015183606001516132b5565b6101c08201516000908152600660205260409020548151612bdd9190613050565b6101c0830151600090815260066020526040808220929092556101e084015181522054608083015182516060850151612c1b939291612b4491612124565b60066000846101e0015160001916600019168152602001908152602001600020819055504360056000846101400151600160a060020a0316600160a060020a03168152602001908152602001600020819055504360056000846101a00151600160a060020a0316600160a060020a0316815260200190815260200160002081905550816101e0015160001916826101c0015160001916836101a00151600160a060020a03167f710a89c2739b2b7124e035c0dfff8b26a1de0ef61edf2851d794b32df317655985610160015185600001518761018001518760200151896101400151600e54600f548b604001518c60600151604051808a600160a060020a0316600160a060020a0316815260200189815260200188600160a060020a0316600160a060020a0316815260200187815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a480519250612fde565b6020808301805184516101c0860151600090815260069094526040909320549151612df293612dce9390916129ee9190612124565b60608401516101e08501516000908152600660205260409020546129fd9190611e4f565b8082521515612e0e576101e08201516101c08301516003612707565b602082015181518351612e219190612124565b811515612e2a57fe5b0460208201819052600e54612e4f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009546020830151600e54612e889392600160a060020a031691670de0b6b3a764000091612a959190612124565b612ec7612eac8260000151670de0b6b3a76400006129ee8560000151600f54612124565b670de0b6b3a76400006129ee84600001518660c00151612124565b60608201526101608201516009548251600f54612f259392600160a060020a031691612b5391670de0b6b3a764000091612f0091612124565b811515612f0957fe5b04670de0b6b3a7640000612b4487600001518960c00151612124565b612f3e826101200151836101400151836000015161327c565b612f5782610100015183610140015183604001516132b5565b612f70826101800151836101a00151836020015161327c565b612f89826101600151836101a0015183606001516132b5565b6101c082015160009081526006602090815260409091205490820151612faf9190613050565b6101c0830151600090815260066020526040808220929092556101e0840151815220548151612c1b9190613050565b5050949350505050565b6000805461300090600160a060020a03163314610e86565b620f424082111561301057600080fd5b600c8290556040805183815290517f19ead489622e1c2974a8b824d87f439caa95e609c9ec1beff8e3641b546781d39181900360200190a1506001919050565b6000828201612148848210801590612143575083821015610e86565b60036020526000908152604090205481565b600c5481565b60008161309184336113fa565b101561309c57600080fd5b6130a783338461327c565b600160a060020a03831615156130e357604051339083156108fc029084906000818181858888f1935050505015156130de57600080fd5b613182565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561314b57600080fd5b505af115801561315f573d6000803e3d6000fd5b505050506040513d602081101561317557600080fd5b5051151561318257600080fd5b33600160a060020a0384167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f846131b987856131f0565b604080519283526020830191909152600082820152519081900360600190a392915050565b60066020526000908152604090205481565b60006131fc83836120c0565b60006120b4565b600760209081526000928352604080842090915290825290205460ff1681565b600e5481565b600b54600160a060020a031681565b600160a060020a0393841660009081526004602090815260408083209590961682529390935292909120700100000000000000000000000000000000909202179055565b8061328784846113fa565b101561329257600080fd5b6132af83836132aa6132a487876131f0565b85611e4f565b613321565b50505050565b6132af83836132aa6132c787876131f0565b85613050565b60006132d984846131f0565b600160a060020a039485166000908152600460209081526040808320969097168252949094529390922070010000000000000000000000000000000090910290921790915550565b600081608061333086866120a5565b600160a060020a038088166000908152600460209081526040808320938a1683529290522060029290920a02919091179081905560019150509392505050565b600081831061337f5781611418565b5090919050565b6080604051908101604052806004906020820280388339509192915050565b60408051808201825290600290829080388339509192915050565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090560019457468657265756d205369676e6564204d6573736167653a0a333200000000dcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7a165627a7a72305820cb1c3dc490c6a6ea119cd0477e7024bb62462b62300e7b16a5d4573051b5bbea002900000000000000000000000095445852148540acb6fcb9e39856d15f1c416381000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000001f4

Deployed Bytecode

0x6080604052600436106102715763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166302ce8c4d81146102835780630674763c146102b85780630b78f9c0146102d457806313af4035146102ef5780631e452a901461031057806320a0851f1461033d5780632295115b14610363578063254dcfe2146103a05780632a7575ee146103d35780632b197ef3146103fa57806337fd5940146104215780633823d66c146104525780633aa9f9911461046a578063429b62e51461049457806343f0179b146104b55780634b0bddd2146104ca5780634e5978e1146104f05780635278366a1461051d578063600f30c31461054a57806365e17c9d1461057e5780636a523c5e146105935780637869a950146105a757806378f767791461078b5780637b68be8114610961578063893d20e814610a135780638da5cb5b14610a2857806392c6061114610a3d5780639dbe267014610aa2578063a293d1e814610ac3578063a7a278b114610ade578063a874fe2f14610af3578063a99463bc14610b20578063ad895d7e14610b41578063b5c9cbbe14610b6e578063c23f001f14610b98578063c719e57f14610bbf578063cbc3ab5314610bfd578063ce4ff5e914610c24578063d05c78da14610c4b578063d0e30db014610c66578063d150126314610c6e578063d305785914610ca1578063dd93c74a14610d54578063e6cb901314610d6c578063e8689bb814610d87578063f31174ee14610da8578063f3fef3a314610dbd578063f7213db614610de1578063f7888aec14610df9578063fc5ef05714610e20578063fc741c7c14610e47578063fe05377214610e5c575b34801561027d57600080fd5b50600080fd5b34801561028f57600080fd5b506102a4600160a060020a0360043516610e71565b604080519115158252519081900360200190f35b3480156102c457600080fd5b506102d26004351515610e86565b005b3480156102e057600080fd5b506102d2600435602435610e95565b3480156102fb57600080fd5b506102d2600160a060020a0360043516610f0e565b34801561031c57600080fd5b506102a4600160a060020a0360043581169060243516604435606435610f8d565b34801561034957600080fd5b506102d2600160a060020a03600435166024351515610ffa565b34801561036f57600080fd5b506102a4600160a060020a03600435811690602435906044351660643560ff6084351660a43560c43560e4356110bd565b3480156103ac57600080fd5b506103c1600160a060020a03600435166113e8565b60408051918252519081900360200190f35b3480156103df57600080fd5b506103c1600160a060020a03600435811690602435166113fa565b34801561040657600080fd5b506102a4600160a060020a0360043581169060243516611421565b34801561042d57600080fd5b506104366114be565b60408051600160a060020a039092168252519081900360200190f35b34801561045e57600080fd5b506102a46004356114cd565b34801561047657600080fd5b506102a4600160a060020a03600435811690602435166044356114e2565b3480156104a057600080fd5b506102a4600160a060020a036004351661152a565b3480156104c157600080fd5b506103c161153f565b3480156104d657600080fd5b506102d2600160a060020a03600435166024351515611545565b3480156104fc57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611587565b34801561052957600080fd5b506102a4600160a060020a03600435811690602435166044356064356115db565b34801561055657600080fd5b506102d2600160a060020a036004358116906001608060020a03602435169060443516611622565b34801561058a57600080fd5b50610436611785565b6102d2600160a060020a0360043516611794565b3480156105b357600080fd5b50604080516020600480358082013583810280860185019096528085526102d295369593946024949385019291829185019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a998901989297509082019550935083925085019084908082843750506040805187358901803560208181028481018201909552818452989b9a99890198929750908201955093508392508501908490808284375094975061182b9650505050505050565b34801561079757600080fd5b506040805160048035808201356020818102850181019095528084526102d2943694602493909290840191819060009085015b828210156108035760408051808201825290808402870190600290839083908082843750505091835250506001909101906020016107ca565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610872576040805160808181019092529080840287019060049083908390808284375050509183525050600190910190602001610836565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b828210156108e2576040805161010081810190925290808402870190600890839083908082843750505091835250506001909101906020016108a5565b50506040805186358801803560208181028401810190945280835296999897830196919550820193509150819060009085015b82821015610951576040805160c08181019092529080840287019060069083908390808284375050509183525050600190910190602001610915565b5093965061194a95505050505050565b34801561096d57600080fd5b506040805180820182526102d29136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805160a0818101909252949796958181019594509250600591508390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750939650611a0595505050505050565b348015610a1f57600080fd5b50610436611d48565b348015610a3457600080fd5b50610436611d57565b348015610a4957600080fd5b50610a6a600160a060020a0360043581169060243581169060443516611d66565b6040518082608080838360005b83811015610a8f578181015183820152602001610a77565b5050505090500191505060405180910390f35b348015610aae57600080fd5b506102d2600160a060020a0360043516611dbb565b348015610acf57600080fd5b506103c1600435602435611e4f565b348015610aea57600080fd5b506103c1611e63565b348015610aff57600080fd5b506102a4600160a060020a0360043581169060243516604435606435611e69565b348015610b2c57600080fd5b506103c1600160a060020a0360043516611eb0565b348015610b4d57600080fd5b506102d2600160a060020a03600435166001608060020a0360243516611ec2565b348015610b7a57600080fd5b506102a4600160a060020a0360043581169060243516604435612008565b348015610ba457600080fd5b506103c1600160a060020a0360043581169060243516612053565b348015610bcb57600080fd5b50610be6600160a060020a0360043581169060243516612070565b604080518251815290819083908083836020610a77565b348015610c0957600080fd5b506103c1600160a060020a03600435811690602435166120a5565b348015610c3057600080fd5b50610be6600160a060020a03600435811690602435166120c0565b348015610c5757600080fd5b506103c1600435602435612124565b6102d261214f565b348015610c7a57600080fd5b506102d2600160a060020a036004358116906024351660ff604435166064356084356121ca565b348015610cad57600080fd5b506040805180820182526103c19136916004916044919083906002908390839080828437505060408051608081810190925294979695818101959450925060049150839083908082843750506040805161010081810190925294979695818101959450925060089150839083908082843750506040805160c08181019092529497969581810195945092506006915083908390808284375093965061239895505050505050565b348015610d6057600080fd5b506102a4600435612fe8565b348015610d7857600080fd5b506103c1600435602435613050565b348015610d9357600080fd5b506103c1600160a060020a036004351661306c565b348015610db457600080fd5b506103c161307e565b348015610dc957600080fd5b506102a4600160a060020a0360043516602435613084565b348015610ded57600080fd5b506103c16004356131de565b348015610e0557600080fd5b506103c1600160a060020a03600435811690602435166131f0565b348015610e2c57600080fd5b506102a4600160a060020a0360043581169060243516613203565b348015610e5357600080fd5b506103c1613223565b348015610e6857600080fd5b50610436613229565b60026020526000908152604090205460ff1681565b801515610e9257600080fd5b50565b600054610eac90600160a060020a03163314610e86565b662386f26fc1000082108015610ec85750662386f26fc1000081105b1515610ed357600080fd5b600e829055600f819055604051819083907fa995ac7c2dc5fdc05b41983e69d4d9fbd224a8528bc7d86eabfd533cd3ca449790600090a35050565b600054610f2590600160a060020a03163314610e86565b60008054604051600160a060020a03808516939216917fcbf985117192c8f614a58aaf97226bb80a754772f5f6edf06f87c675f2e6c66391a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b3360009081526002602052604081205460ff161515610fab57600080fd5b600b54600160a060020a03163314610fc257600080fd5b610ff28585610fda610fd489896131f0565b87611e4f565b610fed610fe78a8a6120a5565b87613050565b613238565b949350505050565b60005461101190600160a060020a03163314610e86565b600b54600160a060020a0316151561104c57600b805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0384161790555b600160a060020a0382166000818152600260209081526040808320805460ff1916861515908117909155600383529281902043905580519384529083019190915280517fd52650aadc7286c5cbc5259bdddd3d967821bd6bfd78babe1d68ba30a04743679281900390910190a15050565b600080548190600160a060020a031633148015906110eb57503360009081526001602052604090205460ff16155b156110f557600080fd5b50604080516c010000000000000000000000003081028252600160a060020a03808d1682026014840152602883018c90528a16026048820152605c8101889052815190819003607c0190206000818152600d602052919091205460ff161561115c57600080fd5b6000818152600d60209081526040808320805460ff19166001908117909155815160008051602061346e8339815191528152601c8101869052825190819003603c0181208582528185018085525260ff8b1681840152606081018a9052608081018990529151600160a060020a038d1694919360a0808501949193601f19840193928390039091019190865af11580156111fa573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561121957600080fd5b66b1a2bc2ec500008311156112335766b1a2bc2ec5000092505b8861123e8b8a6113fa565b101561124957600080fd5b6112548a898b61327c565b6112606000898561327c565b60095461127990600090600160a060020a0316856132b5565b600160a060020a038a1615156112be57604051600160a060020a038916908a156108fc02908b906000818181858888f1935050505015156112b957600080fd5b611371565b89600160a060020a031663a9059cbb898b6040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b15801561133a57600080fd5b505af115801561134e573d6000803e3d6000fd5b505050506040513d602081101561136457600080fd5b5051151561137157600080fd5b600160a060020a038089166000818152600560205260409020439055908b167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f8b6113bc8e8d6131f0565b604080519283526020830191909152818101889052519081900360600190a35098975050505050505050565b60056020526000908152604090205481565b600061141861140984846131f0565b61141385856120a5565b611e4f565b90505b92915050565b600b54600090600160a060020a03848116911614156114425750600161141b565b600160a060020a0380831660009081526007602090815260408083209387168352929052205460ff1615156001141561147d5750600161141b565b600160a060020a038083166000908152600860209081526040808320549387168352600390915290205410156114b55750600161141b565b50600092915050565b600a54600160a060020a031681565b600d6020526000908152604090205460ff1681565b3360009081526002602052604081205460ff16151561150057600080fd5b61150a3384611421565b151561151557600080fd5b6115208484846132cd565b5060019392505050565b60016020526000908152604090205460ff1681565b600f5481565b60005461155c90600160a060020a03163314610e86565b600160a060020a03919091166000908152600160205260409020805460ff1916911515919091179055565b3360009081526002602052604081205460ff1615156115a557600080fd5b600b54600160a060020a031633146115bc57600080fd5b610ff285856115ce610fd489896131f0565b610fed610fd48a8a6120a5565b3360009081526002602052604081205460ff1615156115f957600080fd5b600b54600160a060020a0316331461161057600080fd5b610ff285856115ce610fe789896131f0565b6116368382846001608060020a03166132b5565b600160a060020a038116600090815260086020526040902054151561167157600160a060020a03811660009081526008602052604090204390555b600160a060020a03808216600090815260056020908152604080832043905580517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201523060248201526001608060020a03871660448201529051938716936323b872dd93606480840194938390030190829087803b1580156116f957600080fd5b505af115801561170d573d6000803e3d6000fd5b505050506040513d602081101561172357600080fd5b5051151561173057600080fd5b80600160a060020a031683600160a060020a031660008051602061348e8339815191528461175e87866131f0565b604080516001608060020a03909316835260208301919091528051918290030190a3505050565b600954600160a060020a031681565b6117a0600082346132b5565b600160a060020a03811660009081526008602052604090205415156117db57600160a060020a03811660009081526008602052604090204390555b600160a060020a038116600081815260056020526040812043905560008051602061348e8339815191523461181083866131f0565b6040805192835260208301919091528051918290030190a350565b60008054600160a060020a0316331480159061185757503360009081526001602052604090205460ff16155b1561186157600080fd5b5060005b875181101561193f57611936898281518110151561187f57fe5b90602001906020020151898381518110151561189757fe5b9060200190602002015189848151811015156118af57fe5b9060200190602002015189858151811015156118c757fe5b9060200190602002015189868151811015156118df57fe5b9060200190602002015189878151811015156118f757fe5b90602001906020020151898881518110151561190f57fe5b90602001906020020151898981518110151561192757fe5b906020019060200201516110bd565b50600101611865565b505050505050505050565b60008054600160a060020a0316331480159061197657503360009081526001602052604090205460ff16155b1561198057600080fd5b5060005b81518110156119fe576119f5858281518110151561199e57fe5b9060200190602002015185838151811015156119b657fe5b9060200190602002015185848151811015156119ce57fe5b9060200190602002015185858151811015156119e657fe5b90602001906020020151612398565b50600101611984565b5050505050565b600080548190600160a060020a03163314801590611a3357503360009081526001602052604090205460ff16155b15611a3d57600080fd5b82518451602080860151818801516040808a0151818a0180518351306c010000000000000000000000009081028252600160a060020a039a8b1681026014830152602882019990995295891688026048870152605c860194909452607c850191909152918616909402609c83015283519182900360b0018220905160008051602061346e8339815191528352601c8301829052845192839003603c0183208c518c518d8701516000808852878901808b529490945260ff909216868901526060860152608085015294519197509094169360019360a08084019493601f198401939081900390910191865af1158015611b3a573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611b5957600080fd5b50606082810180518583015160408051306c01000000000000000000000000908102825260148201889052600160a060020a0394851602603482015260488101929092528051918290036068018220935160008051602061346e8339815191528352601c8301859052815192839003603c01832060208c8101518c8501518d8a015160008089528489018089529590955260ff909216878701529886019890985260808501979097529151949593169360019360a0808501949193601f19840193928390039091019190865af1158015611c37573d6000803e3d6000fd5b50505060206040510351600160a060020a0316141515611c5657600080fd5b60608301516040840151600160a060020a03908116911614611c7757600080fd5b83516000838152600660205260409020541415611c9357600080fd5b608084015166b1a2bc2ec500001015611cb45766b1a2bc2ec5000060808501525b60608301516080850151611cca9160009161327c565b835160008381526006602090815260409182902092909255606080860151868401518489015160808a01518551600160a060020a03938416815296870191909152858501529251921692859285927fd23bed568a5bf25c3577535afb4d173c4a6942e92812c0d105d94115d2beab72928290030190a4505050505050565b600054600160a060020a031690565b600054600160a060020a031681565b611d6e613386565b608060405190810160405280611d8486866131f0565b8152602001611d9386856131f0565b8152602001611da286866120a5565b8152602001611db186856120a5565b9052949350505050565b600160a060020a03811660009081526002602052604090205460ff161515611de257600080fd5b336000818152600760209081526040808320600160a060020a03861680855290835292819020805460ff1916600117905580519283529082019290925281517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb929181900390910190a150565b6000611e5d83831115610e86565b50900390565b600c5490565b3360009081526002602052604081205460ff161515611e8757600080fd5b600b54600160a060020a03163314611e9e57600080fd5b610ff28585610fda610fe789896131f0565b60086020526000908152604090205481565b611ed68233836001608060020a03166132b5565b336000908152600860205260409020541515611eff573360009081526008602052604090204390555b33600081815260056020908152604080832043905580517f23b872dd00000000000000000000000000000000000000000000000000000000815260048101949094523060248501526001608060020a038516604485015251600160a060020a038616936323b872dd9360648083019493928390030190829087803b158015611f8657600080fd5b505af1158015611f9a573d6000803e3d6000fd5b505050506040513d6020811015611fb057600080fd5b50511515611fbd57600080fd5b33600160a060020a03831660008051602061348e83398151915283611fe286856131f0565b604080516001608060020a03909316835260208301919091528051918290030190a35050565b3360009081526002602052604081205460ff16151561202657600080fd5b600b54600160a060020a0316331461203d57600080fd5b612048848484613321565b506001949350505050565b600460209081526000928352604080842090915290825290205481565b6120786133a5565b604080519081016040528061208d85856131f0565b815260200161209c85856120a5565b90529392505050565b60006120b183836120c0565b60015b60200201519392505050565b6120c86133a5565b50600160a060020a0391821660009081526004602090815260408083209390941682529182528290205482518084019093526001608060020a038082168452700100000000000000000000000000000000909104169082015290565b6000828202612148841580612143575083858381151561214057fe5b04145b610e86565b9392505050565b61215b600033346132b5565b336000908152600860205260409020541515612184573360009081526008602052604090204390555b33600081815260056020526040812043905560008051602061348e833981519152346121b083856131f0565b6040805192835260208301919091528051918290030190a3565b60008054600160a060020a031633148015906121f657503360009081526001602052604090205460ff16155b1561220057600080fd5b600160a060020a03861660009081526002602052604090205460ff16151561222757600080fd5b50604080516c0100000000000000000000000030810282527f616c6c6f770000000000000000000000000000000000000000000000000000006014830152600160a060020a03808916820260198401528716908102602d830152825191829003604101822060008051602061346e8339815191528352601c8301819052835192839003603c018320600080855260208581018088529290925260ff891685870152606085018890526080850187905294519194929360019360a080830194601f1981019381900390910191865af1158015612306573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561232557600080fd5b600160a060020a038086166000818152600760209081526040808320948b1680845294825291829020805460ff19166001179055815193845283019190915280517fd931e2079515b12dd08696feda19ddc7949c89cf653c724221d0482bc986d2bb9281900390910190a1505050505050565b60006123a26133c0565b6123aa613444565b600054600160a060020a031633148015906123d557503360009081526001602052604090205460ff16155b156123df57600080fd5b60408051610200810190915280866000602090810291909101518252018660016020908102919091015182520186600260209081029190910151825201866003602090810291909101518252018660046020908102919091015182520186600560209081029190910151825201866006602090810291909101518252018660076020908102919091015182520185600060209081029190910151600160a060020a031682520185600160209081029190910151600160a060020a031682520185600260209081029190910151600160a060020a031682520185600360209081029190910151600160a060020a031682520185600460209081029190910151600160a060020a031682520185600560209081029190910151600160a060020a0316825201308660006020020151886000602002015188600160200201518a600160200201518b600260200201518b600260209081029190910151604080516c01000000000000000000000000600160a060020a039a8b1681028252988a1689026014820152602881019790975294881687026048870152605c860193909352607c8501919091529416909202609c82015290519081900360b0019020825201308660036020020151886003602002015188600460200201518a600460200201518b600560200201518b60056020020151604080516c01000000000000000000000000600160a060020a03998a168102825297891688026014820152602881019690965293871686026048860152605c850192909252607c8401528416909202609c82015281519081900360b00190209092526101408301516101c0840151835160008051602061346e8339815191528152601c810191909152925192839003603c019092209294501690600190896000602002015189600060200201518a6001602090810291909101516040805160008082528185018084529790975260ff9095168582015260608501939093526080840152905160a0808401949293601f19830193908390039091019190865af11580156126de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561273f576101e08201516101c083015160015b60ff167f14301341d034ec3c62a1eabc804a79abf3b8c16e6245e82ec572346aa452fabb60405160405180910390a460009250612fde565b6101a08201516101e08301516040805160008051602061346e8339815191528152601c810192909252805191829003603c01822060208b8101518b8401516060808e015160008089528589018089529690965260ff9093168787015286015260808501529151600160a060020a039094169360019360a08082019493601f19840193928390039091019190865af11580156127de573d6000803e3d6000fd5b50505060206040510351600160a060020a031614151561280b576101e08201516101c08301516001612707565b816101800151600160a060020a0316826101000151600160a060020a03161415806128525750816101600151600160a060020a0316826101200151600160a060020a031614155b1561286a576101e08201516101c08301516002612707565b67016345785d8a00008260c001511115612891576101e08201516101c08301516004612707565b60e08201511580156128eb575081608001516128b98360600151670de0b6b3a7640000612124565b8115156128c257fe5b0482600001516128de8460200151670de0b6b3a7640000612124565b8115156128e757fe5b0410155b8061294d575060008260e0015111801561294d5750816060015161291b8360800151670de0b6b3a7640000612124565b81151561292457fe5b0482602001516129408460000151670de0b6b3a7640000612124565b81151561294957fe5b0411155b1515612966576101e08201516101c08301516000612707565b608060405190810160405280600081526020016000815260200160008152602001600081525090508160e0015160001415612d995781516101c0830151600090815260066020526040902054612a02916129bf91611e4f565b60808401805160608601516101e087015160009081526006602052604090205492516129fd936129ee91612124565b8115156129f757fe5b04611e4f565b613370565b8082521515612a1e576101e08201516101c08301516003612707565b815181516020840151612a319190612124565b811515612a3a57fe5b0460208201528051600e54612a5f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009548251600e54612aa49392600160a060020a031691670de0b6b3a764000091612a959190612124565b811515612a9e57fe5b046132b5565b612ae3612ac88260200151670de0b6b3a76400006129ee8560200151600f54612124565b670de0b6b3a76400006129ee84602001518660c00151612124565b60608201526101608201516009546020830151600f54612b589392600160a060020a031691612b5391670de0b6b3a764000091612b1f91612124565b811515612b2857fe5b04670de0b6b3a7640000612b4487602001518960c00151612124565b811515612b4d57fe5b04613050565b6132b5565b612b71826101200151836101400151836020015161327c565b612b8a82610100015183610140015183604001516132b5565b612ba3826101800151836101a00151836000015161327c565b612bbc826101600151836101a0015183606001516132b5565b6101c08201516000908152600660205260409020548151612bdd9190613050565b6101c0830151600090815260066020526040808220929092556101e084015181522054608083015182516060850151612c1b939291612b4491612124565b60066000846101e0015160001916600019168152602001908152602001600020819055504360056000846101400151600160a060020a0316600160a060020a03168152602001908152602001600020819055504360056000846101a00151600160a060020a0316600160a060020a0316815260200190815260200160002081905550816101e0015160001916826101c0015160001916836101a00151600160a060020a03167f710a89c2739b2b7124e035c0dfff8b26a1de0ef61edf2851d794b32df317655985610160015185600001518761018001518760200151896101400151600e54600f548b604001518c60600151604051808a600160a060020a0316600160a060020a0316815260200189815260200188600160a060020a0316600160a060020a0316815260200187815260200186600160a060020a0316600160a060020a03168152602001858152602001848152602001838152602001828152602001995050505050505050505060405180910390a480519250612fde565b6020808301805184516101c0860151600090815260069094526040909320549151612df293612dce9390916129ee9190612124565b60608401516101e08501516000908152600660205260409020546129fd9190611e4f565b8082521515612e0e576101e08201516101c08301516003612707565b602082015181518351612e219190612124565b811515612e2a57fe5b0460208201819052600e54612e4f9190670de0b6b3a7640000906129ee908390612124565b60408201526101008201516009546020830151600e54612e889392600160a060020a031691670de0b6b3a764000091612a959190612124565b612ec7612eac8260000151670de0b6b3a76400006129ee8560000151600f54612124565b670de0b6b3a76400006129ee84600001518660c00151612124565b60608201526101608201516009548251600f54612f259392600160a060020a031691612b5391670de0b6b3a764000091612f0091612124565b811515612f0957fe5b04670de0b6b3a7640000612b4487600001518960c00151612124565b612f3e826101200151836101400151836000015161327c565b612f5782610100015183610140015183604001516132b5565b612f70826101800151836101a00151836020015161327c565b612f89826101600151836101a0015183606001516132b5565b6101c082015160009081526006602090815260409091205490820151612faf9190613050565b6101c0830151600090815260066020526040808220929092556101e0840151815220548151612c1b9190613050565b5050949350505050565b6000805461300090600160a060020a03163314610e86565b620f424082111561301057600080fd5b600c8290556040805183815290517f19ead489622e1c2974a8b824d87f439caa95e609c9ec1beff8e3641b546781d39181900360200190a1506001919050565b6000828201612148848210801590612143575083821015610e86565b60036020526000908152604090205481565b600c5481565b60008161309184336113fa565b101561309c57600080fd5b6130a783338461327c565b600160a060020a03831615156130e357604051339083156108fc029084906000818181858888f1935050505015156130de57600080fd5b613182565b604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561314b57600080fd5b505af115801561315f573d6000803e3d6000fd5b505050506040513d602081101561317557600080fd5b5051151561318257600080fd5b33600160a060020a0384167febff2602b3f468259e1e99f613fed6691f3a6526effe6ef3e768ba7ae7a36c4f846131b987856131f0565b604080519283526020830191909152600082820152519081900360600190a392915050565b60066020526000908152604090205481565b60006131fc83836120c0565b60006120b4565b600760209081526000928352604080842090915290825290205460ff1681565b600e5481565b600b54600160a060020a031681565b600160a060020a0393841660009081526004602090815260408083209590961682529390935292909120700100000000000000000000000000000000909202179055565b8061328784846113fa565b101561329257600080fd5b6132af83836132aa6132a487876131f0565b85611e4f565b613321565b50505050565b6132af83836132aa6132c787876131f0565b85613050565b60006132d984846131f0565b600160a060020a039485166000908152600460209081526040808320969097168252949094529390922070010000000000000000000000000000000090910290921790915550565b600081608061333086866120a5565b600160a060020a038088166000908152600460209081526040808320938a1683529290522060029290920a02919091179081905560019150509392505050565b600081831061337f5781611418565b5090919050565b6080604051908101604052806004906020820280388339509192915050565b60408051808201825290600290829080388339509192915050565b6040805161020081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e081019190915290565b608060405190810160405280600081526020016000815260200160008152602001600081525090560019457468657265756d205369676e6564204d6573736167653a0a333200000000dcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d7a165627a7a72305820cb1c3dc490c6a6ea119cd0477e7024bb62462b62300e7b16a5d4573051b5bbea0029

Deployed Bytecode Sourcemap

774:39920:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;774:39920:0;3512:5;;;1606:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1606:49:0;-1:-1:-1;;;;;1606:49:0;;;;;;;;;;;;;;;;;;;;;;;799:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;799:72:0;;;;;;;;;7945:289;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7945:289:0;;;;;;;2265:117;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2265:117:0;-1:-1:-1;;;;;2265:117:0;;;;;10841:340;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10841:340:0;-1:-1:-1;;;;;10841:340:0;;;;;;;;;;;;;;2703:436;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2703:436:0;-1:-1:-1;;;;;2703:436:0;;;;;;;;;18062:2466;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18062:2466:0;-1:-1:-1;;;;;18062:2466:0;;;;;;;;;;;;;;;;;;;;;;;;;4027:57;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4027:57:0;-1:-1:-1;;;;;4027:57:0;;;;;;;;;;;;;;;;;;;;;12311:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12311:162:0;-1:-1:-1;;;;;12311:162:0;;;;;;;;;;9345:374;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9345:374:0;-1:-1:-1;;;;;9345:374:0;;;;;;;;;;4591:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4591:30:0;;;;;;;;-1:-1:-1;;;;;4591:30:0;;;;;;;;;;;;;;4868:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4868:42:0;;;;;10325:248;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10325:248:0;-1:-1:-1;;;;;10325:248:0;;;;;;;;;;;;1530:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1530:39:0;-1:-1:-1;;;;;1530:39:0;;;;;5108:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5108:23:0;;;;2543:99;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;2543:99:0;-1:-1:-1;;;;;2543:99:0;;;;;;;;;11885:340;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11885:340:0;-1:-1:-1;;;;;11885:340:0;;;;;;;;;;;;;;11189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11189:340:0;-1:-1:-1;;;;;11189:340:0;;;;;;;;;;;;;;15336:836;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;15336:836:0;-1:-1:-1;;;;;15336:836:0;;;;;-1:-1:-1;;;;;15336:836:0;;;;;;;;;4513:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4513:25:0;;;;13804:579;;-1:-1:-1;;;;;13804:579:0;;;;;20536:861;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;;20536:861:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20536:861:0;;;;-1:-1:-1;20536:861:0;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;;;;;;;;-1:-1:-1;20536:861:0;;-1:-1:-1;20536:861:0;;-1:-1:-1;;;;;;;20536:861:0;37909:399;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37909:399:0;;;-1:-1:-1;37909:399:0;-1:-1:-1;37909:399:0;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37909:399:0;;;-1:-1:-1;37909:399:0;-1:-1:-1;37909:399:0;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37909:399:0;;;-1:-1:-1;37909:399:0;-1:-1:-1;37909:399:0;;-1:-1:-1;;37909:399:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;37909:399:0;;;-1:-1:-1;;37909:399:0;;;;;;;;;;-1:-1:-1;37909:399:0;;-1:-1:-1;37909:399:0;;-1:-1:-1;;;;;;37909:399:0;38384:2161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38384:2161:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38384:2161:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;38384:2161:0;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;;;;;;;-1:-1:-1;;38384:2161:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;38384:2161:0;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;;;;;;;-1:-1:-1;;38384:2161:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;38384:2161:0;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;;;;;;;-1:-1:-1;38384:2161:0;;-1:-1:-1;38384:2161:0;;-1:-1:-1;;;;;;38384:2161:0;2420:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2420:73:0;;;;1460:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1460:20:0;;;;21410:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21410:298:0;-1:-1:-1;;;;;21410:298:0;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;21410:298:0;;;;;;;;;;;;;;;;17166:269;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17166:269:0;-1:-1:-1;;;;;17166:269:0;;;;;1149:104;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1149:104:0;;;;;;;12527:115;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12527:115:0;;;;11537:340;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11537:340:0;-1:-1:-1;;;;;11537:340:0;;;;;;;;;;;;;;4388:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4388:53:0;-1:-1:-1;;;;;4388:53:0;;;;;14425:858;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14425:858:0;-1:-1:-1;;;;;14425:858:0;;;-1:-1:-1;;;;;14425:858:0;;;;;10581:252;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10581:252:0;-1:-1:-1;;;;;10581:252:0;;;;;;;;;;;;3842:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3842:65:0;-1:-1:-1;;;;;3842:65:0;;;;;;;;;;21716:197;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21716:197:0;-1:-1:-1;;;;;21716:197:0;;;;;;;;;;;;;;84:18:-1;;64:39;;21716:197:0;;;;;;;;52:2:-1;8:100;;10032:187:0;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10032:187:0;-1:-1:-1;;;;;10032:187:0;;;;;;;;;;9033:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9033:304:0;-1:-1:-1;;;;;9033:304:0;;;;;;;;;;939:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;939:139:0;;;;;;;13157:596;;;;17443:537;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17443:537:0;-1:-1:-1;;;;;17443:537:0;;;;;;;;;;;;;;;;;;23565:14266;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23565:14266:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23565:14266:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23565:14266:0;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;;;;;;;-1:-1:-1;;23565:14266:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23565:14266:0;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;;;;;;;-1:-1:-1;;23565:14266:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;23565:14266:0;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;;;;;;;-1:-1:-1;23565:14266:0;;-1:-1:-1;23565:14266:0;;-1:-1:-1;;;;;;23565:14266:0;7264:251;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;7264:251:0;;;;;1321:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1321:131:0;;;;;;;1704:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;1704:62:0;-1:-1:-1;;;;;1704:62:0;;;;;4757:38;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4757:38:0;;;;16180:978;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;16180:978:0;-1:-1:-1;;;;;16180:978:0;;;;;;;4146:46;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4146:46:0;;;;;9795:175;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;9795:175:0;-1:-1:-1;;;;;9795:175:0;;;;;;;;;;4245:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4245:81:0;-1:-1:-1;;;;;4245:81:0;;;;;;;;;;5003:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5003:23:0;;;;4666:34;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4666:34:0;;;;1606:49;;;;;;;;;;;;;;;:::o;799:72::-;847:9;846:10;842:21;;;858:5;;;842:21;799:72;:::o;7945:289::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;8041:9;8029;:21;:46;;;;;8066:9;8054;:21;8029:46;8021:55;;;;;;;;8128:8;:20;;;8159:8;:20;;;8197:29;;8170:9;;8139;;8197:29;;-1:-1:-1;;8197:29:0;7945:289;;:::o;2265:117::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;2331:5;;;2322:25;;-1:-1:-1;;;;;2322:25:0;;;;2331:5;;;2322:25;;;2358:5;:16;;-1:-1:-1;;2358:16:0;-1:-1:-1;;;;;2358:16:0;;;;;;;;;;2265:117::o;10841:340::-;3435:10;10969:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;11009:19;;-1:-1:-1;;;;;11009:19:0;10995:10;:33;10991:44;;11030:5;;;10991:44;11046:127;11070:5;11077:4;11083:43;11091:22;11101:5;11108:4;11091:9;:22::i;:::-;11115:10;11083:7;:43::i;:::-;11128:44;11136:23;11147:5;11154:4;11136:10;:23::i;:::-;11161:10;11128:7;:44::i;:::-;11046:23;:127::i;:::-;10841:340;;;;;;:::o;2703:436::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;2805:19;;-1:-1:-1;;;;;2805:19:0;:33;2801:124;;;2864:19;:37;;-1:-1:-1;;2864:37:0;-1:-1:-1;;;;;2864:37:0;;;;;2801:124;-1:-1:-1;;;;;2937:33:0;;;;;;:16;:33;;;;;;;;:53;;-1:-1:-1;;2937:53:0;;;;;;;;;;3003:26;:43;;;;;;3049:12;3003:58;;3077:54;;;;;;;;;;;;;;;;;;;;;;;;2703:436;;:::o;18062:2466::-;18579:12;3247:5;;18579:12;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;18619:43:0;;;;18629:4;18619:43;;;;-1:-1:-1;;;;;18619:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18724:15:0;;;:9;18619:43;18724:15;;;;;;;;18720:26;;;18741:5;;;18720:26;18832:15;;;;:9;:15;;;;;;;;:22;;-1:-1:-1;;18832:22:0;18850:4;18832:22;;;;;;18914:51;;-1:-1:-1;;;;;;;;;;;18914:51:0;;;;;;;;;;;;;;;;;;18904:71;;;;;;;;;;18832:22;18904:71;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18904:79:0;;;18850:4;;18904:71;;;;;18832:15;;-1:-1:-1;;18904:71:0;;;;;;;;;;;;18850:4;18904:71;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18904:71:0;;;;;;;;-1:-1:-1;;;;;18904:79:0;;;18900:90;;;18985:5;;;18900:90;19068:9;19052:13;:25;19048:56;;;19095:9;19079:25;;19048:56;19303:6;19269:31;19288:5;19295:4;19269:18;:31::i;:::-;:40;19265:51;;;19311:5;;;19265:51;19496:31;19507:5;19514:4;19520:6;19496:10;:31::i;:::-;19738:43;19757:1;19761:4;19767:13;19738:10;:43::i;:::-;20007:10;;19984:49;;20003:1;;-1:-1:-1;;;;;20007:10:0;20019:13;19984:10;:49::i;:::-;-1:-1:-1;;;;;20089:19:0;;;20085:238;;;20178:17;;-1:-1:-1;;;;;20178:9:0;;;:17;;;;;20188:6;;20178:17;;;;20188:6;20178:9;:17;;;;;;;20177:18;20173:29;;;20197:5;;;20173:29;20085:238;;;20259:5;-1:-1:-1;;;;;20253:21:0;;20275:4;20281:6;20253:35;;;;;;;;;;;;;-1:-1:-1;;;;;20253:35:0;-1:-1:-1;;;;;20253:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20253:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20253:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20253:35:0;20252:36;20248:47;;;20290:5;;;20248:47;-1:-1:-1;;;;;20333:27:0;;;;;;;:21;:27;;;;;20363:12;20333:42;;:27;20424:68;;;20446:6;20454:22;20433:5;20355:4;20454:9;:22::i;:::-;20424:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;18062:2466;;;;;;;;;;;:::o;4027:57::-;;;;;;;;;;;;;:::o;12311:162::-;12382:7;12409:56;12417:22;12427:5;12434:4;12417:9;:22::i;:::-;12441:23;12452:5;12459:4;12441:10;:23::i;:::-;12409:7;:56::i;:::-;12402:63;;12311:162;;;;;:::o;9345:374::-;9452:19;;9426:4;;-1:-1:-1;;;;;9452:38:0;;;:19;;:38;9448:55;;;-1:-1:-1;9499:4:0;9492:11;;9448:55;-1:-1:-1;;;;;9518:33:0;;;;;;;:27;:33;;;;;;;;:50;;;;;;;;;;;;:58;;:50;:58;9514:75;;;-1:-1:-1;9585:4:0;9578:11;;9514:75;-1:-1:-1;;;;;9650:23:0;;;;;;;:17;:23;;;;;;;;;9604:43;;;;;:26;:43;;;;;;:69;9600:86;;;-1:-1:-1;9682:4:0;9675:11;;9600:86;-1:-1:-1;9706:5:0;9345:374;;;;:::o;4591:30::-;;;-1:-1:-1;;;;;4591:30:0;;:::o;4868:42::-;;;;;;;;;;;;;;;:::o;10325:248::-;3435:10;10419:12;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;10450;10473:10;10485:4;10450:22;:40::i;:::-;10449:41;10445:52;;;10492:5;;;10445:52;10508:34;10522:5;10529:4;10535:6;10508:13;:34::i;:::-;-1:-1:-1;10560:4:0;10325:248;;;;;:::o;1530:39::-;;;;;;;;;;;;;;;:::o;5108:23::-;;;;:::o;2543:99::-;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;-1:-1:-1;;;;;2611:13:0;;;;;;;;:6;:13;;;;;:23;;-1:-1:-1;;2611:23:0;;;;;;;;;;2543:99::o;11885:340::-;3435:10;12013:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;12053:19;;-1:-1:-1;;;;;12053:19:0;12039:10;:33;12035:44;;12074:5;;;12035:44;12090:127;12114:5;12121:4;12127:43;12135:22;12145:5;12152:4;12135:9;:22::i;12127:43::-;12172:44;12180:23;12191:5;12198:4;12180:10;:23::i;11189:340::-;3435:10;11317:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;11357:19;;-1:-1:-1;;;;;11357:19:0;11343:10;:33;11339:44;;11378:5;;;11339:44;11394:127;11418:5;11425:4;11431:43;11439:22;11449:5;11456:4;11439:9;:22::i;15336:836::-;15659:31;15670:5;15677:4;15683:6;-1:-1:-1;;;;;15659:31:0;:10;:31::i;:::-;-1:-1:-1;;;;;15752:23:0;;;;;;:17;:23;;;;;;:28;15748:72;;;-1:-1:-1;;;;;15782:23:0;;;;;;:17;:23;;;;;15808:12;15782:38;;15748:72;-1:-1:-1;;;;;15831:27:0;;;;;;;:21;:27;;;;;;;;15861:12;15831:42;;15934:51;;;;;15960:10;15934:51;;;;15972:4;15934:51;;;;-1:-1:-1;;;;;15934:51:0;;;;;;;;:25;;;;;;:51;;;;;15831:27;15934:51;;;;;;;:25;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;15934:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15934:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15934:51:0;15933:52;15929:63;;;15987:5;;;15929:63;16100:4;-1:-1:-1;;;;;16085:52:0;16093:5;-1:-1:-1;;;;;16085:52:0;-1:-1:-1;;;;;;;;;;;16106:6:0;16114:22;16124:5;16131:4;16114:9;:22::i;:::-;16085:52;;;-1:-1:-1;;;;;16085:52:0;;;;;;;;;;;;;;;;;;;;;15336:836;;;:::o;4513:25::-;;;-1:-1:-1;;;;;4513:25:0;;:::o;13804:579::-;14002:39;14021:1;14025:4;14031:9;14002:10;:39::i;:::-;-1:-1:-1;;;;;14101:23:0;;;;;;:17;:23;;;;;;:28;14097:72;;;-1:-1:-1;;;;;14131:23:0;;;;;;:17;:23;;;;;14157:12;14131:38;;14097:72;-1:-1:-1;;;;;14180:27:0;;;;;;:21;:27;;;;;14210:12;14180:42;;-1:-1:-1;;;;;;;;;;;14309:9:0;14320:27;14180;14202:4;14320:9;:27::i;:::-;14283:65;;;;;;;;;;;;;;;;;;;;;;13804:579;:::o;20536:861::-;21087:6;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;21096:1:0;21082:308;21103:6;:13;21099:1;:17;21082:308;;;21138:240;21170:5;21176:1;21170:8;;;;;;;;;;;;;;;;;;21197:6;21204:1;21197:9;;;;;;;;;;;;;;;;;;21225:4;21230:1;21225:7;;;;;;;;;;;;;;;;;;21251:5;21257:1;21251:8;;;;;;;;;;;;;;;;;;21278:1;21280;21278:4;;;;;;;;;;;;;;;;;;21301:1;21303;21301:4;;;;;;;;;;;;;;;;;;21324:1;21326;21324:4;;;;;;;;;;;;;;;;;;21347:13;21361:1;21347:16;;;;;;;;;;;;;;;;;;21138:13;:240::i;:::-;-1:-1:-1;21118:3:0;;21082:308;;;20536:861;;;;;;;;;:::o;37909:399::-;38094:6;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;38103:1:0;38089:212;38110:14;:21;38106:1;:25;38089:212;;;38153:136;38177:1;38179;38177:4;;;;;;;;;;;;;;;;;;38200:2;38203:1;38200:5;;;;;;;;;;;;;;;;;;38224:11;38236:1;38224:14;;;;;;;;;;;;;;;;;;38257;38272:1;38257:17;;;;;;;;;;;;;;;;;;38153:5;:136::i;:::-;-1:-1:-1;38133:3:0;;38089:212;;;37909:399;;;;;:::o;38384:2161::-;38916:17;3247:5;;38916:17;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;38963:18;;38983:15;;38963:18;39000;;;;39030:15;;;;39047;;;;;39064:18;;;;;38936:157;;38957:4;38936:157;;;;;;-1:-1:-1;;;;;38936:157:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39203:18;;-1:-1:-1;;;;;;;;;;;39122:56:0;;;;;;;;;;;;;;;;;;39180:4;;39186:5;;39193;;;;-1:-1:-1;39112:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38936:157;;-1:-1:-1;39112:109:0;;;;39016:1;;39112:87;;;;;38963:18;-1:-1:-1;;39112:87:0;;;;;;;;;;;39016:1;39112:87;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39112:87:0;;;;;;;;-1:-1:-1;;;;;39112:109:0;;39104:118;;;;;;;;-1:-1:-1;39341:18:0;;;;;;39361:15;;;;39314:63;;;39324:4;39314:63;;;;;;;;;;;;-1:-1:-1;;;;;39314:63:0;;;;;;;;;;;;;;;;;;;;;;;;;39488:18;;-1:-1:-1;;;;;;;;;;;39406:57:0;;;;;;;;;;;;;;;;;;39341:18;39465:4;;;;39471:5;;;;39478;;;;-1:-1:-1;39396:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39314:63;;39396:110;;;:88;;;;;;;39341:18;;-1:-1:-1;;39396:88:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39396:88:0;;;;;;;;-1:-1:-1;;;;;39396:110:0;;39388:119;;;;;;;;39615:18;;;;39593;;;;-1:-1:-1;;;;;39593:40:0;;;;;;39585:49;;;;;;39749:15;;39762:1;39724:21;;;:10;39749:15;39724:21;;;;;:40;;39716:49;;;;;;39832:15;;;;39850:9;-1:-1:-1;39828:87:0;;;39894:9;39876:15;;;:27;39828:87;40186:18;;;;40206:15;;;;40163:59;;40182:1;;40163:10;:59::i;:::-;40360:15;;40373:1;40336:21;;;:10;40360:15;40336:21;;;;;;;;:39;;;;40464:18;;;;;40484;;;;40504:15;;;;40521;;;;40429:108;;-1:-1:-1;;;;;40429:108:0;;;;;;;;;;;;;;;;;;;;;40336:21;;40441:10;;40429:108;;;;;;;;38384:2161;;;;;;:::o;2420:73::-;2449:11;2480:5;-1:-1:-1;;;;;2480:5:0;2420:73;:::o;1460:20::-;;;-1:-1:-1;;;;;1460:20:0;;:::o;21410:298::-;21500:10;;:::i;:::-;21528:172;;;;;;;;;21550:23;21560:5;21567;21550:9;:23::i;:::-;21528:172;;;;21588:23;21598:5;21605;21588:9;:23::i;:::-;21528:172;;;;21626:24;21637:5;21644;21626:10;:24::i;:::-;21528:172;;;;21665:24;21676:5;21683;21665:10;:24::i;:::-;21528:172;;;21410:298;-1:-1:-1;;;;21410:298:0:o;17166:269::-;-1:-1:-1;;;;;17246:33:0;;;;;;:16;:33;;;;;;;;17245:34;17241:45;;;17281:5;;;17241:45;17325:10;17297:39;;;;:27;:39;;;;;;;;-1:-1:-1;;;;;17297:56:0;;;;;;;;;;;;:63;;-1:-1:-1;;17297:63:0;17356:4;17297:63;;;17378:49;;;;;;;;;;;;;;;;;;;;;;;;;17166:269;:::o;1149:104::-;1191:4;1208:14;1220:1;1215;:6;;1208;:14::i;:::-;-1:-1:-1;1240:5:0;;;1149:104::o;12527:115::-;12611:23;;12527:115;:::o;11537:340::-;3435:10;11665:4;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;11705:19;;-1:-1:-1;;;;;11705:19:0;11691:10;:33;11687:44;;11726:5;;;11687:44;11742:127;11766:5;11773:4;11779:43;11787:22;11797:5;11804:4;11787:9;:22::i;4388:53::-;;;;;;;;;;;;;:::o;14425:858::-;14734:37;14745:5;14752:10;14764:6;-1:-1:-1;;;;;14734:37:0;:10;:37::i;:::-;14851:10;14833:29;;;;:17;:29;;;;;;:34;14829:84;;;14887:10;14869:29;;;;:17;:29;;;;;14901:12;14869:44;;14829:84;14946:10;14924:33;;;;:21;:33;;;;;;;;14960:12;14924:48;;15033:51;;;;;;;;;;;;15071:4;15033:51;;;;-1:-1:-1;;;;;15033:51:0;;;;;;;-1:-1:-1;;;;;15033:25:0;;;;;:51;;;;;14924:33;15033:51;;;;;;;;:25;:51;;;5:2:-1;;;;30:1;27;20:12;5:2;15033:51:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15033:51:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15033:51:0;15032:52;15028:63;;;15086:5;;;15028:63;15199:10;-1:-1:-1;;;;;15184:64:0;;-1:-1:-1;;;;;;;;;;;15211:6:0;15219:28;15192:5;15199:10;15219:9;:28::i;:::-;15184:64;;;-1:-1:-1;;;;;15184:64:0;;;;;;;;;;;;;;;;;;;;;14425:858;;:::o;10581:252::-;3435:10;10675:12;3418:28;;;:16;:28;;;;;;;;3417:29;3413:40;;;3448:5;;;3413:40;10722:19;;-1:-1:-1;;;;;10722:19:0;10708:10;:33;10704:44;;10743:5;;;10704:44;10759:34;10773:5;10780:4;10786:6;10759:13;:34::i;:::-;-1:-1:-1;10811:4:0;;10581:252;-1:-1:-1;;;;10581:252:0:o;3842:65::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;21716:197::-;21784:10;;:::i;:::-;21812:93;;;;;;;;;21834:22;21844:5;21851:4;21834:9;:22::i;:::-;21812:93;;;;21871:23;21882:5;21889:4;21871:10;:23::i;:::-;21812:93;;;21716:197;-1:-1:-1;;;21716:197:0:o;10032:187::-;10102:7;10172:36;10196:5;10203:4;10172:23;:36::i;:::-;10209:1;10172:39;;;;;;10032:187;-1:-1:-1;;;10032:187:0:o;9033:304::-;9105:10;;:::i;:::-;-1:-1:-1;;;;;;9153:15:0;;;9133:17;9153:15;;;:8;:15;;;;;;;;:21;;;;;;;;;;;;;9304:25;;;;;;;;-1:-1:-1;;;;;9203:27:0;;;9304:25;;9275:14;;;;9259:32;9304:25;;;;;9033:304::o;939:139::-;981:4;1007:5;;;1023:28;1030:6;;;:20;;;1049:1;1044;1040;:5;;;;;;;;:10;1030:20;1023:6;:28::i;:::-;1069:1;939:139;-1:-1:-1;;;939:139:0:o;13157:596::-;13336:45;13355:1;13359:10;13371:9;13336:10;:45::i;:::-;13459:10;13441:29;;;;:17;:29;;;;;;:34;13437:84;;;13495:10;13477:29;;;;:17;:29;;;;;13509:12;13477:44;;13437:84;13554:10;13532:33;;;;:21;:33;;;;;13568:12;13532:48;;-1:-1:-1;;;;;;;;;;;13673:9:0;13684:33;13532;13554:10;13684:9;:33::i;:::-;13641:77;;;;;;;;;;;;;;;;;;;;;;13157:596::o;17443:537::-;17632:12;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;-1:-1:-1;;;;;17581:33:0;;;;;;:16;:33;;;;;;;;17580:34;17576:45;;;17616:5;;;17576:45;-1:-1:-1;17647:47:0;;;;17657:4;17647:47;;;;;;;;;-1:-1:-1;;;;;17647:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;17720:51:0;;;;;;;;;;;;;;;;;;-1:-1:-1;17710:71:0;;;17720:51;17710:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17647:47;;;;17710:71;;;;;;;-1:-1:-1;;17710:71:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;17710:71:0;;;;;;;;-1:-1:-1;;;;;17710:79:0;;;17706:90;;;17791:5;;;17706:90;-1:-1:-1;;;;;17854:33:0;;;;;;;:27;:33;;;;;;;;:50;;;;;;;;;;;;;:57;;-1:-1:-1;;17854:57:0;17907:4;17854:57;;;17929:43;;;;;;;;;;;;;;;;;;;;;;;17443:537;;;;;;:::o;23565:14266::-;23720:27;24223:18;;:::i;:::-;27316:21;;:::i;:::-;3247:5;;-1:-1:-1;;;;;3247:5:0;3233:10;:19;;;;:42;;-1:-1:-1;3264:10:0;3257:18;;;;:6;:18;;;;;;;;3256:19;3233:42;3229:53;;;3277:5;;;3229:53;24245:1146;;;;;;;;;;24288:11;-1:-1:-1;24288:14:0;;;;;;;;;24245:1146;;;24335:11;24347:1;24335:14;;;;;;;;;24245:1146;;;24382:11;24394:1;24382:14;;;;;;;;;24245:1146;;;24429:11;24441:1;24429:14;;;;;;;;;24245:1146;;;24476:11;24488:1;24476:14;;;;;;;;;24245:1146;;;24523:11;24535:1;24523:14;;;;;;;;;24245:1146;;;24570:11;24582:1;24570:14;;;;;;;;;24245:1146;;;24617:11;24629:1;24617:14;;;;;;;;;24245:1146;;;24666:14;24681:1;24666:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24716:14;24731:1;24716:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24766:14;24781:1;24766:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24816:14;24831:1;24816:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24866:14;24881:1;24866:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;24916:14;24931:1;24916:17;;;;;;;;;-1:-1:-1;;;;;24245:1146:0;;;;25116:4;25122:14;25137:1;25122:17;;;;25141:11;25153:1;25141:14;;;;25157;25172:1;25157:17;;;;25176:11;25188:1;25176:14;;;;25192:11;25204:1;25192:14;;;;25208;25223:1;25208:17;;;;;;;;;25106:120;;;;-1:-1:-1;;;;;25106:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24245:1146;;;25269:4;25275:14;25290:1;25275:17;;;;25294:11;25306:1;25294:14;;;;25310;25325:1;25310:17;;;;25329:11;25341:1;25329:14;;;;25345:11;25357:1;25345:14;;;;25361;25376:1;25361:17;;;;25259:120;;;;-1:-1:-1;;;;;25259:120:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24245:1146;;;25559:7;;;;25517:16;;;;25471:63;;-1:-1:-1;;;;;;;;;;;25471:63:0;;;;;;;;;;;;;;;;;;;;24223:1168;;-1:-1:-1;25461:105:0;;:94;;25536:1;-1:-1:-1;25536:4:0;;;;25542:2;25545:1;25542:5;;;;25549:2;25552:1;25549:5;;;;;;;;;25461:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25549:5;;-1:-1:-1;;25461:94:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25461:94:0;;;;;;;;-1:-1:-1;;;;;25461:105:0;;;25457:251;;;25656:16;;;;25638;;;;25612:23;25606:30;25597:76;;;;;;;;;;;;25695:1;25688:8;;;;25457:251;25881:7;;;;25839:16;;;;25793:63;;;-1:-1:-1;;;;;;;;;;;25793:63:0;;;;;;;;;;;;;;;;;;;25858:4;;;;;25864:5;;;;25871;;;;;-1:-1:-1;25783:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25783:105:0;;;;:94;;;;;;;25858:4;-1:-1:-1;;25783:94:0;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25783:94:0;;;;;;;;-1:-1:-1;;;;;25783:105:0;;;25779:251;;;25978:16;;;;25960;;;;25934:23;25928:30;;25779:251;26121:1;:16;;;-1:-1:-1;;;;;26102:35:0;:1;:15;;;-1:-1:-1;;;;;26102:35:0;;;:74;;;;26161:1;:15;;;-1:-1:-1;;;;;26141:35:0;:1;:16;;;-1:-1:-1;;;;;26141:35:0;;;26102:74;26098:221;;;26267:16;;;;26249;;;;26222:24;26216:31;;26098:221;26429:10;26413:1;:13;;;:26;26409:168;;;26525:16;;;;26507;;;;26485:19;26479:26;;26409:168;26801:15;;;;:20;:130;;;;;26914:1;:17;;;26880:31;26888:1;:16;;;26906:4;26880:7;:31::i;:::-;:51;;;;;;;;26860:1;:16;;;26825:32;26833:1;:17;;;26852:4;26825:7;:32::i;:::-;:51;;;;;;;;:106;;26801:130;26800:285;;;;26973:1;26955;:15;;;:19;:129;;;;;27068:1;:16;;;27033:32;27041:1;:17;;;27060:4;27033:7;:32::i;:::-;:51;;;;;;;;27012:1;:17;;;26978:31;26986:1;:16;;;27004:4;26978:7;:31::i;:::-;:51;;;;;;;;:106;;26955:129;26788:308;26784:472;;;27182:16;;;;27164;;;;27127:72;27136:26;;26784:472;27340:176;;;;;;;;;27389:1;27340:176;;;;27427:1;27340:176;;;;27465:1;27340:176;;;;27503:1;27340:176;;;27316:200;;27575:1;:15;;;27594:1;27575:20;27571:10253;;;27788:16;;27817;;;;27788;27806:28;;;:10;:28;;;;;;27776:165;;27780:55;;:7;:55::i;:::-;27845:17;;;;;27923:16;;;;27883;;;;27872:28;;;;:10;:28;;;;;;27902:17;;27837:103;;27864:56;;:7;:56::i;:::-;:75;;;;;;;;27837:7;:103::i;:::-;27776:3;:165::i;:::-;27767:174;;;27960:11;27956:222;;;28118:16;;;;28100;;;;28070:27;28064:34;;27956:222;28303:16;;28274:6;;28282:17;;;;28266:34;;28274:6;28266:7;:34::i;:::-;:53;;;;;;;;28254:9;;;:65;28447:6;;28471:8;;28439:51;;28447:6;28484:4;;28455:25;;28447:6;;28455:7;:25::i;28439:51::-;28393:19;;;:97;28792:15;;;;28809:10;;28829:6;;28837:8;;28781:75;;28792:15;-1:-1:-1;;;;;28809:10:0;;28850:4;;28821:25;;28829:6;28821:7;:25::i;:::-;:34;;;;;;;;28781:10;:75::i;:::-;29014:110;29022:57;29030:2;:9;;;29073:4;29041:28;29049:2;:9;;;29060:8;;29041:7;:28::i;29022:57::-;29118:4;29081:33;29089:2;:9;;;29100:1;:13;;;29081:7;:33::i;29014:110::-;28968:19;;;:156;29459:15;;;;29476:10;;29504:9;;;;29515:8;;29448:131;;29459:15;-1:-1:-1;;;;;29476:10:0;;29488:90;;29528:4;;29496:28;;:7;:28::i;:::-;:37;;;;;;;;29572:4;29535:33;29543:2;:9;;;29554:1;:13;;;29535:7;:33::i;:::-;:42;;;;;;;;29488:7;:90::i;:::-;29448:10;:131::i;:::-;29833:48;29844:1;:16;;;29862:1;:7;;;29871:2;:9;;;29833:10;:48::i;:::-;30138:57;30149:1;:15;;;30166:1;:7;;;30175:2;:19;;;30138:10;:57::i;:::-;30673:45;30684:1;:16;;;30702:1;:7;;;30711:2;:6;;;30673:10;:45::i;:::-;31204:57;31215:1;:15;;;31232:1;:7;;;31241:2;:19;;;31204:10;:57::i;:::-;31399:16;;;;31388:28;;;;:10;:28;;;;;;31418:6;;31380:45;;31388:28;31380:7;:45::i;:::-;31345:16;;;;31334:28;;;;:10;:28;;;;;;:91;;;;31594:16;;;;31583:28;;;;31649:17;;;;31621:6;;31629:16;;;;31575:92;;31583:28;31649:17;31613:33;;:7;:33::i;31575:92::-;31529:10;:28;31540:1;:16;;;31529:28;;;;;;;;;;;;;;;;;:138;;;;31770:12;31724:21;:30;31746:1;:7;;;-1:-1:-1;;;;;31724:30:0;-1:-1:-1;;;;;31724:30:0;;;;;;;;;;;;:58;;;;31887:12;31841:21;:30;31863:1;:7;;;-1:-1:-1;;;;;31841:30:0;-1:-1:-1;;;;;31841:30:0;;;;;;;;;;;;:58;;;;32260:1;:16;;;31998:293;;;32242:1;:16;;;31998:293;;;32119:1;:7;;;-1:-1:-1;;;;;31998:293:0;;32022:1;:15;;;32039:2;:6;;;32064:1;:16;;;32082:2;:9;;;32110:1;:7;;;32145:8;;32155;;32182:2;:19;;;32204:2;:19;;;31998:293;;;;-1:-1:-1;;;;;31998:293:0;-1:-1:-1;;;;;31998:293:0;;;;;;;;;;;-1:-1:-1;;;;;31998:293:0;-1:-1:-1;;;;;31998:293:0;;;;;;;;;;;-1:-1:-1;;;;;31998:293:0;-1:-1:-1;;;;;31998:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32313:6;;;-1:-1:-1;32306:13:0;;27571:10253;32571:17;;;;;;32650:16;;32610;;;;32650;32599:28;;;:10;:28;;;;;;;;32629:17;;32559:166;;32563:104;;32650:16;;32591:56;;32599:28;32591:7;:56::i;32563:104::-;32677:16;;;;32706;;;;32695:28;;;;:10;:28;;;;;;32669:55;;32677:16;32669:7;:55::i;32559:166::-;32550:175;;;32744:11;32740:222;;;32902:16;;;;32884;;;;32854:27;32848:34;;32740:222;33098:17;;;;33070:6;;33078:16;;33062:33;;33070:6;33062:7;:33::i;:::-;:53;;;;;;;;33050:9;;;:65;;;33283:8;;33245:55;;33062:53;33295:4;;33264:28;;33062:53;;33264:7;:28::i;33245:55::-;33199:19;;;:101;33596:15;;;;33613:10;;33633:9;;;;33644:8;;33585:76;;33596:15;-1:-1:-1;;;;;33613:10:0;;33656:4;;33625:28;;33633:9;33625:7;:28::i;33585:76::-;33857:97;33865:49;33873:2;:6;;;33909:4;33881:25;33889:2;:6;;;33897:8;;33881:7;:25::i;33865:49::-;33949:4;33916:30;33924:2;:6;;;33932:1;:13;;;33916:7;:30::i;33857:97::-;33811:19;;;:143;34290:15;;;;34307:10;;34335:6;;34343:8;;34279:121;;34290:15;-1:-1:-1;;;;;34307:10:0;;34319:80;;34355:4;;34327:25;;:7;:25::i;:::-;:32;;;;;;;;34394:4;34361:30;34369:2;:6;;;34377:1;:13;;;34361:7;:30::i;34279:121::-;34624:45;34635:1;:16;;;34653:1;:7;;;34662:2;:6;;;34624:10;:45::i;:::-;35084:57;35095:1;:15;;;35112:1;:7;;;35121:2;:19;;;35084:10;:57::i;:::-;35588:48;35599:1;:16;;;35617:1;:7;;;35626:2;:9;;;35588:10;:48::i;:::-;36053:57;36064:1;:15;;;36081:1;:7;;;36090:2;:19;;;36053:10;:57::i;:::-;36994:16;;;;36983:28;;;;:10;:28;;;;;;;;;37013:9;;;;36975:48;;36983:28;36975:7;:48::i;:::-;36944:16;;;;36933:28;;;;:10;:28;;;;;;:90;;;;37141:16;;;;37130:28;;;;37160:6;;37122:45;;37130:28;37122:7;:45::i;27571:10253::-;23565:14266;;;;;;;;:::o;7264:251::-;7335:12;2189:5;;2168:27;;-1:-1:-1;;;;;2189:5:0;2175:10;:19;2168:6;:27::i;:::-;7373:7;7364:6;:16;7360:27;;;7382:5;;;7360:27;7398:23;:32;;;7448:37;;;;;;;;;;;;;;;;;-1:-1:-1;7503:4:0;7264:251;;;:::o;1321:131::-;1363:4;1389:5;;;1405:20;1412:4;;;;;;:12;;;1423:1;1420;:4;;1405:6;:20::i;1704:62::-;;;;;;;;;;;;;:::o;4757:38::-;;;;:::o;16180:978::-;16238:12;16556:6;16516:37;16535:5;16542:10;16516:18;:37::i;:::-;:46;16512:57;;;16564:5;;;16512:57;16666:37;16677:5;16684:10;16696:6;16666:10;:37::i;:::-;-1:-1:-1;;;;;16773:19:0;;;16769:270;;;16885:23;;:10;;:23;;;;;16901:6;;16885:23;;;;16901:6;16885:10;:23;;;;;;;16884:24;16880:35;;;16910:5;;;16880:35;16769:270;;;16965:41;;;;;;16987:10;16965:41;;;;;;;;;;;;-1:-1:-1;;;;;16965:21:0;;;;;:41;;;;;;;;;;;;;;-1:-1:-1;16965:21:0;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;16965:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16965:41:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16965:41:0;16964:42;16960:53;;;17008:5;;;16960:53;17070:10;-1:-1:-1;;;;;17054:68:0;;;17082:6;17090:28;17063:5;17070:10;17090:9;:28::i;:::-;17054:68;;;;;;;;;;;;;17120:1;17054:68;;;;;;;;;;;;;16180:978;;;;:::o;4146:46::-;;;;;;;;;;;;;:::o;9795:175::-;9857:7;9923:36;9947:5;9954:4;9923:23;:36::i;:::-;9960:1;9923:39;;4245:81;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5003:23::-;;;;:::o;4666:34::-;;;-1:-1:-1;;;;;4666:34:0;;:::o;8254:247::-;-1:-1:-1;;;;;8460:15:0;;;8375:17;8460:15;;;:8;:15;;;;;;;;:21;;;;;;;;;;;;;;8435:12;;;;8422:25;8460:33;;8254:247::o;12888:227::-;13015:6;12981:31;13000:5;13007:4;12981:18;:31::i;:::-;:40;12977:51;;;13023:5;;;12977:51;13040:67;13054:5;13061:4;13067:39;13075:22;13085:5;13092:4;13075:9;:22::i;:::-;13099:6;13067:7;:39::i;:::-;13040:13;:67::i;:::-;;12888:227;;;:::o;12685:164::-;12774:67;12788:5;12795:4;12801:39;12809:22;12819:5;12826:4;12809:9;:22::i;:::-;12833:6;12801:7;:39::i;8790:235::-;8884:17;8912:22;8922:5;8929:4;8912:9;:22::i;:::-;-1:-1:-1;;;;;8984:15:0;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;;;;;;8959:12;;;;8946:25;;;8984:33;;;-1:-1:-1;8790:235:0:o;8509:273::-;8596:4;8646:7;8703:3;8678:23;8689:5;8696:4;8678:10;:23::i;:::-;-1:-1:-1;;;;;8719:15:0;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;8678:28;;;;;;8665:41;;;;8719:33;;;;8770:4;;-1:-1:-1;8509:273:0;;;;;;:::o;40595:96::-;40646:4;40674:1;40670;:5;:13;;40682:1;40670:13;;;-1:-1:-1;40678:1:0;;40595:96;-1:-1:-1;40595:96:0:o;774:39920::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;774:39920:0;;;-1:-1:-1;;774:39920:0:o;:::-;;;;;;;;;;;;;;;105:10:-1;774:39920:0;88:34:-1;-1:-1;774:39920:0;;;-1:-1:-1;;774:39920:0:o;:::-;;;;;;;;;-1:-1:-1;774:39920:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://cb1c3dc490c6a6ea119cd0477e7024bb62462b62300e7b16a5d4573051b5bbea

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
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.