ETH Price: $2,708.26 (+2.80%)

Contract

0x20233a2095787DAC434F20f8954d3758986EF30E
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Accept120667432021-03-19 3:27:001433 days ago1616124420IN
0x20233a20...8986EF30E
0 ETH0.05596625121.00000146
Repay120665222021-03-19 2:39:121433 days ago1616121552IN
0x20233a20...8986EF30E
0 ETH0.01303192117.00000145
Accept114281352020-12-10 23:27:131531 days ago1607642833IN
0x20233a20...8986EF30E
0 ETH0.0091647420
Repay114281232020-12-10 23:24:041531 days ago1607642644IN
0x20233a20...8986EF30E
0 ETH0.0018314122.5
Repay114281112020-12-10 23:21:121531 days ago1607642472IN
0x20233a20...8986EF30E
0 ETH0.002854628.00000145
Accept112805702020-11-18 7:26:331554 days ago1605684393IN
0x20233a20...8986EF30E
0 ETH0.0233712550
Repay112805542020-11-18 7:21:411554 days ago1605684101IN
0x20233a20...8986EF30E
0 ETH0.0050122845
Accept111441452020-10-28 8:42:221575 days ago1603874542IN
0x20233a20...8986EF30E
0 ETH0.0006469928
Accept111441452020-10-28 8:42:221575 days ago1603874542IN
0x20233a20...8986EF30E
0 ETH0.0128307728
Repay111441372020-10-28 8:41:011575 days ago1603874461IN
0x20233a20...8986EF30E
0 ETH0.0031187528
Accept111316432020-10-26 11:00:401577 days ago1603710040IN
0x20233a20...8986EF30E
0 ETH0.0169549537.00000145
Repay111316242020-10-26 10:55:331577 days ago1603709733IN
0x20233a20...8986EF30E
0 ETH0.0021967227
Repay111315242020-10-26 10:33:111577 days ago1603708391IN
0x20233a20...8986EF30E
0 ETH0.0017088630
Accept111284072020-10-25 22:51:461577 days ago1603666306IN
0x20233a20...8986EF30E
0 ETH0.0075720616.00000145
Repay111283922020-10-25 22:48:361577 days ago1603666116IN
0x20233a20...8986EF30E
0 ETH0.0015421416.00000145
Repay111249332020-10-25 10:07:171578 days ago1603620437IN
0x20233a20...8986EF30E
0 ETH0.0016522719
Accept111072262020-10-22 16:56:211580 days ago1603385781IN
0x20233a20...8986EF30E
0 ETH0.011914626.00000145
Repay111072182020-10-22 16:54:231580 days ago1603385663IN
0x20233a20...8986EF30E
0 ETH0.0094686685
Accept110283272020-10-10 14:52:011593 days ago1602341521IN
0x20233a20...8986EF30E
0 ETH0.02841162
Repay110283242020-10-10 14:51:181593 days ago1602341478IN
0x20233a20...8986EF30E
0 ETH0.006905862
Accept108747592020-09-16 18:32:351616 days ago1600281155IN
0x20233a20...8986EF30E
0 ETH0.05359353115.85185508
Repay108747522020-09-16 18:31:051616 days ago1600281065IN
0x20233a20...8986EF30E
0 ETH0.01325612119
Accept108686162020-09-15 19:40:561617 days ago1600198856IN
0x20233a20...8986EF30E
0 ETH0.0481182103.33799892
Repay108686092020-09-15 19:39:371617 days ago1600198777IN
0x20233a20...8986EF30E
0 ETH0.01158393104
Accept108351542020-09-10 16:42:531623 days ago1599756173IN
0x20233a20...8986EF30E
0 ETH0.12397386267.99076418
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Loans

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-02-24
*/

pragma solidity 0.5.10;


contract Context {
    
    
    constructor () internal { }
    

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; 
        return msg.data;
    }
}

interface IERC20 {
    
    function totalSupply() external view returns (uint256);

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

    
    function transfer(address recipient, uint256 amount) external returns (bool);

    
    function allowance(address owner, address spender) external view returns (uint256);

    
    function approve(address spender, uint256 amount) external returns (bool);

    
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    
    event Transfer(address indexed from, address indexed to, uint256 value);

    
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

        return c;
    }

    
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

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

        return c;
    }

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

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

        return c;
    }

    
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        
        require(b > 0, errorMessage);
        uint256 c = a / b;
        

        return c;
    }

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

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

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

     
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

library BytesLib {
    function concat(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bytes memory) {
        bytes memory tempBytes;

        assembly {
            
            
            tempBytes := mload(0x40)

            
            
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            
            
            
            let mc := add(tempBytes, 0x20)
            
            
            let end := add(mc, length)

            for {
                
                
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                
                
                mstore(mc, mload(cc))
            }

            
            
            
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            
            
            mc := end
            
            
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            
            
            
            
            
            mstore(0x40, and(
                add(add(end, iszero(add(length, mload(_preBytes)))), 31),
                not(31) 
            ))
        }

        return tempBytes;
    }

    function concatStorage(bytes storage _preBytes, bytes memory _postBytes) internal {
        assembly {
            
            
            
            let fslot := sload(_preBytes_slot)
            
            
            
            
            
            
            
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)
            let newlength := add(slength, mlength)
            
            
            
            switch add(lt(slength, 32), lt(newlength, 32))
            case 2 {
                
                
                
                sstore(
                    _preBytes_slot,
                    
                    
                    add(
                        
                        
                        fslot,
                        add(
                            mul(
                                div(
                                    
                                    mload(add(_postBytes, 0x20)),
                                    
                                    exp(0x100, sub(32, mlength))
                        ),
                        
                        
                        exp(0x100, sub(32, newlength))
                        ),
                        
                        
                        mul(mlength, 2)
                        )
                    )
                )
            }
            case 1 {
                
                
                
                mstore(0x0, _preBytes_slot)
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                
                sstore(_preBytes_slot, add(mul(newlength, 2), 1))

                
                
                
                
                
                
                
                

                let submod := sub(32, slength)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(
                    sc,
                    add(
                        and(
                            fslot,
                            0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00
                    ),
                    and(mload(mc), mask)
                    )
                )

                for {
                    mc := add(mc, 0x20)
                    sc := add(sc, 1)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
            default {
                
                mstore(0x0, _preBytes_slot)
                
                let sc := add(keccak256(0x0, 0x20), div(slength, 32))

                
                sstore(_preBytes_slot, add(mul(newlength, 2), 1))

                
                
                let slengthmod := mod(slength, 32)
                let mlengthmod := mod(mlength, 32)
                let submod := sub(32, slengthmod)
                let mc := add(_postBytes, submod)
                let end := add(_postBytes, mlength)
                let mask := sub(exp(0x100, submod), 1)

                sstore(sc, add(sload(sc), and(mload(mc), mask)))

                for {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } lt(mc, end) {
                    sc := add(sc, 1)
                    mc := add(mc, 0x20)
                } {
                    sstore(sc, mload(mc))
                }

                mask := exp(0x100, sub(mc, end))

                sstore(sc, mul(div(mload(mc), mask), mask))
            }
        }
    }

    function slice(bytes memory _bytes, uint _start, uint _length) internal  pure returns (bytes memory) {
        require(_bytes.length >= (_start + _length), "Slice out of bounds");

        bytes memory tempBytes;

        assembly {
            switch iszero(_length)
            case 0 {
                
                
                tempBytes := mload(0x40)

                
                
                
                
                
                
                
                
                let lengthmod := and(_length, 31)

                
                
                
                
                let mc := add(add(tempBytes, lengthmod), mul(0x20, iszero(lengthmod)))
                let end := add(mc, _length)

                for {
                    
                    
                    let cc := add(add(add(_bytes, lengthmod), mul(0x20, iszero(lengthmod))), _start)
                } lt(mc, end) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    mstore(mc, mload(cc))
                }

                mstore(tempBytes, _length)

                
                
                mstore(0x40, and(add(mc, 31), not(31)))
            }
            
            default {
                tempBytes := mload(0x40)

                mstore(0x40, add(tempBytes, 0x20))
            }
        }

        return tempBytes;
    }

    function toAddress(bytes memory _bytes, uint _start) internal  pure returns (address) {
        require(_bytes.length >= (_start + 20), "Address conversion out of bounds.");
        address tempAddress;

        assembly {
            tempAddress := div(mload(add(add(_bytes, 0x20), _start)), 0x1000000000000000000000000)
        }

        return tempAddress;
    }

    function toUint(bytes memory _bytes, uint _start) internal  pure returns (uint256) {
        require(_bytes.length >= (_start + 32), "Uint conversion out of bounds.");
        uint256 tempUint;

        assembly {
            tempUint := mload(add(add(_bytes, 0x20), _start))
        }

        return tempUint;
    }

    function equal(bytes memory _preBytes, bytes memory _postBytes) internal pure returns (bool) {
        bool success = true;

        assembly {
            let length := mload(_preBytes)

            
            switch eq(length, mload(_postBytes))
            case 1 {
                
                
                
                
                let cb := 1

                let mc := add(_preBytes, 0x20)
                let end := add(mc, length)

                for {
                    let cc := add(_postBytes, 0x20)
                    
                    
                } eq(add(lt(mc, end), cb), 2) {
                    mc := add(mc, 0x20)
                    cc := add(cc, 0x20)
                } {
                    
                    if iszero(eq(mload(mc), mload(cc))) {
                        
                        success := 0
                        cb := 0
                    }
                }
            }
            default {
                
                success := 0
            }
        }

        return success;
    }

    function equalStorage(bytes storage _preBytes, bytes memory _postBytes) internal view returns (bool) {
        bool success = true;

        assembly {
            
            let fslot := sload(_preBytes_slot)
            
            let slength := div(and(fslot, sub(mul(0x100, iszero(and(fslot, 1))), 1)), 2)
            let mlength := mload(_postBytes)

            
            switch eq(slength, mlength)
            case 1 {
                
                
                
                if iszero(iszero(slength)) {
                    switch lt(slength, 32)
                    case 1 {
                        
                        fslot := mul(div(fslot, 0x100), 0x100)

                        if iszero(eq(fslot, mload(add(_postBytes, 0x20)))) {
                            
                            success := 0
                        }
                    }
                    default {
                        
                        
                        
                        
                        let cb := 1

                        
                        mstore(0x0, _preBytes_slot)
                        let sc := keccak256(0x0, 0x20)

                        let mc := add(_postBytes, 0x20)
                        let end := add(mc, mlength)

                        
                        
                        for {} eq(add(lt(mc, end), cb), 2) {
                            sc := add(sc, 1)
                            mc := add(mc, 0x20)
                        } {
                            if iszero(eq(sload(sc), mload(mc))) {
                                
                                success := 0
                                cb := 0
                            }
                        }
                    }
                }
            }
            default {
                
                success := 0
            }
        }

        return success;
    }

    function toBytes32(bytes memory _source) pure internal returns (bytes32 result) {
        bytes memory tempEmptyStringTest = bytes(_source);
        if (tempEmptyStringTest.length == 0) {
            return 0x0;
        }

        assembly {
            result := mload(add(_source, 32))
        }
    }
}

library BTCUtils {
    using BytesLib for bytes;
    using SafeMath for uint256;

    
    uint256 public constant DIFF1_TARGET = 0xffff0000000000000000000000000000000000000000000000000000;

    uint256 public constant RETARGET_PERIOD = 2 * 7 * 24 * 60 * 60;  
    uint256 public constant RETARGET_PERIOD_BLOCKS = 2016;  

    
    
    

    
    
    
    
    function determineVarIntDataLength(bytes memory _flag) internal pure returns (uint8) {
        if (uint8(_flag[0]) == 0xff) {
            return 8;  
        }
        if (uint8(_flag[0]) == 0xfe) {
            return 4;  
        }
        if (uint8(_flag[0]) == 0xfd) {
            return 2;  
        }

        return 0;  
    }

    
    
    
    
    function reverseEndianness(bytes memory _b) internal pure returns (bytes memory) {
        bytes memory _newValue = new bytes(_b.length);

        for (uint i = 0; i < _b.length; i++) {
            _newValue[_b.length - i - 1] = _b[i];
        }

        return _newValue;
    }

    
    
    
    
    function bytesToUint(bytes memory _b) internal pure returns (uint256) {
        uint256 _number;

        for (uint i = 0; i < _b.length; i++) {
            _number = _number + uint8(_b[i]) * (2 ** (8 * (_b.length - (i + 1))));
        }

        return _number;
    }

    
    
    
    
    function lastBytes(bytes memory _b, uint256 _num) internal pure returns (bytes memory) {
        uint256 _start = _b.length.sub(_num);

        return _b.slice(_start, _num);
    }

    
    
    
    
    function hash160(bytes memory _b) internal pure returns (bytes memory) {
        return abi.encodePacked(ripemd160(abi.encodePacked(sha256(_b))));
    }

    
    
    
    
    function hash256(bytes memory _b) internal pure returns (bytes32) {
        return abi.encodePacked(sha256(abi.encodePacked(sha256(_b)))).toBytes32();
    }

    
    
    

    
    
    
    
    
    function extractInputAtIndex(bytes memory _vin, uint8 _index) internal pure returns (bytes memory) {
        uint256 _len;
        bytes memory _remaining;

        uint256 _offset = 1;

        for (uint8 _i = 0; _i < _index; _i ++) {
            _remaining = _vin.slice(_offset, _vin.length - _offset);
            _len = determineInputLength(_remaining);
            _offset = _offset + _len;
        }

        _remaining = _vin.slice(_offset, _vin.length - _offset);
        _len = determineInputLength(_remaining);
        return _vin.slice(_offset, _len);
    }

    
    
    
    
    function isLegacyInput(bytes memory _input) internal pure returns (bool) {
        return keccak256(_input.slice(36, 1)) != keccak256(hex"00");
    }

    
    
    
    
    function determineInputLength(bytes memory _input) internal pure returns (uint256) {
        uint8 _varIntDataLen;
        uint256 _scriptSigLen;
        (_varIntDataLen, _scriptSigLen) = extractScriptSigLen(_input);
        return 36 + 1 + _varIntDataLen + _scriptSigLen + 4;
    }

    
    
    
    
    function extractSequenceLELegacy(bytes memory _input) internal pure returns (bytes memory) {
        uint8 _varIntDataLen;
        uint256 _scriptSigLen;
        (_varIntDataLen, _scriptSigLen) = extractScriptSigLen(_input);
        return _input.slice(36 + 1 + _varIntDataLen + _scriptSigLen, 4);
    }

    
    
    
    
    function extractSequenceLegacy(bytes memory _input) internal pure returns (uint32) {
        bytes memory _leSeqence = extractSequenceLELegacy(_input);
        bytes memory _beSequence = reverseEndianness(_leSeqence);
        return uint32(bytesToUint(_beSequence));
    }
    
    
    
    
    function extractScriptSig(bytes memory _input) internal pure returns (bytes memory) {
        uint8 _varIntDataLen;
        uint256 _scriptSigLen;
        (_varIntDataLen, _scriptSigLen) = extractScriptSigLen(_input);
        return _input.slice(36, 1 + _varIntDataLen + _scriptSigLen);
    }

    
    
    
    
    function extractScriptSigLen(bytes memory _input) internal pure returns (uint8, uint256) {
        bytes memory _varIntTag = _input.slice(36, 1);
        uint8 _varIntDataLen = determineVarIntDataLength(_varIntTag);
        uint256 _len;
        if (_varIntDataLen == 0) {
            _len = uint8(_varIntTag[0]);
        } else {
            _len = bytesToUint(reverseEndianness(_input.slice(36 + 1, _varIntDataLen)));
        }
        return (_varIntDataLen, _len);
    }


    
    
    

    
    
    
    
    function extractSequenceLEWitness(bytes memory _input) internal pure returns (bytes memory) {
        return _input.slice(37, 4);
    }

    
    
    
    
    function extractSequenceWitness(bytes memory _input) internal pure returns (uint32) {
        bytes memory _leSeqence = extractSequenceLEWitness(_input);
        bytes memory _inputeSequence = reverseEndianness(_leSeqence);
        return uint32(bytesToUint(_inputeSequence));
    }

    
    
    
    
    function extractOutpoint(bytes memory _input) internal pure returns (bytes memory) {
        return _input.slice(0, 36);
    }

    
    
    
    
    function extractInputTxIdLE(bytes memory _input) internal pure returns (bytes32) {
        return _input.slice(0, 32).toBytes32();
    }

    
    
    
    
    function extractInputTxId(bytes memory _input) internal pure returns (bytes32) {
        bytes memory _leId = abi.encodePacked(extractInputTxIdLE(_input));
        bytes memory _beId = reverseEndianness(_leId);
        return _beId.toBytes32();
    }

    
    
    
    
    function extractTxIndexLE(bytes memory _input) internal pure returns (bytes memory) {
        return _input.slice(32, 4);
    }

    
    
    
    
    function extractTxIndex(bytes memory _input) internal pure returns (uint32) {
        bytes memory _leIndex = extractTxIndexLE(_input);
        bytes memory _beIndex = reverseEndianness(_leIndex);
        return uint32(bytesToUint(_beIndex));
    }

    
    
    

    
    
    
    
    function determineOutputLength(bytes memory _output) internal pure returns (uint256) {
        uint8 _len = uint8(_output.slice(8, 1)[0]);
        require(_len < 0xfd, "Multi-byte VarInts not supported");

        return _len + 8 + 1; 
    }

    
    
    
    
    
    function extractOutputAtIndex(bytes memory _vout, uint8 _index) internal pure returns (bytes memory) {
        uint256 _len;
        bytes memory _remaining;

        uint256 _offset = 1;

        for (uint8 _i = 0; _i < _index; _i ++) {
            _remaining = _vout.slice(_offset, _vout.length - _offset);
            _len = determineOutputLength(_remaining);
            _offset = _offset + _len;
        }

        _remaining = _vout.slice(_offset, _vout.length - _offset);
        _len = determineOutputLength(_remaining);
        return _vout.slice(_offset, _len);
    }

    
    
    
    
    function extractOutputScriptLen(bytes memory _output) internal pure returns (bytes memory) {
        return _output.slice(8, 1);
    }

    
    
    
    
    function extractValueLE(bytes memory _output) internal pure returns (bytes memory) {
        return _output.slice(0, 8);
    }

    
    
    
    
    function extractValue(bytes memory _output) internal pure returns (uint64) {
        bytes memory _leValue = extractValueLE(_output);
        bytes memory _beValue = reverseEndianness(_leValue);
        return uint64(bytesToUint(_beValue));
    }

    
    
    
    
    function extractOpReturnData(bytes memory _output) internal pure returns (bytes memory) {
        if (keccak256(_output.slice(9, 1)) != keccak256(hex"6a")) {
            return hex"";
        }
        bytes memory _dataLen = _output.slice(10, 1);
        return _output.slice(11, bytesToUint(_dataLen));
    }

    
    
    
    
    function extractHash(bytes memory _output) internal pure returns (bytes memory) {
        if (uint8(_output.slice(9, 1)[0]) == 0) {
            uint256 _len = uint8(extractOutputScriptLen(_output)[0]) - 2;
            
            if (uint8(_output.slice(10, 1)[0]) != uint8(_len)) {
                return hex"";
            }
            return _output.slice(11, _len);
        } else {
            bytes32 _tag = keccak256(_output.slice(8, 3));
            
            if (_tag == keccak256(hex"1976a9")) {
                
                if (uint8(_output.slice(11, 1)[0]) != 0x14 ||
                    keccak256(_output.slice(_output.length - 2, 2)) != keccak256(hex"88ac")) {
                    return hex"";
                }
                return _output.slice(12, 20);
            
            } else if (_tag == keccak256(hex"17a914")) {
                
                if (uint8(_output.slice(_output.length - 1, 1)[0]) != 0x87) {
                    return hex"";
                }
                return _output.slice(11, 20);
            }
        }
        return hex"";  
    }

    
    
    


    
    
    
    
    function validateVin(bytes memory _vin) internal pure returns (bool) {
        uint256 _offset = 1;
        uint8 _nIns = uint8(_vin.slice(0, 1)[0]);

        
        if (_nIns >= 0xfd || _nIns == 0) {
            return false;
        }

        for (uint8 i = 0; i < _nIns; i++) {
            
            
            _offset += determineInputLength(_vin.slice(_offset, _vin.length - _offset));

            
            if (_offset > _vin.length) {
                return false;
            }
        }

        
        return _offset == _vin.length;
    }

    
    
    
    
    function validateVout(bytes memory _vout) internal pure returns (bool) {
        uint256 _offset = 1;
        uint8 _nOuts = uint8(_vout.slice(0, 1)[0]);

        
        if (_nOuts >= 0xfd || _nOuts == 0) {
            return false;
        }

        for (uint8 i = 0; i < _nOuts; i++) {
            
            
            _offset += determineOutputLength(_vout.slice(_offset, _vout.length - _offset));

            
            if (_offset > _vout.length) {
                return false;
            }
        }

        
        return _offset == _vout.length;
    }



    
    
    

    
    
    
    
    function extractMerkleRootLE(bytes memory _header) internal pure returns (bytes memory) {
        return _header.slice(36, 32);
    }

    
    
    
    
    function extractMerkleRootBE(bytes memory _header) internal pure returns (bytes memory) {
        return reverseEndianness(extractMerkleRootLE(_header));
    }

    
    
    
    
    function extractTarget(bytes memory _header) internal pure returns (uint256) {
        bytes memory _m = _header.slice(72, 3);
        uint8 _e = uint8(_header[75]);
        uint256 _mantissa = bytesToUint(reverseEndianness(_m));
        uint _exponent = _e - 3;

        return _mantissa * (256 ** _exponent);
    }

    
    
    
    
    
    function calculateDifficulty(uint256 _target) internal pure returns (uint256) {
        
        return DIFF1_TARGET.div(_target);
    }

    
    
    
    
    function extractPrevBlockLE(bytes memory _header) internal pure returns (bytes memory) {
        return _header.slice(4, 32);
    }

    
    
    
    
    function extractPrevBlockBE(bytes memory _header) internal pure returns (bytes memory) {
        return reverseEndianness(extractPrevBlockLE(_header));
    }

    
    
    
    
    function extractTimestampLE(bytes memory _header) internal pure returns (bytes memory) {
        return _header.slice(68, 4);
    }

    
    
    
    
    function extractTimestamp(bytes memory _header) internal pure returns (uint32) {
        return uint32(bytesToUint(reverseEndianness(extractTimestampLE(_header))));
    }

    
    
    
    
    function extractDifficulty(bytes memory _header) internal pure returns (uint256) {
        return calculateDifficulty(extractTarget(_header));
    }

    
    
    
    
    function _hash256MerkleStep(bytes memory _a, bytes memory _b) internal pure returns (bytes32) {
        return hash256(abi.encodePacked(_a, _b));
    }

    
    
    
    
    
    function verifyHash256Merkle(bytes memory _proof, uint _index) internal pure returns (bool) {
        
        if (_proof.length % 32 != 0) {
            return false;
        }

        
        if (_proof.length == 32) {
            return true;
        }

        
        if (_proof.length == 64) {
            return false;
        }

        uint _idx = _index;
        bytes32 _root = _proof.slice(_proof.length - 32, 32).toBytes32();
        bytes32 _current = _proof.slice(0, 32).toBytes32();

        for (uint i = 1; i < (_proof.length.div(32)) - 1; i++) {
            if (_idx % 2 == 1) {
                _current = _hash256MerkleStep(_proof.slice(i * 32, 32), abi.encodePacked(_current));
            } else {
                _current = _hash256MerkleStep(abi.encodePacked(_current), _proof.slice(i * 32, 32));
            }
            _idx = _idx >> 1;
        }
        return _current == _root;
    }

    
    
    
    
    
    
    
    function retargetAlgorithm(
        uint256 _previousTarget,
        uint256 _firstTimestamp,
        uint256 _secondTimestamp
    ) internal pure returns (uint256) {
        uint256 _elapsedTime = _secondTimestamp.sub(_firstTimestamp);

        
        if (_elapsedTime < RETARGET_PERIOD.div(4)) {
            _elapsedTime = RETARGET_PERIOD.div(4);
        }
        if (_elapsedTime > RETARGET_PERIOD.mul(4)) {
            _elapsedTime = RETARGET_PERIOD.mul(4);
        }

        

        uint256 _adjusted = _previousTarget.div(65536).mul(_elapsedTime);
        return _adjusted.div(RETARGET_PERIOD).mul(65536);
    }
}

interface FundsInterface {
    function lender(bytes32) external view returns (address);
    function custom(bytes32) external view returns (bool);
    function deposit(bytes32, uint256) external;
    function decreaseTotalBorrow(uint256) external;
    function calcGlobalInterest() external;
}

interface SalesInterface {
    function saleIndexByLoan(bytes32, uint256) external returns(bytes32);
    function settlementExpiration(bytes32) external view returns (uint256);
    function accepted(bytes32) external view returns (bool);
    function next(bytes32) external view returns (uint256);
    function create(bytes32, address, address, address, address, bytes32, bytes32, bytes32, bytes32, bytes20) external returns(bytes32);
}

interface CollateralInterface {
    function onDemandSpv() external view returns(address);
    function collateral(bytes32 loan) external view returns (uint256);
    function refundableCollateral(bytes32 loan) external view returns (uint256);
    function seizableCollateral(bytes32 loan) external view returns (uint256);
    function temporaryRefundableCollateral(bytes32 loan) external view returns (uint256);
    function temporarySeizableCollateral(bytes32 loan) external view returns (uint256);
    function setCollateral(bytes32 loan, uint256 refundableCollateral_, uint256 seizableCollateral_) external;
    function requestSpv(bytes32 loan) external;
    function cancelSpv(bytes32 loan) external;
}

contract DSMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x);
    }
    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x);
    }
    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }
    function div(uint a, uint b) internal pure returns (uint c) {
        require(b > 0);
        c = a / b;
    }

    function min(uint x, uint y) internal pure returns (uint z) {
        return x <= y ? x : y;
    }
    function max(uint x, uint y) internal pure returns (uint z) {
        return x >= y ? x : y;
    }
    function imin(int x, int y) internal pure returns (int z) {
        return x <= y ? x : y;
    }
    function imax(int x, int y) internal pure returns (int z) {
        return x >= y ? x : y;
    }

    uint constant COL  = 10 ** 8;
    uint constant WAD  = 10 ** 18;
    uint constant RAY  = 10 ** 27;

    function cmul(uint x, uint y) public pure returns (uint z) {
        z = add(mul(x, y), COL / 2) / COL;
    }
    function wmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }
    function rmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }
    function cdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, COL), y / 2) / y;
    }
    function wdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, WAD), y / 2) / y;
    }
    function rdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    function rpow(uint x, uint n) internal pure returns (uint z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}

contract Medianizer {
    function peek() external view returns (bytes32, bool);
    function read() external returns (bytes32);
    function poke() external;
    function poke(bytes32) external;
    function fund (uint256 amount, ERC20 token) external;
}

contract Loans is DSMath {
    FundsInterface funds;
    Medianizer med;
    SalesInterface sales;
    CollateralInterface col;

    uint256 public constant APPROVE_EXP_THRESHOLD = 4 hours;    
    uint256 public constant ACCEPT_EXP_THRESHOLD = 2 days;      
    uint256 public constant LIQUIDATION_EXP_THRESHOLD = 7 days; 
    uint256 public constant SEIZURE_EXP_THRESHOLD = 2 days;     
    uint256 public constant LIQUIDATION_DISCOUNT = 930000000000000000; 
    uint256 public constant MAX_NUM_LIQUIDATIONS = 3; 
    uint256 public constant MAX_UINT_256 = 2**256-1;

    mapping (bytes32 => Loan)                     public loans;
    mapping (bytes32 => PubKeys)                  public pubKeys;             
    mapping (bytes32 => SecretHashes)             public secretHashes;        
    mapping (bytes32 => Bools)                    public bools;               
    mapping (bytes32 => bytes32)                  public fundIndex;           
    mapping (bytes32 => uint256)                  public repayments;          
    mapping (address => bytes32[])                public borrowerLoans;
    mapping (address => bytes32[])                public lenderLoans;
    mapping (address => mapping(uint256 => bool)) public addressToTimestamp;
    uint256                                       public loanIndex;           

    ERC20 public token; 
    uint256 public decimals;

    address deployer;

    
    struct Loan {
        address borrower;
        address lender;
        address arbiter;
        uint256 createdAt;
        uint256 loanExpiration;
        uint256 requestTimestamp;
        uint256 closedTimestamp;
        uint256 principal;
        uint256 interest;
        uint256 penalty;
        uint256 fee;
        uint256 liquidationRatio;
    }

    
    struct PubKeys {
        bytes   borrowerPubKey;
        bytes   lenderPubKey;
        bytes   arbiterPubKey;
    }

    
    struct SecretHashes {
        bytes32    secretHashA1;
        bytes32[3] secretHashAs;
        bytes32    secretHashB1;
        bytes32[3] secretHashBs;
        bytes32    secretHashC1;
        bytes32[3] secretHashCs;
        bytes32    withdrawSecret;
        bytes32    acceptSecret;
        bool       set;
    }

    
    struct Bools {
        bool funded;
        bool approved;
        bool withdrawn;
        bool sale;
        bool paid;
        bool off;
    }

    event Create(bytes32 loan);

    event SetSecretHashes(bytes32 loan);

    event FundLoan(bytes32 loan);

    event Approve(bytes32 loan);

    event Withdraw(bytes32 loan, bytes32 secretA1);

    event Repay(bytes32 loan, uint256 amount);

    event Refund(bytes32 loan);

    event Cancel(bytes32 loan, bytes32 secret);

    event Accept(bytes32 loan, bytes32 secret);

    event Liquidate(bytes32 loan, bytes32 secretHash, bytes20 pubKeyHash);

    
    function borrower(bytes32 loan) external view returns (address) {
        return loans[loan].borrower;
    }

    
    function lender(bytes32 loan) external view returns (address) {
        return loans[loan].lender;
    }

    
    function arbiter(bytes32 loan) external view returns (address) {
        return loans[loan].arbiter;
    }

    
    function approveExpiration(bytes32 loan) public view returns (uint256) { 
        return add(loans[loan].createdAt, APPROVE_EXP_THRESHOLD);
    }

    
    function acceptExpiration(bytes32 loan) public view returns (uint256) { 
        return add(loans[loan].loanExpiration, ACCEPT_EXP_THRESHOLD);
    }

    
    function liquidationExpiration(bytes32 loan) public view returns (uint256) { 
        return add(loans[loan].loanExpiration, LIQUIDATION_EXP_THRESHOLD);
    }

    
    function seizureExpiration(bytes32 loan) public view returns (uint256) {
        return add(liquidationExpiration(loan), SEIZURE_EXP_THRESHOLD);
    }

    
    function principal(bytes32 loan) public view returns (uint256) {
        return loans[loan].principal;
    }

    
    function interest(bytes32 loan) public view returns (uint256) {
        return loans[loan].interest;
    }

    
    function fee(bytes32 loan) public view returns (uint256) {
        return loans[loan].fee;
    }

    
    function penalty(bytes32 loan) public view returns (uint256) {
        return loans[loan].penalty;
    }

    
    function collateral(bytes32 loan) public view returns (uint256) {
        return col.collateral(loan);
    }

    
    function refundableCollateral(bytes32 loan) external view returns (uint256) {
        return col.refundableCollateral(loan);
    }

    
    function seizableCollateral(bytes32 loan) external view returns (uint256) {
        return col.seizableCollateral(loan);
    }

    
    function temporaryRefundableCollateral(bytes32 loan) external view returns (uint256) {
        return col.temporaryRefundableCollateral(loan);
    }

    
    function temporarySeizableCollateral(bytes32 loan) external view returns (uint256) {
        return col.temporarySeizableCollateral(loan);
    }

    
    function repaid(bytes32 loan) public view returns (uint256) { 
        return repayments[loan];
    }

    
    function liquidationRatio(bytes32 loan) public view returns (uint256) {
        return loans[loan].liquidationRatio;
    }

    
    function owedToLender(bytes32 loan) public view returns (uint256) { 
        return add(principal(loan), interest(loan));
    }

    
    function owedForLoan(bytes32 loan) public view returns (uint256) { 
        return add(owedToLender(loan), fee(loan));
    }

    
    function owedForLiquidation(bytes32 loan) external view returns (uint256) { 
        return add(owedForLoan(loan), penalty(loan));
    }

    
    function owing(bytes32 loan) external view returns (uint256) {
        return sub(owedForLoan(loan), repaid(loan));
    }

    
    function funded(bytes32 loan) external view returns (bool) {
        return bools[loan].funded;
    }

    
    function approved(bytes32 loan) external view returns (bool) {
        return bools[loan].approved;
    }

    
    function withdrawn(bytes32 loan) external view returns (bool) {
        return bools[loan].withdrawn;
    }

    
    function sale(bytes32 loan) public view returns (bool) {
        return bools[loan].sale;
    }

    
    function paid(bytes32 loan) external view returns (bool) {
        return bools[loan].paid;
    }

    
    function off(bytes32 loan) public view returns (bool) {
        return bools[loan].off;
    }

    
    function dmul(uint x) public view returns (uint256) {
        return mul(x, (10 ** sub(18, decimals)));
    }

    
    function ddiv(uint x) public view returns (uint256) {
        return div(x, (10 ** sub(18, decimals)));
    }

    
    function borrowerLoanCount(address borrower_) external view returns (uint256) {
        return borrowerLoans[borrower_].length;
    }

    
    function lenderLoanCount(address lender_) external view returns (uint256) {
        return lenderLoans[lender_].length;
    }

    
    function minSeizableCollateral(bytes32 loan) public view returns (uint256) {
        (bytes32 val, bool set) = med.peek();
        require(set, "Loans.minSeizableCollateral: Medianizer must be set");
        uint256 price = uint(val);
        return div(wdiv(dmul(sub(owedForLoan(loan), repaid(loan))), price), div(WAD, COL));
    }

    
    function collateralValue(bytes32 loan) public view returns (uint256) {
        (bytes32 val, bool set) = med.peek();
        require(set, "Loans.collateralValue: Medianizer must be set");
        uint256 price = uint(val);
        return cmul(price, collateral(loan));
    }

    
    function minCollateralValue(bytes32 loan) public view returns (uint256) {
        return rmul(dmul(sub(owedForLoan(loan), repaid(loan))), liquidationRatio(loan));
    }

    
    function discountCollateralValue(bytes32 loan) public view returns (uint256) {
        return wmul(collateralValue(loan), LIQUIDATION_DISCOUNT);
    }

    
    function safe(bytes32 loan) public view returns (bool) {
        return collateralValue(loan) >= minCollateralValue(loan);
    }

    
    constructor (FundsInterface funds_, Medianizer med_, ERC20 token_, uint256 decimals_) public {
        require(address(funds_) != address(0), "Funds address must be non-zero");
        require(address(med_) != address(0), "Medianizer address must be non-zero");
        require(address(token_) != address(0), "Token address must be non-zero");

        deployer = msg.sender;
        funds = funds_;
        med = med_;
        token = token_;
        decimals = decimals_;
        require(token.approve(address(funds), MAX_UINT_256), "Token approve failed");
    }

    
    
    
    
    
    

    
    function setSales(SalesInterface sales_) external {
        require(msg.sender == deployer, "Loans.setSales: Only the deployer can perform this");
        require(address(sales) == address(0), "Loans.setSales: The Sales address has already been set");
        require(address(sales_) != address(0), "Loans.setSales: Sales address must be non-zero");
        sales = sales_;
    }

    
    function setCollateral(CollateralInterface col_) external {
        require(msg.sender == deployer, "Loans.setCollateral: Only the deployer can perform this");
        require(address(col) == address(0), "Loans.setCollateral: The Collateral address has already been set");
        require(address(col_) != address(0), "Loans.setCollateral: Collateral address must be non-zero");
        col = col_;
    }
    

    
    function create(
        uint256             loanExpiration_,
        address[3] calldata usrs_,
        uint256[7] calldata vals_,
        bytes32             fund
    ) external returns (bytes32 loan) {
        if (fund != bytes32(0)) {
            require(funds.lender(fund) == usrs_[1], "Loans.create: Lender of Fund not in args");
        }
        require(!addressToTimestamp[usrs_[0]][vals_[6]], "Loans.create: Duplicate request timestamps are not allowed");
        require(loanExpiration_ > now, "Loans.create: loanExpiration must be greater than `now`");
        require(usrs_[0] != address(0) && usrs_[1] != address(0), "Loans.create: Borrower and Lender address must be non-zero");
        require(vals_[0] != 0 && vals_[4] != 0, "Loans.create: Principal and Collateral must be non-zero");
        require(vals_[5] != 0 && vals_[6] != 0, "Loans.create: Liquidation ratio and Request timestamp must be non-zero");

        loanIndex = add(loanIndex, 1);
        loan = bytes32(loanIndex);
        loans[loan].createdAt = now;
        loans[loan].loanExpiration = loanExpiration_;
        loans[loan].borrower = usrs_[0];
        loans[loan].lender = usrs_[1];
        loans[loan].arbiter = usrs_[2];
        loans[loan].principal = vals_[0];
        loans[loan].interest = vals_[1];
        loans[loan].penalty = vals_[2];
        loans[loan].fee = vals_[3];
        uint256 minSeizableCol = minSeizableCollateral(loan);
        col.setCollateral(loan, sub(vals_[4], minSeizableCol), minSeizableCol);
        loans[loan].liquidationRatio = vals_[5];
        loans[loan].requestTimestamp = vals_[6];
        fundIndex[loan] = fund;
        secretHashes[loan].set = false;
        borrowerLoans[usrs_[0]].push(bytes32(loanIndex));
        lenderLoans[usrs_[1]].push(bytes32(loanIndex));
        addressToTimestamp[usrs_[0]][vals_[6]] = true;

        emit Create(loan);
    }

    
    function setSecretHashes(
        bytes32             loan,
        bytes32[4] calldata borrowerSecretHashes,
        bytes32[4] calldata lenderSecretHashes,
        bytes32[4] calldata arbiterSecretHashes,
        bytes      calldata borrowerPubKey_,
        bytes      calldata lenderPubKey_,
        bytes      calldata arbiterPubKey_
    ) external {
        require(!secretHashes[loan].set, "Loans.setSecretHashes: Secret hashes must not already be set");
        require(
            msg.sender == loans[loan].borrower || msg.sender == loans[loan].lender || msg.sender == address(funds),
            "Loans.setSecretHashes: msg.sender must be Borrower, Lender or Funds Address"
        );
        secretHashes[loan].secretHashA1 = borrowerSecretHashes[0];
        secretHashes[loan].secretHashAs = [ borrowerSecretHashes[1], borrowerSecretHashes[2], borrowerSecretHashes[3] ];
        secretHashes[loan].secretHashB1 = lenderSecretHashes[0];
        secretHashes[loan].secretHashBs = [ lenderSecretHashes[1], lenderSecretHashes[2], lenderSecretHashes[3] ];
        secretHashes[loan].secretHashC1 = arbiterSecretHashes[0];
        secretHashes[loan].secretHashCs = [ arbiterSecretHashes[1], arbiterSecretHashes[2], arbiterSecretHashes[3] ];
        pubKeys[loan].borrowerPubKey = borrowerPubKey_;
        pubKeys[loan].lenderPubKey = lenderPubKey_;
        pubKeys[loan].arbiterPubKey = arbiterPubKey_;
        secretHashes[loan].set = true;
    }

    
    function fund(bytes32 loan) external {
        require(secretHashes[loan].set, "Loans.fund: Secret hashes must be set");
        require(bools[loan].funded == false, "Loans.fund: Loan is already funded");
        bools[loan].funded = true;
        require(token.transferFrom(msg.sender, address(this), principal(loan)), "Loans.fund: Failed to transfer tokens");

        emit FundLoan(loan);
    }

    
    function approve(bytes32 loan) external { 
    	require(bools[loan].funded == true, "Loans.approve: Loan must be funded");
    	require(loans[loan].lender == msg.sender, "Loans.approve: Only the lender can approve the loan");
        require(now <= approveExpiration(loan), "Loans.approve: Loan is past the approve deadline");
    	bools[loan].approved = true;

        emit Approve(loan);
    }

    
    function withdraw(bytes32 loan, bytes32 secretA1) external {
        require(!off(loan), "Loans.withdraw: Loan cannot be inactive");
        require(bools[loan].funded == true, "Loans.withdraw: Loan must be funded");
        require(bools[loan].approved == true, "Loans.withdraw: Loan must be approved");
        require(bools[loan].withdrawn == false, "Loans.withdraw: Loan principal has already been withdrawn");
        require(sha256(abi.encodePacked(secretA1)) == secretHashes[loan].secretHashA1, "Loans.withdraw: Secret does not match");
        bools[loan].withdrawn = true;
        require(token.transfer(loans[loan].borrower, principal(loan)), "Loans.withdraw: Failed to transfer tokens");

        secretHashes[loan].withdrawSecret = secretA1;
        if (address(col.onDemandSpv()) != address(0)) {col.requestSpv(loan);}

        emit Withdraw(loan, secretA1);
    }

    
    function repay(bytes32 loan, uint256 amount) external {
        require(!off(loan), "Loans.repay: Loan cannot be inactive");
        require(!sale(loan), "Loans.repay: Loan cannot be undergoing a liquidation");
        require(bools[loan].withdrawn == true, "Loans.repay: Loan principal must be withdrawn");
        require(now <= loans[loan].loanExpiration, "Loans.repay: Loan cannot have expired");
        require(add(amount, repaid(loan)) <= owedForLoan(loan), "Loans.repay: Cannot repay more than the owed amount");
        require(token.transferFrom(msg.sender, address(this), amount), "Loans.repay: Failed to transfer tokens");
        repayments[loan] = add(amount, repayments[loan]);
        if (repaid(loan) == owedForLoan(loan)) {
            bools[loan].paid = true;
            if (address(col.onDemandSpv()) != address(0)) {col.cancelSpv(loan);}
        }

        emit Repay(loan, amount);
    }

    
    function refund(bytes32 loan) external {
        require(!off(loan), "Loans.refund: Loan cannot be inactive");
        require(!sale(loan), "Loans.refund: Loan cannot be undergoing a liquidation");
        require(now > acceptExpiration(loan), "Loans.refund: Cannot request refund until after acceptExpiration");
        require(bools[loan].paid == true, "Loans.refund: The loan must be repaid");
        require(msg.sender == loans[loan].borrower, "Loans.refund: Only the borrower can request a refund");
        bools[loan].off = true;
        loans[loan].closedTimestamp = now;
        if (funds.custom(fundIndex[loan]) == false) {
            funds.decreaseTotalBorrow(loans[loan].principal);
            funds.calcGlobalInterest();
        }
        require(token.transfer(loans[loan].borrower, owedForLoan(loan)), "Loans.refund: Failed to transfer tokens");

        emit Refund(loan);
    }

    
    function cancel(bytes32 loan, bytes32 secret) external {
        accept(loan, secret);

        emit Cancel(loan, secret);
    }

    
    function cancel(bytes32 loan) external {
        require(!off(loan), "Loans.cancel: Loan must not be inactive");
        require(bools[loan].withdrawn == false, "Loans.cancel: Loan principal must not be withdrawn");
        require(now >= seizureExpiration(loan), "Loans.cancel: Seizure deadline has not been reached");
        require(bools[loan].sale == false, "Loans.cancel: Loan must not be undergoing liquidation");
        close(loan);

        emit Cancel(loan, bytes32(0));
    }

    
    function accept(bytes32 loan, bytes32 secret) public {
        require(!off(loan), "Loans.accept: Loan must not be inactive");
        require(bools[loan].withdrawn == false || bools[loan].paid == true, "Loans.accept: Loan must be either not withdrawn or repaid");
        require(msg.sender == loans[loan].lender || msg.sender == loans[loan].arbiter, "Loans.accept: msg.sender must be lender or arbiter");
        require(now <= acceptExpiration(loan), "Loans.accept: Acceptance deadline has past");
        require(bools[loan].sale == false, "Loans.accept: Loan must not be going under liquidation");
        require(
            sha256(abi.encodePacked(secret)) == secretHashes[loan].secretHashB1 || sha256(abi.encodePacked(secret)) == secretHashes[loan].secretHashC1,
            "Loans.accept: Invalid secret"
        );
        secretHashes[loan].acceptSecret = secret;
        close(loan);

        emit Accept(loan, secret);
    }

    
    function close(bytes32 loan) private {
        bools[loan].off = true;
        loans[loan].closedTimestamp = now;
        
        if (bools[loan].withdrawn == false) {
            if (fundIndex[loan] == bytes32(0)) {
                require(token.transfer(loans[loan].lender, loans[loan].principal), "Loans.close: Failed to transfer principal to Lender");
            } else {
                if (funds.custom(fundIndex[loan]) == false) {
                    funds.decreaseTotalBorrow(loans[loan].principal);
                }
                funds.deposit(fundIndex[loan], loans[loan].principal);
            }
        }
        
        else {
            if (fundIndex[loan] == bytes32(0)) {
                require(token.transfer(loans[loan].lender, owedToLender(loan)), "Loans.close: Failed to transfer owedToLender to Lender");
            } else {
                if (funds.custom(fundIndex[loan]) == false) {
                    funds.decreaseTotalBorrow(loans[loan].principal);
                }
                funds.deposit(fundIndex[loan], owedToLender(loan));
            }
            require(token.transfer(loans[loan].arbiter, fee(loan)), "Loans.close: Failed to transfer fee to Arbiter");
        }
    }

    
    function liquidate(bytes32 loan, bytes32 secretHash, bytes20 pubKeyHash) external returns (bytes32 sale_) {
        require(!off(loan), "Loans.liquidate: Loan must not be inactive");
        require(bools[loan].withdrawn == true, "Loans.liquidate: Loan principal must be withdrawn");
        require(msg.sender != loans[loan].borrower && msg.sender != loans[loan].lender, "Loans.liquidate: Liquidator must be a third-party");
        require(secretHash != bytes32(0) && pubKeyHash != bytes20(0), "Loans.liquidate: secretHash and pubKeyHash must be non-zero");
        
        if (sales.next(loan) == 0) {
            
            if (now > loans[loan].loanExpiration) {
                require(bools[loan].paid == false, "Loans.liquidate: loan must not have already been repaid");
            } else {
                require(!safe(loan), "Loans.liquidate: collateralization must be below min-collateralization ratio");
            }
            
            if (funds.custom(fundIndex[loan]) == false) {
                funds.decreaseTotalBorrow(loans[loan].principal);
                funds.calcGlobalInterest();
            }
        } else {
            
            require(sales.next(loan) < MAX_NUM_LIQUIDATIONS, "Loans.liquidate: Max number of liquidations reached");
            require(!sales.accepted(sales.saleIndexByLoan(loan, sales.next(loan) - 1)), "Loans.liquidate: Previous liquidation already accepted");
            require(
                now > sales.settlementExpiration(sales.saleIndexByLoan(loan, sales.next(loan) - 1)),
                "Loans.liquidate: Previous liquidation settlement expiration hasn't expired"
            );
        }
        require(token.balanceOf(msg.sender) >= ddiv(discountCollateralValue(loan)), "Loans.liquidate: insufficient balance to liquidate");
        require(token.transferFrom(msg.sender, address(sales), ddiv(discountCollateralValue(loan))), "Loans.liquidate: Token transfer failed");
        SecretHashes storage h = secretHashes[loan];
        uint256 i = sales.next(loan);
        
        sale_ = sales.create(
            loan, loans[loan].borrower, loans[loan].lender, loans[loan].arbiter, msg.sender,
            h.secretHashAs[i], h.secretHashBs[i], h.secretHashCs[i], secretHash, pubKeyHash
        );
        if (bools[loan].sale == false) {
            bools[loan].sale = true;
            require(token.transfer(address(sales), repaid(loan)), "Loans.liquidate: Token transfer to Sales contract failed");
        }
        
        if (address(col.onDemandSpv()) != address(0)) {col.cancelSpv(loan);}

        emit Liquidate(loan, secretHash, pubKeyHash);
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"loan","type":"bytes32"},{"name":"amount","type":"uint256"}],"name":"repay","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"MAX_NUM_LIQUIDATIONS","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"minSeizableCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"borrower","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"collateralValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loanExpiration_","type":"uint256"},{"name":"usrs_","type":"address[3]"},{"name":"vals_","type":"uint256[7]"},{"name":"fund","type":"bytes32"}],"name":"create","outputs":[{"name":"loan","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"acceptExpiration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"approveExpiration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"penalty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"liquidationExpiration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"temporaryRefundableCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"},{"name":"secretHash","type":"bytes32"},{"name":"pubKeyHash","type":"bytes20"}],"name":"liquidate","outputs":[{"name":"sale_","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"seizableCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"owedForLoan","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"withdrawn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LIQUIDATION_EXP_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"lenderLoans","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_UINT_256","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"repaid","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"lender_","type":"address"}],"name":"lenderLoanCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"arbiter","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"sale","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"},{"name":"secret","type":"bytes32"}],"name":"accept","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"off","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"refundableCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"},{"name":"secretA1","type":"bytes32"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"bools","outputs":[{"name":"funded","type":"bool"},{"name":"approved","type":"bool"},{"name":"withdrawn","type":"bool"},{"name":"sale","type":"bool"},{"name":"paid","type":"bool"},{"name":"off","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"}],"name":"refund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"addressToTimestamp","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"liquidationRatio","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"approved","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"pubKeys","outputs":[{"name":"borrowerPubKey","type":"bytes"},{"name":"lenderPubKey","type":"bytes"},{"name":"arbiterPubKey","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"discountCollateralValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sales_","type":"address"}],"name":"setSales","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"loanIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"ddiv","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LIQUIDATION_DISCOUNT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"col_","type":"address"}],"name":"setCollateral","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"temporarySeizableCollateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ACCEPT_EXP_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"owedForLiquidation","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"collateral","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"funded","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"lender","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"fundIndex","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"owing","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"paid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"APPROVE_EXP_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"}],"name":"fund","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"loans","outputs":[{"name":"borrower","type":"address"},{"name":"lender","type":"address"},{"name":"arbiter","type":"address"},{"name":"createdAt","type":"uint256"},{"name":"loanExpiration","type":"uint256"},{"name":"requestTimestamp","type":"uint256"},{"name":"closedTimestamp","type":"uint256"},{"name":"principal","type":"uint256"},{"name":"interest","type":"uint256"},{"name":"penalty","type":"uint256"},{"name":"fee","type":"uint256"},{"name":"liquidationRatio","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"seizureExpiration","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"borrower_","type":"address"}],"name":"borrowerLoanCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SEIZURE_EXP_THRESHOLD","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"secretHashes","outputs":[{"name":"secretHashA1","type":"bytes32"},{"name":"secretHashB1","type":"bytes32"},{"name":"secretHashC1","type":"bytes32"},{"name":"withdrawSecret","type":"bytes32"},{"name":"acceptSecret","type":"bytes32"},{"name":"set","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"minCollateralValue","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"borrowerLoans","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"principal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"interest","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"safe","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"repayments","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"},{"name":"secret","type":"bytes32"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"loan","type":"bytes32"},{"name":"borrowerSecretHashes","type":"bytes32[4]"},{"name":"lenderSecretHashes","type":"bytes32[4]"},{"name":"arbiterSecretHashes","type":"bytes32[4]"},{"name":"borrowerPubKey_","type":"bytes"},{"name":"lenderPubKey_","type":"bytes"},{"name":"arbiterPubKey_","type":"bytes"}],"name":"setSecretHashes","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"loan","type":"bytes32"}],"name":"owedToLender","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"cmul","outputs":[{"name":"z","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"uint256"}],"name":"dmul","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"funds_","type":"address"},{"name":"med_","type":"address"},{"name":"token_","type":"address"},{"name":"decimals_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"}],"name":"Create","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"}],"name":"SetSecretHashes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"}],"name":"FundLoan","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"}],"name":"Approve","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"},{"indexed":false,"name":"secretA1","type":"bytes32"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Repay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"},{"indexed":false,"name":"secret","type":"bytes32"}],"name":"Cancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"},{"indexed":false,"name":"secret","type":"bytes32"}],"name":"Accept","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"loan","type":"bytes32"},{"indexed":false,"name":"secretHash","type":"bytes32"},{"indexed":false,"name":"pubKeyHash","type":"bytes20"}],"name":"Liquidate","type":"event"}]

60806040523480156200001157600080fd5b5060405162005cae38038062005cae833981810160405260808110156200003757600080fd5b50805160208201516040830151606090930151919290916001600160a01b038416620000c457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f46756e64732061646472657373206d757374206265206e6f6e2d7a65726f0000604482015290519081900360640190fd5b6001600160a01b03831662000125576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602381526020018062005c8b6023913960400191505060405180910390fd5b6001600160a01b0382166200019b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f546f6b656e2061646472657373206d757374206265206e6f6e2d7a65726f0000604482015290519081900360640190fd5b60108054336001600160a01b0319918216179091556000805482166001600160a01b0387811691909117808355600180548516888416179055600e80549094168683161793849055600f859055604080517f095ea7b30000000000000000000000000000000000000000000000000000000081529183166004830152600019602483015251939091169263095ea7b392604480840193602093929083900390910190829087803b1580156200024f57600080fd5b505af115801562000264573d6000803e3d6000fd5b505050506040513d60208110156200027b57600080fd5b5051620002e957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f546f6b656e20617070726f7665206661696c6564000000000000000000000000604482015290519081900360640190fd5b5050505061598e80620002fd6000396000f3fe608060405234801561001057600080fd5b50600436106104115760003560e01c80637a2e18fd11610220578063c4a9081511610130578063e91d14a4116100b8578063ee79b12b11610087578063ee79b12b14610da3578063f69736e014610eca578063f7837eb714610ee7578063fc0c546a14610f0a578063fcfd860514610f1257610411565b8063e91d14a414610d29578063e95823ad14610d46578063ebd1f26a14610d63578063ec7a4f4314610d8057610411565b8063c82e428d116100ff578063c82e428d14610a71578063d357691d14610c71578063df90997b14610cc3578063e3ed190214610ce0578063e3eff40814610d0c57610411565b8063c4a9081514610b86578063c4d252f514610c11578063c52c0c9814610c2e578063c71230bf14610c4b57610411565b80639e7c565e116101b3578063a5d9dc7b11610182578063a5d9dc7b14610b0a578063a632730714610b27578063add89bb214610b44578063ba38c83e14610b61578063bf14c11914610b6957610411565b80639e7c565e14610a965780639f9b3d3b14610ab35780639fc3f02f14610ad0578063a53a1adf14610aed57610411565b8063886abef5116101ef578063886abef514610a2e5780638fa6f57814610a5457806397bd506d14610a715780639b33997c14610a7957610411565b80637a2e18fd146109db5780637a8cfcb414610a015780637ff6fecc14610a0957806383f4ca7b14610a2657610411565b80633aaffb78116103265780635be765b8116102ae578063724b02ad1161027d578063724b02ad146107f757806376a0b166146108235780637865c3ad14610840578063787a969c1461085d5780637888938b146109be57610411565b80635be765b81461074457806363615149146107615780636e1719a6146107845780637249fbb6146107da57610411565b80633f6aff31116102f55780633f6aff31146106a457806344b6ba95146106ca5780634672d7bf146106e7578063531f4c401461070457806359949df41461072757610411565b80633aaffb781461064b5780633cdb72f1146106535780633d41a26b1461067f5780633e4b2a291461068757610411565b806326fc7590116103a95780632e3b81eb116103785780632e3b81eb146105a5578063305f9cb2146105d8578063313ce567146105f557806332025b69146105fd5780633823d66c1461061a57610411565b806326fc75901461053157806327cdab061461054e5780632cdc3c121461056b5780632e2cf9ca1461058857610411565b80630e112476116103e55780630e112476146104ab57806310375921146104c85780631594bbbe146104f75780631abc4a781461051457610411565b8062f989ad1461041657806301ec48431461043b578063080120bd146104555780630be1880f14610472575b600080fd5b6104396004803603604081101561042c57600080fd5b5080359060200135610f2f565b005b6104436112fd565b60408051918252519081900360200190f35b6104436004803603602081101561046b57600080fd5b5035611302565b61048f6004803603602081101561048857600080fd5b503561141b565b604080516001600160a01b039092168252519081900360200190f35b610443600480360360208110156104c157600080fd5b5035611436565b61044360048036036101808110156104df57600080fd5b5080359060208101906080810190610160013561150f565b6104436004803603602081101561050d57600080fd5b50356119a1565b6104436004803603602081101561052a57600080fd5b50356119c6565b6104436004803603602081101561054757600080fd5b50356119e4565b6104436004803603602081101561056457600080fd5b50356119f9565b6104436004803603602081101561058157600080fd5b5035611a0e565b6104436004803603602081101561059e57600080fd5b5035611a2d565b610443600480360360608110156105bb57600080fd5b50803590602081013590604001356001600160601b031916611aab565b610443600480360360208110156105ee57600080fd5b503561286b565b6104436128b7565b6104436004803603602081101561061357600080fd5b50356128bd565b6106376004803603602081101561063057600080fd5b50356128d4565b604080519115158252519081900360200190f35b6104436128ef565b6104436004803603604081101561066957600080fd5b506001600160a01b0381351690602001356128f6565b610443612924565b6104436004803603602081101561069d57600080fd5b503561292a565b610443600480360360208110156106ba57600080fd5b50356001600160a01b031661293c565b61048f600480360360208110156106e057600080fd5b5035612957565b610637600480360360208110156106fd57600080fd5b5035612975565b6104396004803603604081101561071a57600080fd5b5080359060200135612991565b6106376004803603602081101561073d57600080fd5b5035612d99565b6104436004803603602081101561075a57600080fd5b5035612db5565b6104396004803603604081101561077757600080fd5b5080359060200135612e01565b6107a16004803603602081101561079a57600080fd5b5035613270565b604080519615158752941515602087015292151585850152901515606085015215156080840152151560a0830152519081900360c00190f35b610439600480360360208110156107f057600080fd5b50356132b5565b6106376004803603604081101561080d57600080fd5b506001600160a01b0381351690602001356136c5565b6104436004803603602081101561083957600080fd5b50356136e5565b6106376004803603602081101561085657600080fd5b50356136fa565b61087a6004803603602081101561087357600080fd5b5035613714565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156108bf5781810151838201526020016108a7565b50505050905090810190601f1680156108ec5780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b8381101561091f578181015183820152602001610907565b50505050905090810190601f16801561094c5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101561097f578181015183820152602001610967565b50505050905090810190601f1680156109ac5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b610443600480360360208110156109d457600080fd5b50356138e5565b610439600480360360208110156109f157600080fd5b50356001600160a01b0316613901565b6104436139f9565b61044360048036036020811015610a1f57600080fd5b50356139ff565b610443613a1a565b61043960048036036020811015610a4457600080fd5b50356001600160a01b0316613a26565b61044360048036036020811015610a6a57600080fd5b5035613b1e565b610443613b6a565b61044360048036036020811015610a8f57600080fd5b5035613b71565b61044360048036036020811015610aac57600080fd5b5035613b88565b61063760048036036020811015610ac957600080fd5b5035613bd4565b61048f60048036036020811015610ae657600080fd5b5035613be9565b61043960048036036020811015610b0357600080fd5b5035613c07565b61044360048036036020811015610b2057600080fd5b5035613d4b565b61044360048036036020811015610b3d57600080fd5b5035613d5d565b61063760048036036020811015610b5a57600080fd5b5035613d74565b610443613d90565b61043960048036036020811015610b7f57600080fd5b5035613d96565b610ba360048036036020811015610b9c57600080fd5b5035613f6e565b604080516001600160a01b039d8e1681529b8d1660208d015299909b168a8a015260608a0197909752608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408301526101608201929092529051908190036101800190f35b61043960048036036020811015610c2757600080fd5b5035613fdc565b61044360048036036020811015610c4457600080fd5b5035614158565b61044360048036036020811015610c6157600080fd5b50356001600160a01b031661416f565b610c8e60048036036020811015610c8757600080fd5b503561418a565b6040805196875260208701959095528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61044360048036036020811015610cd957600080fd5b50356141c2565b61044360048036036040811015610cf657600080fd5b506001600160a01b0381351690602001356141ed565b61044360048036036020811015610d2257600080fd5b5035614206565b61044360048036036020811015610d3f57600080fd5b503561421b565b61063760048036036020811015610d5c57600080fd5b5035614230565b61044360048036036020811015610d7957600080fd5b503561424c565b61043960048036036040811015610d9657600080fd5b508035906020013561425e565b6104396004803603610200811015610dba57600080fd5b813591602081019160a08201916101208101918101906101c081016101a0820135600160201b811115610dec57600080fd5b820183602082011115610dfe57600080fd5b803590602001918460018302840111600160201b83111715610e1f57600080fd5b919390929091602081019035600160201b811115610e3c57600080fd5b820183602082011115610e4e57600080fd5b803590602001918460018302840111600160201b83111715610e6f57600080fd5b919390929091602081019035600160201b811115610e8c57600080fd5b820183602082011115610e9e57600080fd5b803590602001918460018302840111600160201b83111715610ebf57600080fd5b5090925090506142a7565b61044360048036036020811015610ee057600080fd5b50356144ef565b61044360048036036040811015610efd57600080fd5b5080359060200135614506565b61048f614537565b61044360048036036020811015610f2857600080fd5b5035614546565b610f3882612d99565b15610f745760405162461bcd60e51b8152600401808060200182810382526024815260200180614e5e6024913960400191505060405180910390fd5b610f7d82612975565b15610fb95760405162461bcd60e51b81526004018080602001828103825260348152602001806154e86034913960400191505060405180910390fd5b60008281526007602052604090205462010000900460ff1615156001146110115760405162461bcd60e51b815260040180806020018281038252602d8152602001806158e3602d913960400191505060405180910390fd5b600082815260046020819052604090912001544211156110625760405162461bcd60e51b815260040180806020018281038252602581526020018061551c6025913960400191505060405180910390fd5b61106b826128bd565b61107d826110788561292a565b614561565b11156110ba5760405162461bcd60e51b81526004018080602001828103825260338152602001806150546033913960400191505060405180910390fd5b600e54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561111457600080fd5b505af1158015611128573d6000803e3d6000fd5b505050506040513d602081101561113e57600080fd5b505161117b5760405162461bcd60e51b815260040180806020018281038252602681526020018061567e6026913960400191505060405180910390fd5b600082815260096020526040902054611195908290614561565b6000838152600960205260409020556111ad826128bd565b6111b68361292a565b14156112be576000828152600760209081526040808320805464ff000000001916600160201b1790556003548151633a51d29160e21b815291516001600160a01b03919091169263e9474a449260048181019391829003018186803b15801561121e57600080fd5b505afa158015611232573d6000803e3d6000fd5b505050506040513d602081101561124857600080fd5b50516001600160a01b0316146112be576003546040805163b32fefbf60e01b81526004810185905290516001600160a01b039092169163b32fefbf9160248082019260009290919082900301818387803b1580156112a557600080fd5b505af11580156112b9573d6000803e3d6000fd5b505050505b604080518381526020810183905281517f59454c2c3385a95399182e59da91521ee5621f0211b9f016ff08b2e8e5fc9843929181900390910190a15050565b600381565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b03166359e02dd76040518163ffffffff1660e01b8152600401604080518083038186803b15801561135457600080fd5b505afa158015611368573d6000803e3d6000fd5b505050506040513d604081101561137e57600080fd5b5080516020909101519092509050806113c85760405162461bcd60e51b81526004018080602001828103825260338152602001806155416033913960400191505060405180910390fd5b816114126113f76113f16113ec6113de896128bd565b6113e78a61292a565b614571565b614546565b83614581565b61140d670de0b6b3a76400006305f5e1006145a1565b6145a1565b95945050505050565b6000908152600460205260409020546001600160a01b031690565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b03166359e02dd76040518163ffffffff1660e01b8152600401604080518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d60408110156114b257600080fd5b5080516020909101519092509050806114fc5760405162461bcd60e51b815260040180806020018281038252602d8152602001806155a7602d913960400191505060405180910390fd5b816114128161150a87613b88565b614506565b600081156115d75760005460408051639fc3f02f60e01b81526004810185905290516020878101356001600160a01b03908116941692639fc3f02f9260248083019392829003018186803b15801561156657600080fd5b505afa15801561157a573d6000803e3d6000fd5b505050506040513d602081101561159057600080fd5b50516001600160a01b0316146115d75760405162461bcd60e51b81526004018080602001828103825260288152602001806154746028913960400191505060405180910390fd5b83356001600160a01b03166000908152600c6020908152604080832060c0870135845290915290205460ff161561163f5760405162461bcd60e51b815260040180806020018281038252603a81526020018061519e603a913960400191505060405180910390fd5b42851161167d5760405162461bcd60e51b81526004018080602001828103825260378152602001806151346037913960400191505060405180910390fd5b6001600160a01b03843516158015906116a257506001600160a01b0360208501351615155b6116dd5760405162461bcd60e51b815260040180806020018281038252603a8152602001806153cf603a913960400191505060405180910390fd5b8235158015906116f05750608083013515155b61172b5760405162461bcd60e51b8152600401808060200182810382526037815260200180614ef36037913960400191505060405180910390fd5b60a083013515801590611741575060c083013515155b61177c5760405162461bcd60e51b81526004018080602001828103825260468152602001806150ee6046913960600191505060405180910390fd5b611789600d546001614561565b600d81905560008181526004602081815260408084204260038201559283018a905582546001600160a01b03199081166001600160a01b038b35811691909117855560018501805483168c86013583161790556002850180549092168b8401359091161790558735600784015590870135600883015586013560098201556060860135600a9091015590915061181e82611302565b6003549091506001600160a01b0316639a7e740183611841608088013585614571565b846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561188657600080fd5b505af115801561189a573d6000803e3d6000fd5b50505050836005600781106118ab57fe5b60008481526004602090815260408083209382029490940135600b8085019190915560c089013560059094018490556008825284832088905560068252848320600e01805460ff199081169091556001600160a01b038b358116808652600a8552878620600d8054825460018181018555938a52888a2001558e8701359093168752938552878620915482548086018455928752858720909201919091558452600c8352858420948452938252918490208054909316909117909155815184815291517fa7857d7da6974b0157f3bf7dd25a745bd7d81d845bb525ee0b316a87541a5c319281900390910190a150949350505050565b6000818152600460208190526040822001546119c0906202a300614561565b92915050565b6000818152600460205260408120600301546119c090613840614561565b60009081526004602052604090206009015490565b6000908152600460205260409020600a015490565b6000818152600460208190526040822001546119c09062093a80614561565b600354604080516317167ce560e11b81526004810184905290516000926001600160a01b031691632e2cf9ca916024808301926020929190829003018186803b158015611a7957600080fd5b505afa158015611a8d573d6000803e3d6000fd5b505050506040513d6020811015611aa357600080fd5b505192915050565b6000611ab684612d99565b15611af25760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2a602a913960400191505060405180910390fd5b60008481526007602052604090205462010000900460ff161515600114611b4a5760405162461bcd60e51b8152600401808060200182810382526031815260200180614ec26031913960400191505060405180910390fd5b6000848152600460205260409020546001600160a01b03163314801590611b8b57506000848152600460205260409020600101546001600160a01b03163314155b611bc65760405162461bcd60e51b81526004018080602001828103825260318152602001806156ce6031913960400191505060405180910390fd5b8215801590611bde57506001600160601b0319821615155b611c195760405162461bcd60e51b815260040180806020018281038252603b815260200180614f54603b913960400191505060405180910390fd5b600254604080516302d3af5b60e01b81526004810187905290516001600160a01b03909216916302d3af5b91602480820192602092909190829003018186803b158015611c6557600080fd5b505afa158015611c79573d6000803e3d6000fd5b505050506040513d6020811015611c8f57600080fd5b5051611ea45760008481526004602081905260409091200154421115611d0957600084815260076020526040902054600160201b900460ff1615611d045760405162461bcd60e51b81526004018080602001828103825260378152602001806151d86037913960400191505060405180910390fd5b611d4e565b611d1284614230565b15611d4e5760405162461bcd60e51b815260040180806020018281038252604c81526020018061549c604c913960600191505060405180910390fd5b60008054858252600860209081526040928390205483516301431c9560e71b8152600481019190915292516001600160a01b039092169263a18e4a809260248083019392829003018186803b158015611da657600080fd5b505afa158015611dba573d6000803e3d6000fd5b505050506040513d6020811015611dd057600080fd5b5051611e9f5760008054858252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b158015611e2b57600080fd5b505af1158015611e3f573d6000803e3d6000fd5b505060008054604080516333549b1b60e01b815290516001600160a01b0390921694506333549b1b9350600480820193929182900301818387803b158015611e8657600080fd5b505af1158015611e9a573d6000803e3d6000fd5b505050505b6122a3565b600254604080516302d3af5b60e01b81526004810187905290516003926001600160a01b0316916302d3af5b916024808301926020929190829003018186803b158015611ef057600080fd5b505afa158015611f04573d6000803e3d6000fd5b505050506040513d6020811015611f1a57600080fd5b505110611f585760405162461bcd60e51b81526004018080602001828103825260338152602001806155746033913960400191505060405180910390fd5b600254604080516302d3af5b60e01b81526004810187905290516001600160a01b0390921691638642afd1918391631a81dcab91899160019185916302d3af5b91602480820192602092909190829003018186803b158015611fb957600080fd5b505afa158015611fcd573d6000803e3d6000fd5b505050506040513d6020811015611fe357600080fd5b5051604080516001600160e01b031960e087901b168152600481019490945291900360248301525160448083019260209291908290030181600087803b15801561202c57600080fd5b505af1158015612040573d6000803e3d6000fd5b505050506040513d602081101561205657600080fd5b5051604080516001600160e01b031960e085901b1681526004810192909252516024808301926020929190829003018186803b15801561209557600080fd5b505afa1580156120a9573d6000803e3d6000fd5b505050506040513d60208110156120bf57600080fd5b5051156120fd5760405162461bcd60e51b81526004018080602001828103825260368152602001806153326036913960400191505060405180910390fd5b600254604080516302d3af5b60e01b81526004810187905290516001600160a01b039092169163a6b7d54e918391631a81dcab91899160019185916302d3af5b91602480820192602092909190829003018186803b15801561215e57600080fd5b505afa158015612172573d6000803e3d6000fd5b505050506040513d602081101561218857600080fd5b5051604080516001600160e01b031960e087901b168152600481019490945291900360248301525160448083019260209291908290030181600087803b1580156121d157600080fd5b505af11580156121e5573d6000803e3d6000fd5b505050506040513d60208110156121fb57600080fd5b5051604080516001600160e01b031960e085901b1681526004810192909252516024808301926020929190829003018186803b15801561223a57600080fd5b505afa15801561224e573d6000803e3d6000fd5b505050506040513d602081101561226457600080fd5b505142116122a35760405162461bcd60e51b815260040180806020018281038252604a815260200180615910604a913960600191505060405180910390fd5b6122b46122af856138e5565b6139ff565b600e54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156122ff57600080fd5b505afa158015612313573d6000803e3d6000fd5b505050506040513d602081101561232957600080fd5b505110156123685760405162461bcd60e51b8152600401808060200182810382526032815260200180614d036032913960400191505060405180910390fd5b600e546002546001600160a01b03918216916323b872dd9133911661238f6122af896138e5565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156123f757600080fd5b505af115801561240b573d6000803e3d6000fd5b505050506040513d602081101561242157600080fd5b505161245e5760405162461bcd60e51b815260040180806020018281038252602681526020018061530c6026913960400191505060405180910390fd5b600084815260066020908152604080832060025482516302d3af5b60e01b8152600481018a905292519194936001600160a01b03909116926302d3af5b9260248083019392829003018186803b1580156124b757600080fd5b505afa1580156124cb573d6000803e3d6000fd5b505050506040513d60208110156124e157600080fd5b5051600280546000898152600460205260409020805460018083015492909401549495506001600160a01b0392831694630c4afecf948c94928316938316929091169033908901886003811061253357fe5b015489600501896003811061254457fe5b01548a6009018a6003811061255557fe5b0154604080516001600160e01b031960e08c901b16815260048101999099526001600160a01b0397881660248a01529587166044890152938616606488015291909416608486015260a485019390935260c484019290925260e483019190915261010482018990526001600160601b03198816610124830152516101448083019260209291908290030181600087803b1580156125f157600080fd5b505af1158015612605573d6000803e3d6000fd5b505050506040513d602081101561261b57600080fd5b50516000878152600760205260409020549093506301000000900460ff16612734576000868152600760205260409020805463ff00000019166301000000179055600e546002546001600160a01b039182169163a9059cbb911661267e8961292a565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126cd57600080fd5b505af11580156126e1573d6000803e3d6000fd5b505050506040513d60208110156126f757600080fd5b50516127345760405162461bcd60e51b81526004018080602001828103825260388152602001806157d76038913960400191505060405180910390fd5b60035460408051633a51d29160e21b815290516000926001600160a01b03169163e9474a44916004808301926020929190829003018186803b15801561277957600080fd5b505afa15801561278d573d6000803e3d6000fd5b505050506040513d60208110156127a357600080fd5b50516001600160a01b031614612819576003546040805163b32fefbf60e01b81526004810189905290516001600160a01b039092169163b32fefbf9160248082019260009290919082900301818387803b15801561280057600080fd5b505af1158015612814573d6000803e3d6000fd5b505050505b60408051878152602081018790526001600160601b031986168183015290517fc219795d9133fc09720767bb9eff6ce9f818bc1091bd58e34e4147fdb5edfc919181900360600190a150509392505050565b6003546040805163182fce5960e11b81526004810184905290516000926001600160a01b03169163305f9cb2916024808301926020929190829003018186803b158015611a7957600080fd5b600f5481565b60006119c06128cb836144ef565b611078846119f9565b60009081526007602052604090205462010000900460ff1690565b62093a8081565b600b602052816000526040600020818154811061290f57fe5b90600052602060002001600091509150505481565b60001981565b60009081526009602052604090205490565b6001600160a01b03166000908152600b602052604090205490565b6000908152600460205260409020600201546001600160a01b031690565b6000908152600760205260409020546301000000900460ff1690565b61299a82612d99565b156129d65760405162461bcd60e51b815260040180806020018281038252602781526020018061520f6027913960400191505060405180910390fd5b60008281526007602052604090205462010000900460ff161580612a145750600082815260076020526040902054600160201b900460ff1615156001145b612a4f5760405162461bcd60e51b815260040180806020018281038252603981526020018061543b6039913960400191505060405180910390fd5b6000828152600460205260409020600101546001600160a01b0316331480612a9057506000828152600460205260409020600201546001600160a01b031633145b612acb5760405162461bcd60e51b81526004018080602001828103825260328152602001806154096032913960400191505060405180910390fd5b612ad4826119a1565b421115612b125760405162461bcd60e51b815260040180806020018281038252602a8152602001806156a4602a913960400191505060405180910390fd5b6000828152600760205260409020546301000000900460ff1615612b675760405162461bcd60e51b815260040180806020018281038252603681526020018061580f6036913960400191505060405180910390fd5b6006600083815260200190815260200160002060040154600282604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612bcf5780518252601f199092019160209182019101612bb0565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612c0e573d6000803e3d6000fd5b5050506040513d6020811015612c2357600080fd5b50511480612cec57506006600083815260200190815260200160002060080154600282604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612c945780518252601f199092019160209182019101612c75565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612cd3573d6000803e3d6000fd5b5050506040513d6020811015612ce857600080fd5b5051145b612d3d576040805162461bcd60e51b815260206004820152601c60248201527f4c6f616e732e6163636570743a20496e76616c69642073656372657400000000604482015290519081900360640190fd5b6000828152600660205260409020600d01819055612d5a826145b8565b604080518381526020810183905281517fd001c5fed05473ebc31735197ca758919c1b82b1db58753430b848f875a5eaef929181900390910190a15050565b600090815260076020526040902054600160281b900460ff1690565b60035460408051630b7cecb760e31b81526004810184905290516000926001600160a01b031691635be765b8916024808301926020929190829003018186803b158015611a7957600080fd5b612e0a82612d99565b15612e465760405162461bcd60e51b81526004018080602001828103825260278152602001806156576027913960400191505060405180910390fd5b60008281526007602052604090205460ff161515600114612e985760405162461bcd60e51b81526004018080602001828103825260238152602001806157b46023913960400191505060405180910390fd5b60008281526007602052604090205460ff610100909104161515600114612ef05760405162461bcd60e51b8152600401808060200182810382526025815260200180614fbd6025913960400191505060405180910390fd5b60008281526007602052604090205462010000900460ff1615612f445760405162461bcd60e51b8152600401808060200182810382526039815260200180614e256039913960400191505060405180910390fd5b6006600083815260200190815260200160002060000154600282604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612fac5780518252601f199092019160209182019101612f8d565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612feb573d6000803e3d6000fd5b5050506040513d602081101561300057600080fd5b50511461303e5760405162461bcd60e51b81526004018080602001828103825260258152602001806156326025913960400191505060405180910390fd5b6000828152600760209081526040808320805462ff0000191662010000179055600e546004909252909120546001600160a01b039182169163a9059cbb911661308685614206565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156130d557600080fd5b505af11580156130e9573d6000803e3d6000fd5b505050506040513d60208110156130ff57600080fd5b505161313c5760405162461bcd60e51b81526004018080602001828103825260298152602001806156096029913960400191505060405180910390fd5b6000828152600660209081526040808320600c018490556003548151633a51d29160e21b815291516001600160a01b039091169263e9474a449260048082019391829003018186803b15801561319157600080fd5b505afa1580156131a5573d6000803e3d6000fd5b505050506040513d60208110156131bb57600080fd5b50516001600160a01b0316146132315760035460408051632e4606b160e01b81526004810185905290516001600160a01b0390921691632e4606b19160248082019260009290919082900301818387803b15801561321857600080fd5b505af115801561322c573d6000803e3d6000fd5b505050505b604080518381526020810183905281517f47aeb056e8eba8d7bbb5348f53123f67d6c678b16f7950aac696e4a168174873929181900390910190a15050565b60076020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b6132be81612d99565b156132fa5760405162461bcd60e51b8152600401808060200182810382526025815260200180614d716025913960400191505060405180910390fd5b61330381612975565b1561333f5760405162461bcd60e51b8152600401808060200182810382526035815260200180614df06035913960400191505060405180910390fd5b613348816119a1565b42116133855760405162461bcd60e51b8152600401808060200182810382526040815260200180614e826040913960400191505060405180910390fd5b600081815260076020526040902054600160201b900460ff1615156001146133de5760405162461bcd60e51b81526004018080602001828103825260258152602001806157596025913960400191505060405180910390fd5b6000818152600460205260409020546001600160a01b031633146134335760405162461bcd60e51b815260040180806020018281038252603481526020018061539b6034913960400191505060405180910390fd5b6000818152600760209081526040808320805465ff00000000001916600160281b179055600480835281842042600690910155835460088452938290205482516301431c9560e71b81529182015290516001600160a01b039093169263a18e4a8092602480840193919291829003018186803b1580156134b257600080fd5b505afa1580156134c6573d6000803e3d6000fd5b505050506040513d60208110156134dc57600080fd5b50516135ab5760008054828252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b15801561353757600080fd5b505af115801561354b573d6000803e3d6000fd5b505060008054604080516333549b1b60e01b815290516001600160a01b0390921694506333549b1b9350600480820193929182900301818387803b15801561359257600080fd5b505af11580156135a6573d6000803e3d6000fd5b505050505b600e546000828152600460205260409020546001600160a01b039182169163a9059cbb91166135d9846128bd565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561362857600080fd5b505af115801561363c573d6000803e3d6000fd5b505050506040513d602081101561365257600080fd5b505161368f5760405162461bcd60e51b81526004018080602001828103825260278152602001806152916027913960400191505060405180910390fd5b6040805182815290517f3fbd469ec3a5ce074f975f76ce27e727ba21c99176917b97ae2e713695582a129181900360200190a150565b600c60209081526000928352604080842090915290825290205460ff1681565b6000908152600460205260409020600b015490565b600090815260076020526040902054610100900460ff1690565b60056020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529092918391908301828280156137ab5780601f10613780576101008083540402835291602001916137ab565b820191906000526020600020905b81548152906001019060200180831161378e57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138495780601f1061381e57610100808354040283529160200191613849565b820191906000526020600020905b81548152906001019060200180831161382c57829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156138db5780601f106138b0576101008083540402835291602001916138db565b820191906000526020600020905b8154815290600101906020018083116138be57829003601f168201915b5050505050905083565b60006119c06138f383611436565b670ce80612991d0000614bbd565b6010546001600160a01b0316331461394a5760405162461bcd60e51b81526004018080602001828103825260328152602001806152da6032913960400191505060405180910390fd5b6002546001600160a01b0316156139925760405162461bcd60e51b81526004018080602001828103825260368152602001806152366036913960400191505060405180910390fd5b6001600160a01b0381166139d75760405162461bcd60e51b815260040180806020018281038252602e815260200180615845602e913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b60006119c082613a126012600f54614571565b600a0a6145a1565b670ce80612991d000081565b6010546001600160a01b03163314613a6f5760405162461bcd60e51b81526004018080602001828103825260378152602001806150b76037913960400191505060405180910390fd5b6003546001600160a01b031615613ab75760405162461bcd60e51b81526004018080602001828103825260408152602001806150146040913960400191505060405180910390fd5b6001600160a01b038116613afc5760405162461bcd60e51b81526004018080602001828103825260388152602001806156ff6038913960400191505060405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600354604080516311f4deaf60e31b81526004810184905290516000926001600160a01b031691638fa6f578916024808301926020929190829003018186803b158015611a7957600080fd5b6202a30081565b60006119c0613b7f836128bd565b611078846119e4565b60035460408051634f3e2b2f60e11b81526004810184905290516000926001600160a01b031691639e7c565e916024808301926020929190829003018186803b158015611a7957600080fd5b60009081526007602052604090205460ff1690565b6000908152600460205260409020600101546001600160a01b031690565b60008181526007602052604090205460ff161515600114613c595760405162461bcd60e51b81526004018080602001828103825260228152602001806157376022913960400191505060405180910390fd5b6000818152600460205260409020600101546001600160a01b03163314613cb15760405162461bcd60e51b81526004018080602001828103825260338152602001806153686033913960400191505060405180910390fd5b613cba816119c6565b421115613cf85760405162461bcd60e51b81526004018080602001828103825260308152602001806150876030913960400191505060405180910390fd5b600081815260076020908152604091829020805461ff001916610100179055815183815291517f323d40c0aa1cf896ec093775d91d6ba7455923481a9da93e54d4e114e0d6fb169281900390910190a150565b60086020526000908152604090205481565b60006119c0613d6b836128bd565b6113e78461292a565b600090815260076020526040902054600160201b900460ff1690565b61384081565b6000818152600660205260409020600e015460ff16613de65760405162461bcd60e51b815260040180806020018281038252602581526020018061526c6025913960400191505060405180910390fd5b60008181526007602052604090205460ff1615613e345760405162461bcd60e51b81526004018080602001828103825260228152602001806152b86022913960400191505060405180910390fd5b6000818152600760205260409020805460ff19166001179055600e546001600160a01b03166323b872dd3330613e6985614206565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015613ed157600080fd5b505af1158015613ee5573d6000803e3d6000fd5b505050506040513d6020811015613efb57600080fd5b5051613f385760405162461bcd60e51b81526004018080602001828103825260258152602001806158be6025913960400191505060405180910390fd5b6040805182815290517f3561bc82a7926abd63a8c9d0b398ba40a4afd996df634bd6f1606c269781dfe09181900360200190a150565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006860154600787015460088801546009890154600a8a0154600b909a01546001600160a01b03998a169b988a169a97909916989596949593949293919290918c565b613fe581612d99565b156140215760405162461bcd60e51b8152600401808060200182810382526027815260200180614dc96027913960400191505060405180910390fd5b60008181526007602052604090205462010000900460ff16156140755760405162461bcd60e51b8152600401808060200182810382526032815260200180614fe26032913960400191505060405180910390fd5b61407e81614158565b4210156140bc5760405162461bcd60e51b8152600401808060200182810382526033815260200180614d966033913960400191505060405180910390fd5b6000818152600760205260409020546301000000900460ff16156141115760405162461bcd60e51b81526004018080602001828103825260358152602001806155d46035913960400191505060405180910390fd5b61411a816145b8565b604080518281526000602082015281517f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a6929181900390910190a150565b60006119c061416683611a0e565b6202a300614561565b6001600160a01b03166000908152600a602052604090205490565b6006602052600090815260409020805460048201546008830154600c840154600d850154600e90950154939492939192909160ff1686565b60006119c06141df6113ec6141d6856128bd565b6113e78661292a565b6141e8846136e5565b614be5565b600a602052816000526040600020818154811061290f57fe5b60009081526004602052604090206007015490565b60009081526004602052604090206008015490565b600061423b826141c2565b61424483611436565b101592915050565b60096020526000908152604090205481565b6142688282612991565b604080518381526020810183905281517f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a6929181900390910190a15050565b60008a8152600660205260409020600e015460ff16156142f85760405162461bcd60e51b815260040180806020018281038252603c815260200180614d35603c913960400191505060405180910390fd5b60008a8152600460205260409020546001600160a01b0316331480614336575060008a8152600460205260409020600101546001600160a01b031633145b8061434b57506000546001600160a01b031633145b6143865760405162461bcd60e51b815260040180806020018281038252604b815260200180615873604b913960600191505060405180910390fd5b60008a81526006602081815260408084208d3581558151606080820184528f85013582528f840135828601528f013592810192909252938e90529190526143d291600101906003614c39565b5060008a81526006602081815260408084208c3560048201558151606080820184528e85013582528e840135828601528e013592810192909252938e905291905261442291600501906003614c39565b5060008a81526006602081815260408084208b3560088201558151606080820184528d85013582528d840135828601528d013592810192909252938e905291905261447291600901906003614c39565b5060008a815260056020526040902061448c908787614c77565b5060008a81526005602052604090206144a9906001018585614c77565b5060008a81526005602052604090206144c6906002018383614c77565b50505060009788525050600660205250506040909320600e01805460ff19166001179055505050565b60006119c06144fd83614206565b6110788461421b565b60006305f5e10061452861451a8585614c15565b60026305f5e1005b04614561565b8161452f57fe5b049392505050565b600e546001600160a01b031681565b60006119c0826145596012600f54614571565b600a0a614c15565b808201828110156119c057600080fd5b808203828111156119c057600080fd5b60008161452861459985670de0b6b3a7640000614c15565b600285614522565b60008082116145af57600080fd5b81838161452f57fe5b6000818152600760208181526040808420805465ff00000000001916600160281b17815560048352932042600690910155525462010000900460ff1661485b576000818152600860205260409020546146e057600e5460008281526004602081815260408084206001810154600790910154825163a9059cbb60e01b81526001600160a01b03928316958101959095526024850152905194169363a9059cbb936044808501948390030190829087803b15801561467457600080fd5b505af1158015614688573d6000803e3d6000fd5b505050506040513d602081101561469e57600080fd5b50516146db5760405162461bcd60e51b815260040180806020018281038252603381526020018061516b6033913960400191505060405180910390fd5b614856565b60008054828252600860209081526040928390205483516301431c9560e71b8152600481019190915292516001600160a01b039092169263a18e4a809260248083019392829003018186803b15801561473857600080fd5b505afa15801561474c573d6000803e3d6000fd5b505050506040513d602081101561476257600080fd5b50516147d65760008054828252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b1580156147bd57600080fd5b505af11580156147d1573d6000803e3d6000fd5b505050505b6000805482825260086020908152604080842054600492839052818520600701548251630ef1370b60e11b8152938401919091526024830152516001600160a01b0390921692631de26e169260448084019382900301818387803b15801561483d57600080fd5b505af1158015614851573d6000803e3d6000fd5b505050505b614bba565b60008181526008602052604090205461495a57600e546000828152600460205260409020600101546001600160a01b039182169163a9059cbb911661489f846144ef565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156148ee57600080fd5b505af1158015614902573d6000803e3d6000fd5b505050506040513d602081101561491857600080fd5b50516149555760405162461bcd60e51b815260040180806020018281038252603681526020018061577e6036913960400191505060405180910390fd5b614ad3565b60008054828252600860209081526040928390205483516301431c9560e71b8152600481019190915292516001600160a01b039092169263a18e4a809260248083019392829003018186803b1580156149b257600080fd5b505afa1580156149c6573d6000803e3d6000fd5b505050506040513d60208110156149dc57600080fd5b5051614a505760008054828252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b158015614a3757600080fd5b505af1158015614a4b573d6000803e3d6000fd5b505050505b6000805482825260086020526040909120546001600160a01b0390911690631de26e1690614a7d846144ef565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015614aba57600080fd5b505af1158015614ace573d6000803e3d6000fd5b505050505b600e546000828152600460205260409020600201546001600160a01b039182169163a9059cbb9116614b04846119f9565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614b5357600080fd5b505af1158015614b67573d6000803e3d6000fd5b505050506040513d6020811015614b7d57600080fd5b5051614bba5760405162461bcd60e51b815260040180806020018281038252602e815260200180614f8f602e913960400191505060405180910390fd5b50565b6000670de0b6b3a7640000614528614bd58585614c15565b6002670de0b6b3a7640000614522565b60006b033b2e3c9fd0803ce8000000614528614c018585614c15565b60026b033b2e3c9fd0803ce8000000614522565b6000811580614c3057505080820282828281614c2d57fe5b04145b6119c057600080fd5b8260038101928215614c67579160200282015b82811115614c67578251825591602001919060010190614c4c565b50614c73929150614ce5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614cb85782800160ff19823516178555614c67565b82800160010185558215614c67579182015b82811115614c67578235825591602001919060010190614cca565b614cff91905b80821115614c735760008155600101614ceb565b9056fe4c6f616e732e6c69717569646174653a20696e73756666696369656e742062616c616e636520746f206c69717569646174654c6f616e732e7365745365637265744861736865733a2053656372657420686173686573206d757374206e6f7420616c7265616479206265207365744c6f616e732e726566756e643a204c6f616e2063616e6e6f7420626520696e6163746976654c6f616e732e63616e63656c3a205365697a75726520646561646c696e6520686173206e6f74206265656e20726561636865644c6f616e732e63616e63656c3a204c6f616e206d757374206e6f7420626520696e6163746976654c6f616e732e726566756e643a204c6f616e2063616e6e6f7420626520756e646572676f696e672061206c69717569646174696f6e4c6f616e732e77697468647261773a204c6f616e207072696e636970616c2068617320616c7265616479206265656e2077697468647261776e4c6f616e732e72657061793a204c6f616e2063616e6e6f7420626520696e6163746976654c6f616e732e726566756e643a2043616e6e6f74207265717565737420726566756e6420756e74696c2061667465722061636365707445787069726174696f6e4c6f616e732e6c69717569646174653a204c6f616e207072696e636970616c206d7573742062652077697468647261776e4c6f616e732e6372656174653a205072696e636970616c20616e6420436f6c6c61746572616c206d757374206265206e6f6e2d7a65726f4c6f616e732e6c69717569646174653a204c6f616e206d757374206e6f7420626520696e6163746976654c6f616e732e6c69717569646174653a207365637265744861736820616e64207075624b657948617368206d757374206265206e6f6e2d7a65726f4c6f616e732e636c6f73653a204661696c656420746f207472616e736665722066656520746f20417262697465724c6f616e732e77697468647261773a204c6f616e206d75737420626520617070726f7665644c6f616e732e63616e63656c3a204c6f616e207072696e636970616c206d757374206e6f742062652077697468647261776e4c6f616e732e736574436f6c6c61746572616c3a2054686520436f6c6c61746572616c20616464726573732068617320616c7265616479206265656e207365744c6f616e732e72657061793a2043616e6e6f74207265706179206d6f7265207468616e20746865206f77656420616d6f756e744c6f616e732e617070726f76653a204c6f616e20697320706173742074686520617070726f766520646561646c696e654c6f616e732e736574436f6c6c61746572616c3a204f6e6c7920746865206465706c6f7965722063616e20706572666f726d20746869734c6f616e732e6372656174653a204c69717569646174696f6e20726174696f20616e6420526571756573742074696d657374616d70206d757374206265206e6f6e2d7a65726f4c6f616e732e6372656174653a206c6f616e45787069726174696f6e206d7573742062652067726561746572207468616e20606e6f77604c6f616e732e636c6f73653a204661696c656420746f207472616e73666572207072696e636970616c20746f204c656e6465724c6f616e732e6372656174653a204475706c696361746520726571756573742074696d657374616d707320617265206e6f7420616c6c6f7765644c6f616e732e6c69717569646174653a206c6f616e206d757374206e6f74206861766520616c7265616479206265656e207265706169644c6f616e732e6163636570743a204c6f616e206d757374206e6f7420626520696e6163746976654c6f616e732e73657453616c65733a205468652053616c657320616464726573732068617320616c7265616479206265656e207365744c6f616e732e66756e643a2053656372657420686173686573206d757374206265207365744c6f616e732e726566756e643a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e66756e643a204c6f616e20697320616c72656164792066756e6465644c6f616e732e73657453616c65733a204f6e6c7920746865206465706c6f7965722063616e20706572666f726d20746869734c6f616e732e6c69717569646174653a20546f6b656e207472616e73666572206661696c65644c6f616e732e6c69717569646174653a2050726576696f7573206c69717569646174696f6e20616c72656164792061636365707465644c6f616e732e617070726f76653a204f6e6c7920746865206c656e6465722063616e20617070726f766520746865206c6f616e4c6f616e732e726566756e643a204f6e6c792074686520626f72726f7765722063616e2072657175657374206120726566756e644c6f616e732e6372656174653a20426f72726f77657220616e64204c656e6465722061646472657373206d757374206265206e6f6e2d7a65726f4c6f616e732e6163636570743a206d73672e73656e646572206d757374206265206c656e646572206f7220617262697465724c6f616e732e6163636570743a204c6f616e206d75737420626520656974686572206e6f742077697468647261776e206f72207265706169644c6f616e732e6372656174653a204c656e646572206f662046756e64206e6f7420696e20617267734c6f616e732e6c69717569646174653a20636f6c6c61746572616c697a6174696f6e206d7573742062652062656c6f77206d696e2d636f6c6c61746572616c697a6174696f6e20726174696f4c6f616e732e72657061793a204c6f616e2063616e6e6f7420626520756e646572676f696e672061206c69717569646174696f6e4c6f616e732e72657061793a204c6f616e2063616e6e6f74206861766520657870697265644c6f616e732e6d696e5365697a61626c65436f6c6c61746572616c3a204d656469616e697a6572206d757374206265207365744c6f616e732e6c69717569646174653a204d6178206e756d626572206f66206c69717569646174696f6e7320726561636865644c6f616e732e636f6c6c61746572616c56616c75653a204d656469616e697a6572206d757374206265207365744c6f616e732e63616e63656c3a204c6f616e206d757374206e6f7420626520756e646572676f696e67206c69717569646174696f6e4c6f616e732e77697468647261773a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e77697468647261773a2053656372657420646f6573206e6f74206d617463684c6f616e732e77697468647261773a204c6f616e2063616e6e6f7420626520696e6163746976654c6f616e732e72657061793a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e6163636570743a20416363657074616e636520646561646c696e652068617320706173744c6f616e732e6c69717569646174653a204c697175696461746f72206d75737420626520612074686972642d70617274794c6f616e732e736574436f6c6c61746572616c3a20436f6c6c61746572616c2061646472657373206d757374206265206e6f6e2d7a65726f4c6f616e732e617070726f76653a204c6f616e206d7573742062652066756e6465644c6f616e732e726566756e643a20546865206c6f616e206d757374206265207265706169644c6f616e732e636c6f73653a204661696c656420746f207472616e73666572206f776564546f4c656e64657220746f204c656e6465724c6f616e732e77697468647261773a204c6f616e206d7573742062652066756e6465644c6f616e732e6c69717569646174653a20546f6b656e207472616e7366657220746f2053616c657320636f6e7472616374206661696c65644c6f616e732e6163636570743a204c6f616e206d757374206e6f7420626520676f696e6720756e646572206c69717569646174696f6e4c6f616e732e73657453616c65733a2053616c65732061646472657373206d757374206265206e6f6e2d7a65726f4c6f616e732e7365745365637265744861736865733a206d73672e73656e646572206d75737420626520426f72726f7765722c204c656e646572206f722046756e647320416464726573734c6f616e732e66756e643a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e72657061793a204c6f616e207072696e636970616c206d7573742062652077697468647261776e4c6f616e732e6c69717569646174653a2050726576696f7573206c69717569646174696f6e20736574746c656d656e742065787069726174696f6e206861736e27742065787069726564a265627a7a72305820d64b4fe7c6867306d5488b644e604016bfe67da764affe46661041bc3399f4a464736f6c634300050a00324d656469616e697a65722061646472657373206d757374206265206e6f6e2d7a65726f0000000000000000000000003528c164e3fca20e2333cf58ab4b1c99def83347000000000000000000000000bc32048d9be3a3c3b626c44d296cefaaa400c797000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000006

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106104115760003560e01c80637a2e18fd11610220578063c4a9081511610130578063e91d14a4116100b8578063ee79b12b11610087578063ee79b12b14610da3578063f69736e014610eca578063f7837eb714610ee7578063fc0c546a14610f0a578063fcfd860514610f1257610411565b8063e91d14a414610d29578063e95823ad14610d46578063ebd1f26a14610d63578063ec7a4f4314610d8057610411565b8063c82e428d116100ff578063c82e428d14610a71578063d357691d14610c71578063df90997b14610cc3578063e3ed190214610ce0578063e3eff40814610d0c57610411565b8063c4a9081514610b86578063c4d252f514610c11578063c52c0c9814610c2e578063c71230bf14610c4b57610411565b80639e7c565e116101b3578063a5d9dc7b11610182578063a5d9dc7b14610b0a578063a632730714610b27578063add89bb214610b44578063ba38c83e14610b61578063bf14c11914610b6957610411565b80639e7c565e14610a965780639f9b3d3b14610ab35780639fc3f02f14610ad0578063a53a1adf14610aed57610411565b8063886abef5116101ef578063886abef514610a2e5780638fa6f57814610a5457806397bd506d14610a715780639b33997c14610a7957610411565b80637a2e18fd146109db5780637a8cfcb414610a015780637ff6fecc14610a0957806383f4ca7b14610a2657610411565b80633aaffb78116103265780635be765b8116102ae578063724b02ad1161027d578063724b02ad146107f757806376a0b166146108235780637865c3ad14610840578063787a969c1461085d5780637888938b146109be57610411565b80635be765b81461074457806363615149146107615780636e1719a6146107845780637249fbb6146107da57610411565b80633f6aff31116102f55780633f6aff31146106a457806344b6ba95146106ca5780634672d7bf146106e7578063531f4c401461070457806359949df41461072757610411565b80633aaffb781461064b5780633cdb72f1146106535780633d41a26b1461067f5780633e4b2a291461068757610411565b806326fc7590116103a95780632e3b81eb116103785780632e3b81eb146105a5578063305f9cb2146105d8578063313ce567146105f557806332025b69146105fd5780633823d66c1461061a57610411565b806326fc75901461053157806327cdab061461054e5780632cdc3c121461056b5780632e2cf9ca1461058857610411565b80630e112476116103e55780630e112476146104ab57806310375921146104c85780631594bbbe146104f75780631abc4a781461051457610411565b8062f989ad1461041657806301ec48431461043b578063080120bd146104555780630be1880f14610472575b600080fd5b6104396004803603604081101561042c57600080fd5b5080359060200135610f2f565b005b6104436112fd565b60408051918252519081900360200190f35b6104436004803603602081101561046b57600080fd5b5035611302565b61048f6004803603602081101561048857600080fd5b503561141b565b604080516001600160a01b039092168252519081900360200190f35b610443600480360360208110156104c157600080fd5b5035611436565b61044360048036036101808110156104df57600080fd5b5080359060208101906080810190610160013561150f565b6104436004803603602081101561050d57600080fd5b50356119a1565b6104436004803603602081101561052a57600080fd5b50356119c6565b6104436004803603602081101561054757600080fd5b50356119e4565b6104436004803603602081101561056457600080fd5b50356119f9565b6104436004803603602081101561058157600080fd5b5035611a0e565b6104436004803603602081101561059e57600080fd5b5035611a2d565b610443600480360360608110156105bb57600080fd5b50803590602081013590604001356001600160601b031916611aab565b610443600480360360208110156105ee57600080fd5b503561286b565b6104436128b7565b6104436004803603602081101561061357600080fd5b50356128bd565b6106376004803603602081101561063057600080fd5b50356128d4565b604080519115158252519081900360200190f35b6104436128ef565b6104436004803603604081101561066957600080fd5b506001600160a01b0381351690602001356128f6565b610443612924565b6104436004803603602081101561069d57600080fd5b503561292a565b610443600480360360208110156106ba57600080fd5b50356001600160a01b031661293c565b61048f600480360360208110156106e057600080fd5b5035612957565b610637600480360360208110156106fd57600080fd5b5035612975565b6104396004803603604081101561071a57600080fd5b5080359060200135612991565b6106376004803603602081101561073d57600080fd5b5035612d99565b6104436004803603602081101561075a57600080fd5b5035612db5565b6104396004803603604081101561077757600080fd5b5080359060200135612e01565b6107a16004803603602081101561079a57600080fd5b5035613270565b604080519615158752941515602087015292151585850152901515606085015215156080840152151560a0830152519081900360c00190f35b610439600480360360208110156107f057600080fd5b50356132b5565b6106376004803603604081101561080d57600080fd5b506001600160a01b0381351690602001356136c5565b6104436004803603602081101561083957600080fd5b50356136e5565b6106376004803603602081101561085657600080fd5b50356136fa565b61087a6004803603602081101561087357600080fd5b5035613714565b60405180806020018060200180602001848103845287818151815260200191508051906020019080838360005b838110156108bf5781810151838201526020016108a7565b50505050905090810190601f1680156108ec5780820380516001836020036101000a031916815260200191505b50848103835286518152865160209182019188019080838360005b8381101561091f578181015183820152602001610907565b50505050905090810190601f16801561094c5780820380516001836020036101000a031916815260200191505b50848103825285518152855160209182019187019080838360005b8381101561097f578181015183820152602001610967565b50505050905090810190601f1680156109ac5780820380516001836020036101000a031916815260200191505b50965050505050505060405180910390f35b610443600480360360208110156109d457600080fd5b50356138e5565b610439600480360360208110156109f157600080fd5b50356001600160a01b0316613901565b6104436139f9565b61044360048036036020811015610a1f57600080fd5b50356139ff565b610443613a1a565b61043960048036036020811015610a4457600080fd5b50356001600160a01b0316613a26565b61044360048036036020811015610a6a57600080fd5b5035613b1e565b610443613b6a565b61044360048036036020811015610a8f57600080fd5b5035613b71565b61044360048036036020811015610aac57600080fd5b5035613b88565b61063760048036036020811015610ac957600080fd5b5035613bd4565b61048f60048036036020811015610ae657600080fd5b5035613be9565b61043960048036036020811015610b0357600080fd5b5035613c07565b61044360048036036020811015610b2057600080fd5b5035613d4b565b61044360048036036020811015610b3d57600080fd5b5035613d5d565b61063760048036036020811015610b5a57600080fd5b5035613d74565b610443613d90565b61043960048036036020811015610b7f57600080fd5b5035613d96565b610ba360048036036020811015610b9c57600080fd5b5035613f6e565b604080516001600160a01b039d8e1681529b8d1660208d015299909b168a8a015260608a0197909752608089019590955260a088019390935260c087019190915260e08601526101008501526101208401526101408301526101608201929092529051908190036101800190f35b61043960048036036020811015610c2757600080fd5b5035613fdc565b61044360048036036020811015610c4457600080fd5b5035614158565b61044360048036036020811015610c6157600080fd5b50356001600160a01b031661416f565b610c8e60048036036020811015610c8757600080fd5b503561418a565b6040805196875260208701959095528585019390935260608501919091526080840152151560a0830152519081900360c00190f35b61044360048036036020811015610cd957600080fd5b50356141c2565b61044360048036036040811015610cf657600080fd5b506001600160a01b0381351690602001356141ed565b61044360048036036020811015610d2257600080fd5b5035614206565b61044360048036036020811015610d3f57600080fd5b503561421b565b61063760048036036020811015610d5c57600080fd5b5035614230565b61044360048036036020811015610d7957600080fd5b503561424c565b61043960048036036040811015610d9657600080fd5b508035906020013561425e565b6104396004803603610200811015610dba57600080fd5b813591602081019160a08201916101208101918101906101c081016101a0820135600160201b811115610dec57600080fd5b820183602082011115610dfe57600080fd5b803590602001918460018302840111600160201b83111715610e1f57600080fd5b919390929091602081019035600160201b811115610e3c57600080fd5b820183602082011115610e4e57600080fd5b803590602001918460018302840111600160201b83111715610e6f57600080fd5b919390929091602081019035600160201b811115610e8c57600080fd5b820183602082011115610e9e57600080fd5b803590602001918460018302840111600160201b83111715610ebf57600080fd5b5090925090506142a7565b61044360048036036020811015610ee057600080fd5b50356144ef565b61044360048036036040811015610efd57600080fd5b5080359060200135614506565b61048f614537565b61044360048036036020811015610f2857600080fd5b5035614546565b610f3882612d99565b15610f745760405162461bcd60e51b8152600401808060200182810382526024815260200180614e5e6024913960400191505060405180910390fd5b610f7d82612975565b15610fb95760405162461bcd60e51b81526004018080602001828103825260348152602001806154e86034913960400191505060405180910390fd5b60008281526007602052604090205462010000900460ff1615156001146110115760405162461bcd60e51b815260040180806020018281038252602d8152602001806158e3602d913960400191505060405180910390fd5b600082815260046020819052604090912001544211156110625760405162461bcd60e51b815260040180806020018281038252602581526020018061551c6025913960400191505060405180910390fd5b61106b826128bd565b61107d826110788561292a565b614561565b11156110ba5760405162461bcd60e51b81526004018080602001828103825260338152602001806150546033913960400191505060405180910390fd5b600e54604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561111457600080fd5b505af1158015611128573d6000803e3d6000fd5b505050506040513d602081101561113e57600080fd5b505161117b5760405162461bcd60e51b815260040180806020018281038252602681526020018061567e6026913960400191505060405180910390fd5b600082815260096020526040902054611195908290614561565b6000838152600960205260409020556111ad826128bd565b6111b68361292a565b14156112be576000828152600760209081526040808320805464ff000000001916600160201b1790556003548151633a51d29160e21b815291516001600160a01b03919091169263e9474a449260048181019391829003018186803b15801561121e57600080fd5b505afa158015611232573d6000803e3d6000fd5b505050506040513d602081101561124857600080fd5b50516001600160a01b0316146112be576003546040805163b32fefbf60e01b81526004810185905290516001600160a01b039092169163b32fefbf9160248082019260009290919082900301818387803b1580156112a557600080fd5b505af11580156112b9573d6000803e3d6000fd5b505050505b604080518381526020810183905281517f59454c2c3385a95399182e59da91521ee5621f0211b9f016ff08b2e8e5fc9843929181900390910190a15050565b600381565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b03166359e02dd76040518163ffffffff1660e01b8152600401604080518083038186803b15801561135457600080fd5b505afa158015611368573d6000803e3d6000fd5b505050506040513d604081101561137e57600080fd5b5080516020909101519092509050806113c85760405162461bcd60e51b81526004018080602001828103825260338152602001806155416033913960400191505060405180910390fd5b816114126113f76113f16113ec6113de896128bd565b6113e78a61292a565b614571565b614546565b83614581565b61140d670de0b6b3a76400006305f5e1006145a1565b6145a1565b95945050505050565b6000908152600460205260409020546001600160a01b031690565b6000806000600160009054906101000a90046001600160a01b03166001600160a01b03166359e02dd76040518163ffffffff1660e01b8152600401604080518083038186803b15801561148857600080fd5b505afa15801561149c573d6000803e3d6000fd5b505050506040513d60408110156114b257600080fd5b5080516020909101519092509050806114fc5760405162461bcd60e51b815260040180806020018281038252602d8152602001806155a7602d913960400191505060405180910390fd5b816114128161150a87613b88565b614506565b600081156115d75760005460408051639fc3f02f60e01b81526004810185905290516020878101356001600160a01b03908116941692639fc3f02f9260248083019392829003018186803b15801561156657600080fd5b505afa15801561157a573d6000803e3d6000fd5b505050506040513d602081101561159057600080fd5b50516001600160a01b0316146115d75760405162461bcd60e51b81526004018080602001828103825260288152602001806154746028913960400191505060405180910390fd5b83356001600160a01b03166000908152600c6020908152604080832060c0870135845290915290205460ff161561163f5760405162461bcd60e51b815260040180806020018281038252603a81526020018061519e603a913960400191505060405180910390fd5b42851161167d5760405162461bcd60e51b81526004018080602001828103825260378152602001806151346037913960400191505060405180910390fd5b6001600160a01b03843516158015906116a257506001600160a01b0360208501351615155b6116dd5760405162461bcd60e51b815260040180806020018281038252603a8152602001806153cf603a913960400191505060405180910390fd5b8235158015906116f05750608083013515155b61172b5760405162461bcd60e51b8152600401808060200182810382526037815260200180614ef36037913960400191505060405180910390fd5b60a083013515801590611741575060c083013515155b61177c5760405162461bcd60e51b81526004018080602001828103825260468152602001806150ee6046913960600191505060405180910390fd5b611789600d546001614561565b600d81905560008181526004602081815260408084204260038201559283018a905582546001600160a01b03199081166001600160a01b038b35811691909117855560018501805483168c86013583161790556002850180549092168b8401359091161790558735600784015590870135600883015586013560098201556060860135600a9091015590915061181e82611302565b6003549091506001600160a01b0316639a7e740183611841608088013585614571565b846040518463ffffffff1660e01b8152600401808481526020018381526020018281526020019350505050600060405180830381600087803b15801561188657600080fd5b505af115801561189a573d6000803e3d6000fd5b50505050836005600781106118ab57fe5b60008481526004602090815260408083209382029490940135600b8085019190915560c089013560059094018490556008825284832088905560068252848320600e01805460ff199081169091556001600160a01b038b358116808652600a8552878620600d8054825460018181018555938a52888a2001558e8701359093168752938552878620915482548086018455928752858720909201919091558452600c8352858420948452938252918490208054909316909117909155815184815291517fa7857d7da6974b0157f3bf7dd25a745bd7d81d845bb525ee0b316a87541a5c319281900390910190a150949350505050565b6000818152600460208190526040822001546119c0906202a300614561565b92915050565b6000818152600460205260408120600301546119c090613840614561565b60009081526004602052604090206009015490565b6000908152600460205260409020600a015490565b6000818152600460208190526040822001546119c09062093a80614561565b600354604080516317167ce560e11b81526004810184905290516000926001600160a01b031691632e2cf9ca916024808301926020929190829003018186803b158015611a7957600080fd5b505afa158015611a8d573d6000803e3d6000fd5b505050506040513d6020811015611aa357600080fd5b505192915050565b6000611ab684612d99565b15611af25760405162461bcd60e51b815260040180806020018281038252602a815260200180614f2a602a913960400191505060405180910390fd5b60008481526007602052604090205462010000900460ff161515600114611b4a5760405162461bcd60e51b8152600401808060200182810382526031815260200180614ec26031913960400191505060405180910390fd5b6000848152600460205260409020546001600160a01b03163314801590611b8b57506000848152600460205260409020600101546001600160a01b03163314155b611bc65760405162461bcd60e51b81526004018080602001828103825260318152602001806156ce6031913960400191505060405180910390fd5b8215801590611bde57506001600160601b0319821615155b611c195760405162461bcd60e51b815260040180806020018281038252603b815260200180614f54603b913960400191505060405180910390fd5b600254604080516302d3af5b60e01b81526004810187905290516001600160a01b03909216916302d3af5b91602480820192602092909190829003018186803b158015611c6557600080fd5b505afa158015611c79573d6000803e3d6000fd5b505050506040513d6020811015611c8f57600080fd5b5051611ea45760008481526004602081905260409091200154421115611d0957600084815260076020526040902054600160201b900460ff1615611d045760405162461bcd60e51b81526004018080602001828103825260378152602001806151d86037913960400191505060405180910390fd5b611d4e565b611d1284614230565b15611d4e5760405162461bcd60e51b815260040180806020018281038252604c81526020018061549c604c913960600191505060405180910390fd5b60008054858252600860209081526040928390205483516301431c9560e71b8152600481019190915292516001600160a01b039092169263a18e4a809260248083019392829003018186803b158015611da657600080fd5b505afa158015611dba573d6000803e3d6000fd5b505050506040513d6020811015611dd057600080fd5b5051611e9f5760008054858252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b158015611e2b57600080fd5b505af1158015611e3f573d6000803e3d6000fd5b505060008054604080516333549b1b60e01b815290516001600160a01b0390921694506333549b1b9350600480820193929182900301818387803b158015611e8657600080fd5b505af1158015611e9a573d6000803e3d6000fd5b505050505b6122a3565b600254604080516302d3af5b60e01b81526004810187905290516003926001600160a01b0316916302d3af5b916024808301926020929190829003018186803b158015611ef057600080fd5b505afa158015611f04573d6000803e3d6000fd5b505050506040513d6020811015611f1a57600080fd5b505110611f585760405162461bcd60e51b81526004018080602001828103825260338152602001806155746033913960400191505060405180910390fd5b600254604080516302d3af5b60e01b81526004810187905290516001600160a01b0390921691638642afd1918391631a81dcab91899160019185916302d3af5b91602480820192602092909190829003018186803b158015611fb957600080fd5b505afa158015611fcd573d6000803e3d6000fd5b505050506040513d6020811015611fe357600080fd5b5051604080516001600160e01b031960e087901b168152600481019490945291900360248301525160448083019260209291908290030181600087803b15801561202c57600080fd5b505af1158015612040573d6000803e3d6000fd5b505050506040513d602081101561205657600080fd5b5051604080516001600160e01b031960e085901b1681526004810192909252516024808301926020929190829003018186803b15801561209557600080fd5b505afa1580156120a9573d6000803e3d6000fd5b505050506040513d60208110156120bf57600080fd5b5051156120fd5760405162461bcd60e51b81526004018080602001828103825260368152602001806153326036913960400191505060405180910390fd5b600254604080516302d3af5b60e01b81526004810187905290516001600160a01b039092169163a6b7d54e918391631a81dcab91899160019185916302d3af5b91602480820192602092909190829003018186803b15801561215e57600080fd5b505afa158015612172573d6000803e3d6000fd5b505050506040513d602081101561218857600080fd5b5051604080516001600160e01b031960e087901b168152600481019490945291900360248301525160448083019260209291908290030181600087803b1580156121d157600080fd5b505af11580156121e5573d6000803e3d6000fd5b505050506040513d60208110156121fb57600080fd5b5051604080516001600160e01b031960e085901b1681526004810192909252516024808301926020929190829003018186803b15801561223a57600080fd5b505afa15801561224e573d6000803e3d6000fd5b505050506040513d602081101561226457600080fd5b505142116122a35760405162461bcd60e51b815260040180806020018281038252604a815260200180615910604a913960600191505060405180910390fd5b6122b46122af856138e5565b6139ff565b600e54604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b1580156122ff57600080fd5b505afa158015612313573d6000803e3d6000fd5b505050506040513d602081101561232957600080fd5b505110156123685760405162461bcd60e51b8152600401808060200182810382526032815260200180614d036032913960400191505060405180910390fd5b600e546002546001600160a01b03918216916323b872dd9133911661238f6122af896138e5565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b1580156123f757600080fd5b505af115801561240b573d6000803e3d6000fd5b505050506040513d602081101561242157600080fd5b505161245e5760405162461bcd60e51b815260040180806020018281038252602681526020018061530c6026913960400191505060405180910390fd5b600084815260066020908152604080832060025482516302d3af5b60e01b8152600481018a905292519194936001600160a01b03909116926302d3af5b9260248083019392829003018186803b1580156124b757600080fd5b505afa1580156124cb573d6000803e3d6000fd5b505050506040513d60208110156124e157600080fd5b5051600280546000898152600460205260409020805460018083015492909401549495506001600160a01b0392831694630c4afecf948c94928316938316929091169033908901886003811061253357fe5b015489600501896003811061254457fe5b01548a6009018a6003811061255557fe5b0154604080516001600160e01b031960e08c901b16815260048101999099526001600160a01b0397881660248a01529587166044890152938616606488015291909416608486015260a485019390935260c484019290925260e483019190915261010482018990526001600160601b03198816610124830152516101448083019260209291908290030181600087803b1580156125f157600080fd5b505af1158015612605573d6000803e3d6000fd5b505050506040513d602081101561261b57600080fd5b50516000878152600760205260409020549093506301000000900460ff16612734576000868152600760205260409020805463ff00000019166301000000179055600e546002546001600160a01b039182169163a9059cbb911661267e8961292a565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126cd57600080fd5b505af11580156126e1573d6000803e3d6000fd5b505050506040513d60208110156126f757600080fd5b50516127345760405162461bcd60e51b81526004018080602001828103825260388152602001806157d76038913960400191505060405180910390fd5b60035460408051633a51d29160e21b815290516000926001600160a01b03169163e9474a44916004808301926020929190829003018186803b15801561277957600080fd5b505afa15801561278d573d6000803e3d6000fd5b505050506040513d60208110156127a357600080fd5b50516001600160a01b031614612819576003546040805163b32fefbf60e01b81526004810189905290516001600160a01b039092169163b32fefbf9160248082019260009290919082900301818387803b15801561280057600080fd5b505af1158015612814573d6000803e3d6000fd5b505050505b60408051878152602081018790526001600160601b031986168183015290517fc219795d9133fc09720767bb9eff6ce9f818bc1091bd58e34e4147fdb5edfc919181900360600190a150509392505050565b6003546040805163182fce5960e11b81526004810184905290516000926001600160a01b03169163305f9cb2916024808301926020929190829003018186803b158015611a7957600080fd5b600f5481565b60006119c06128cb836144ef565b611078846119f9565b60009081526007602052604090205462010000900460ff1690565b62093a8081565b600b602052816000526040600020818154811061290f57fe5b90600052602060002001600091509150505481565b60001981565b60009081526009602052604090205490565b6001600160a01b03166000908152600b602052604090205490565b6000908152600460205260409020600201546001600160a01b031690565b6000908152600760205260409020546301000000900460ff1690565b61299a82612d99565b156129d65760405162461bcd60e51b815260040180806020018281038252602781526020018061520f6027913960400191505060405180910390fd5b60008281526007602052604090205462010000900460ff161580612a145750600082815260076020526040902054600160201b900460ff1615156001145b612a4f5760405162461bcd60e51b815260040180806020018281038252603981526020018061543b6039913960400191505060405180910390fd5b6000828152600460205260409020600101546001600160a01b0316331480612a9057506000828152600460205260409020600201546001600160a01b031633145b612acb5760405162461bcd60e51b81526004018080602001828103825260328152602001806154096032913960400191505060405180910390fd5b612ad4826119a1565b421115612b125760405162461bcd60e51b815260040180806020018281038252602a8152602001806156a4602a913960400191505060405180910390fd5b6000828152600760205260409020546301000000900460ff1615612b675760405162461bcd60e51b815260040180806020018281038252603681526020018061580f6036913960400191505060405180910390fd5b6006600083815260200190815260200160002060040154600282604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612bcf5780518252601f199092019160209182019101612bb0565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612c0e573d6000803e3d6000fd5b5050506040513d6020811015612c2357600080fd5b50511480612cec57506006600083815260200190815260200160002060080154600282604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612c945780518252601f199092019160209182019101612c75565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612cd3573d6000803e3d6000fd5b5050506040513d6020811015612ce857600080fd5b5051145b612d3d576040805162461bcd60e51b815260206004820152601c60248201527f4c6f616e732e6163636570743a20496e76616c69642073656372657400000000604482015290519081900360640190fd5b6000828152600660205260409020600d01819055612d5a826145b8565b604080518381526020810183905281517fd001c5fed05473ebc31735197ca758919c1b82b1db58753430b848f875a5eaef929181900390910190a15050565b600090815260076020526040902054600160281b900460ff1690565b60035460408051630b7cecb760e31b81526004810184905290516000926001600160a01b031691635be765b8916024808301926020929190829003018186803b158015611a7957600080fd5b612e0a82612d99565b15612e465760405162461bcd60e51b81526004018080602001828103825260278152602001806156576027913960400191505060405180910390fd5b60008281526007602052604090205460ff161515600114612e985760405162461bcd60e51b81526004018080602001828103825260238152602001806157b46023913960400191505060405180910390fd5b60008281526007602052604090205460ff610100909104161515600114612ef05760405162461bcd60e51b8152600401808060200182810382526025815260200180614fbd6025913960400191505060405180910390fd5b60008281526007602052604090205462010000900460ff1615612f445760405162461bcd60e51b8152600401808060200182810382526039815260200180614e256039913960400191505060405180910390fd5b6006600083815260200190815260200160002060000154600282604051602001808281526020019150506040516020818303038152906040526040518082805190602001908083835b60208310612fac5780518252601f199092019160209182019101612f8d565b51815160209384036101000a60001901801990921691161790526040519190930194509192505080830381855afa158015612feb573d6000803e3d6000fd5b5050506040513d602081101561300057600080fd5b50511461303e5760405162461bcd60e51b81526004018080602001828103825260258152602001806156326025913960400191505060405180910390fd5b6000828152600760209081526040808320805462ff0000191662010000179055600e546004909252909120546001600160a01b039182169163a9059cbb911661308685614206565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156130d557600080fd5b505af11580156130e9573d6000803e3d6000fd5b505050506040513d60208110156130ff57600080fd5b505161313c5760405162461bcd60e51b81526004018080602001828103825260298152602001806156096029913960400191505060405180910390fd5b6000828152600660209081526040808320600c018490556003548151633a51d29160e21b815291516001600160a01b039091169263e9474a449260048082019391829003018186803b15801561319157600080fd5b505afa1580156131a5573d6000803e3d6000fd5b505050506040513d60208110156131bb57600080fd5b50516001600160a01b0316146132315760035460408051632e4606b160e01b81526004810185905290516001600160a01b0390921691632e4606b19160248082019260009290919082900301818387803b15801561321857600080fd5b505af115801561322c573d6000803e3d6000fd5b505050505b604080518381526020810183905281517f47aeb056e8eba8d7bbb5348f53123f67d6c678b16f7950aac696e4a168174873929181900390910190a15050565b60076020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691600160201b8204811691600160281b90041686565b6132be81612d99565b156132fa5760405162461bcd60e51b8152600401808060200182810382526025815260200180614d716025913960400191505060405180910390fd5b61330381612975565b1561333f5760405162461bcd60e51b8152600401808060200182810382526035815260200180614df06035913960400191505060405180910390fd5b613348816119a1565b42116133855760405162461bcd60e51b8152600401808060200182810382526040815260200180614e826040913960400191505060405180910390fd5b600081815260076020526040902054600160201b900460ff1615156001146133de5760405162461bcd60e51b81526004018080602001828103825260258152602001806157596025913960400191505060405180910390fd5b6000818152600460205260409020546001600160a01b031633146134335760405162461bcd60e51b815260040180806020018281038252603481526020018061539b6034913960400191505060405180910390fd5b6000818152600760209081526040808320805465ff00000000001916600160281b179055600480835281842042600690910155835460088452938290205482516301431c9560e71b81529182015290516001600160a01b039093169263a18e4a8092602480840193919291829003018186803b1580156134b257600080fd5b505afa1580156134c6573d6000803e3d6000fd5b505050506040513d60208110156134dc57600080fd5b50516135ab5760008054828252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b15801561353757600080fd5b505af115801561354b573d6000803e3d6000fd5b505060008054604080516333549b1b60e01b815290516001600160a01b0390921694506333549b1b9350600480820193929182900301818387803b15801561359257600080fd5b505af11580156135a6573d6000803e3d6000fd5b505050505b600e546000828152600460205260409020546001600160a01b039182169163a9059cbb91166135d9846128bd565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561362857600080fd5b505af115801561363c573d6000803e3d6000fd5b505050506040513d602081101561365257600080fd5b505161368f5760405162461bcd60e51b81526004018080602001828103825260278152602001806152916027913960400191505060405180910390fd5b6040805182815290517f3fbd469ec3a5ce074f975f76ce27e727ba21c99176917b97ae2e713695582a129181900360200190a150565b600c60209081526000928352604080842090915290825290205460ff1681565b6000908152600460205260409020600b015490565b600090815260076020526040902054610100900460ff1690565b60056020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529092918391908301828280156137ab5780601f10613780576101008083540402835291602001916137ab565b820191906000526020600020905b81548152906001019060200180831161378e57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156138495780601f1061381e57610100808354040283529160200191613849565b820191906000526020600020905b81548152906001019060200180831161382c57829003601f168201915b50505060028085018054604080516020601f60001961010060018716150201909416959095049283018590048502810185019091528181529596959450909250908301828280156138db5780601f106138b0576101008083540402835291602001916138db565b820191906000526020600020905b8154815290600101906020018083116138be57829003601f168201915b5050505050905083565b60006119c06138f383611436565b670ce80612991d0000614bbd565b6010546001600160a01b0316331461394a5760405162461bcd60e51b81526004018080602001828103825260328152602001806152da6032913960400191505060405180910390fd5b6002546001600160a01b0316156139925760405162461bcd60e51b81526004018080602001828103825260368152602001806152366036913960400191505060405180910390fd5b6001600160a01b0381166139d75760405162461bcd60e51b815260040180806020018281038252602e815260200180615845602e913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600d5481565b60006119c082613a126012600f54614571565b600a0a6145a1565b670ce80612991d000081565b6010546001600160a01b03163314613a6f5760405162461bcd60e51b81526004018080602001828103825260378152602001806150b76037913960400191505060405180910390fd5b6003546001600160a01b031615613ab75760405162461bcd60e51b81526004018080602001828103825260408152602001806150146040913960400191505060405180910390fd5b6001600160a01b038116613afc5760405162461bcd60e51b81526004018080602001828103825260388152602001806156ff6038913960400191505060405180910390fd5b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600354604080516311f4deaf60e31b81526004810184905290516000926001600160a01b031691638fa6f578916024808301926020929190829003018186803b158015611a7957600080fd5b6202a30081565b60006119c0613b7f836128bd565b611078846119e4565b60035460408051634f3e2b2f60e11b81526004810184905290516000926001600160a01b031691639e7c565e916024808301926020929190829003018186803b158015611a7957600080fd5b60009081526007602052604090205460ff1690565b6000908152600460205260409020600101546001600160a01b031690565b60008181526007602052604090205460ff161515600114613c595760405162461bcd60e51b81526004018080602001828103825260228152602001806157376022913960400191505060405180910390fd5b6000818152600460205260409020600101546001600160a01b03163314613cb15760405162461bcd60e51b81526004018080602001828103825260338152602001806153686033913960400191505060405180910390fd5b613cba816119c6565b421115613cf85760405162461bcd60e51b81526004018080602001828103825260308152602001806150876030913960400191505060405180910390fd5b600081815260076020908152604091829020805461ff001916610100179055815183815291517f323d40c0aa1cf896ec093775d91d6ba7455923481a9da93e54d4e114e0d6fb169281900390910190a150565b60086020526000908152604090205481565b60006119c0613d6b836128bd565b6113e78461292a565b600090815260076020526040902054600160201b900460ff1690565b61384081565b6000818152600660205260409020600e015460ff16613de65760405162461bcd60e51b815260040180806020018281038252602581526020018061526c6025913960400191505060405180910390fd5b60008181526007602052604090205460ff1615613e345760405162461bcd60e51b81526004018080602001828103825260228152602001806152b86022913960400191505060405180910390fd5b6000818152600760205260409020805460ff19166001179055600e546001600160a01b03166323b872dd3330613e6985614206565b6040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b03168152602001836001600160a01b03166001600160a01b031681526020018281526020019350505050602060405180830381600087803b158015613ed157600080fd5b505af1158015613ee5573d6000803e3d6000fd5b505050506040513d6020811015613efb57600080fd5b5051613f385760405162461bcd60e51b81526004018080602001828103825260258152602001806158be6025913960400191505060405180910390fd5b6040805182815290517f3561bc82a7926abd63a8c9d0b398ba40a4afd996df634bd6f1606c269781dfe09181900360200190a150565b600460208190526000918252604090912080546001820154600283015460038401549484015460058501546006860154600787015460088801546009890154600a8a0154600b909a01546001600160a01b03998a169b988a169a97909916989596949593949293919290918c565b613fe581612d99565b156140215760405162461bcd60e51b8152600401808060200182810382526027815260200180614dc96027913960400191505060405180910390fd5b60008181526007602052604090205462010000900460ff16156140755760405162461bcd60e51b8152600401808060200182810382526032815260200180614fe26032913960400191505060405180910390fd5b61407e81614158565b4210156140bc5760405162461bcd60e51b8152600401808060200182810382526033815260200180614d966033913960400191505060405180910390fd5b6000818152600760205260409020546301000000900460ff16156141115760405162461bcd60e51b81526004018080602001828103825260358152602001806155d46035913960400191505060405180910390fd5b61411a816145b8565b604080518281526000602082015281517f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a6929181900390910190a150565b60006119c061416683611a0e565b6202a300614561565b6001600160a01b03166000908152600a602052604090205490565b6006602052600090815260409020805460048201546008830154600c840154600d850154600e90950154939492939192909160ff1686565b60006119c06141df6113ec6141d6856128bd565b6113e78661292a565b6141e8846136e5565b614be5565b600a602052816000526040600020818154811061290f57fe5b60009081526004602052604090206007015490565b60009081526004602052604090206008015490565b600061423b826141c2565b61424483611436565b101592915050565b60096020526000908152604090205481565b6142688282612991565b604080518381526020810183905281517f9e5d8891dc1b047de610617bc9bc2d8ccffebbc3d63363431a546831245858a6929181900390910190a15050565b60008a8152600660205260409020600e015460ff16156142f85760405162461bcd60e51b815260040180806020018281038252603c815260200180614d35603c913960400191505060405180910390fd5b60008a8152600460205260409020546001600160a01b0316331480614336575060008a8152600460205260409020600101546001600160a01b031633145b8061434b57506000546001600160a01b031633145b6143865760405162461bcd60e51b815260040180806020018281038252604b815260200180615873604b913960600191505060405180910390fd5b60008a81526006602081815260408084208d3581558151606080820184528f85013582528f840135828601528f013592810192909252938e90529190526143d291600101906003614c39565b5060008a81526006602081815260408084208c3560048201558151606080820184528e85013582528e840135828601528e013592810192909252938e905291905261442291600501906003614c39565b5060008a81526006602081815260408084208b3560088201558151606080820184528d85013582528d840135828601528d013592810192909252938e905291905261447291600901906003614c39565b5060008a815260056020526040902061448c908787614c77565b5060008a81526005602052604090206144a9906001018585614c77565b5060008a81526005602052604090206144c6906002018383614c77565b50505060009788525050600660205250506040909320600e01805460ff19166001179055505050565b60006119c06144fd83614206565b6110788461421b565b60006305f5e10061452861451a8585614c15565b60026305f5e1005b04614561565b8161452f57fe5b049392505050565b600e546001600160a01b031681565b60006119c0826145596012600f54614571565b600a0a614c15565b808201828110156119c057600080fd5b808203828111156119c057600080fd5b60008161452861459985670de0b6b3a7640000614c15565b600285614522565b60008082116145af57600080fd5b81838161452f57fe5b6000818152600760208181526040808420805465ff00000000001916600160281b17815560048352932042600690910155525462010000900460ff1661485b576000818152600860205260409020546146e057600e5460008281526004602081815260408084206001810154600790910154825163a9059cbb60e01b81526001600160a01b03928316958101959095526024850152905194169363a9059cbb936044808501948390030190829087803b15801561467457600080fd5b505af1158015614688573d6000803e3d6000fd5b505050506040513d602081101561469e57600080fd5b50516146db5760405162461bcd60e51b815260040180806020018281038252603381526020018061516b6033913960400191505060405180910390fd5b614856565b60008054828252600860209081526040928390205483516301431c9560e71b8152600481019190915292516001600160a01b039092169263a18e4a809260248083019392829003018186803b15801561473857600080fd5b505afa15801561474c573d6000803e3d6000fd5b505050506040513d602081101561476257600080fd5b50516147d65760008054828252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b1580156147bd57600080fd5b505af11580156147d1573d6000803e3d6000fd5b505050505b6000805482825260086020908152604080842054600492839052818520600701548251630ef1370b60e11b8152938401919091526024830152516001600160a01b0390921692631de26e169260448084019382900301818387803b15801561483d57600080fd5b505af1158015614851573d6000803e3d6000fd5b505050505b614bba565b60008181526008602052604090205461495a57600e546000828152600460205260409020600101546001600160a01b039182169163a9059cbb911661489f846144ef565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156148ee57600080fd5b505af1158015614902573d6000803e3d6000fd5b505050506040513d602081101561491857600080fd5b50516149555760405162461bcd60e51b815260040180806020018281038252603681526020018061577e6036913960400191505060405180910390fd5b614ad3565b60008054828252600860209081526040928390205483516301431c9560e71b8152600481019190915292516001600160a01b039092169263a18e4a809260248083019392829003018186803b1580156149b257600080fd5b505afa1580156149c6573d6000803e3d6000fd5b505050506040513d60208110156149dc57600080fd5b5051614a505760008054828252600460208190526040808420600701548151637249992b60e11b815292830152516001600160a01b039092169263e49332569260248084019382900301818387803b158015614a3757600080fd5b505af1158015614a4b573d6000803e3d6000fd5b505050505b6000805482825260086020526040909120546001600160a01b0390911690631de26e1690614a7d846144ef565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015614aba57600080fd5b505af1158015614ace573d6000803e3d6000fd5b505050505b600e546000828152600460205260409020600201546001600160a01b039182169163a9059cbb9116614b04846119f9565b6040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015614b5357600080fd5b505af1158015614b67573d6000803e3d6000fd5b505050506040513d6020811015614b7d57600080fd5b5051614bba5760405162461bcd60e51b815260040180806020018281038252602e815260200180614f8f602e913960400191505060405180910390fd5b50565b6000670de0b6b3a7640000614528614bd58585614c15565b6002670de0b6b3a7640000614522565b60006b033b2e3c9fd0803ce8000000614528614c018585614c15565b60026b033b2e3c9fd0803ce8000000614522565b6000811580614c3057505080820282828281614c2d57fe5b04145b6119c057600080fd5b8260038101928215614c67579160200282015b82811115614c67578251825591602001919060010190614c4c565b50614c73929150614ce5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10614cb85782800160ff19823516178555614c67565b82800160010185558215614c67579182015b82811115614c67578235825591602001919060010190614cca565b614cff91905b80821115614c735760008155600101614ceb565b9056fe4c6f616e732e6c69717569646174653a20696e73756666696369656e742062616c616e636520746f206c69717569646174654c6f616e732e7365745365637265744861736865733a2053656372657420686173686573206d757374206e6f7420616c7265616479206265207365744c6f616e732e726566756e643a204c6f616e2063616e6e6f7420626520696e6163746976654c6f616e732e63616e63656c3a205365697a75726520646561646c696e6520686173206e6f74206265656e20726561636865644c6f616e732e63616e63656c3a204c6f616e206d757374206e6f7420626520696e6163746976654c6f616e732e726566756e643a204c6f616e2063616e6e6f7420626520756e646572676f696e672061206c69717569646174696f6e4c6f616e732e77697468647261773a204c6f616e207072696e636970616c2068617320616c7265616479206265656e2077697468647261776e4c6f616e732e72657061793a204c6f616e2063616e6e6f7420626520696e6163746976654c6f616e732e726566756e643a2043616e6e6f74207265717565737420726566756e6420756e74696c2061667465722061636365707445787069726174696f6e4c6f616e732e6c69717569646174653a204c6f616e207072696e636970616c206d7573742062652077697468647261776e4c6f616e732e6372656174653a205072696e636970616c20616e6420436f6c6c61746572616c206d757374206265206e6f6e2d7a65726f4c6f616e732e6c69717569646174653a204c6f616e206d757374206e6f7420626520696e6163746976654c6f616e732e6c69717569646174653a207365637265744861736820616e64207075624b657948617368206d757374206265206e6f6e2d7a65726f4c6f616e732e636c6f73653a204661696c656420746f207472616e736665722066656520746f20417262697465724c6f616e732e77697468647261773a204c6f616e206d75737420626520617070726f7665644c6f616e732e63616e63656c3a204c6f616e207072696e636970616c206d757374206e6f742062652077697468647261776e4c6f616e732e736574436f6c6c61746572616c3a2054686520436f6c6c61746572616c20616464726573732068617320616c7265616479206265656e207365744c6f616e732e72657061793a2043616e6e6f74207265706179206d6f7265207468616e20746865206f77656420616d6f756e744c6f616e732e617070726f76653a204c6f616e20697320706173742074686520617070726f766520646561646c696e654c6f616e732e736574436f6c6c61746572616c3a204f6e6c7920746865206465706c6f7965722063616e20706572666f726d20746869734c6f616e732e6372656174653a204c69717569646174696f6e20726174696f20616e6420526571756573742074696d657374616d70206d757374206265206e6f6e2d7a65726f4c6f616e732e6372656174653a206c6f616e45787069726174696f6e206d7573742062652067726561746572207468616e20606e6f77604c6f616e732e636c6f73653a204661696c656420746f207472616e73666572207072696e636970616c20746f204c656e6465724c6f616e732e6372656174653a204475706c696361746520726571756573742074696d657374616d707320617265206e6f7420616c6c6f7765644c6f616e732e6c69717569646174653a206c6f616e206d757374206e6f74206861766520616c7265616479206265656e207265706169644c6f616e732e6163636570743a204c6f616e206d757374206e6f7420626520696e6163746976654c6f616e732e73657453616c65733a205468652053616c657320616464726573732068617320616c7265616479206265656e207365744c6f616e732e66756e643a2053656372657420686173686573206d757374206265207365744c6f616e732e726566756e643a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e66756e643a204c6f616e20697320616c72656164792066756e6465644c6f616e732e73657453616c65733a204f6e6c7920746865206465706c6f7965722063616e20706572666f726d20746869734c6f616e732e6c69717569646174653a20546f6b656e207472616e73666572206661696c65644c6f616e732e6c69717569646174653a2050726576696f7573206c69717569646174696f6e20616c72656164792061636365707465644c6f616e732e617070726f76653a204f6e6c7920746865206c656e6465722063616e20617070726f766520746865206c6f616e4c6f616e732e726566756e643a204f6e6c792074686520626f72726f7765722063616e2072657175657374206120726566756e644c6f616e732e6372656174653a20426f72726f77657220616e64204c656e6465722061646472657373206d757374206265206e6f6e2d7a65726f4c6f616e732e6163636570743a206d73672e73656e646572206d757374206265206c656e646572206f7220617262697465724c6f616e732e6163636570743a204c6f616e206d75737420626520656974686572206e6f742077697468647261776e206f72207265706169644c6f616e732e6372656174653a204c656e646572206f662046756e64206e6f7420696e20617267734c6f616e732e6c69717569646174653a20636f6c6c61746572616c697a6174696f6e206d7573742062652062656c6f77206d696e2d636f6c6c61746572616c697a6174696f6e20726174696f4c6f616e732e72657061793a204c6f616e2063616e6e6f7420626520756e646572676f696e672061206c69717569646174696f6e4c6f616e732e72657061793a204c6f616e2063616e6e6f74206861766520657870697265644c6f616e732e6d696e5365697a61626c65436f6c6c61746572616c3a204d656469616e697a6572206d757374206265207365744c6f616e732e6c69717569646174653a204d6178206e756d626572206f66206c69717569646174696f6e7320726561636865644c6f616e732e636f6c6c61746572616c56616c75653a204d656469616e697a6572206d757374206265207365744c6f616e732e63616e63656c3a204c6f616e206d757374206e6f7420626520756e646572676f696e67206c69717569646174696f6e4c6f616e732e77697468647261773a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e77697468647261773a2053656372657420646f6573206e6f74206d617463684c6f616e732e77697468647261773a204c6f616e2063616e6e6f7420626520696e6163746976654c6f616e732e72657061793a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e6163636570743a20416363657074616e636520646561646c696e652068617320706173744c6f616e732e6c69717569646174653a204c697175696461746f72206d75737420626520612074686972642d70617274794c6f616e732e736574436f6c6c61746572616c3a20436f6c6c61746572616c2061646472657373206d757374206265206e6f6e2d7a65726f4c6f616e732e617070726f76653a204c6f616e206d7573742062652066756e6465644c6f616e732e726566756e643a20546865206c6f616e206d757374206265207265706169644c6f616e732e636c6f73653a204661696c656420746f207472616e73666572206f776564546f4c656e64657220746f204c656e6465724c6f616e732e77697468647261773a204c6f616e206d7573742062652066756e6465644c6f616e732e6c69717569646174653a20546f6b656e207472616e7366657220746f2053616c657320636f6e7472616374206661696c65644c6f616e732e6163636570743a204c6f616e206d757374206e6f7420626520676f696e6720756e646572206c69717569646174696f6e4c6f616e732e73657453616c65733a2053616c65732061646472657373206d757374206265206e6f6e2d7a65726f4c6f616e732e7365745365637265744861736865733a206d73672e73656e646572206d75737420626520426f72726f7765722c204c656e646572206f722046756e647320416464726573734c6f616e732e66756e643a204661696c656420746f207472616e7366657220746f6b656e734c6f616e732e72657061793a204c6f616e207072696e636970616c206d7573742062652077697468647261776e4c6f616e732e6c69717569646174653a2050726576696f7573206c69717569646174696f6e20736574746c656d656e742065787069726174696f6e206861736e27742065787069726564a265627a7a72305820d64b4fe7c6867306d5488b644e604016bfe67da764affe46661041bc3399f4a464736f6c634300050a0032

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

0000000000000000000000003528c164e3fca20e2333cf58ab4b1c99def83347000000000000000000000000bc32048d9be3a3c3b626c44d296cefaaa400c797000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000000000000000000000000000000000000000000006

-----Decoded View---------------
Arg [0] : funds_ (address): 0x3528C164e3fCA20E2333Cf58Ab4B1c99DeF83347
Arg [1] : med_ (address): 0xBC32048D9Be3A3c3b626c44D296CEfaaA400c797
Arg [2] : token_ (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [3] : decimals_ (uint256): 6

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000003528c164e3fca20e2333cf58ab4b1c99def83347
Arg [1] : 000000000000000000000000bc32048d9be3a3c3b626c44d296cefaaa400c797
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000006


Deployed Bytecode Sourcemap

35533:22428:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35533:22428:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50533:924;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50533:924:0;;;;;;;:::i;:::-;;36009:48;;;:::i;:::-;;;;;;;;;;;;;;;;42776:337;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42776:337:0;;:::i;38470:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38470:110:0;;:::i;:::-;;;;-1:-1:-1;;;;;38470:110:0;;;;;;;;;;;;;;43127:279;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43127:279:0;;:::i;45369:1921::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;45369:1921:0;;;;;;;;;;;;;;;:::i;38997:150::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38997:150:0;;:::i;38836:147::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38836:147:0;;:::i;39859:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39859:106:0;;:::i;39747:98::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39747:98:0;;:::i;39161:160::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39161:160:0;;:::i;40391:150::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40391:150:0;;:::i;55280:2678::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55280:2678:0;;;;;;;;;;;-1:-1:-1;;;;;;55280:2678:0;;:::i;40249:128::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40249:128:0;;:::i;36916:23::-;;;:::i;41113:126::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41113:126:0;;:::i;41780:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41780:109:0;;:::i;:::-;;;;;;;;;;;;;;;;;;35804:58;;;:::i;36659:64::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36659:64:0;;;;;;;;:::i;36065:47::-;;;:::i;40715:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40715:103:0;;:::i;42635:127::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42635:127:0;-1:-1:-1;;;;;42635:127:0;;:::i;38714:108::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38714:108:0;;:::i;41903:97::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41903:97:0;;:::i;53052:952::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53052:952:0;;;;;;;:::i;42127:95::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42127:95:0;;:::i;40103:132::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40103:132:0;;:::i;49629:890::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49629:890:0;;;;;;;:::i;36346:58::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36346:58:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51471:912;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51471:912:0;;:::i;36730:71::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36730:71:0;;;;;;;;:::i;40832:124::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40832:124:0;;:::i;41659:107::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41659:107:0;;:::i;36186:60::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36186:60:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;36186:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36186:60: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;36186:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36186:60: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;36186:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43604:152;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43604:152:0;;:::i;44542:384::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44542:384:0;-1:-1:-1;;;;;44542:384:0;;:::i;36808:62::-;;;:::i;42361:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42361:111:0;;:::i;35936:65::-;;;:::i;44940:409::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44940:409:0;-1:-1:-1;;;;;44940:409:0;;:::i;40555:146::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40555:146:0;;:::i;35738:53::-;;;:::i;41253:138::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41253:138:0;;:::i;39979:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39979:110:0;;:::i;41542:103::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41542:103:0;;:::i;38594:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38594:106:0;;:::i;49213:402::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49213:402:0;;:::i;36426:62::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36426:62:0;;:::i;41405:123::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41405:123:0;;:::i;42014:99::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42014:99:0;;:::i;35672:55::-;;;:::i;48795:404::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;48795:404:0;;:::i;36121:58::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36121:58:0;;:::i;:::-;;;;-1:-1:-1;;;;;36121:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52543:495;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52543:495:0;;:::i;39335:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39335:152:0;;:::i;42486:135::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42486:135:0;-1:-1:-1;;;;;42486:135:0;;:::i;36266:65::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36266:65:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43420:170;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43420:170:0;;:::i;36586:66::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;36586:66:0;;;;;;;;:::i;39501:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39501:110:0;;:::i;39625:108::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39625:108:0;;:::i;43770:130::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43770:130:0;;:::i;36506:63::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36506:63:0;;:::i;52397:132::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52397:132:0;;;;;;;:::i;47304:1477::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;47304:1477:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;47304:1477:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47304:1477:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47304:1477:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;47304:1477:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47304:1477:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;47304:1477:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;47304:1477:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;47304:1477:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;47304:1477:0;;-1:-1:-1;47304:1477:0;-1:-1:-1;47304:1477:0;:::i;40970:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40970:129:0;;:::i;34196:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34196:111:0;;;;;;;:::i;36890:18::-;;;:::i;42236:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42236:111:0;;:::i;50533:924::-;50607:9;50611:4;50607:3;:9::i;:::-;50606:10;50598:59;;;;-1:-1:-1;;;50598:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50677:10;50682:4;50677;:10::i;:::-;50676:11;50668:76;;;;-1:-1:-1;;;50668:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50763:11;;;;:5;:11;;;;;:21;;;;;;:29;;50788:4;50763:29;50755:87;;;;-1:-1:-1;;;50755:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50868:11;;;;:5;:11;;;;;;;;:26;;50861:3;:33;;50853:83;;;;-1:-1:-1;;;50853:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50984:17;50996:4;50984:11;:17::i;:::-;50955:25;50959:6;50967:12;50974:4;50967:6;:12::i;:::-;50955:3;:25::i;:::-;:46;;50947:110;;;;-1:-1:-1;;;50947:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51076:5;;:53;;;-1:-1:-1;;;51076:53:0;;51095:10;51076:53;;;;51115:4;51076:53;;;;;;;;;;;;-1:-1:-1;;;;;51076:5:0;;;;:18;;:53;;;;;;;;;;;;;;;:5;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;51076:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51076:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51076:53:0;51068:104;;;;-1:-1:-1;;;51068:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51214:16;;;;:10;:16;;;;;;51202:29;;51206:6;;51202:3;:29::i;:::-;51183:16;;;;:10;:16;;;;;:48;51262:17;51194:4;51262:11;:17::i;:::-;51246:12;51253:4;51246:6;:12::i;:::-;:33;51242:171;;;51296:11;;;;:5;:11;;;;;;;;:23;;-1:-1:-1;;51296:23:0;-1:-1:-1;;;51296:23:0;;;51346:3;;:17;;-1:-1:-1;;;51346:17:0;;;;-1:-1:-1;;;;;51346:3:0;;;;;:15;;51296:16;51346:17;;;;;;;;;;:3;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;51346:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51346:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51346:17:0;-1:-1:-1;;;;;51338:40:0;;51334:68;;51381:3;;:19;;;-1:-1:-1;;;51381:19:0;;;;;;;;;;-1:-1:-1;;;;;51381:3:0;;;;:13;;:19;;;;;:3;;:19;;;;;;;;:3;;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;51381:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51381:19:0;;;;51334:68;51430:19;;;;;;;;;;;;;;;;;;;;;;;;;50533:924;;:::o;36009:48::-;36056:1;36009:48;:::o;42776:337::-;42842:7;42863:11;42876:8;42888:3;;;;;;;;;-1:-1:-1;;;;;42888:3:0;-1:-1:-1;;;;;42888:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42888:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42888:10:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42888:10:0;;;;;;;;;-1:-1:-1;42888:10:0;-1:-1:-1;42888:10:0;42909:67;;;;-1:-1:-1;;;42909:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43008:3;43030:75;43034:55;43039:42;43044:36;43048:17;43060:4;43048:11;:17::i;:::-;43067:12;43074:4;43067:6;:12::i;:::-;43044:3;:36::i;:::-;43039:4;:42::i;:::-;43083:5;43034:4;:55::i;:::-;43091:13;34143:8;34108:7;43091:3;:13::i;:::-;43030:3;:75::i;:::-;43023:82;42776:337;-1:-1:-1;;;;;42776:337:0:o;38470:110::-;38525:7;38552:11;;;:5;:11;;;;;:20;-1:-1:-1;;;;;38552:20:0;;38470:110::o;43127:279::-;43187:7;43208:11;43221:8;43233:3;;;;;;;;;-1:-1:-1;;;;;43233:3:0;-1:-1:-1;;;;;43233:8:0;;:10;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43233:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43233:10:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43233:10:0;;;;;;;;;-1:-1:-1;43233:10:0;-1:-1:-1;43233:10:0;43254:61;;;;-1:-1:-1;;;43254:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43347:3;43369:29;43347:3;43381:16;43392:4;43381:10;:16::i;:::-;43369:4;:29::i;45369:1921::-;45563:12;45592:18;;45588:134;;45635:5;;:18;;;-1:-1:-1;;;45635:18:0;;;;;;;;;;45657:8;;;;;-1:-1:-1;;;;;45657:8:0;;;;45635:5;;:12;;:18;;;;;45657:8;45635:18;;;;;:5;:18;;;5:2:-1;;;;30:1;27;20:12;5:2;45635:18:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45635:18:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45635:18:0;-1:-1:-1;;;;;45635:30:0;;45627:83;;;;-1:-1:-1;;;45627:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45760:8;;-1:-1:-1;;;;;45760:8:0;45741:28;;;;:18;45760:8;45741:28;;;;;;;45770:8;;;;45741:38;;;;;;;;;;45740:39;45732:110;;;;-1:-1:-1;;;45732:110:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45879:3;45861:15;:21;45853:89;;;;-1:-1:-1;;;45853:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45961:8:0;;;:22;;;;:48;;-1:-1:-1;;;;;;45987:8:0;;;;;:22;;45961:48;45953:119;;;;-1:-1:-1;;;45953:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46091:8;;:13;;;;:30;;-1:-1:-1;46108:8:0;;;;:13;;46091:30;46083:98;;;;-1:-1:-1;;;46083:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46200:8;;;;:13;;;;:30;;-1:-1:-1;46217:8:0;;;;:13;;46200:30;46192:113;;;;-1:-1:-1;;;46192:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46330:17;46334:9;;46345:1;46330:3;:17::i;:::-;46318:9;:29;;;46365:18;46394:11;;;:5;:11;;;;;;;;46418:3;46394:21;;;:27;46432:26;;;:44;;;46487:31;;-1:-1:-1;;;;;;46487:31:0;;;-1:-1:-1;;;;;46510:8:0;;;;46487:31;;;;;;-1:-1:-1;46529:18:0;;:29;;;;46550:8;;;;;;46529:29;;;-1:-1:-1;46569:19:0;;:30;;;;;46591:8;;;;;;;46569:30;;;46634:8;;46610:21;;;:32;46676:8;;;;46653:20;;;:31;46717:8;;;46695:19;;;:30;46754:8;;;;46736:15;;;;:26;46318:29;;-1:-1:-1;46798:27:0;46318:29;46798:21;:27::i;:::-;46836:3;;46773:52;;-1:-1:-1;;;;;;46836:3:0;:17;46854:4;46860:29;46864:8;;;;46773:52;46860:3;:29::i;:::-;46891:14;46836:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46836:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46836:70:0;;;;46948:5;46954:1;46948:8;;;;;;;46917:11;;;;:5;46948:8;46917:11;;;;;;;46948:8;;;;;;;;46917:28;;;;:39;;;;46998:8;;;;46967:28;;;;:39;;;47017:9;:15;;;;;:22;;;-1:-1:-1;47050:18:0;;;;;:22;;:30;;-1:-1:-1;;47050:30:0;;;;;;-1:-1:-1;;;;;47105:8:0;;;;47091:23;;;:13;:23;;;;;47128:9;;;27:10:-1;;-1:-1;23:18;;;45:23;;47091:48:0;;;;;;;;47162:8;;;;;;;47150:21;;;;;;;;47185:9;;27:10:-1;;23:18;;;45:23;;47150:46:0;;;;;;;;;;;;;47207:28;;:18;:28;;;;;:38;;;;;;;;;;:45;;;;;;;;;;;47270:12;;;;;;;;;;;;;;;;;45369:1921;;;;;;;:::o;38997:150::-;39058:7;39090:11;;;:5;:11;;;;;;;:26;;39086:53;;35785:6;39086:3;:53::i;:::-;39079:60;38997:150;-1:-1:-1;;38997:150:0:o;38836:147::-;38898:7;38930:11;;;:5;:11;;;;;:21;;;38926:49;;35720:7;38926:3;:49::i;39859:106::-;39911:7;39938:11;;;:5;:11;;;;;:19;;;;39859:106::o;39747:98::-;39795:7;39822:11;;;:5;:11;;;;;:15;;;;39747:98::o;39161:160::-;39227:7;39259:11;;;:5;:11;;;;;;;:26;;39255:58;;35856:6;39255:3;:58::i;40391:150::-;40494:3;;:39;;;-1:-1:-1;;;40494:39:0;;;;;;;;;;40467:7;;-1:-1:-1;;;;;40494:3:0;;:33;;:39;;;;;;;;;;;;;;:3;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;40494:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40494:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40494:39:0;;40391:150;-1:-1:-1;;40391:150:0:o;55280:2678::-;55371:13;55406:9;55410:4;55406:3;:9::i;:::-;55405:10;55397:65;;;;-1:-1:-1;;;55397:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55481:11;;;;:5;:11;;;;;:21;;;;;;:29;;55506:4;55481:29;55473:91;;;;-1:-1:-1;;;55473:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55597:11;;;;:5;:11;;;;;:20;-1:-1:-1;;;;;55597:20:0;55583:10;:34;;;;:70;;-1:-1:-1;55635:11:0;;;;:5;:11;;;;;:18;;;-1:-1:-1;;;;;55635:18:0;55621:10;:32;;55583:70;55575:132;;;;-1:-1:-1;;;55575:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55726:24;;;;;:52;;-1:-1:-1;;;;;;;55754:24:0;;;;55726:52;55718:124;;;;-1:-1:-1;;;55718:124:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55867:5;;:16;;;-1:-1:-1;;;55867:16:0;;;;;;;;;;-1:-1:-1;;;;;55867:5:0;;;;:10;;:16;;;;;;;;;;;;;;;:5;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;55867:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55867:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55867:16:0;55863:1106;;55929:11;;;;:5;:11;;;;;;;;:26;;55923:3;:32;55919:307;;;55984:11;;;;:5;:11;;;;;:16;-1:-1:-1;;;55984:16:0;;;;:25;55976:93;;;;-1:-1:-1;;;55976:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55919:307;;;56119:10;56124:4;56119;:10::i;:::-;56118:11;56110:100;;;;-1:-1:-1;;;56110:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56258:5;;;56271:15;;;:9;:15;;;;;;;;;;56258:29;;-1:-1:-1;;;56258:29:0;;;;;;;;;;;-1:-1:-1;;;;;56258:5:0;;;;:12;;:29;;;;;56271:15;56258:29;;;;;:5;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;56258:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56258:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56258:29:0;56254:172;;56317:5;;;56343:11;;;:5;:11;;;;;;;;:21;;;56317:48;;-1:-1:-1;;;56317:48:0;;;;;;;-1:-1:-1;;;;;56317:5:0;;;;:25;;:48;;;;;;;;;;:5;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;56317:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;56384:5:0;;;:26;;;-1:-1:-1;;;56384:26:0;;;;-1:-1:-1;;;;;56384:5:0;;;;-1:-1:-1;56384:24:0;;-1:-1:-1;56384:26:0;;;;;:5;:26;;;;;;:5;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;56384:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56384:26:0;;;;56254:172;55863:1106;;;56480:5;;:16;;;-1:-1:-1;;;56480:16:0;;;;;;;;;;36056:1;;-1:-1:-1;;;;;56480:5:0;;:10;;:16;;;;;;;;;;;;;;:5;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;56480:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56480:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56480:16:0;:39;56472:103;;;;-1:-1:-1;;;56472:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56599:5;;56642:16;;;-1:-1:-1;;;56642:16:0;;;;;;;;;;-1:-1:-1;;;;;56599:5:0;;;;:14;;:5;;56614:21;;56636:4;;56599:5;;;;56642:10;;:16;;;;;;;;;;;;;;;56599:5;56642:16;;;5:2:-1;;;;30:1;27;20:12;5:2;56642:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56642:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56642:16:0;56614:49;;;-1:-1:-1;;;;;;56614:49:0;;;;;;;;;;;;;;56642:20;;;56614:49;;;;;;;;;;56642:16;;56614:49;;;;;;;-1:-1:-1;56614:49:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;56614:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56614:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56614:49:0;56599:65;;;-1:-1:-1;;;;;;56599:65:0;;;;;;;;;;;;;;;;;;;;56614:49;;56599:65;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;56599:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56599:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56599:65:0;56598:66;56590:133;;;;-1:-1:-1;;;56590:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56770:5;;56825:16;;;-1:-1:-1;;;56825:16:0;;;;;;;;;;-1:-1:-1;;;;;56770:5:0;;;;:26;;:5;;56797:21;;56819:4;;56770:5;;;;56825:10;;:16;;;;;;;;;;;;;;;56770:5;56825:16;;;5:2:-1;;;;30:1;27;20:12;5:2;56825:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56825:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56825:16:0;56797:49;;;-1:-1:-1;;;;;;56797:49:0;;;;;;;;;;;;;;56825:20;;;56797:49;;;;;;;;;;56825:16;;56797:49;;;;;;;-1:-1:-1;56797:49:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;56797:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56797:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56797:49:0;56770:77;;;-1:-1:-1;;;;;;56770:77:0;;;;;;;;;;;;;;;;;;;;56797:49;;56770:77;;;;;;;;;;;5:2:-1;;;;30:1;27;20:12;5:2;56770:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56770:77:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56770:77:0;56764:3;:83;56738:219;;;;-1:-1:-1;;;56738:219:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57018:35;57023:29;57047:4;57023:23;:29::i;:::-;57018:4;:35::i;:::-;56987:5;;:27;;;-1:-1:-1;;;56987:27:0;;57003:10;56987:27;;;;;;-1:-1:-1;;;;;56987:5:0;;;;:15;;:27;;;;;;;;;;;;;;;:5;:27;;;5:2:-1;;;;30:1;27;20:12;5:2;56987:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56987:27:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56987:27:0;:66;;56979:129;;;;-1:-1:-1;;;56979:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57127:5;;57166;;-1:-1:-1;;;;;57127:5:0;;;;:18;;57146:10;;57166:5;57174:35;57179:29;57203:4;57179:23;:29::i;57174:35::-;57127:83;;;;;;;;;;;;;-1:-1:-1;;;;;57127:83:0;-1:-1:-1;;;;;57127:83:0;;;;;;-1:-1:-1;;;;;57127:83:0;-1:-1:-1;;;;;57127:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57127:83:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57127:83:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57127:83:0;57119:134;;;;-1:-1:-1;;;57119:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57264:22;57289:18;;;:12;:18;;;;;;;;57330:5;;:16;;-1:-1:-1;;;57330:16:0;;;;;;;;;;57289:18;;57264:22;-1:-1:-1;;;;;57330:5:0;;;;:10;;:16;;;;;57289:18;57330:16;;;;;:5;:16;;;5:2:-1;;;;30:1;27;20:12;5:2;57330:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57330:16:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57330:16:0;57375:5;;;;57408:11;;;:5;57330:16;57408:11;;;;:20;;57375:5;57430:18;;;;57450:19;;;;;57330:16;;-1:-1:-1;;;;;;57375:5:0;;;;:12;;57408:11;;:20;;;;57430:18;;;57450:19;;;;57471:10;;57496:14;;57330:16;57496:17;;;;;;;;;57515:1;:14;;57530:1;57515:17;;;;;;;;;57534:1;:14;;57549:1;57534:17;;;;;;;;;57375:211;;;-1:-1:-1;;;;;;57375:211:0;;;;;;;;;;;;;;-1:-1:-1;;;;;57375:211:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57375:211:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;57375:211:0;;;;5:2:-1;;;;30:1;27;20:12;5:2;57375:211:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57375:211:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57375:211:0;57601:11;;;;:5;57375:211;57601:11;;;;:16;57375:211;;-1:-1:-1;57601:16:0;;;;;57597:209;;57643:11;;;;:5;:11;;;;;:23;;-1:-1:-1;;57643:23:0;;;;;57689:5;;57712;;-1:-1:-1;;;;;57689:5:0;;;;:14;;57712:5;57720:12;57649:4;57720:6;:12::i;:::-;57689:44;;;;;;;;;;;;;-1:-1:-1;;;;;57689:44:0;-1:-1:-1;;;;;57689:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57689:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57689:44:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57689:44:0;57681:113;;;;-1:-1:-1;;;57681:113:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57838:3;;:17;;;-1:-1:-1;;;57838:17:0;;;;57868:1;;-1:-1:-1;;;;;57838:3:0;;:15;;:17;;;;;;;;;;;;;;:3;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;57838:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57838:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57838:17:0;-1:-1:-1;;;;;57830:40:0;;57826:68;;57873:3;;:19;;;-1:-1:-1;;;57873:19:0;;;;;;;;;;-1:-1:-1;;;;;57873:3:0;;;;:13;;:19;;;;;:3;;:19;;;;;;;;:3;;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;57873:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57873:19:0;;;;57826:68;57911:39;;;;;;;;;;;;-1:-1:-1;;;;;;57911:39:0;;;;;;;;;;;;;;;;;55280:2678;;;;;;;:::o;40249:128::-;40341:3;;:28;;;-1:-1:-1;;;40341:28:0;;;;;;;;;;40314:7;;-1:-1:-1;;;;;40341:3:0;;:22;;:28;;;;;;;;;;;;;;:3;:28;;;5:2:-1;;;;30:1;27;20:12;36916:23:0;;;;:::o;41113:126::-;41169:7;41197:34;41201:18;41214:4;41201:12;:18::i;:::-;41221:9;41225:4;41221:3;:9::i;41780:109::-;41836:4;41860:11;;;:5;:11;;;;;:21;;;;;;;41780:109::o;35804:58::-;35856:6;35804:58;:::o;36659:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36065:47::-;-1:-1:-1;;36065:47:0;:::o;40715:103::-;40766:7;40794:16;;;:10;:16;;;;;;;40715:103::o;42635:127::-;-1:-1:-1;;;;;42727:20:0;42700:7;42727:20;;;:11;:20;;;;;:27;;42635:127::o;38714:108::-;38768:7;38795:11;;;:5;:11;;;;;:19;;;-1:-1:-1;;;;;38795:19:0;;38714:108::o;41903:97::-;41952:4;41976:11;;;:5;:11;;;;;:16;;;;;;;41903:97::o;53052:952::-;53125:9;53129:4;53125:3;:9::i;:::-;53124:10;53116:62;;;;-1:-1:-1;;;53116:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53197:11;;;;:5;:11;;;;;:21;;;;;;:30;;:58;;-1:-1:-1;53231:11:0;;;;:5;:11;;;;;:16;-1:-1:-1;;;53231:16:0;;;;:24;;53251:4;53231:24;53197:58;53189:128;;;;-1:-1:-1;;;53189:128:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53350:11;;;;:5;:11;;;;;:18;;;-1:-1:-1;;;;;53350:18:0;53336:10;:32;;:69;;-1:-1:-1;53386:11:0;;;;:5;:11;;;;;:19;;;-1:-1:-1;;;;;53386:19:0;53372:10;:33;53336:69;53328:132;;;;-1:-1:-1;;;53328:132:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53486:22;53503:4;53486:16;:22::i;:::-;53479:3;:29;;53471:84;;;;-1:-1:-1;;;53471:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53574:11;;;;:5;:11;;;;;:16;;;;;;:25;53566:92;;;;-1:-1:-1;;;53566:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53727:12;:18;53740:4;53727:18;;;;;;;;;;;:31;;;53691:32;53715:6;53698:24;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53698:24:0;;;53691:32;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;53691:32:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;53691:32:0;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53691:32:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53691:32:0;:67;;:138;;;53798:12;:18;53811:4;53798:18;;;;;;;;;;;:31;;;53762:32;53786:6;53769:24;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;53769:24:0;;;53762:32;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;53762:32:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;53762:32:0;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53762:32:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53762:32:0;:67;53691:138;53669:216;;;;;-1:-1:-1;;;53669:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53896:18;;;;:12;:18;;;;;:31;;:40;;;53947:11;53909:4;53947:5;:11::i;:::-;53976:20;;;;;;;;;;;;;;;;;;;;;;;;;53052:952;;:::o;42127:95::-;42175:4;42199:11;;;:5;:11;;;;;:15;-1:-1:-1;;;42199:15:0;;;;;42127:95::o;40103:132::-;40197:3;;:30;;;-1:-1:-1;;;40197:30:0;;;;;;;;;;40170:7;;-1:-1:-1;;;;;40197:3:0;;:24;;:30;;;;;;;;;;;;;;:3;:30;;;5:2:-1;;;;30:1;27;20:12;49629:890:0;49708:9;49712:4;49708:3;:9::i;:::-;49707:10;49699:62;;;;-1:-1:-1;;;49699:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49780:11;;;;:5;:11;;;;;:18;;;:26;;:18;:26;49772:74;;;;-1:-1:-1;;;49772:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49865:11;;;;:5;:11;;;;;:20;;;;;;;:28;;:20;:28;49857:78;;;;-1:-1:-1;;;49857:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49954:11;;;;:5;:11;;;;;:21;;;;;;:30;49946:100;;;;-1:-1:-1;;;49946:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50103:12;:18;50116:4;50103:18;;;;;;;;;;;:31;;;50065:34;50089:8;50072:26;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;50072:26:0;;;50065:34;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;50065:34:0;;;;;;;-1:-1:-1;263:2;;-1:-1;;50065:34:0;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50065:34:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50065:34:0;:69;50057:119;;;;-1:-1:-1;;;50057:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50187:11;;;;:5;:11;;;;;;;;:28;;-1:-1:-1;;50187:28:0;;;;;50234:5;;50249;:11;;;;;;:20;-1:-1:-1;;;;;50234:5:0;;;;:14;;50249:20;50271:15;50193:4;50271:9;:15::i;:::-;50234:53;;;;;;;;;;;;;-1:-1:-1;;;;;50234:53:0;-1:-1:-1;;;;;50234:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;50234:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50234:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50234:53:0;50226:107;;;;-1:-1:-1;;;50226:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50346:18;;;;:12;:18;;;;;;;;:33;;:44;;;50413:3;;:17;;-1:-1:-1;;;50413:17:0;;;;-1:-1:-1;;;;;50413:3:0;;;;:15;;:17;;;;;;;;;;;:3;:17;;;5:2:-1;;;;30:1;27;20:12;5:2;50413:17:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50413:17:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50413:17:0;-1:-1:-1;;;;;50405:40:0;;50401:69;;50448:3;;:20;;;-1:-1:-1;;;50448:20:0;;;;;;;;;;-1:-1:-1;;;;;50448:3:0;;;;:14;;:20;;;;;:3;;:20;;;;;;;;:3;;:20;;;5:2:-1;;;;30:1;27;20:12;5:2;50448:20:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50448:20:0;;;;50401:69;50487:24;;;;;;;;;;;;;;;;;;;;;;;;;49629:890;;:::o;36346:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36346:58:0;;;;;-1:-1:-1;;;36346:58:0;;;;:::o;51471:912::-;51530:9;51534:4;51530:3;:9::i;:::-;51529:10;51521:60;;;;-1:-1:-1;;;51521:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51601:10;51606:4;51601;:10::i;:::-;51600:11;51592:77;;;;-1:-1:-1;;;51592:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51694:22;51711:4;51694:16;:22::i;:::-;51688:3;:28;51680:105;;;;-1:-1:-1;;;51680:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51804:11;;;;:5;:11;;;;;:16;-1:-1:-1;;;51804:16:0;;;;:24;;51824:4;51804:24;51796:74;;;;-1:-1:-1;;;51796:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51903:11;;;;:5;:11;;;;;:20;-1:-1:-1;;;;;51903:20:0;51889:10;:34;51881:99;;;;-1:-1:-1;;;51881:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51991:11;;;;:5;:11;;;;;;;;:22;;-1:-1:-1;;51991:22:0;-1:-1:-1;;;51991:22:0;;;52024:5;:11;;;;;;52054:3;52024:27;;;;:33;52072:5;;52085:9;:15;;;;;;;52072:29;;-1:-1:-1;;;52072:29:0;;;;;;;;-1:-1:-1;;;;;52072:5:0;;;;:12;;:29;;;;;51991:11;;52072:29;;;;;;:5;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;52072:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52072:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52072:29:0;52068:160;;52127:5;;;52153:11;;;:5;:11;;;;;;;;:21;;;52127:48;;-1:-1:-1;;;52127:48:0;;;;;;;-1:-1:-1;;;;;52127:5:0;;;;:25;;:48;;;;;;;;;;:5;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;52127:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;52190:5:0;;;:26;;;-1:-1:-1;;;52190:26:0;;;;-1:-1:-1;;;;;52190:5:0;;;;-1:-1:-1;52190:24:0;;-1:-1:-1;52190:26:0;;;;;:5;:26;;;;;;:5;;:26;;;5:2:-1;;;;30:1;27;20:12;5:2;52190:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52190:26:0;;;;52068:160;52246:5;;;52261:11;;;:5;:11;;;;;:20;-1:-1:-1;;;;;52246:5:0;;;;:14;;52261:20;52283:17;52267:4;52283:11;:17::i;:::-;52246:55;;;;;;;;;;;;;-1:-1:-1;;;;;52246:55:0;-1:-1:-1;;;;;52246:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52246:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52246:55:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52246:55:0;52238:107;;;;-1:-1:-1;;;52238:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52363:12;;;;;;;;;;;;;;;;;51471:912;:::o;36730:71::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40832:124::-;40893:7;40920:11;;;:5;:11;;;;;:28;;;;40832:124::o;41659:107::-;41714:4;41738:11;;;:5;:11;;;;;:20;;;;;;;41659:107::o;36186:60::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36186:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36186:60:0;;;;;;;;;;;-1:-1:-1;;36186:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36186:60:0;;-1:-1:-1;36186:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43604:152::-;43672:7;43699:49;43704:21;43720:4;43704:15;:21::i;:::-;35983:18;43699:4;:49::i;44542:384::-;44625:8;;-1:-1:-1;;;;;44625:8:0;44611:10;:22;44603:85;;;;-1:-1:-1;;;44603:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44715:5;;-1:-1:-1;;;;;44715:5:0;44707:28;44699:95;;;;-1:-1:-1;;;44699:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44813:29:0;;44805:88;;;;-1:-1:-1;;;44805:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44904:5;:14;;-1:-1:-1;;;;;;44904:14:0;-1:-1:-1;;;;;44904:14:0;;;;;;;;;;44542:384::o;36808:62::-;;;;:::o;42361:111::-;42404:7;42431:33;42435:1;42445:17;42449:2;42453:8;;42445:3;:17::i;:::-;42439:2;:23;42431:3;:33::i;35936:65::-;35983:18;35936:65;:::o;44940:409::-;45031:8;;-1:-1:-1;;;;;45031:8:0;45017:10;:22;45009:90;;;;-1:-1:-1;;;45009:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45126:3;;-1:-1:-1;;;;;45126:3:0;45118:26;45110:103;;;;-1:-1:-1;;;45110:103:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45232:27:0;;45224:96;;;;-1:-1:-1;;;45224:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45331:3;:10;;-1:-1:-1;;;;;;45331:10:0;-1:-1:-1;;;;;45331:10:0;;;;;;;;;;44940:409::o;40555:146::-;40656:3;;:37;;;-1:-1:-1;;;40656:37:0;;;;;;;;;;40629:7;;-1:-1:-1;;;;;40656:3:0;;:31;;:37;;;;;;;;;;;;;;:3;:37;;;5:2:-1;;;;30:1;27;20:12;35738:53:0;35785:6;35738:53;:::o;41253:138::-;41318:7;41346:37;41350:17;41362:4;41350:11;:17::i;:::-;41369:13;41377:4;41369:7;:13::i;39979:110::-;40061:3;;:20;;;-1:-1:-1;;;40061:20:0;;;;;;;;;;40034:7;;-1:-1:-1;;;;;40061:3:0;;:14;;:20;;;;;;;;;;;;;;:3;:20;;;5:2:-1;;;;30:1;27;20:12;41542:103:0;41595:4;41619:11;;;:5;:11;;;;;:18;;;;41542:103::o;38594:106::-;38647:7;38674:11;;;:5;:11;;;;;:18;;;-1:-1:-1;;;;;38674:18:0;;38594:106::o;49213:402::-;49270:11;;;;:5;:11;;;;;:18;;;:26;;:18;:26;49262:73;;;;-1:-1:-1;;;49262:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49351:11;;;;:5;:11;;;;;:18;;;-1:-1:-1;;;;;49351:18:0;49373:10;49351:32;49343:96;;;;-1:-1:-1;;;49343:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49465:23;49483:4;49465:17;:23::i;:::-;49458:3;:30;;49450:91;;;;-1:-1:-1;;;49450:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49549:11;;;;:5;:11;;;;;;;;;:27;;-1:-1:-1;;49549:27:0;;;;;49594:13;;;;;;;;;;;;;;;;;49213:402;:::o;36426:62::-;;;;;;;;;;;;;:::o;41405:123::-;41457:7;41484:36;41488:17;41500:4;41488:11;:17::i;:::-;41507:12;41514:4;41507:6;:12::i;42014:99::-;42065:4;42089:11;;;:5;:11;;;;;:16;-1:-1:-1;;;42089:16:0;;;;;42014:99::o;35672:55::-;35720:7;35672:55;:::o;48795:404::-;48851:18;;;;:12;:18;;;;;:22;;;;;48843:72;;;;-1:-1:-1;;;48843:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48934:11;;;;:5;:11;;;;;:18;;;:27;48926:74;;;;-1:-1:-1;;;48926:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49011:11;;;;:5;:11;;;;;:25;;-1:-1:-1;;49011:25:0;49032:4;49011:25;;;49055:5;;-1:-1:-1;;;;;49055:5:0;:18;49074:10;49094:4;49101:15;49017:4;49101:9;:15::i;:::-;49055:62;;;;;;;;;;;;;-1:-1:-1;;;;;49055:62:0;-1:-1:-1;;;;;49055:62:0;;;;;;-1:-1:-1;;;;;49055:62:0;-1:-1:-1;;;;;49055:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49055:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49055:62:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;49055:62:0;49047:112;;;;-1:-1:-1;;;49047:112:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49177:14;;;;;;;;;;;;;;;;;48795:404;:::o;36121:58::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36121:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52543:495::-;52602:9;52606:4;52602:3;:9::i;:::-;52601:10;52593:62;;;;-1:-1:-1;;;52593:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52674:11;;;;:5;:11;;;;;:21;;;;;;:30;52666:93;;;;-1:-1:-1;;;52666:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52785:23;52803:4;52785:17;:23::i;:::-;52778:3;:30;;52770:94;;;;-1:-1:-1;;;52770:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52883:11;;;;:5;:11;;;;;:16;;;;;;:25;52875:91;;;;-1:-1:-1;;;52875:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52977:11;52983:4;52977:5;:11::i;:::-;53006:24;;;;;;53027:1;53006:24;;;;;;;;;;;;;;;;;52543:495;:::o;39335:152::-;39397:7;39424:55;39428:27;39450:4;39428:21;:27::i;:::-;35918:6;39424:3;:55::i;42486:135::-;-1:-1:-1;;;;;42582:24:0;42555:7;42582:24;;;:13;:24;;;;;:31;;42486:135::o;36266:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43420:170::-;43483:7;43510:72;43515:42;43520:36;43524:17;43536:4;43524:11;:17::i;:::-;43543:12;43550:4;43543:6;:12::i;43515:42::-;43559:22;43576:4;43559:16;:22::i;:::-;43510:4;:72::i;36586:66::-;;;;;;;;;;;;;;;;;;39501:110;39555:7;39582:11;;;:5;:11;;;;;:21;;;;39501:110::o;39625:108::-;39678:7;39705:11;;;:5;:11;;;;;:20;;;;39625:108::o;43770:130::-;43819:4;43868:24;43887:4;43868:18;:24::i;:::-;43843:21;43859:4;43843:15;:21::i;:::-;:49;;;43770:130;-1:-1:-1;;43770:130:0:o;36506:63::-;;;;;;;;;;;;;:::o;52397:132::-;52463:20;52470:4;52476:6;52463;:20::i;:::-;52501;;;;;;;;;;;;;;;;;;;;;;;;;52397:132;;:::o;47304:1477::-;47685:18;;;;:12;:18;;;;;:22;;;;;47684:23;47676:96;;;;-1:-1:-1;;;47676:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47819:11;;;;:5;:11;;;;;:20;-1:-1:-1;;;;;47819:20:0;47805:10;:34;;:70;;-1:-1:-1;47857:11:0;;;;:5;:11;;;;;:18;;;-1:-1:-1;;;;;47857:18:0;47843:10;:32;47805:70;:102;;;-1:-1:-1;47901:5:0;;-1:-1:-1;;;;;47901:5:0;47879:10;:28;47805:102;47783:227;;;;-1:-1:-1;;;47783:227:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48076:1;48021:18;;;:12;48055:23;48021:18;;;;;;;48055:23;;48021:57;;48089:111;;;;;;;;48125:23;;;;48089:111;;48150:23;;;;48089:111;;;;48175:23;;;48089:111;;;;;;;:18;;;;;;;:111;;:31;;;48196:1;48089:111;:::i;:::-;-1:-1:-1;48264:1:0;48211:18;;;:12;48245:21;48211:18;;;;;;;48245:21;;48211:31;;;:55;48277:105;;;;;;;;48313:21;;;;48277:105;;48336:21;;;;48277:105;;;;48359:21;;;48277:105;;;;;;;:18;;;;;;;:105;;:31;;;48378:1;48277:105;:::i;:::-;-1:-1:-1;48447:1:0;48393:18;;;:12;48427:22;48393:18;;;;;;;48427:22;;48393:31;;;:56;48460:108;;;;;;;;48496:22;;;;48460:108;;48520:22;;;;48460:108;;;;48544:22;;;48460:108;;;;;;;:18;;;;;;;:108;;:31;;;48564:1;48460:108;:::i;:::-;-1:-1:-1;48579:13:0;;;;:7;:13;;;;;:46;;48610:15;;48579:46;:::i;:::-;-1:-1:-1;48636:13:0;;;;:7;:13;;;;;:42;;:26;;48665:13;;48636:42;:::i;:::-;-1:-1:-1;48689:13:0;;;;:7;:13;;;;;:44;;:27;;48719:14;;48689:44;:::i;:::-;-1:-1:-1;;;48744:18:0;;;;-1:-1:-1;;48744:12:0;:18;;-1:-1:-1;;48744:18:0;;;;:22;;:29;;-1:-1:-1;;48744:29:0;48769:4;48744:29;;;-1:-1:-1;;;47304:1477:0:o;40970:129::-;41027:7;41055:36;41059:15;41069:4;41059:9;:15::i;:::-;41076:14;41085:4;41076:8;:14::i;34196:111::-;34247:6;34108:7;34270:23;34274:9;34278:1;34281;34274:3;:9::i;:::-;34291:1;34108:7;34285;;34270:3;:23::i;:::-;:29;;;;;;;34196:111;-1:-1:-1;;;34196:111:0:o;36890:18::-;;;-1:-1:-1;;;;;36890:18:0;;:::o;42236:111::-;42279:7;42306:33;42310:1;42320:17;42324:2;42328:8;;42320:3;:17::i;:::-;42314:2;:23;42306:3;:33::i;33200:104::-;33284:5;;;33279:16;;;;33271:25;;;;;33310:104;33394:5;;;33389:16;;;;33381:25;;;;;34668:111;34721:6;34770:1;34744:23;34748:11;34752:1;34143:8;34748:3;:11::i;:::-;34765:1;34761;:5;;33544:113;33596:6;33627:1;33623;:5;33615:14;;;;;;33648:1;33644;:5;;;;54018:1248;54066:11;;;;:5;:11;;;;;;;;:22;;-1:-1:-1;;54066:22:0;-1:-1:-1;;;54066:22:0;;;54099:5;:11;;;;54129:3;54099:27;;;;:33;54157:11;:21;;;;54066:22;54157:21;54153:1106;;54235:1;54208:15;;;:9;:15;;;;;;54204:438;;54266:5;;;54281:11;;;:5;:11;;;;;;;;54266:5;54281:18;;;54301:21;;;;;54266:57;;-1:-1:-1;;;54266:57:0;;-1:-1:-1;;;;;54281:18:0;;;54266:57;;;;;;;;;;;;;:5;;;:14;;:57;;;;;;;;;;;;:5;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;54266:57:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54266:57:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54266:57:0;54258:121;;;;-1:-1:-1;;;54258:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54204:438;;;54424:5;;;54437:15;;;:9;:15;;;;;;;;;;54424:29;;-1:-1:-1;;;54424:29:0;;;;;;;;;;;-1:-1:-1;;;;;54424:5:0;;;;:12;;:29;;;;;54437:15;54424:29;;;;;:5;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;54424:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54424:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54424:29:0;54420:135;;54487:5;;;54513:11;;;:5;:11;;;;;;;;:21;;;54487:48;;-1:-1:-1;;;54487:48:0;;;;;;;-1:-1:-1;;;;;54487:5:0;;;;:25;;:48;;;;;;;;;;:5;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;54487:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54487:48:0;;;;54420:135;54573:5;;;54587:15;;;:9;:15;;;;;;;;;54604:5;:11;;;;;;;:21;;;54573:53;;-1:-1:-1;;;54573:53:0;;;;;;;;;;;;;;-1:-1:-1;;;;;54573:5:0;;;;:13;;:53;;;;;;;;;;:5;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;54573:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54573:53:0;;;;54204:438;54153:1106;;;54724:1;54697:15;;;:9;:15;;;;;;54693:435;;54755:5;;;54770:11;;;:5;:11;;;;;54755:5;54770:18;;-1:-1:-1;;;;;54755:5:0;;;;:14;;54770:18;54790;54776:4;54790:12;:18::i;:::-;54755:54;;;;;;;;;;;;;-1:-1:-1;;;;;54755:54:0;-1:-1:-1;;;;;54755:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;54755:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54755:54:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54755:54:0;54747:121;;;;-1:-1:-1;;;54747:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54693:435;;;54913:5;;;54926:15;;;:9;:15;;;;;;;;;;54913:29;;-1:-1:-1;;;54913:29:0;;;;;;;;;;;-1:-1:-1;;;;;54913:5:0;;;;:12;;:29;;;;;54926:15;54913:29;;;;;:5;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;54913:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54913:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;54913:29:0;54909:135;;54976:5;;;55002:11;;;:5;:11;;;;;;;;:21;;;54976:48;;-1:-1:-1;;;54976:48:0;;;;;;;-1:-1:-1;;;;;54976:5:0;;;;:25;;:48;;;;;;;;;;:5;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;54976:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;54976:48:0;;;;54909:135;55062:5;;;55076:15;;;:9;:15;;;;;;;-1:-1:-1;;;;;55062:5:0;;;;:13;;55093:18;55086:4;55093:12;:18::i;:::-;55062:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55062:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55062:50:0;;;;54693:435;55150:5;;;55165:11;;;:5;:11;;;;;:19;;;-1:-1:-1;;;;;55150:5:0;;;;:14;;55165:19;55186:9;55171:4;55186:3;:9::i;:::-;55150:46;;;;;;;;;;;;;-1:-1:-1;;;;;55150:46:0;-1:-1:-1;;;;;55150:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55150:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55150:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55150:46:0;55142:105;;;;-1:-1:-1;;;55142:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54018:1248;:::o;34313:113::-;34366:6;34143:8;34389:23;34393:9;34397:1;34400;34393:3;:9::i;:::-;34410:1;34143:8;34404:7;;34432:113;34485:6;34179:8;34508:23;34512:9;34516:1;34519;34512:3;:9::i;:::-;34529:1;34179:8;34523:7;;33420:118;33472:6;33499;;;:30;;-1:-1:-1;;33514:5:0;;;33528:1;33523;33514:5;33523:1;33509:15;;;;;:20;33499:30;33491:39;;;;;35533:22428;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35533:22428:0;;;-1:-1:-1;35533:22428:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35533:22428:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://d64b4fe7c6867306d5488b644e604016bfe67da764affe46661041bc3399f4a4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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