Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 456 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Accept | 12066743 | 1433 days ago | IN | 0 ETH | 0.05596625 | ||||
Repay | 12066522 | 1433 days ago | IN | 0 ETH | 0.01303192 | ||||
Accept | 11428135 | 1531 days ago | IN | 0 ETH | 0.00916474 | ||||
Repay | 11428123 | 1531 days ago | IN | 0 ETH | 0.00183141 | ||||
Repay | 11428111 | 1531 days ago | IN | 0 ETH | 0.0028546 | ||||
Accept | 11280570 | 1554 days ago | IN | 0 ETH | 0.02337125 | ||||
Repay | 11280554 | 1554 days ago | IN | 0 ETH | 0.00501228 | ||||
Accept | 11144145 | 1575 days ago | IN | 0 ETH | 0.00064699 | ||||
Accept | 11144145 | 1575 days ago | IN | 0 ETH | 0.01283077 | ||||
Repay | 11144137 | 1575 days ago | IN | 0 ETH | 0.00311875 | ||||
Accept | 11131643 | 1577 days ago | IN | 0 ETH | 0.01695495 | ||||
Repay | 11131624 | 1577 days ago | IN | 0 ETH | 0.00219672 | ||||
Repay | 11131524 | 1577 days ago | IN | 0 ETH | 0.00170886 | ||||
Accept | 11128407 | 1577 days ago | IN | 0 ETH | 0.00757206 | ||||
Repay | 11128392 | 1577 days ago | IN | 0 ETH | 0.00154214 | ||||
Repay | 11124933 | 1578 days ago | IN | 0 ETH | 0.00165227 | ||||
Accept | 11107226 | 1580 days ago | IN | 0 ETH | 0.0119146 | ||||
Repay | 11107218 | 1580 days ago | IN | 0 ETH | 0.00946866 | ||||
Accept | 11028327 | 1593 days ago | IN | 0 ETH | 0.028411 | ||||
Repay | 11028324 | 1593 days ago | IN | 0 ETH | 0.0069058 | ||||
Accept | 10874759 | 1616 days ago | IN | 0 ETH | 0.05359353 | ||||
Repay | 10874752 | 1616 days ago | IN | 0 ETH | 0.01325612 | ||||
Accept | 10868616 | 1617 days ago | IN | 0 ETH | 0.0481182 | ||||
Repay | 10868609 | 1617 days ago | IN | 0 ETH | 0.01158393 | ||||
Accept | 10835154 | 1623 days ago | IN | 0 ETH | 0.12397386 |
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
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.