More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 787 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 8875723 | 1970 days ago | IN | 0 ETH | 0.00013658 | ||||
Claim | 8875723 | 1970 days ago | IN | 0 ETH | 0.00013658 | ||||
Claim | 8875559 | 1970 days ago | IN | 0 ETH | 0.00035258 | ||||
Trade | 8874667 | 1970 days ago | IN | 0 ETH | 0.00054432 | ||||
Trade | 8874647 | 1970 days ago | IN | 0 ETH | 0.00032951 | ||||
Claim | 8873791 | 1970 days ago | IN | 0 ETH | 0.00013225 | ||||
Trade | 8872629 | 1971 days ago | IN | 0 ETH | 0.0001568 | ||||
Claim | 8869502 | 1971 days ago | IN | 0 ETH | 0.00013225 | ||||
Claim | 8869285 | 1971 days ago | IN | 0 ETH | 0.00015825 | ||||
Claim | 8868615 | 1971 days ago | IN | 0 ETH | 0.00013219 | ||||
Claim | 8868612 | 1971 days ago | IN | 0 ETH | 0.00013225 | ||||
Claim | 8868600 | 1971 days ago | IN | 0 ETH | 0.00013225 | ||||
Claim | 8868593 | 1971 days ago | IN | 0 ETH | 0.00004138 | ||||
Claim | 8868589 | 1971 days ago | IN | 0 ETH | 0.00004551 | ||||
Claim | 8868589 | 1971 days ago | IN | 0 ETH | 0.00014386 | ||||
Trade | 8868467 | 1971 days ago | IN | 0 ETH | 0.0002727 | ||||
Claim | 8868449 | 1971 days ago | IN | 0 ETH | 0.00016373 | ||||
Claim | 8868351 | 1971 days ago | IN | 0 ETH | 0.00030002 | ||||
Claim | 8868329 | 1971 days ago | IN | 0 ETH | 0.00008203 | ||||
Trade | 8868305 | 1971 days ago | IN | 0 ETH | 0.00027228 | ||||
Trade | 8868299 | 1971 days ago | IN | 0 ETH | 0.00020002 | ||||
Claim | 8868279 | 1971 days ago | IN | 0 ETH | 0.00015372 | ||||
Claim | 8868251 | 1971 days ago | IN | 0 ETH | 0.00021589 | ||||
Trade | 8868049 | 1971 days ago | IN | 0 ETH | 0.00015691 | ||||
Claim | 8867978 | 1971 days ago | IN | 0 ETH | 0.00013643 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Degens
Compiler Version
v0.5.11+commit.c082d0b4
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-09-23 */ // Degens Protocol (C) degens.com pragma solidity ^0.5.10; interface IERC20Token { function balanceOf(address tokenOwner) external view returns (uint balance); function allowance(address tokenOwner, address spender) external view returns (uint remaining); function transfer(address to, uint tokens) external returns (bool success); function transferFrom(address from, address to, uint tokens) external returns (bool success); } contract Degens { // Constants uint private constant MAX_SANE_AMOUNT = (2**128) - 1; uint private constant MIN_SANE_AMOUNT = 2; uint private constant MAX_PRICE = 1000000000; bytes32 private constant EIP712_DOMAIN = keccak256(abi.encode( keccak256("EIP712Domain(string name,string version,address verifyingContract)"), keccak256("Degens"), keccak256("1.0"), address(0x888888E88E027E5585fa504954dad6246271Aa81) // set at deployment )); // Events event LogTrade( address indexed takerAccount, address indexed makerAccount, uint indexed matchId, address token, uint orderFillHash, uint8 orderDirection, uint32 price, uint longAmount, int newLongPosition, uint shortAmount, int newShortPosition, int longBalanceDelta, int shortBalanceDelta ); event LogTradeError( address indexed takerAccount, address indexed makerAccount, uint indexed matchId, address token, uint orderFillHash, uint16 status ); event LogCancel( address indexed account, address token, uint amount, uint orderGroup ); event LogCancelAll( address indexed account, uint timestamp ); event LogFinalizeMatch( uint indexed matchId, uint32 finalPrice ); event LogClaim( address indexed account, uint indexed matchId, address indexed token, uint amount, uint graderFee ); // Storage struct Match { mapping(address => mapping(address => int)) positions; // account => token => position bool finalized; uint32 finalPrice; uint32 graderFee; address[] graders; } mapping(uint => Match) private matches; mapping(uint => uint) private filledAmounts; mapping(address => uint) private cancelTimestamps; // Order struct Order { address maker; address taker; address token; uint matchId; uint amount; uint32 price; uint8 direction; uint expiry; uint timestamp; uint orderGroup; uint fillHash; } bytes32 private constant EIP712_ORDER_SCHEMA_HASH = keccak256(abi.encodePacked( "Order(", "address maker,", "address taker,", "address token,", "uint256 matchId,", "uint256 amount,", "uint256 price,", "uint256 direction,", "uint256 expiry,", "uint256 timestamp,", "uint256 orderGroup", ")" )); function unpackShared(uint[4] memory packed, Order memory o) private view { o.maker = address(packed[0] >> (12*8)); o.taker = packed[0] & (0x01 << (11*8)) == 0 ? address(0) : msg.sender; o.amount = packed[1] >> (16*8); o.price = uint32(packed[1] >> uint32((12*8)) & 0xFFFFFFFF); o.direction = uint8((packed[0] >> (10*8)) & 0xFF); o.expiry = (packed[0] >> (5*8)) & 0xFFFFFFFFFF; o.timestamp = packed[0] & 0xFFFFFFFFFF; o.orderGroup = packed[1] & 0xFFFFFFFFFFFFFFFFFFFFFFFF; } function computeFillHash(Order memory o) private pure { o.fillHash = uint(keccak256(abi.encodePacked(o.maker, o.token, o.amount, o.orderGroup))); } function unpackOrder(uint matchId, address token, uint[4] memory packed) private view returns(Order memory o) { unpackShared(packed, o); o.token = token; o.matchId = matchId; computeFillHash(o); bytes32 signatureHash = keccak256(abi.encodePacked( "\x19\x01", EIP712_DOMAIN, keccak256(abi.encode( EIP712_ORDER_SCHEMA_HASH, o.maker, o.taker, o.token, o.matchId, o.amount, uint(o.price), uint(o.direction), o.expiry, o.timestamp, o.orderGroup )) )); if ((packed[0] & (0x02 << (11*8))) != 0) signatureHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", signatureHash)); require(ecrecoverPacked(signatureHash, packed[2], packed[3]) == o.maker, "DERR_INVALID_ORDER_SIGNATURE"); require(o.taker == address(0) || o.taker == msg.sender, "DERR_INVALID_TAKER"); // not reachable require(o.price > 0 && o.price < MAX_PRICE, "DERR_INVALID_PRICE"); require(o.direction < 2, "DERR_INVALID_DIRECTION"); } function unpackOrderForQuery(uint[4] memory packed) private view returns(Order memory o) { unpackShared(packed, o); o.matchId = packed[2]; o.token = address(packed[3]); o.taker = address(0); computeFillHash(o); } // Trade enum TradeStatus { INVALID, OK, TAKER_NO_BALANCE, TRADE_EXPIRED, MATCH_FINALIZED, TRADE_TOO_SMALL, ORDER_NO_BALANCE, ORDER_EXPIRED, ORDER_CANCELLED, AMOUNT_MALFORMED, SELF_TRADE } struct Trade { TradeStatus status; address longAddr; address shortAddr; int newLongPosition; int newShortPosition; int longBalanceDelta; int shortBalanceDelta; uint shortAmount; uint longAmount; uint takerAmount; uint makerAmount; } // External interface function() external payable { revert("DERR_UNKNOWN_METHOD"); } function trade(uint amount, uint expiry, uint matchId, address token, uint[4][] calldata packedOrders) external { if (expiry != 0 && block.timestamp >= expiry) { emit LogTradeError(msg.sender, address(0), matchId, token, 0, uint16(TradeStatus.TRADE_EXPIRED)); return; } require(packedOrders.length > 0, "DERR_EMPTY_PACKEDORDERS"); uint amountRemaining = amount; for (uint i = 0; i < packedOrders.length; i++) { Order memory o = unpackOrder(matchId, token, packedOrders[i]); Trade memory t = tradeCore(amountRemaining, o, false); if (t.status == TradeStatus.OK) { applyTradePositions(o, t); applyTrade(o, t); amountRemaining = safeSub(amountRemaining, t.takerAmount); } else { emit LogTradeError(msg.sender, o.maker, o.matchId, o.token, o.fillHash, uint16(t.status)); } if (amountRemaining < MIN_SANE_AMOUNT) break; } } function matchOrders(uint matchId, address token, uint[4] calldata packedLeftOrder, uint[4][] calldata packedRightOrders) external { require(packedRightOrders.length > 0, "DERR_EMPTY_PACKEDRIGHTORDERS"); Order memory leftOrder = unpackOrder(matchId, token, packedLeftOrder); for (uint i = 0; i < packedRightOrders.length; i++) { Order memory rightOrder = unpackOrder(matchId, token, packedRightOrders[i]); require(leftOrder.maker != rightOrder.maker, "DERR_SAME_MAKER"); require(rightOrder.direction != leftOrder.direction, "DERR_SAME_DIRECTION"); (uint leftMaxPosition, uint leftAmount) = computeMaxPosition(leftOrder); (uint rightMaxPosition, uint rightAmount) = computeMaxPosition(rightOrder); if (leftMaxPosition > rightMaxPosition) { leftAmount = uint(priceDivide(int(rightMaxPosition), leftOrder.direction == 1 ? (MAX_PRICE - leftOrder.price) : leftOrder.price)); } else { rightAmount = uint(priceDivide(int(leftMaxPosition), leftOrder.direction == 1 ? rightOrder.price : (MAX_PRICE - rightOrder.price))); } Trade memory rightTrade = tradeCore(rightAmount, rightOrder, true); if (rightTrade.status != TradeStatus.OK) { emit LogTradeError(msg.sender, rightOrder.maker, rightOrder.matchId, rightOrder.token, rightOrder.fillHash, uint16(rightTrade.status)); continue; } applyTradePositions(rightOrder, rightTrade); Trade memory leftTrade = tradeCore(leftAmount, leftOrder, true); require(leftTrade.status == TradeStatus.OK, "DERR_LEFT_TRADE_FAIL"); applyTradePositions(leftOrder, leftTrade); int takerBalanceDelta = 0; if (leftOrder.direction == 1) { takerBalanceDelta = leftTrade.shortBalanceDelta + rightTrade.longBalanceDelta; leftTrade.shortBalanceDelta = rightTrade.longBalanceDelta = 0; } else { takerBalanceDelta = leftTrade.longBalanceDelta + rightTrade.shortBalanceDelta; leftTrade.longBalanceDelta = rightTrade.shortBalanceDelta = 0; } if (takerBalanceDelta < 0) adjustBalance(leftOrder.token, msg.sender, takerBalanceDelta); if (leftTrade.shortBalanceDelta + leftTrade.longBalanceDelta < rightTrade.shortBalanceDelta + rightTrade.longBalanceDelta) { applyTrade(leftOrder, leftTrade); applyTrade(rightOrder, rightTrade); } else { applyTrade(rightOrder, rightTrade); applyTrade(leftOrder, leftTrade); } if (takerBalanceDelta > 0) adjustBalance(leftOrder.token, msg.sender, takerBalanceDelta); } } function cancel(address token, uint amount, uint orderGroup) external { require(orderGroup <= 0xFFFFFFFFFFFFFFFFFFFFFFFF, "DERR_BAD_ORDERGROUP"); uint fillHash = uint(keccak256(abi.encodePacked(msg.sender, token, amount, orderGroup))); filledAmounts[fillHash] = uint(-1); emit LogCancel(msg.sender, token, amount, orderGroup); } function cancelAll() external { cancelTimestamps[msg.sender] = block.timestamp; emit LogCancelAll(msg.sender, block.timestamp); } function claim(bytes32 witness, uint256 graderQuorum, uint256 graderFee, address[] calldata graders, uint32 finalPrice, uint256[2][] calldata sigs, uint256[] calldata targets) external { uint matchId = uint(keccak256(abi.encodePacked(witness, graderQuorum, graderFee, graders))); Match storage m = matches[matchId]; if (!m.finalized) { require(graderQuorum > 0, "DERR_ZERO_GRADER_QUORUM"); require(sigs.length == graders.length, "DERR_INVALID_NUM_SIGS"); require(graderFee <= MAX_PRICE, "DERR_INVALID_GRADERFEE"); bytes32 messageHash = keccak256(abi.encodePacked( "\x19Ethereum Signed Message:\n32", keccak256(abi.encodePacked(address(this), matchId, finalPrice)) )); uint validated = 0; for (uint i = 0; i < graders.length; i++) { if (sigs[i][0] != 0) { address signer = ecrecoverPacked(messageHash, sigs[i][0], sigs[i][1]); require(signer == graders[i], "DERR_BAD_GRADER_SIG"); m.graders.push(graders[i]); validated++; } } require(validated >= graderQuorum, "DERR_INSUFFICIENT_GRADERS"); bool waiveFees = (finalPrice & 0x80000000) != 0; uint32 maskedPrice = finalPrice & 0x7fffffff; m.finalized = true; m.finalPrice = maskedPrice; m.graderFee = waiveFees ? 0 : uint32(graderFee); require(m.finalPrice <= MAX_PRICE, "DERR_BAD_FINALPRICE"); emit LogFinalizeMatch(matchId, finalPrice); } processClaims(matchId, targets); } function claimFinalized(uint matchId, uint256[] calldata targets) external { Match storage m = matches[matchId]; require(m.finalized, "DERR_MATCH_NOT_FINALIZED"); processClaims(matchId, targets); } function recoverFunds(uint256 detailsHash, uint256 recoveryTime, uint256 cancelPrice, uint256 graderQuorum, uint256 graderFee, address[] calldata graders) external { bytes32 witness = keccak256(abi.encodePacked(detailsHash, recoveryTime, cancelPrice)); uint matchId = uint(keccak256(abi.encodePacked(witness, graderQuorum, graderFee, graders))); Match storage m = matches[matchId]; require(!m.finalized, "DERR_MATCH_IS_FINALIZED"); require(recoveryTime < block.timestamp, "DERR_TOO_SOON_TO_RECOVER"); require(cancelPrice <= MAX_PRICE, "DERR_INVALID_CANCELPRICE"); m.finalized = true; m.finalPrice = uint32(cancelPrice); m.graderFee = 0; emit LogFinalizeMatch(matchId, uint32(cancelPrice)); } // External read-only interface function getPosition(uint matchId, address account, address token) external view returns(int) { return matches[matchId].positions[account][token]; } function getFinalizedStatus(uint matchId) external view returns(bool, uint32, uint32, address[] memory graders) { Match storage m = matches[matchId]; return (m.finalized, m.finalPrice, m.graderFee, m.graders); } function getFilledAmount(bytes32 fillHash) external view returns(uint) { return filledAmounts[uint(fillHash)]; } function getCancelTimestamp(address account) external view returns(uint) { return cancelTimestamps[account]; } function testOrder(uint[4] calldata packed) external view returns(uint256, uint256) { Order memory o = unpackOrderForQuery(packed); return (getOrderAmount(o), filledAmounts[o.fillHash]); } // Utilities that modify storage function adjustBalance(address token, address addr, int delta) private { if (delta > 0) { require(IERC20Token(token).transfer(addr, uint(delta)), "DERR_TOKEN_TRANSFER_FAIL"); } else if (delta < 0) { require(IERC20Token(token).transferFrom(addr, address(this), uint(-1 * delta)), "DERR_TOKEN_TRANSFERFROM_FAIL"); } } function applyTrade(Order memory o, Trade memory t) private { assert(t.status == TradeStatus.OK); if (t.longBalanceDelta < t.shortBalanceDelta) { adjustBalance(o.token, t.longAddr, t.longBalanceDelta); adjustBalance(o.token, t.shortAddr, t.shortBalanceDelta); } else { adjustBalance(o.token, t.shortAddr, t.shortBalanceDelta); adjustBalance(o.token, t.longAddr, t.longBalanceDelta); } filledAmounts[o.fillHash] += (o.direction == 0 ? t.shortAmount : t.longAmount); emit LogTrade(msg.sender, o.maker, o.matchId, o.token, o.fillHash, o.direction, o.price, t.longAmount, t.newLongPosition, t.shortAmount, t.newShortPosition, t.longBalanceDelta, t.shortBalanceDelta); } function applyTradePositions(Order memory o, Trade memory t) private { assert(t.status == TradeStatus.OK); Match storage m = matches[o.matchId]; m.positions[t.longAddr][o.token] = t.newLongPosition; m.positions[t.shortAddr][o.token] = t.newShortPosition; } function processClaims(uint matchId, uint256[] memory targets) private { Match storage m = matches[matchId]; assert(m.finalized); assert(m.graderFee <= MAX_PRICE); for (uint i = 0; i < targets.length;) { address token = address(targets[i] & 0x00ffffffffffffffffffffffffffffffffffffffff); int totalFee = 0; for (i++; i < targets.length && (targets[i] & (1<<255)) == 0; i++) { address addr = address(targets[i]); int delta = 0; int targetPosition = m.positions[addr][token]; if (targetPosition > 0) { delta = priceDivide(targetPosition, m.finalPrice); } else if (targetPosition < 0) { delta = priceDivide(-targetPosition, MAX_PRICE - m.finalPrice); } else { continue; } assert(delta >= 0); int fee = priceDivide(delta, m.graderFee); assert(fee >= 0); delta -= fee; totalFee += fee; assert(delta >= 0); m.positions[addr][token] = 0; adjustBalance(token, addr, delta); emit LogClaim(addr, matchId, token, uint(delta), uint(fee)); } if (m.graderFee == 0 || totalFee == 0) continue; int feePerGrader = totalFee / int(m.graders.length); for (uint j = 0; j < m.graders.length - 1; j++) { totalFee -= feePerGrader; adjustBalance(token, m.graders[j], feePerGrader); } adjustBalance(token, m.graders[m.graders.length - 1], totalFee); } } // Utilities that read from storage function lookupBalance(address token, address addr) private view returns(uint) { uint balance = minu256(IERC20Token(token).balanceOf(addr), IERC20Token(token).allowance(addr, address(this))); require(balance <= MAX_SANE_AMOUNT, "DERR_BALANCE_INSANE"); return balance; } function tradeCore(uint amount, Order memory o, bool takerUnlimitedBalance) private view returns(Trade memory t) { t.status = TradeStatus.INVALID; if (block.timestamp >= o.expiry) { t.status = TradeStatus.ORDER_EXPIRED; return t; } uint orderFilledAmount = filledAmounts[o.fillHash]; if (cancelTimestamps[o.maker] >= o.timestamp || orderFilledAmount == uint(-1)) { t.status = TradeStatus.ORDER_CANCELLED; return t; } if (msg.sender == o.maker) { t.status = TradeStatus.SELF_TRADE; return t; } if (amount > MAX_SANE_AMOUNT) { t.status = TradeStatus.AMOUNT_MALFORMED; return t; } Match storage m = matches[o.matchId]; if (m.finalized) { t.status = TradeStatus.MATCH_FINALIZED; return t; } uint longAmount; uint shortAmount; uint longBalance; uint shortBalance; if (o.direction == 0) { // maker short, taker long t.longAddr = msg.sender; longAmount = amount; t.shortAddr = o.maker; shortAmount = safeSub(o.amount, orderFilledAmount); longBalance = takerUnlimitedBalance ? MAX_SANE_AMOUNT : lookupBalance(o.token, t.longAddr); shortBalance = lookupBalance(o.token, t.shortAddr); } else { // maker long, taker short t.longAddr = o.maker; longAmount = safeSub(o.amount, orderFilledAmount); t.shortAddr = msg.sender; shortAmount = amount; longBalance = lookupBalance(o.token, t.longAddr); shortBalance = takerUnlimitedBalance ? MAX_SANE_AMOUNT : lookupBalance(o.token, t.shortAddr); } int oldLongPosition = m.positions[t.longAddr][o.token]; int oldShortPosition = m.positions[t.shortAddr][o.token]; longAmount = minu256(longAmount, computeEffectiveBalance(longBalance, oldLongPosition, o.price, true)); shortAmount = minu256(shortAmount, computeEffectiveBalance(shortBalance, oldShortPosition, o.price, false)); if (longAmount < MIN_SANE_AMOUNT) { t.status = o.direction == 0 ? TradeStatus.TAKER_NO_BALANCE : TradeStatus.ORDER_NO_BALANCE; return t; } if (shortAmount < MIN_SANE_AMOUNT) { t.status = o.direction == 0 ? TradeStatus.ORDER_NO_BALANCE : TradeStatus.TAKER_NO_BALANCE; return t; } (longAmount, shortAmount) = computePriceWeightedAmounts(longAmount, shortAmount, o.price); if (longAmount < MIN_SANE_AMOUNT || shortAmount < MIN_SANE_AMOUNT) { t.status = TradeStatus.TRADE_TOO_SMALL; return t; } int newLongPosition = oldLongPosition + (int(longAmount) + int(shortAmount)); int newShortPosition = oldShortPosition - (int(longAmount) + int(shortAmount)); t.longBalanceDelta = 0; t.shortBalanceDelta = 0; if (oldLongPosition < 0) t.longBalanceDelta += priceDivide(-oldLongPosition + min256(0, newLongPosition), MAX_PRICE - o.price); if (newLongPosition > 0) t.longBalanceDelta -= priceDivide(newLongPosition - max256(0, oldLongPosition), o.price); if (oldShortPosition > 0) t.shortBalanceDelta += priceDivide(oldShortPosition - max256(0, newShortPosition), o.price); if (newShortPosition < 0) t.shortBalanceDelta -= priceDivide(-newShortPosition + min256(0, oldShortPosition), MAX_PRICE - o.price); int exposureDelta = computeExposureDelta(t.longBalanceDelta, t.shortBalanceDelta, oldLongPosition, newLongPosition, oldShortPosition, newShortPosition); if (exposureDelta != 0) { if (exposureDelta == 1) { newLongPosition--; newShortPosition++; } else if (exposureDelta == -1) { t.longBalanceDelta++; // one left-over wei: arbitrarily give it to long } else { assert(false); } exposureDelta = computeExposureDelta(t.longBalanceDelta, t.shortBalanceDelta, oldLongPosition, newLongPosition, oldShortPosition, newShortPosition); assert(exposureDelta == 0); } t.status = TradeStatus.OK; t.newLongPosition = newLongPosition; t.newShortPosition = newShortPosition; t.shortAmount = shortAmount; t.longAmount = longAmount; if (o.direction == 0) { t.takerAmount = t.longAmount; t.makerAmount = t.shortAmount; } else { t.takerAmount = t.shortAmount; t.makerAmount = t.longAmount; } return t; } function getOrderAmount(Order memory o) private view returns(uint) { if (block.timestamp >= o.expiry || cancelTimestamps[o.maker] >= o.timestamp) return 0; uint filled = filledAmounts[o.fillHash]; if (filled == uint(-1)) return 0; Match storage m = matches[o.matchId]; uint amount = safeSub(o.amount, filled); int position = m.positions[o.maker][o.token]; return minu256(amount, computeEffectiveBalance(lookupBalance(o.token, o.maker), position, o.price, o.direction == 1)); } function computeMaxPosition(Order memory o) private view returns(uint, uint) { if (o.direction == 1) { (uint longAmount, uint shortAmount) = computePriceWeightedAmounts(getOrderAmount(o), MAX_SANE_AMOUNT, o.price); return (longAmount + shortAmount, shortAmount); } else { (uint longAmount, uint shortAmount) = computePriceWeightedAmounts(MAX_SANE_AMOUNT, getOrderAmount(o), o.price); return (longAmount + shortAmount, longAmount); } } // Pure utilities function ecrecoverPacked(bytes32 hash, uint r, uint sv) private pure returns (address) { return ecrecover(hash, uint8(27 + (sv >> 255)), bytes32(r), bytes32(sv & ((1<<255) - 1))); } function priceDivide(int amount, uint price) private pure returns(int) { assert(amount >= 0); return int(safeMul(uint(amount), price) / MAX_PRICE); } function computeEffectiveBalance(uint balance, int position, uint price, bool isLong) private pure returns(uint) { uint effectiveBalance = balance; if (isLong) { if (position < 0) effectiveBalance += uint(priceDivide(-position, price)); } else { if (position > 0) effectiveBalance += uint(priceDivide(position, MAX_PRICE - price)); } return effectiveBalance; } function computePriceWeightedAmounts(uint longAmount, uint shortAmount, uint price) private pure returns(uint, uint) { uint totalLongAmount = longAmount + (safeMul(longAmount, MAX_PRICE - price) / price); uint totalShortAmount = shortAmount + (safeMul(shortAmount, price) / (MAX_PRICE - price)); if (totalLongAmount > totalShortAmount) { return (totalShortAmount - shortAmount, shortAmount); } else { return (longAmount, totalLongAmount - longAmount); } } function computeExposureDelta(int longBalanceDelta, int shortBalanceDelta, int oldLongPosition, int newLongPosition, int oldShortPosition, int newShortPosition) private pure returns(int) { int positionDelta = 0; if (newLongPosition > 0) positionDelta += newLongPosition - max256(0, oldLongPosition); if (oldShortPosition > 0) positionDelta -= oldShortPosition - max256(0, newShortPosition); return positionDelta + longBalanceDelta + shortBalanceDelta; } function safeMul(uint a, uint b) private pure returns(uint) { uint c = a * b; assert(a == 0 || c / a == b); return c; } function safeSub(uint a, uint b) private pure returns(uint) { assert(b <= a); return a - b; } function minu256(uint a, uint b) private pure returns(uint) { return a < b ? a : b; } function max256(int a, int b) private pure returns(int) { return a >= b ? a : b; } function min256(int a, int b) private pure returns(int) { return a < b ? a : b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"constant":true,"inputs":[{"internalType":"uint256","name":"matchId","type":"uint256"}],"name":"getFinalizedStatus","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"address[]","name":"graders","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"matchId","type":"uint256"},{"internalType":"uint256[]","name":"targets","type":"uint256[]"}],"name":"claimFinalized","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getCancelTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"cancelAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256[4]","name":"packed","type":"uint256[4]"}],"name":"testOrder","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"matchId","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getPosition","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"matchId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[4]","name":"packedLeftOrder","type":"uint256[4]"},{"internalType":"uint256[4][]","name":"packedRightOrders","type":"uint256[4][]"}],"name":"matchOrders","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"witness","type":"bytes32"},{"internalType":"uint256","name":"graderQuorum","type":"uint256"},{"internalType":"uint256","name":"graderFee","type":"uint256"},{"internalType":"address[]","name":"graders","type":"address[]"},{"internalType":"uint32","name":"finalPrice","type":"uint32"},{"internalType":"uint256[2][]","name":"sigs","type":"uint256[2][]"},{"internalType":"uint256[]","name":"targets","type":"uint256[]"}],"name":"claim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"orderGroup","type":"uint256"}],"name":"cancel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"detailsHash","type":"uint256"},{"internalType":"uint256","name":"recoveryTime","type":"uint256"},{"internalType":"uint256","name":"cancelPrice","type":"uint256"},{"internalType":"uint256","name":"graderQuorum","type":"uint256"},{"internalType":"uint256","name":"graderFee","type":"uint256"},{"internalType":"address[]","name":"graders","type":"address[]"}],"name":"recoverFunds","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"fillHash","type":"bytes32"}],"name":"getFilledAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiry","type":"uint256"},{"internalType":"uint256","name":"matchId","type":"uint256"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256[4][]","name":"packedOrders","type":"uint256[4][]"}],"name":"trade","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"takerAccount","type":"address"},{"indexed":true,"internalType":"address","name":"makerAccount","type":"address"},{"indexed":true,"internalType":"uint256","name":"matchId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderFillHash","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"orderDirection","type":"uint8"},{"indexed":false,"internalType":"uint32","name":"price","type":"uint32"},{"indexed":false,"internalType":"uint256","name":"longAmount","type":"uint256"},{"indexed":false,"internalType":"int256","name":"newLongPosition","type":"int256"},{"indexed":false,"internalType":"uint256","name":"shortAmount","type":"uint256"},{"indexed":false,"internalType":"int256","name":"newShortPosition","type":"int256"},{"indexed":false,"internalType":"int256","name":"longBalanceDelta","type":"int256"},{"indexed":false,"internalType":"int256","name":"shortBalanceDelta","type":"int256"}],"name":"LogTrade","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"takerAccount","type":"address"},{"indexed":true,"internalType":"address","name":"makerAccount","type":"address"},{"indexed":true,"internalType":"uint256","name":"matchId","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"orderFillHash","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"status","type":"uint16"}],"name":"LogTradeError","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"orderGroup","type":"uint256"}],"name":"LogCancel","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"LogCancelAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"matchId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"finalPrice","type":"uint32"}],"name":"LogFinalizeMatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"uint256","name":"matchId","type":"uint256"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"graderFee","type":"uint256"}],"name":"LogClaim","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50612faf806100206000396000f3fe6080604052600436106100a75760003560e01c806344ae7b671161006457806344ae7b67146102fa578063a49a408814610390578063a981848f146104c8578063c3908f9714610507578063cc527775146105a1578063e156d58e146105cb576100a7565b806301ba4a36146100ea57806313e3dcf21461019957806316b7218f1461021d57806318cb2b18146102625780632f1ae7ab146102775780633c186ff3146102b9575b6040805162461bcd60e51b81526020600482015260136024820152721111549497d55392d393d5d397d351551213d1606a1b604482015290519081900360640190fd5b3480156100f657600080fd5b506101146004803603602081101561010d57600080fd5b5035610667565b60405180851515151581526020018463ffffffff1663ffffffff1681526020018363ffffffff1663ffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561018257818101518382015260200161016a565b505050509050019550505050505060405180910390f35b3480156101a557600080fd5b5061021b600480360360408110156101bc57600080fd5b81359190810190604081016020820135600160201b8111156101dd57600080fd5b8201836020820111156101ef57600080fd5b803590602001918460208302840111600160201b8311171561021057600080fd5b509092509050610709565b005b34801561022957600080fd5b506102506004803603602081101561024057600080fd5b50356001600160a01b03166107b3565b60408051918252519081900360200190f35b34801561026e57600080fd5b5061021b6107d2565b34801561028357600080fd5b506102a06004803603608081101561029a57600080fd5b5061081d565b6040805192835260208301919091528051918290030190f35b3480156102c557600080fd5b50610250600480360360608110156102dc57600080fd5b508035906001600160a01b0360208201358116916040013516610882565b34801561030657600080fd5b5061021b600480360360e081101561031d57600080fd5b8135916001600160a01b036020820135169160408201919081019060e0810160c0820135600160201b81111561035257600080fd5b82018360208201111561036457600080fd5b803590602001918460808302840111600160201b8311171561038557600080fd5b5090925090506108b7565b34801561039c57600080fd5b5061021b600480360360e08110156103b357600080fd5b81359160208101359160408201359190810190608081016060820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460208302840111600160201b8311171561041357600080fd5b9193909263ffffffff83351692604081019060200135600160201b81111561043a57600080fd5b82018360208201111561044c57600080fd5b803590602001918460408302840111600160201b8311171561046d57600080fd5b919390929091602081019035600160201b81111561048a57600080fd5b82018360208201111561049c57600080fd5b803590602001918460208302840111600160201b831117156104bd57600080fd5b509092509050610d0d565b3480156104d457600080fd5b5061021b600480360360608110156104eb57600080fd5b506001600160a01b0381351690602081013590604001356111e9565b34801561051357600080fd5b5061021b600480360360c081101561052a57600080fd5b8135916020810135916040820135916060810135916080820135919081019060c0810160a0820135600160201b81111561056357600080fd5b82018360208201111561057557600080fd5b803590602001918460208302840111600160201b8311171561059657600080fd5b5090925090506112f9565b3480156105ad57600080fd5b50610250600480360360208110156105c457600080fd5b5035611512565b3480156105d757600080fd5b5061021b600480360360a08110156105ee57600080fd5b8135916020810135916040820135916001600160a01b036060820135169181019060a081016080820135600160201b81111561062957600080fd5b82018360208201111561063b57600080fd5b803590602001918460808302840111600160201b8311171561065c57600080fd5b509092509050611524565b6000818152602081815260408083206001810154600282018054845181870281018701909552808552869586956060959460ff81169463ffffffff6101008304811695600160281b909304169390929183918301828280156106f257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106d4575b505050505090509450945094509450509193509193565b6000838152602081905260409020600181015460ff16610770576040805162461bcd60e51b815260206004820152601860248201527f444552525f4d415443485f4e4f545f46494e414c495a45440000000000000000604482015290519081900360640190fd5b6107ad8484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061170592505050565b50505050565b6001600160a01b0381166000908152600260205260409020545b919050565b336000818152600260209081526040918290204290819055825190815291517ff741d0ba71da7949fae818df4044531f78c6303a239319d2f9e2ede16cbe2d199281900390910190a2565b600080610828612e4d565b60408051608081810190925261085691869060049083908390808284376000920191909152506119d7915050565b905061086181611a18565b6101409091015160009081526001602052604090205490925090505b915091565b6000838152602081815260408083206001600160a01b03808716855290835281842090851684529091529020545b9392505050565b80610909576040805162461bcd60e51b815260206004820152601c60248201527f444552525f454d5054595f5041434b454452494748544f524445525300000000604482015290519081900360640190fd5b610911612e4d565b6109458686866004806020026040519081016040528092919082600460200280828437600092019190915250611b19915050565b905060005b82811015610d045761095a612e4d565b61099f888887878681811061096b57fe5b9050608002016004806020026040519081016040528092919082600460200280828437600092019190915250611b19915050565b805184519192506001600160a01b03918216911614156109f8576040805162461bcd60e51b815260206004820152600f60248201526e2222a9292fa9a0a6a2afa6a0a5a2a960891b604482015290519081900360640190fd5b8260c0015160ff168160c0015160ff161415610a51576040805162461bcd60e51b81526020600482015260136024820152722222a9292fa9a0a6a2afa224a922a1aa24a7a760691b604482015290519081900360640190fd5b600080610a5d85612087565b91509150600080610a6d85612087565b9150915081841115610aba57610ab3828860c0015160ff16600114610a9c578860a0015163ffffffff16610aae565b8860a0015163ffffffff16633b9aca00035b612105565b9250610af6565b610af3848860c0015160ff16600114610ae3578660a0015163ffffffff16633b9aca0003610aae565b8660a0015163ffffffff16612105565b90505b610afe612ecb565b610b0a8287600161212f565b905060018151600a811115610b1b57fe5b14610baf57856060015186600001516001600160a01b0316336001600160a01b03167fc18d9b605d704a457c4e1843595120a6722eb9b31b859ec775262189d62f04b789604001518a61014001518660000151600a811115610b7957fe5b604080516001600160a01b039094168452602084019290925261ffff1682820152519081900360600190a4505050505050610cfc565b610bb98682612612565b610bc1612ecb565b610bcd858a600161212f565b905060018151600a811115610bde57fe5b14610c27576040805162461bcd60e51b81526020600482015260146024820152731111549497d311519517d51490511157d190525360621b604482015290519081900360640190fd5b610c318982612612565b60008090508960c0015160ff1660011415610c62575060a08201805160c08301805160009384905292905201610c7a565b5060c08201805160a083018051600093849052929052015b6000811215610c9257610c928a60400151338361268f565b8260a001518360c00151018260a001518360c00151011215610cc757610cb88a83612862565b610cc28884612862565b610cdb565b610cd18884612862565b610cdb8a83612862565b6000811315610cf357610cf38a60400151338361268f565b50505050505050505b60010161094a565b50505050505050565b60008a8a8a8a8a604051602001808681526020018581526020018481526020018383602002808284376040805191909301818103601f1901825283528051602091820120600081815291829052929020600181015492995097505060ff16945061119e93505050505760008b11610dcb576040805162461bcd60e51b815260206004820152601760248201527f444552525f5a45524f5f4752414445525f51554f52554d000000000000000000604482015290519081900360640190fd5b848814610e17576040805162461bcd60e51b8152602060048201526015602482015274444552525f494e56414c49445f4e554d5f5349475360581b604482015290519081900360640190fd5b633b9aca008a1115610e69576040805162461bcd60e51b8152602060048201526016602482015275444552525f494e56414c49445f47524144455246454560501b604482015290519081900360640190fd5b604080513060601b602080830191909152603482018590526001600160e01b031960e08b901b166054830152825160388184030181526058830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060788401526094808401919091528351808403909101815260b490920190925280519101206000805b8a81101561104a57888882818110610f0957fe5b905060400201600060028110610f1b57fe5b602002013515611042576000610f76848b8b85818110610f3757fe5b905060400201600060028110610f4957fe5b60200201358c8c86818110610f5a57fe5b905060400201600160028110610f6c57fe5b6020020135612a1a565b90508c8c83818110610f8457fe5b905060200201356001600160a01b03166001600160a01b0316816001600160a01b031614610fef576040805162461bcd60e51b8152602060048201526013602482015272444552525f4241445f4752414445525f53494760681b604482015290519081900360640190fd5b846002018d8d84818110610fff57fe5b835460018082018655600095865260209586902090910180549290950293909301356001600160a01b03166001600160a01b031990911617909255939093019250505b600101610ef5565b508c8110156110a0576040805162461bcd60e51b815260206004820152601960248201527f444552525f494e53554646494349454e545f4752414445525300000000000000604482015290519081900360640190fd5b6001838101805460ff191690911764ffffffff001916637fffffff8b1661010081029190911790915563800000008a16151590816110de578d6110e1565b60005b60018601805468ffffffff00000000001916600160281b63ffffffff938416021790819055633b9aca00610100909104909116111561115d576040805162461bcd60e51b8152602060048201526013602482015272444552525f4241445f46494e414c505249434560681b604482015290519081900360640190fd5b6040805163ffffffff8d168152905187917f5b7dd90e5b4429f4065b72413fa0e6b3e94d240f37f15738c63219cf4d1d29a3919081900360200190a2505050505b6111db8285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061170592505050565b505050505050505050505050565b6bffffffffffffffffffffffff811115611240576040805162461bcd60e51b81526020600482015260136024820152720444552525f4241445f4f5244455247524f555606c1b604482015290519081900360640190fd5b6040805133606081811b6020808501919091526bffffffffffffffffffffffff199188901b9190911660348401526048830186905260688084018690528451808503909101815260888401808652815191830191909120600081815260019093529185902060001990556001600160a01b038816905260a8830186905260c88301859052925190917f1430a8409c73700eb66d67441f57646f38f97871d4ef568e9891000cfbc542da919081900360e80190a250505050565b600087878760405160200180848152602001838152602001828152602001935050505060405160208183030381529060405280519060200120905060008186868686604051602001808681526020018581526020018481526020018383602002808284376040805191909301818103601f1901825283528051602091820120600081815291829052929020600181015492995097505060ff161594506113eb9350505050576040805162461bcd60e51b815260206004820152601760248201527f444552525f4d415443485f49535f46494e414c495a4544000000000000000000604482015290519081900360640190fd5b42891061143f576040805162461bcd60e51b815260206004820152601860248201527f444552525f544f4f5f534f4f4e5f544f5f5245434f5645520000000000000000604482015290519081900360640190fd5b633b9aca00881115611498576040805162461bcd60e51b815260206004820152601860248201527f444552525f494e56414c49445f43414e43454c50524943450000000000000000604482015290519081900360640190fd5b6001818101805460ff191690911764ffffffff00191661010063ffffffff8b169081029190911768ffffffff00000000001916909155604080519182525183917f5b7dd90e5b4429f4065b72413fa0e6b3e94d240f37f15738c63219cf4d1d29a3916020918190039190910190a250505050505050505050565b60009081526001602052604090205490565b84158015906115335750844210155b1561158d57604080516001600160a01b0385168152600060208201819052600382840152915186929133917fc18d9b605d704a457c4e1843595120a6722eb9b31b859ec775262189d62f04b79181900360600190a46116fd565b806115df576040805162461bcd60e51b815260206004820152601760248201527f444552525f454d5054595f5041434b45444f5244455253000000000000000000604482015290519081900360640190fd5b8560005b828110156116fa576115f3612e4d565b611604878787878681811061096b57fe5b905061160e612ecb565b61161a8483600061212f565b905060018151600a81111561162b57fe5b141561165b5761163b8282612612565b6116458282612862565b61165484826101200151612a92565b93506116e0565b816060015182600001516001600160a01b0316336001600160a01b03167fc18d9b605d704a457c4e1843595120a6722eb9b31b859ec775262189d62f04b785604001518661014001518660000151600a8111156116b457fe5b604080516001600160a01b039094168452602084019290925261ffff1682820152519081900360600190a45b60028410156116f05750506116fa565b50506001016115e3565b50505b505050505050565b6000828152602081905260409020600181015460ff1661172157fe5b6001810154633b9aca00600160281b90910463ffffffff16111561174157fe5b60005b82518110156107ad57600083828151811061175b57fe5b60209081029190910101516001909201916001600160a01b0316905060005b8451831080156117a3575084838151811061179157fe5b6020026020010151600160ff1b166000145b1561192a5760008584815181106117b657fe5b6020908102919091018101516001600160a01b03808216600090815288845260408082209288168252919093528220549092508181131561181357600187015461180c908290610100900463ffffffff16612105565b9150611849565b600081121561184157600187015461180c90600083900390610100900463ffffffff16633b9aca0003612105565b50505061191f565b600082121561185457fe5b6001870154600090611874908490600160281b900463ffffffff16612105565b9050600081121561188157fe5b938401939182900391600083121561189557fe5b6001600160a01b03808516600090815260208a81526040808320938a168352929052908120556118c686858561268f565b856001600160a01b03168a856001600160a01b03167f34b19d4ab39b572df0255e6c74331cd56f42aff855508021d664cd2be29b3ff88685604051808381526020018281526020019250505060405180910390a4505050505b60019092019161177a565b6001840154600160281b900463ffffffff161580611946575080155b156119525750506119d2565b6002840154600090828161196257fe5b05905060005b6002860154600019018110156119b35781830392506119ab8487600201838154811061199057fe5b6000918252602090912001546001600160a01b03168461268f565b600101611968565b506002850180546119ce918591600019810190811061199057fe5b5050505b611744565b6119df612e4d565b6119e98282612aa4565b6040808301516060838101919091528301516001600160a01b031690820152600060208201526107cd81612b34565b60008160e0015142101580611a4b575061010082015182516001600160a01b031660009081526002602052604090205410155b15611a58575060006107cd565b610140820151600090815260016020526040902054600019811415611a815760009150506107cd565b606083015160009081526020819052604081206080850151909190611aa69084612a92565b85516001600160a01b03908116600090815260208581526040808320818b0180519095168452909152902054905187519293509091611b0f918491611b0a91611aee91612ba4565b848a60a0015163ffffffff168b60c0015160ff16600114612d01565b612d4b565b9695505050505050565b611b21612e4d565b611b2b8282612aa4565b6001600160a01b038316604082015260608101849052611b4a81612b34565b60006040518080612f396042913960420190506040518091039020604051808065446567656e7360d01b815250600601905060405180910390206040518080620312e360ec1b8152506003019050604051809103902073888888e88e027e5585fa504954dad6246271aa8160405160200180858152602001848152602001838152602001826001600160a01b03166001600160a01b031681526020019450505050506040516020818303038152906040528051906020012060405160200180806509ee4c8cae4560d31b815250600601806d1859191c995cdcc81b585ad95c8b60921b815250600e01806d1859191c995cdcc81d185ad95c8b60921b815250600e01806d1859191c995cdcc81d1bdad95b8b60921b815250600e01806f1d5a5b9d0c8d4d881b585d18da12590b60821b815250601001806e1d5a5b9d0c8d4d88185b5bdd5b9d0b608a1b815250600f01806d1d5a5b9d0c8d4d881c1c9a58d94b60921b815250600e0180711d5a5b9d0c8d4d88191a5c9958dd1a5bdb8b60721b815250601201806e1d5a5b9d0c8d4d88195e1c1a5c9e4b608a1b815250600f0180711d5a5b9d0c8d4d881d1a5b595cdd185b5c0b60721b8152506012018071075696e74323536206f7264657247726f75760741b81525060120180602960f81b815250600101905060405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a0015163ffffffff168960c0015160ff168a60e001518b61010001518c6101200151604051602001808c81526020018b6001600160a01b03166001600160a01b031681526020018a6001600160a01b03166001600160a01b03168152602001896001600160a01b03166001600160a01b031681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405160208183030381529060405280519060200120604051602001808061190160f01b8152506002018381526020018281526020019250505060405160208183030381529060405280519060200120905082600060048110611e7057fe5b6020020151600160591b1615611ed2578060405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012090505b81516001600160a01b0316611ef68285600260200201518660036020020151612a1a565b6001600160a01b031614611f51576040805162461bcd60e51b815260206004820152601c60248201527f444552525f494e56414c49445f4f524445525f5349474e415455524500000000604482015290519081900360640190fd5b60208201516001600160a01b03161580611f77575060208201516001600160a01b031633145b611fbd576040805162461bcd60e51b81526020600482015260126024820152712222a9292fa4a72b20a624a22faa20a5a2a960711b604482015290519081900360640190fd5b60008260a0015163ffffffff16118015611fe45750633b9aca008260a0015163ffffffff16105b61202a576040805162461bcd60e51b8152602060048201526012602482015271444552525f494e56414c49445f505249434560701b604482015290519081900360640190fd5b60028260c0015160ff161061207f576040805162461bcd60e51b81526020600482015260166024820152752222a9292fa4a72b20a624a22fa224a922a1aa24a7a760511b604482015290519081900360640190fd5b509392505050565b6000808260c0015160ff16600114156120d0576000806120c16120a986611a18565b6001600160801b038760a0015163ffffffff16612d61565b9081019450925061087d915050565b6000806120f76001600160801b036120e787611a18565b8760a0015163ffffffff16612d61565b81019450925061087d915050565b60008083121561211157fe5b633b9aca006121208484612dcb565b8161212757fe5b049392505050565b612137612ecb565b6000815260e0830151421061214f57600781526108b0565b61014083015160009081526001602090815260408083205461010087015187516001600160a01b031685526002909352922054101580612190575060001981145b156121b0578160085b9081600a8111156121a657fe5b9052506108b09050565b83516001600160a01b03163314156121ca5781600a612199565b6001600160801b038511156121e157816009612199565b60608401516000908152602081905260409020600181015460ff161561220c575050600481526108b0565b6000806000808860c0015160ff166000141561228c5733602088015288516001600160a01b0316604088015260808901518a945061224a9087612a92565b9250876122685761226389604001518860200151612ba4565b612271565b6001600160801b035b915061228589604001518860400151612ba4565b90506122f6565b88516001600160a01b0316602088015260808901516122ab9087612a92565b336040808a01919091528a015160208901519195508b94506122cc91612ba4565b9150876122ea576122e589604001518860400151612ba4565b6122f3565b6001600160801b035b90505b6020808801516001600160a01b03908116600090815287835260408082208d820180518516845290855281832054828d0151851684528a865282842091519094168352909352919091205460a08b0151612361908790611b0a908790869063ffffffff166001612d01565b955061237e85611b0a85848f60a0015163ffffffff166000612d01565b945060028610156123cb5760c08b015160ff161561239d5760066123a0565b60025b8990600a8111156123ad57fe5b9081600a8111156123ba57fe5b9052506108b0975050505050505050565b60028510156123f05760c08b015160ff16156123e85760026123a0565b8860066123ad565b61240586868d60a0015163ffffffff16612d61565b909650945060028610806124195750600285105b15612426578860056123ad565b600060a08a0181905260c08a01819052868601838101919083039084121561247d57612471612456600084612deb565b85600003018e60a0015163ffffffff16633b9aca0003612105565b60a08c01805190910190525b60008213156124b3576124a6612494600086612dfa565b83038e60a0015163ffffffff16612105565b60a08c0180519190910390525b60008313156124e8576124dc6124ca600083612dfa565b84038e60a0015163ffffffff16612105565b60c08c01805190910190525b60008112156125275761251a6124ff600085612deb565b82600003018e60a0015163ffffffff16633b9aca0003612105565b60c08c0180519190910390525b600061253f8c60a001518d60c0015187868887612e0a565b9050801561259f57806001141561256357600019909201916001919091019061257f565b80600019141561257d5760a08c018051600101905261257f565bfe5b6125958c60a001518d60c0015187868887612e0a565b9050801561259f57fe5b60018c5260608c0183905260808c0182905260e08c018890526101008c0189905260c08e015160ff166125e8576101008c01516101208d015260e08c01516101408d0152612600565b60e08c01516101208d01526101008c01516101408d01525b50505050505050505050509392505050565b60018151600a81111561262157fe5b1461262857fe5b60608083015160009081526020818152604080832093850151858301516001600160a01b0390811685528584528285209783018051821686529784528285209190915560808601519582015181168452938252808320955190931682529390935290912055565b600081131561277a57826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126f857600080fd5b505af115801561270c573d6000803e3d6000fd5b505050506040513d602081101561272257600080fd5b5051612775576040805162461bcd60e51b815260206004820152601860248201527f444552525f544f4b454e5f5452414e534645525f4641494c0000000000000000604482015290519081900360640190fd5b61285d565b600081121561285d57604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152600084810360448401529251908616926323b872dd92606480820193602093909283900390910190829087803b1580156127e057600080fd5b505af11580156127f4573d6000803e3d6000fd5b505050506040513d602081101561280a57600080fd5b505161285d576040805162461bcd60e51b815260206004820152601c60248201527f444552525f544f4b454e5f5452414e5346455246524f4d5f4641494c00000000604482015290519081900360640190fd5b505050565b60018151600a81111561287157fe5b1461287857fe5b8060c001518160a0015112156128bb5761289f826040015182602001518360a0015161268f565b6128b6826040015182604001518360c0015161268f565b6128e9565b6128d2826040015182604001518360c0015161268f565b6128e9826040015182602001518360a0015161268f565b60c082015160ff161561290157806101000151612907565b8060e001515b60016000846101400151815260200190815260200160002060008282540192505081905550816060015182600001516001600160a01b0316336001600160a01b03167fdc13589835b7bdc7ff3bbf712a59927511e18e82e9ec9231372692090e1c09f185604001518661014001518760c001518860a0015188610100015189606001518a60e001518b608001518c60a001518d60c00151604051808b6001600160a01b03166001600160a01b031681526020018a81526020018960ff1660ff1681526020018863ffffffff1663ffffffff1681526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a45050565b604080516000808252602080830180855287905260ff85811c601b011683850152606083018690526001600160ff1b03851660808401529251909260019260a080820193601f1981019281900390910190855afa158015612a7f573d6000803e3d6000fd5b5050604051601f19015195945050505050565b600082821115612a9e57fe5b50900390565b815160601c81528151600160581b1615612abe5733612ac1565b60005b6001600160a01b031660208281019190915282018051608090811c90830152805160601c63ffffffff1660a0830152825160501c60ff1660c0830152825160281c64ffffffffff90811660e0840152925190921661010082015290516bffffffffffffffffffffffff1661012090910152565b8051604080830151608084015161012085015183516bffffffffffffffffffffffff19606096871b81166020808401919091529490961b90951660348601526048850191909152606880850191909152825180850390910181526088909301909152815191012061014090910152565b600080612cad846001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612c0057600080fd5b505afa158015612c14573d6000803e3d6000fd5b505050506040513d6020811015612c2a57600080fd5b505160408051636eb1769f60e11b81526001600160a01b03878116600483015230602483015291519188169163dd62ed3e91604480820192602092909190829003018186803b158015612c7c57600080fd5b505afa158015612c90573d6000803e3d6000fd5b505050506040513d6020811015612ca657600080fd5b5051612d4b565b90506001600160801b038111156108b0576040805162461bcd60e51b8152602060048201526013602482015272444552525f42414c414e43455f494e53414e4560681b604482015290519081900360640190fd5b6000848215612d27576000851215612d2257612d208560000385612105565b015b612d42565b6000851315612d4257612d408585633b9aca0003612105565b015b95945050505050565b6000818310612d5a57816108b0565b5090919050565b600080600083612d778786633b9aca0003612dcb565b81612d7e57fe5b0486019050600084633b9aca0003612d968787612dcb565b81612d9d57fe5b048601905080821115612db95785810386935093505050612dc3565b5085925082900390505b935093915050565b6000828202831580612de5575082848281612de257fe5b04145b6108b057fe5b6000818312612d5a57816108b0565b600081831215612d5a57816108b0565b60008080851315612e2457612e20600087612dfa565b8503015b6000841315612e3d57612e38600084612dfa565b840390035b8701860190509695505050505050565b60405180610160016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600063ffffffff168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b604080516101608101909152806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e747261637429a265627a7a72315820234ae9917cb53dcdb37b322e8a94bfeba87c62b41bee5f8ed9bcc59f5b4370e564736f6c634300050b0032
Deployed Bytecode
0x6080604052600436106100a75760003560e01c806344ae7b671161006457806344ae7b67146102fa578063a49a408814610390578063a981848f146104c8578063c3908f9714610507578063cc527775146105a1578063e156d58e146105cb576100a7565b806301ba4a36146100ea57806313e3dcf21461019957806316b7218f1461021d57806318cb2b18146102625780632f1ae7ab146102775780633c186ff3146102b9575b6040805162461bcd60e51b81526020600482015260136024820152721111549497d55392d393d5d397d351551213d1606a1b604482015290519081900360640190fd5b3480156100f657600080fd5b506101146004803603602081101561010d57600080fd5b5035610667565b60405180851515151581526020018463ffffffff1663ffffffff1681526020018363ffffffff1663ffffffff16815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561018257818101518382015260200161016a565b505050509050019550505050505060405180910390f35b3480156101a557600080fd5b5061021b600480360360408110156101bc57600080fd5b81359190810190604081016020820135600160201b8111156101dd57600080fd5b8201836020820111156101ef57600080fd5b803590602001918460208302840111600160201b8311171561021057600080fd5b509092509050610709565b005b34801561022957600080fd5b506102506004803603602081101561024057600080fd5b50356001600160a01b03166107b3565b60408051918252519081900360200190f35b34801561026e57600080fd5b5061021b6107d2565b34801561028357600080fd5b506102a06004803603608081101561029a57600080fd5b5061081d565b6040805192835260208301919091528051918290030190f35b3480156102c557600080fd5b50610250600480360360608110156102dc57600080fd5b508035906001600160a01b0360208201358116916040013516610882565b34801561030657600080fd5b5061021b600480360360e081101561031d57600080fd5b8135916001600160a01b036020820135169160408201919081019060e0810160c0820135600160201b81111561035257600080fd5b82018360208201111561036457600080fd5b803590602001918460808302840111600160201b8311171561038557600080fd5b5090925090506108b7565b34801561039c57600080fd5b5061021b600480360360e08110156103b357600080fd5b81359160208101359160408201359190810190608081016060820135600160201b8111156103e057600080fd5b8201836020820111156103f257600080fd5b803590602001918460208302840111600160201b8311171561041357600080fd5b9193909263ffffffff83351692604081019060200135600160201b81111561043a57600080fd5b82018360208201111561044c57600080fd5b803590602001918460408302840111600160201b8311171561046d57600080fd5b919390929091602081019035600160201b81111561048a57600080fd5b82018360208201111561049c57600080fd5b803590602001918460208302840111600160201b831117156104bd57600080fd5b509092509050610d0d565b3480156104d457600080fd5b5061021b600480360360608110156104eb57600080fd5b506001600160a01b0381351690602081013590604001356111e9565b34801561051357600080fd5b5061021b600480360360c081101561052a57600080fd5b8135916020810135916040820135916060810135916080820135919081019060c0810160a0820135600160201b81111561056357600080fd5b82018360208201111561057557600080fd5b803590602001918460208302840111600160201b8311171561059657600080fd5b5090925090506112f9565b3480156105ad57600080fd5b50610250600480360360208110156105c457600080fd5b5035611512565b3480156105d757600080fd5b5061021b600480360360a08110156105ee57600080fd5b8135916020810135916040820135916001600160a01b036060820135169181019060a081016080820135600160201b81111561062957600080fd5b82018360208201111561063b57600080fd5b803590602001918460808302840111600160201b8311171561065c57600080fd5b509092509050611524565b6000818152602081815260408083206001810154600282018054845181870281018701909552808552869586956060959460ff81169463ffffffff6101008304811695600160281b909304169390929183918301828280156106f257602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116106d4575b505050505090509450945094509450509193509193565b6000838152602081905260409020600181015460ff16610770576040805162461bcd60e51b815260206004820152601860248201527f444552525f4d415443485f4e4f545f46494e414c495a45440000000000000000604482015290519081900360640190fd5b6107ad8484848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061170592505050565b50505050565b6001600160a01b0381166000908152600260205260409020545b919050565b336000818152600260209081526040918290204290819055825190815291517ff741d0ba71da7949fae818df4044531f78c6303a239319d2f9e2ede16cbe2d199281900390910190a2565b600080610828612e4d565b60408051608081810190925261085691869060049083908390808284376000920191909152506119d7915050565b905061086181611a18565b6101409091015160009081526001602052604090205490925090505b915091565b6000838152602081815260408083206001600160a01b03808716855290835281842090851684529091529020545b9392505050565b80610909576040805162461bcd60e51b815260206004820152601c60248201527f444552525f454d5054595f5041434b454452494748544f524445525300000000604482015290519081900360640190fd5b610911612e4d565b6109458686866004806020026040519081016040528092919082600460200280828437600092019190915250611b19915050565b905060005b82811015610d045761095a612e4d565b61099f888887878681811061096b57fe5b9050608002016004806020026040519081016040528092919082600460200280828437600092019190915250611b19915050565b805184519192506001600160a01b03918216911614156109f8576040805162461bcd60e51b815260206004820152600f60248201526e2222a9292fa9a0a6a2afa6a0a5a2a960891b604482015290519081900360640190fd5b8260c0015160ff168160c0015160ff161415610a51576040805162461bcd60e51b81526020600482015260136024820152722222a9292fa9a0a6a2afa224a922a1aa24a7a760691b604482015290519081900360640190fd5b600080610a5d85612087565b91509150600080610a6d85612087565b9150915081841115610aba57610ab3828860c0015160ff16600114610a9c578860a0015163ffffffff16610aae565b8860a0015163ffffffff16633b9aca00035b612105565b9250610af6565b610af3848860c0015160ff16600114610ae3578660a0015163ffffffff16633b9aca0003610aae565b8660a0015163ffffffff16612105565b90505b610afe612ecb565b610b0a8287600161212f565b905060018151600a811115610b1b57fe5b14610baf57856060015186600001516001600160a01b0316336001600160a01b03167fc18d9b605d704a457c4e1843595120a6722eb9b31b859ec775262189d62f04b789604001518a61014001518660000151600a811115610b7957fe5b604080516001600160a01b039094168452602084019290925261ffff1682820152519081900360600190a4505050505050610cfc565b610bb98682612612565b610bc1612ecb565b610bcd858a600161212f565b905060018151600a811115610bde57fe5b14610c27576040805162461bcd60e51b81526020600482015260146024820152731111549497d311519517d51490511157d190525360621b604482015290519081900360640190fd5b610c318982612612565b60008090508960c0015160ff1660011415610c62575060a08201805160c08301805160009384905292905201610c7a565b5060c08201805160a083018051600093849052929052015b6000811215610c9257610c928a60400151338361268f565b8260a001518360c00151018260a001518360c00151011215610cc757610cb88a83612862565b610cc28884612862565b610cdb565b610cd18884612862565b610cdb8a83612862565b6000811315610cf357610cf38a60400151338361268f565b50505050505050505b60010161094a565b50505050505050565b60008a8a8a8a8a604051602001808681526020018581526020018481526020018383602002808284376040805191909301818103601f1901825283528051602091820120600081815291829052929020600181015492995097505060ff16945061119e93505050505760008b11610dcb576040805162461bcd60e51b815260206004820152601760248201527f444552525f5a45524f5f4752414445525f51554f52554d000000000000000000604482015290519081900360640190fd5b848814610e17576040805162461bcd60e51b8152602060048201526015602482015274444552525f494e56414c49445f4e554d5f5349475360581b604482015290519081900360640190fd5b633b9aca008a1115610e69576040805162461bcd60e51b8152602060048201526016602482015275444552525f494e56414c49445f47524144455246454560501b604482015290519081900360640190fd5b604080513060601b602080830191909152603482018590526001600160e01b031960e08b901b166054830152825160388184030181526058830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060788401526094808401919091528351808403909101815260b490920190925280519101206000805b8a81101561104a57888882818110610f0957fe5b905060400201600060028110610f1b57fe5b602002013515611042576000610f76848b8b85818110610f3757fe5b905060400201600060028110610f4957fe5b60200201358c8c86818110610f5a57fe5b905060400201600160028110610f6c57fe5b6020020135612a1a565b90508c8c83818110610f8457fe5b905060200201356001600160a01b03166001600160a01b0316816001600160a01b031614610fef576040805162461bcd60e51b8152602060048201526013602482015272444552525f4241445f4752414445525f53494760681b604482015290519081900360640190fd5b846002018d8d84818110610fff57fe5b835460018082018655600095865260209586902090910180549290950293909301356001600160a01b03166001600160a01b031990911617909255939093019250505b600101610ef5565b508c8110156110a0576040805162461bcd60e51b815260206004820152601960248201527f444552525f494e53554646494349454e545f4752414445525300000000000000604482015290519081900360640190fd5b6001838101805460ff191690911764ffffffff001916637fffffff8b1661010081029190911790915563800000008a16151590816110de578d6110e1565b60005b60018601805468ffffffff00000000001916600160281b63ffffffff938416021790819055633b9aca00610100909104909116111561115d576040805162461bcd60e51b8152602060048201526013602482015272444552525f4241445f46494e414c505249434560681b604482015290519081900360640190fd5b6040805163ffffffff8d168152905187917f5b7dd90e5b4429f4065b72413fa0e6b3e94d240f37f15738c63219cf4d1d29a3919081900360200190a2505050505b6111db8285858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525061170592505050565b505050505050505050505050565b6bffffffffffffffffffffffff811115611240576040805162461bcd60e51b81526020600482015260136024820152720444552525f4241445f4f5244455247524f555606c1b604482015290519081900360640190fd5b6040805133606081811b6020808501919091526bffffffffffffffffffffffff199188901b9190911660348401526048830186905260688084018690528451808503909101815260888401808652815191830191909120600081815260019093529185902060001990556001600160a01b038816905260a8830186905260c88301859052925190917f1430a8409c73700eb66d67441f57646f38f97871d4ef568e9891000cfbc542da919081900360e80190a250505050565b600087878760405160200180848152602001838152602001828152602001935050505060405160208183030381529060405280519060200120905060008186868686604051602001808681526020018581526020018481526020018383602002808284376040805191909301818103601f1901825283528051602091820120600081815291829052929020600181015492995097505060ff161594506113eb9350505050576040805162461bcd60e51b815260206004820152601760248201527f444552525f4d415443485f49535f46494e414c495a4544000000000000000000604482015290519081900360640190fd5b42891061143f576040805162461bcd60e51b815260206004820152601860248201527f444552525f544f4f5f534f4f4e5f544f5f5245434f5645520000000000000000604482015290519081900360640190fd5b633b9aca00881115611498576040805162461bcd60e51b815260206004820152601860248201527f444552525f494e56414c49445f43414e43454c50524943450000000000000000604482015290519081900360640190fd5b6001818101805460ff191690911764ffffffff00191661010063ffffffff8b169081029190911768ffffffff00000000001916909155604080519182525183917f5b7dd90e5b4429f4065b72413fa0e6b3e94d240f37f15738c63219cf4d1d29a3916020918190039190910190a250505050505050505050565b60009081526001602052604090205490565b84158015906115335750844210155b1561158d57604080516001600160a01b0385168152600060208201819052600382840152915186929133917fc18d9b605d704a457c4e1843595120a6722eb9b31b859ec775262189d62f04b79181900360600190a46116fd565b806115df576040805162461bcd60e51b815260206004820152601760248201527f444552525f454d5054595f5041434b45444f5244455253000000000000000000604482015290519081900360640190fd5b8560005b828110156116fa576115f3612e4d565b611604878787878681811061096b57fe5b905061160e612ecb565b61161a8483600061212f565b905060018151600a81111561162b57fe5b141561165b5761163b8282612612565b6116458282612862565b61165484826101200151612a92565b93506116e0565b816060015182600001516001600160a01b0316336001600160a01b03167fc18d9b605d704a457c4e1843595120a6722eb9b31b859ec775262189d62f04b785604001518661014001518660000151600a8111156116b457fe5b604080516001600160a01b039094168452602084019290925261ffff1682820152519081900360600190a45b60028410156116f05750506116fa565b50506001016115e3565b50505b505050505050565b6000828152602081905260409020600181015460ff1661172157fe5b6001810154633b9aca00600160281b90910463ffffffff16111561174157fe5b60005b82518110156107ad57600083828151811061175b57fe5b60209081029190910101516001909201916001600160a01b0316905060005b8451831080156117a3575084838151811061179157fe5b6020026020010151600160ff1b166000145b1561192a5760008584815181106117b657fe5b6020908102919091018101516001600160a01b03808216600090815288845260408082209288168252919093528220549092508181131561181357600187015461180c908290610100900463ffffffff16612105565b9150611849565b600081121561184157600187015461180c90600083900390610100900463ffffffff16633b9aca0003612105565b50505061191f565b600082121561185457fe5b6001870154600090611874908490600160281b900463ffffffff16612105565b9050600081121561188157fe5b938401939182900391600083121561189557fe5b6001600160a01b03808516600090815260208a81526040808320938a168352929052908120556118c686858561268f565b856001600160a01b03168a856001600160a01b03167f34b19d4ab39b572df0255e6c74331cd56f42aff855508021d664cd2be29b3ff88685604051808381526020018281526020019250505060405180910390a4505050505b60019092019161177a565b6001840154600160281b900463ffffffff161580611946575080155b156119525750506119d2565b6002840154600090828161196257fe5b05905060005b6002860154600019018110156119b35781830392506119ab8487600201838154811061199057fe5b6000918252602090912001546001600160a01b03168461268f565b600101611968565b506002850180546119ce918591600019810190811061199057fe5b5050505b611744565b6119df612e4d565b6119e98282612aa4565b6040808301516060838101919091528301516001600160a01b031690820152600060208201526107cd81612b34565b60008160e0015142101580611a4b575061010082015182516001600160a01b031660009081526002602052604090205410155b15611a58575060006107cd565b610140820151600090815260016020526040902054600019811415611a815760009150506107cd565b606083015160009081526020819052604081206080850151909190611aa69084612a92565b85516001600160a01b03908116600090815260208581526040808320818b0180519095168452909152902054905187519293509091611b0f918491611b0a91611aee91612ba4565b848a60a0015163ffffffff168b60c0015160ff16600114612d01565b612d4b565b9695505050505050565b611b21612e4d565b611b2b8282612aa4565b6001600160a01b038316604082015260608101849052611b4a81612b34565b60006040518080612f396042913960420190506040518091039020604051808065446567656e7360d01b815250600601905060405180910390206040518080620312e360ec1b8152506003019050604051809103902073888888e88e027e5585fa504954dad6246271aa8160405160200180858152602001848152602001838152602001826001600160a01b03166001600160a01b031681526020019450505050506040516020818303038152906040528051906020012060405160200180806509ee4c8cae4560d31b815250600601806d1859191c995cdcc81b585ad95c8b60921b815250600e01806d1859191c995cdcc81d185ad95c8b60921b815250600e01806d1859191c995cdcc81d1bdad95b8b60921b815250600e01806f1d5a5b9d0c8d4d881b585d18da12590b60821b815250601001806e1d5a5b9d0c8d4d88185b5bdd5b9d0b608a1b815250600f01806d1d5a5b9d0c8d4d881c1c9a58d94b60921b815250600e0180711d5a5b9d0c8d4d88191a5c9958dd1a5bdb8b60721b815250601201806e1d5a5b9d0c8d4d88195e1c1a5c9e4b608a1b815250600f0180711d5a5b9d0c8d4d881d1a5b595cdd185b5c0b60721b8152506012018071075696e74323536206f7264657247726f75760741b81525060120180602960f81b815250600101905060405160208183030381529060405280519060200120836000015184602001518560400151866060015187608001518860a0015163ffffffff168960c0015160ff168a60e001518b61010001518c6101200151604051602001808c81526020018b6001600160a01b03166001600160a01b031681526020018a6001600160a01b03166001600160a01b03168152602001896001600160a01b03166001600160a01b031681526020018881526020018781526020018681526020018581526020018481526020018381526020018281526020019b50505050505050505050505060405160208183030381529060405280519060200120604051602001808061190160f01b8152506002018381526020018281526020019250505060405160208183030381529060405280519060200120905082600060048110611e7057fe5b6020020151600160591b1615611ed2578060405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c018281526020019150506040516020818303038152906040528051906020012090505b81516001600160a01b0316611ef68285600260200201518660036020020151612a1a565b6001600160a01b031614611f51576040805162461bcd60e51b815260206004820152601c60248201527f444552525f494e56414c49445f4f524445525f5349474e415455524500000000604482015290519081900360640190fd5b60208201516001600160a01b03161580611f77575060208201516001600160a01b031633145b611fbd576040805162461bcd60e51b81526020600482015260126024820152712222a9292fa4a72b20a624a22faa20a5a2a960711b604482015290519081900360640190fd5b60008260a0015163ffffffff16118015611fe45750633b9aca008260a0015163ffffffff16105b61202a576040805162461bcd60e51b8152602060048201526012602482015271444552525f494e56414c49445f505249434560701b604482015290519081900360640190fd5b60028260c0015160ff161061207f576040805162461bcd60e51b81526020600482015260166024820152752222a9292fa4a72b20a624a22fa224a922a1aa24a7a760511b604482015290519081900360640190fd5b509392505050565b6000808260c0015160ff16600114156120d0576000806120c16120a986611a18565b6001600160801b038760a0015163ffffffff16612d61565b9081019450925061087d915050565b6000806120f76001600160801b036120e787611a18565b8760a0015163ffffffff16612d61565b81019450925061087d915050565b60008083121561211157fe5b633b9aca006121208484612dcb565b8161212757fe5b049392505050565b612137612ecb565b6000815260e0830151421061214f57600781526108b0565b61014083015160009081526001602090815260408083205461010087015187516001600160a01b031685526002909352922054101580612190575060001981145b156121b0578160085b9081600a8111156121a657fe5b9052506108b09050565b83516001600160a01b03163314156121ca5781600a612199565b6001600160801b038511156121e157816009612199565b60608401516000908152602081905260409020600181015460ff161561220c575050600481526108b0565b6000806000808860c0015160ff166000141561228c5733602088015288516001600160a01b0316604088015260808901518a945061224a9087612a92565b9250876122685761226389604001518860200151612ba4565b612271565b6001600160801b035b915061228589604001518860400151612ba4565b90506122f6565b88516001600160a01b0316602088015260808901516122ab9087612a92565b336040808a01919091528a015160208901519195508b94506122cc91612ba4565b9150876122ea576122e589604001518860400151612ba4565b6122f3565b6001600160801b035b90505b6020808801516001600160a01b03908116600090815287835260408082208d820180518516845290855281832054828d0151851684528a865282842091519094168352909352919091205460a08b0151612361908790611b0a908790869063ffffffff166001612d01565b955061237e85611b0a85848f60a0015163ffffffff166000612d01565b945060028610156123cb5760c08b015160ff161561239d5760066123a0565b60025b8990600a8111156123ad57fe5b9081600a8111156123ba57fe5b9052506108b0975050505050505050565b60028510156123f05760c08b015160ff16156123e85760026123a0565b8860066123ad565b61240586868d60a0015163ffffffff16612d61565b909650945060028610806124195750600285105b15612426578860056123ad565b600060a08a0181905260c08a01819052868601838101919083039084121561247d57612471612456600084612deb565b85600003018e60a0015163ffffffff16633b9aca0003612105565b60a08c01805190910190525b60008213156124b3576124a6612494600086612dfa565b83038e60a0015163ffffffff16612105565b60a08c0180519190910390525b60008313156124e8576124dc6124ca600083612dfa565b84038e60a0015163ffffffff16612105565b60c08c01805190910190525b60008112156125275761251a6124ff600085612deb565b82600003018e60a0015163ffffffff16633b9aca0003612105565b60c08c0180519190910390525b600061253f8c60a001518d60c0015187868887612e0a565b9050801561259f57806001141561256357600019909201916001919091019061257f565b80600019141561257d5760a08c018051600101905261257f565bfe5b6125958c60a001518d60c0015187868887612e0a565b9050801561259f57fe5b60018c5260608c0183905260808c0182905260e08c018890526101008c0189905260c08e015160ff166125e8576101008c01516101208d015260e08c01516101408d0152612600565b60e08c01516101208d01526101008c01516101408d01525b50505050505050505050509392505050565b60018151600a81111561262157fe5b1461262857fe5b60608083015160009081526020818152604080832093850151858301516001600160a01b0390811685528584528285209783018051821686529784528285209190915560808601519582015181168452938252808320955190931682529390935290912055565b600081131561277a57826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156126f857600080fd5b505af115801561270c573d6000803e3d6000fd5b505050506040513d602081101561272257600080fd5b5051612775576040805162461bcd60e51b815260206004820152601860248201527f444552525f544f4b454e5f5452414e534645525f4641494c0000000000000000604482015290519081900360640190fd5b61285d565b600081121561285d57604080516323b872dd60e01b81526001600160a01b038481166004830152306024830152600084810360448401529251908616926323b872dd92606480820193602093909283900390910190829087803b1580156127e057600080fd5b505af11580156127f4573d6000803e3d6000fd5b505050506040513d602081101561280a57600080fd5b505161285d576040805162461bcd60e51b815260206004820152601c60248201527f444552525f544f4b454e5f5452414e5346455246524f4d5f4641494c00000000604482015290519081900360640190fd5b505050565b60018151600a81111561287157fe5b1461287857fe5b8060c001518160a0015112156128bb5761289f826040015182602001518360a0015161268f565b6128b6826040015182604001518360c0015161268f565b6128e9565b6128d2826040015182604001518360c0015161268f565b6128e9826040015182602001518360a0015161268f565b60c082015160ff161561290157806101000151612907565b8060e001515b60016000846101400151815260200190815260200160002060008282540192505081905550816060015182600001516001600160a01b0316336001600160a01b03167fdc13589835b7bdc7ff3bbf712a59927511e18e82e9ec9231372692090e1c09f185604001518661014001518760c001518860a0015188610100015189606001518a60e001518b608001518c60a001518d60c00151604051808b6001600160a01b03166001600160a01b031681526020018a81526020018960ff1660ff1681526020018863ffffffff1663ffffffff1681526020018781526020018681526020018581526020018481526020018381526020018281526020019a505050505050505050505060405180910390a45050565b604080516000808252602080830180855287905260ff85811c601b011683850152606083018690526001600160ff1b03851660808401529251909260019260a080820193601f1981019281900390910190855afa158015612a7f573d6000803e3d6000fd5b5050604051601f19015195945050505050565b600082821115612a9e57fe5b50900390565b815160601c81528151600160581b1615612abe5733612ac1565b60005b6001600160a01b031660208281019190915282018051608090811c90830152805160601c63ffffffff1660a0830152825160501c60ff1660c0830152825160281c64ffffffffff90811660e0840152925190921661010082015290516bffffffffffffffffffffffff1661012090910152565b8051604080830151608084015161012085015183516bffffffffffffffffffffffff19606096871b81166020808401919091529490961b90951660348601526048850191909152606880850191909152825180850390910181526088909301909152815191012061014090910152565b600080612cad846001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015612c0057600080fd5b505afa158015612c14573d6000803e3d6000fd5b505050506040513d6020811015612c2a57600080fd5b505160408051636eb1769f60e11b81526001600160a01b03878116600483015230602483015291519188169163dd62ed3e91604480820192602092909190829003018186803b158015612c7c57600080fd5b505afa158015612c90573d6000803e3d6000fd5b505050506040513d6020811015612ca657600080fd5b5051612d4b565b90506001600160801b038111156108b0576040805162461bcd60e51b8152602060048201526013602482015272444552525f42414c414e43455f494e53414e4560681b604482015290519081900360640190fd5b6000848215612d27576000851215612d2257612d208560000385612105565b015b612d42565b6000851315612d4257612d408585633b9aca0003612105565b015b95945050505050565b6000818310612d5a57816108b0565b5090919050565b600080600083612d778786633b9aca0003612dcb565b81612d7e57fe5b0486019050600084633b9aca0003612d968787612dcb565b81612d9d57fe5b048601905080821115612db95785810386935093505050612dc3565b5085925082900390505b935093915050565b6000828202831580612de5575082848281612de257fe5b04145b6108b057fe5b6000818312612d5a57816108b0565b600081831215612d5a57816108b0565b60008080851315612e2457612e20600087612dfa565b8503015b6000841315612e3d57612e38600084612dfa565b840390035b8701860190509695505050505050565b60405180610160016040528060006001600160a01b0316815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600063ffffffff168152602001600060ff168152602001600081526020016000815260200160008152602001600081525090565b604080516101608101909152806000815260200160006001600160a01b0316815260200160006001600160a01b031681526020016000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152509056fe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e747261637429a265627a7a72315820234ae9917cb53dcdb37b322e8a94bfeba87c62b41bee5f8ed9bcc59f5b4370e564736f6c634300050b0032
Deployed Bytecode Sourcemap
458:26381:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6303:29;;;-1:-1:-1;;;6303:29:0;;;;;;;;;;;;-1:-1:-1;;;6303:29:0;;;;;;;;;;;;;;13948:234;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13948:234:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13948:234: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;13948:234:0;;;;;;;;;;;;;;;;;;;;12694:233;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12694:233:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;12694:233:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12694:233:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12694:233:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;12694:233:0;;-1:-1:-1;12694:233:0;-1:-1:-1;12694:233:0;:::i;:::-;;14324:124;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14324:124:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14324:124:0;-1:-1:-1;;;;;14324:124:0;;:::i;:::-;;;;;;;;;;;;;;;;10707:152;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10707:152:0;;;:::i;14456:211::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14456:211:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;14456:211:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;13778:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13778:162:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13778:162:0;;;-1:-1:-1;;;;;13778:162:0;;;;;;;;;;;;:::i;7417:2905::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7417:2905:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;7417:2905:0;;;-1:-1:-1;;;;;7417:2905:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;7417:2905:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;7417:2905:0;;;;;;102:9:-1;95:3;81:12;77:22;67:8;63:37;60:52;-1:-1;;;25:12;22:29;11:109;8:2;;;133:1;130;123:12;8:2;-1:-1;7417:2905:0;;-1:-1:-1;7417:2905:0;-1:-1:-1;7417:2905:0;:::i;10867:1819::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10867:1819:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;10867:1819:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10867:1819:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10867:1819:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;10867:1819:0;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10867:1819:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10867:1819:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;10867:1819:0;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;10867:1819:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;10867:1819:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;10867:1819:0;;-1:-1:-1;10867:1819:0;-1:-1:-1;10867:1819:0;:::i;10330:369::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10330:369:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10330:369:0;;;;;;;;;;;;;:::i;12935:794::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12935:794:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;12935:794:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;12935:794:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;12935:794:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;12935:794:0;;-1:-1:-1;12935:794:0;-1:-1:-1;12935:794:0;:::i;14190:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14190:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14190:126:0;;:::i;6348:1061::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6348:1061:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;6348:1061:0;;;;;;;;;;;;;-1:-1:-1;;;;;6348:1061:0;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;6348:1061:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;6348:1061:0;;;;;;102:9:-1;95:3;81:12;77:22;67:8;63:37;60:52;-1:-1;;;25:12;22:29;11:109;8:2;;;133:1;130;123:12;8:2;-1:-1;6348:1061:0;;-1:-1:-1;6348:1061:0;-1:-1:-1;6348:1061:0;:::i;13948:234::-;14012:4;14089:16;;;;;;;;;;;14124:11;;;;14164:9;;;14116:58;;;;;;;;;;;;;;;;;14012:4;;;;14034:24;;14089:16;14124:11;;;;14137:12;14124:11;14137:12;;;;;-1:-1:-1;;;14151:11:0;;;;;14164:9;;14116:58;14164:9;;14116:58;;14164:9;14116:58;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14116:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13948:234;;;;;:::o;12694:233::-;12780:15;12798:16;;;;;;;;;;12835:11;;;;;;12827:48;;;;;-1:-1:-1;;;12827:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12888:31;12902:7;12911;;12888:31;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12888:13:0;;-1:-1:-1;;;12888:31:0:i;:::-;12694:233;;;;:::o;14324:124::-;-1:-1:-1;;;;;14415:25:0;;14391:4;14415:25;;;:16;:25;;;;;;14324:124;;;;:::o;10707:152::-;10765:10;10748:28;;;;:16;:28;;;;;;;;;10779:15;10748:46;;;;10810:41;;;;;;;;;;;;;;;;;10707:152::o;14456:211::-;14522:7;14531;14551:14;;:::i;:::-;14568:27;;;;;;;;;;;;14588:6;;14568:27;;;;14588:6;;14568:27;14588:6;14568:27;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;14568:19:0;;-1:-1:-1;;14568:27:0:i;:::-;14551:44;;14614:17;14629:1;14614:14;:17::i;:::-;14647:10;;;;;14633:25;;;;:13;:25;;;;;;14606:53;;-1:-1:-1;14633:25:0;-1:-1:-1;14456:211:0;;;;:::o;13778:162::-;13867:3;13890:16;;;;;;;;;;;-1:-1:-1;;;;;13890:35:0;;;;;;;;;;;:42;;;;;;;;;;;13778:162;;;;;;:::o;7417:2905::-;7567:28;7559:69;;;;;-1:-1:-1;;;7559:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7641:22;;:::i;:::-;7666:44;7678:7;7687:5;7694:15;7666:44;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;7666:11:0;;-1:-1:-1;;7666:44:0:i;:::-;7641:69;-1:-1:-1;7728:6:0;7723:2592;7740:28;;;7723:2592;;;7790:23;;:::i;:::-;7816:49;7828:7;7837:5;7844:17;;7862:1;7844:20;;;;;;;;;;;;7816:49;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;7816:11:0;;-1:-1:-1;;7816:49:0:i;:::-;7909:16;;7890:15;;7790:75;;-1:-1:-1;;;;;;7890:35:0;;;;;;;7882:63;;;;;-1:-1:-1;;;7882:63:0;;;;;;;;;;;;-1:-1:-1;;;7882:63:0;;;;;;;;;;;;;;;7992:9;:19;;;7968:43;;:10;:20;;;:43;;;;7960:75;;;;;-1:-1:-1;;;7960:75:0;;;;;;;;;;;;-1:-1:-1;;;7960:75:0;;;;;;;;;;;;;;;8055:20;8077:15;8096:29;8115:9;8096:18;:29::i;:::-;8054:71;;;;8141:21;8164:16;8184:30;8203:10;8184:18;:30::i;:::-;8140:74;;;;8253:16;8235:15;:34;8231:376;;;8308:110;8324:16;8343:9;:19;;;:24;;8366:1;8343:24;:74;;8402:9;:15;;;8343:74;;;;;8383:9;:15;;;8371:27;;642:10;8371:27;8343:74;8308:11;:110::i;:::-;8290:129;;8231:376;;;8479:111;8495:15;8513:9;:19;;;:24;;8536:1;8513:24;:76;;8572:10;:16;;;8560:28;;642:10;8560:28;8513:76;;;8540:10;:16;;;8513:76;;8479:11;:111::i;:::-;8460:131;;8231:376;8625:23;;:::i;:::-;8651:40;8661:11;8674:10;8686:4;8651:9;:40::i;:::-;8625:66;-1:-1:-1;8733:14:0;8712:17;;:35;;;;;;;;;8708:237;;8817:10;:18;;;8799:10;:16;;;-1:-1:-1;;;;;8773:129:0;8787:10;-1:-1:-1;;;;;8773:129:0;;8837:10;:16;;;8855:10;:19;;;8883:10;:17;;;8876:25;;;;;;;;8773:129;;;-1:-1:-1;;;;;8773:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8921:8;;;;;;;;8708:237;8961:43;8981:10;8993;8961:19;:43::i;:::-;9021:22;;:::i;:::-;9046:38;9056:10;9068:9;9079:4;9046:9;:38::i;:::-;9021:63;-1:-1:-1;9129:14:0;9109:16;;:34;;;;;;;;;9101:67;;;;;-1:-1:-1;;;9101:67:0;;;;;;;;;;;;-1:-1:-1;;;9101:67:0;;;;;;;;;;;;;;;9185:41;9205:9;9216;9185:19;:41::i;:::-;9245:21;9269:1;9245:25;;9291:9;:19;;;:24;;9314:1;9291:24;9287:420;;;-1:-1:-1;9386:27:0;;;;;9356;;;;;9492:1;9462:31;;;;9432:61;;;9356:57;9287:420;;;-1:-1:-1;9583:28:0;;;;;9554:26;;;;;9690:1;9659:32;;;;9630:61;;;9554:57;9287:420;9749:1;9729:17;:21;9725:88;;;9752:61;9766:9;:15;;;9783:10;9795:17;9752:13;:61::i;:::-;9924:10;:27;;;9893:10;:28;;;:58;9864:9;:26;;;9834:9;:27;;;:56;:117;9830:369;;;9972:32;9983:9;9994;9972:10;:32::i;:::-;10023:34;10034:10;10046;10023;:34::i;:::-;9830:369;;;10098:34;10109:10;10121;10098;:34::i;:::-;10151:32;10162:9;10173;10151:10;:32::i;:::-;10239:1;10219:17;:21;10215:88;;;10242:61;10256:9;:15;;;10273:10;10285:17;10242:13;:61::i;:::-;7723:2592;;;;;;;;;7770:3;;7723:2592;;;;7417:2905;;;;;;:::o;10867:1819::-;11063:12;11110:7;11119:12;11133:9;11144:7;;11093:59;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;11093:59:0;;;45:16:-1;;;;26:21;;;-1:-1;;22:32;6:49;;11093:59:0;;11083:70;;49:4:-1;11083:70:0;;;;11078:76;11185:16;;;;;;;;;;11219:11;;;;11083:70;;-1:-1:-1;11185:16:0;-1:-1:-1;;11219:11:0;;;-1:-1:-1;11214:1421:0;;-1:-1:-1;;;;11214:1421:0;11270:1;11255:12;:16;11247:52;;;;;-1:-1:-1;;;11247:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;11322:29;;;11314:63;;;;;-1:-1:-1;;;11314:63:0;;;;;;;;;;;;-1:-1:-1;;;11314:63:0;;;;;;;;;;;;;;;642:10;11400:9;:22;;11392:57;;;;;-1:-1:-1;;;11392:57:0;;;;;;;;;;;;-1:-1:-1;;;11392:57:0;;;;;;;;;;;;;;;11640:52;;;11665:4;11640:52;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;11640:52:0;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;11640:52:0;;;;;11630:63;;;;;;11498:232;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;11498:232:0;;;;;;;11488:243;;;;;11466:19;;11783:367;11800:18;;;11783:367;;;11848:4;;11853:1;11848:7;;;;;;;;;;;;11856:1;11848:10;;;;;;;;;;;:15;11844:291;;11888:14;11905:52;11921:11;11934:4;;11939:1;11934:7;;;;;;;;;;;;11942:1;11934:10;;;;;;;;;;;11946:4;;11951:1;11946:7;;;;;;;;;;;;11954:1;11946:10;;;;;;;;;;;11905:15;:52::i;:::-;11888:69;;11998:7;;12006:1;11998:10;;;;;;;;;;;;;-1:-1:-1;;;;;11998:10:0;-1:-1:-1;;;;;11988:20:0;:6;-1:-1:-1;;;;;11988:20:0;;11980:52;;;;;-1:-1:-1;;;11980:52:0;;;;;;;;;;;;-1:-1:-1;;;11980:52:0;;;;;;;;;;;;;;;12055:1;:9;;12070:7;;12078:1;12070:10;;;;;;;27::-1;;39:1;23:18;;;45:23;;-1:-1;12055:26:0;;;12070:10;12055:26;;;;;;;;;12070:10;;;;;;;;;-1:-1:-1;;;;;12070:10:0;-1:-1:-1;;;;;;12055:26:0;;;;;;;12104:11;;;;;-1:-1:-1;;11844:291:0;11820:3;;11783:367;;;;12187:12;12174:9;:25;;12166:63;;;;;-1:-1:-1;;;12166:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12383:4;12369:11;;;:18;;-1:-1:-1;;12369:18:0;;;;-1:-1:-1;;12402:26:0;12342:10;12329:23;;12369:18;12402:26;;;;;;;;;12277:10;12264:23;;12263:30;;;;12457:33;;12480:9;12457:33;;;12469:1;12457:33;12443:11;;;:47;;-1:-1:-1;;12443:47:0;-1:-1:-1;;;12443:47:0;;;;;;;;;;642:10;12443:47;12515:12;;;;;;:25;;12507:57;;;;;-1:-1:-1;;;12507:57:0;;;;;;;;;;;;-1:-1:-1;;;12507:57:0;;;;;;;;;;;;;;;12586:37;;;;;;;;;;12603:7;;12586:37;;;;;;;;;;11214:1421;;;;;12647:31;12661:7;12670;;12647:31;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;12647:13:0;;-1:-1:-1;;;12647:31:0:i;:::-;10867:1819;;;;;;;;;;;;:::o;10330:369::-;10433:26;10419:10;:40;;10411:72;;;;;-1:-1:-1;;;10411:72:0;;;;;;;;;;;;-1:-1:-1;;;10411:72:0;;;;;;;;;;;;;;;10525:55;;;10542:10;10525:55;;;;;;;;;;;;-1:-1:-1;;10525:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;10525:55:0;;;;;;10515:66;;;;;;;;;10494:13;10593:23;;;:13;:23;;;;;;;-1:-1:-1;;10593:34:0;;-1:-1:-1;;;;;10525:55:0;;10643:48;;;;;;;;;;;;;;;;10542:10;;10643:48;;;;;;;;;;10330:369;;;;:::o;12935:794::-;13110:15;13155:11;13168:12;13182:11;13138:56;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;13138:56:0;;;13128:67;;;;;;13110:85;;13206:12;13253:7;13262:12;13276:9;13287:7;;13236:59;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;13236:59:0;;;45:16:-1;;;;26:21;;;-1:-1;;22:32;6:49;;13236:59:0;;13226:70;;49:4:-1;13226:70:0;;;;13221:76;13328:16;;;;;;;;;;13366:11;;;;13226:70;;-1:-1:-1;13328:16:0;-1:-1:-1;;13366:11:0;;13365:12;;-1:-1:-1;13357:48:0;;-1:-1:-1;;;;13357:48:0;;;;-1:-1:-1;;;13357:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13439:15;13424:12;:30;13416:67;;;;;-1:-1:-1;;;13416:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;642:10;13502:11;:24;;13494:61;;;;;-1:-1:-1;;;13494:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13582:4;13568:11;;;:18;;-1:-1:-1;;13568:18:0;;;;-1:-1:-1;;13597:34:0;13568:18;13597:34;;;;;;;;;;-1:-1:-1;;13642:15:0;;;;13675:46;;;;;;;13692:7;;13675:46;;;;;;;;;;;;;12935:794;;;;;;;;;;:::o;14190:126::-;14255:4;14279:29;;;:13;:29;;;;;;;14190:126::o;6348:1061::-;6475:11;;;;;:40;;;6509:6;6490:15;:25;;6475:40;6471:190;;;6537:91;;;-1:-1:-1;;;;;6537:91:0;;;;6571:1;6537:91;;;;;;6601:25;6537:91;;;;;;6575:7;;6571:1;6551:10;;6537:91;;;;;;;;;6643:7;;6471:190;6681:23;6673:59;;;;;-1:-1:-1;;;6673:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6768:6;6745:20;6787:615;6804:23;;;6787:615;;;6849:14;;:::i;:::-;6866:44;6878:7;6887:5;6894:12;;6907:1;6894:15;;;;;;6866:44;6849:61;;6927:14;;:::i;:::-;6944:36;6954:15;6971:1;6974:5;6944:9;:36::i;:::-;6927:53;-1:-1:-1;7013:14:0;7001:8;;:26;;;;;;;;;6997:333;;;7048:25;7068:1;7071;7048:19;:25::i;:::-;7092:16;7103:1;7106;7092:10;:16::i;:::-;7145:39;7153:15;7170:1;:13;;;7145:7;:39::i;:::-;7127:57;;6997:333;;;7265:1;:9;;;7256:1;:7;;;-1:-1:-1;;;;;7230:84:0;7244:10;-1:-1:-1;;;;;7230:84:0;;7276:1;:7;;;7285:1;:10;;;7304:1;:8;;;7297:16;;;;;;;;7230:84;;;-1:-1:-1;;;;;7230:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6997:333;600:1;7350:15;:33;7346:44;;;7385:5;;;;7346:44;-1:-1:-1;;6829:3:0;;6787:615;;;;6348:1061;;;;;;;;:::o;16199:1788::-;16281:15;16299:16;;;;;;;;;;16333:11;;;;;;16326:19;;;;16363:11;;;;642:10;-1:-1:-1;;;16363:11:0;;;;;:24;;16356:32;;;;16406:6;16401:1579;16422:7;:14;16418:1;:18;16401:1579;;;16454:13;16478:7;16486:1;16478:10;;;;;;;;;;;;;;;;;;16589:3;;;;;-1:-1:-1;;;;;16478:57:0;;-1:-1:-1;16551:12:0;16584:983;16598:7;:14;16594:1;:18;:50;;;;;16617:7;16625:1;16617:10;;;;;;;;;;;;;;-1:-1:-1;;;16617:21:0;16643:1;16616:28;16594:50;16584:983;;;16670:12;16693:7;16701:1;16693:10;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16776:17:0;;;16723:9;16776:17;;;;;;;;;;:24;;;;;;;;;;;;16693:10;;-1:-1:-1;16825:18:0;;;16821:308;;;16904:12;;;;16876:41;;16888:14;;16904:12;;;;;16876:11;:41::i;:::-;16868:49;;16821:308;;;16964:1;16947:14;:18;16943:186;;;17039:12;;;;16998:54;;17010:15;;;;;17039:12;;;;;642:10;17027:24;16998:11;:54::i;16943:186::-;17101:8;;;;;16943:186;17165:1;17156:5;:10;;17149:18;;;;17217:11;;;;17188:7;;17198:31;;17210:5;;-1:-1:-1;;;17217:11:0;;;;17198;:31::i;:::-;17188:41;;17262:1;17255:3;:8;;17248:16;;;;17316:15;;;;17285:12;;;;;17368:1;17359:10;;;17352:18;;;;-1:-1:-1;;;;;17391:17:0;;;17418:1;17391:17;;;;;;;;;;;:24;;;;;;;;;;;:28;17438:33;17409:5;17403:4;17465:5;17438:13;:33::i;:::-;17521:5;-1:-1:-1;;;;;17497:54:0;17512:7;17506:4;-1:-1:-1;;;;;17497:54:0;;17533:5;17546:3;17497:54;;;;;;;;;;;;;;;;;;;;;;;;16584:983;;;;;16646:3;;;;;16584:983;;;17587:11;;;;-1:-1:-1;;;17587:11:0;;;;:16;;:33;;-1:-1:-1;17607:13:0;;17587:33;17583:47;;;17622:8;;;;17583:47;17681:9;;;:16;17647;;17666:8;17681:16;17666:32;;;;;;-1:-1:-1;17720:6:0;17715:174;17736:9;;;:16;-1:-1:-1;;17736:20:0;17732:24;;17715:174;;;17794:12;17782:24;;;;17825:48;17839:5;17846:1;:9;;17856:1;17846:12;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;17846:12:0;17860;17825:13;:48::i;:::-;17758:3;;17715:174;;;-1:-1:-1;17926:9:0;;;17936:16;;17905:63;;17919:5;;-1:-1:-1;;17936:20:0;;;17926:31;;;;;17905:63;16401:1579;;;;;;5300:266;5373:14;;:::i;:::-;5400:23;5413:6;5421:1;5400:12;:23::i;:::-;5448:9;;;;;5436;;;;:21;;;;5486:9;;;-1:-1:-1;;;;;5468:28:0;:7;;;:28;-1:-1:-1;5448:9:0;5507:7;;:20;5540:18;5436:9;5540:15;:18::i;23254:552::-;23315:4;23355:1;:8;;;23336:15;:27;;:71;;;-1:-1:-1;23396:11:0;;;;23384:7;;-1:-1:-1;;;;;23367:25:0;;;;;:16;:25;;;;;;:40;;23336:71;23332:85;;;-1:-1:-1;23416:1:0;23409:8;;23332:85;23458:10;;;;23430:11;23444:25;;;:13;:25;;;;;;-1:-1:-1;;23484:18:0;;23480:32;;;23511:1;23504:8;;;;;23480:32;23551:9;;;;23525:15;23543:18;;;;;;;;;;23596:8;;;;23543:18;;23525:15;23588:25;;23606:6;23588:7;:25::i;:::-;23651:7;;-1:-1:-1;;;;;23639:20:0;;;23624:12;23639:20;;;;;;;;;;;23660:7;;;;;23639:29;;;;;;;;;;;23742:7;;23751;;23574:39;;-1:-1:-1;23639:29:0;;23688:110;;23574:39;;23704:93;;23728:31;;:13;:31::i;:::-;23761:8;23771:1;:7;;;23704:93;;23780:1;:11;;;:16;;23795:1;23780:16;23704:23;:93::i;:::-;23688:7;:110::i;:::-;23681:117;23254:552;-1:-1:-1;;;;;;23254:552:0:o;4033:1259::-;4127:14;;:::i;:::-;4154:23;4167:6;4175:1;4154:12;:23::i;:::-;-1:-1:-1;;;;;4190:15:0;;:7;;;:15;4216:9;;;:19;;;4248:18;4190:1;4248:15;:18::i;:::-;4279:21;733:79;;;;;;;;;;;;;;;;;;;823:19;;;;-1:-1:-1;;;823:19:0;;;;;;;;;;;;;;853:16;;;;-1:-1:-1;;;853:16:0;;;;;;;;;;;;;;888:42;712:247;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;712:247:0;-1:-1:-1;;;;;712:247:0;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;712:247:0;;;702:258;;;;;;2913:382;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;-1:-1:-1;;;2913:382:0;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;2913:382:0;;;2903:393;;;;;;4479:1;:7;;;4505:1;:7;;;4531:1;:7;;;4557:1;:9;;;4585:1;:8;;;4617:1;:7;;;4612:13;;4649:1;:11;;;4644:17;;4680:1;:8;;;4707:1;:11;;;4737:1;:12;;;4407:357;;;;;;;;;;;-1:-1:-1;;;;;4407:357:0;-1:-1:-1;;;;;4407:357:0;;;;;;-1:-1:-1;;;;;4407:357:0;-1:-1:-1;;;;;4407:357:0;;;;;;-1:-1:-1;;;;;4407:357:0;-1:-1:-1;;;;;4407:357:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4407:357:0;;;4397:368;;;;;;4313:463;;;;;;-1:-1:-1;;;4313:463:0;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4313:463:0;;;4303:474;;;;;;4279:498;;4795:6;4802:1;4795:9;;;;;;;;;;;-1:-1:-1;;;4795:28:0;4794:35;4790:135;;4910:13;4857:67;;;;;;;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4857:67:0;;;4847:78;;;;;;4831:94;;4790:135;5002:7;;-1:-1:-1;;;;;4946:63:0;:52;4962:13;4977:6;4984:1;4977:9;;;;4988:6;4995:1;4988:9;;;;4946:15;:52::i;:::-;-1:-1:-1;;;;;4946:63:0;;4938:104;;;;;-1:-1:-1;;;4938:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5061:7;;;;-1:-1:-1;;;;;5061:21:0;;;:46;;-1:-1:-1;5086:7:0;;;;-1:-1:-1;;;;;5086:21:0;5097:10;5086:21;5061:46;5053:77;;;;;-1:-1:-1;;;5053:77:0;;;;;;;;;;;;-1:-1:-1;;;5053:77:0;;;;;;;;;;;;;;;5176:1;5166;:7;;;:11;;;:34;;;;;642:10;5181:1;:7;;;:19;;;5166:34;5158:65;;;;;-1:-1:-1;;;5158:65:0;;;;;;;;;;;;-1:-1:-1;;;5158:65:0;;;;;;;;;;;;;;;5256:1;5242;:11;;;:15;;;5234:50;;;;;-1:-1:-1;;;5234:50:0;;;;;;;;;;;;-1:-1:-1;;;5234:50:0;;;;;;;;;;;;;;;4033:1259;;;;;;:::o;23814:522::-;23879:4;23885;23906:1;:11;;;:16;;23921:1;23906:16;23902:427;;;23940:15;23957:16;23977:72;24005:17;24020:1;24005:14;:17::i;:::-;-1:-1:-1;;;;;24041:1:0;:7;;;23977:72;;:27;:72::i;:::-;24074:24;;;;-1:-1:-1;23939:110:0;-1:-1:-1;24066:46:0;;-1:-1:-1;;24066:46:0;23902:427;24146:15;24163:16;24183:72;-1:-1:-1;;;;;24228:17:0;24243:1;24228:14;:17::i;:::-;24247:1;:7;;;24183:72;;:27;:72::i;:::-;24280:24;;;-1:-1:-1;24145:110:0;-1:-1:-1;24272:45:0;;-1:-1:-1;;24272:45:0;24574:172;24640:3;24673:1;24663:6;:11;;24656:19;;;;642:10;24697:28;24710:6;24719:5;24697:7;:28::i;:::-;:40;;;;;;;24574:172;-1:-1:-1;;;24574:172:0:o;18351:4895::-;18448:14;;:::i;:::-;18486:19;18475:30;;18541:8;;;;18522:15;:27;18518:119;;18577:25;18566:36;;18617:8;;18518:119;18688:10;;;;18649:22;18674:25;;;:13;:25;;;;;;;;;18745:11;;;;18733:7;;-1:-1:-1;;;;;18716:25:0;;;:16;:25;;;;;;:40;;;:73;;;-1:-1:-1;;18760:17:0;:29;18716:73;18712:167;;;18806:1;18817:27;18806:38;;;;;;;;;;;;;-1:-1:-1;18859:8:0;;-1:-1:-1;18859:8:0;18712:167;18909:7;;-1:-1:-1;;;;;18895:21:0;:10;:21;18891:110;;;18933:1;18944:22;18933:33;;18891:110;-1:-1:-1;;;;;19017:6:0;:24;19013:119;;;19058:1;19069:28;19058:39;;19013:119;19170:9;;;;19144:15;19162:18;;;;;;;;;;19197:11;;;;;;19193:105;;;-1:-1:-1;;19236:27:0;19225:38;;19278:8;;19193:105;19312:15;19338:16;19365;19392:17;19426:1;:11;;;:16;;19441:1;19426:16;19422:826;;;19512:10;19499;;;:23;19587:7;;-1:-1:-1;;;;;19573:21:0;:11;;;:21;19631:8;;;;19550:6;;-1:-1:-1;19623:36:0;;19641:17;19623:7;:36::i;:::-;19609:50;;19690:21;:76;;19732:34;19746:1;:7;;;19755:1;:10;;;19732:13;:34::i;:::-;19690:76;;;-1:-1:-1;;;;;19690:76:0;19676:90;;19796:35;19810:1;:7;;;19819:1;:11;;;19796:13;:35::i;:::-;19781:50;;19422:826;;;19917:7;;-1:-1:-1;;;;;19904:20:0;:10;;;:20;19960:8;;;;19952:36;;19970:17;19952:7;:36::i;:::-;20019:10;20005:11;;;;:24;;;;20109:7;;;20118:10;;;;19939:49;;-1:-1:-1;20058:6:0;;-1:-1:-1;20095:34:0;;:13;:34::i;:::-;20081:48;;20159:21;:77;;20201:35;20215:1;:7;;;20224:1;:11;;;20201:13;:35::i;:::-;20159:77;;;-1:-1:-1;;;;;20159:77:0;20144:92;;19422:826;20294:10;;;;;-1:-1:-1;;;;;20282:23:0;;;20260:19;20282:23;;;;;;;;;;20306:7;;;;;20282:32;;;;;;;;;;;20360:11;;;;20348:24;;;;;;;;;;20373:7;;20348:33;;;;;;;;;;;;;20481:7;;;;20407:89;;20415:10;;20427:68;;20451:11;;20282:32;;20427:68;;20490:4;20427:23;:68::i;20407:89::-;20394:102;;20521:93;20529:11;20542:71;20566:12;20580:16;20598:1;:7;;;20542:71;;20607:5;20542:23;:71::i;20521:93::-;20507:107;;600:1;20631:10;:28;20627:173;;;20687:11;;;;:16;;;:78;;20737:28;20687:78;;;20706:28;20687:78;20676:1;;:89;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20780:8:0;;-1:-1:-1;;;;;;;;20780:8:0;20627:173;600:1;20816:11;:29;20812:174;;;20873:11;;;;:16;;;:78;;20923:28;20873:78;;;20862:1;20892:28;20862:89;;20812:174;21026:61;21054:10;21066:11;21079:1;:7;;;21026:61;;:27;:61::i;:::-;20998:89;;-1:-1:-1;20998:89:0;-1:-1:-1;600:1:0;21104:28;;;:61;;;600:1;21136:11;:29;21104:61;21100:155;;;21182:1;21193:27;21182:38;;21100:155;21267:19;21447:18;;;:22;;;21480:19;;;:23;;;21308:34;;;21289:54;;;;21377:55;;;;21520:19;;21516:126;;;21563:79;21594:26;21601:1;21604:15;21594:6;:26::i;:::-;21576:15;21575:16;;:45;21634:1;:7;;;21622:19;;642:10;21622:19;21563:11;:79::i;:::-;21541:18;;;:101;;;;;;;21516:126;21675:1;21657:15;:19;21653:113;;;21700:66;21730:26;21737:1;21740:15;21730:6;:26::i;:::-;21712:15;:44;21758:1;:7;;;21700:66;;:11;:66::i;:::-;21678:18;;;:88;;;;;;;;21653:113;21802:1;21783:16;:20;21779:117;;;21828:68;21859:27;21866:1;21869:16;21859:6;:27::i;:::-;21840:16;:46;21888:1;:7;;;21828:68;;:11;:68::i;:::-;21805:19;;;:91;;;;;;;21779:117;21930:1;21911:16;:20;21907:130;;;21956:81;21988:27;21995:1;21998:16;21988:6;:27::i;:::-;21969:16;21968:17;;:47;22029:1;:7;;;22017:19;;642:10;22017:19;21956:11;:81::i;:::-;21933:19;;;:104;;;;;;;;21907:130;22050:17;22070:131;22091:1;:18;;;22111:1;:19;;;22132:15;22149;22166:16;22184;22070:20;:131::i;:::-;22050:151;-1:-1:-1;22218:18:0;;22214:558;;22257:13;22274:1;22257:18;22253:303;;;-1:-1:-1;;22296:17:0;;;;;22332:18;;;;;22253:303;;;22376:13;-1:-1:-1;;22376:19:0;22372:184;;;22416:18;;;:20;;;;;;22372:184;;;22527:13;;22588:131;22609:1;:18;;;22629:1;:19;;;22650:15;22667;22684:16;22702;22588:20;:131::i;:::-;22572:147;-1:-1:-1;22741:18:0;;22734:26;;;;22797:14;22786:25;;22822:17;;;:35;;;22868:18;;;:37;;;22916:13;;;:27;;;22954:12;;;:25;;;22996:11;;;;:16;;22992:226;;23045:12;;;;23029:13;;;:28;23088:13;;;;23072;;;:29;22992:226;;;23150:13;;;;23134;;;:29;23194:12;;;;23178:13;;;:28;22992:226;-1:-1:-1;;;;;;;;;;;18351:4895:0;;;;;:::o;15888:303::-;15987:14;15975:8;;:26;;;;;;;;;15968:34;;;;16041:9;;;;;16015:15;16033:18;;;;;;;;;;;16099:17;;;;16076:10;;;;-1:-1:-1;;;;;16064:23:0;;;;;;;;;;;16088:7;;;;;16064:32;;;;;;;;;;:52;;;;16165:18;;;;16141:11;;;;16129:24;;;;;;;;;;16154:7;;16129:33;;;;;;;;;;;;:54;15888:303::o;14717:373::-;14811:1;14803:5;:9;14799:284;;;14849:5;-1:-1:-1;;;;;14837:27:0;;14865:4;14876:5;14837:46;;;;;;;;;;;;;-1:-1:-1;;;;;14837:46:0;-1:-1:-1;;;;;14837:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14837:46:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14837:46:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14837:46:0;14829:83;;;;;-1:-1:-1;;;14829:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14799:284;;;14942:1;14934:5;:9;14930:153;;;14968:70;;;-1:-1:-1;;;14968:70:0;;-1:-1:-1;;;;;14968:70:0;;;;;;;15014:4;14968:70;;;;15026:10;;;;14968:70;;;;;;:31;;;;;;:70;;;;;;;;;;;;;;;;;;:31;:70;;;5:2:-1;;;;30:1;27;20:12;5:2;14968:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14968:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;14968:70:0;14960:111;;;;;-1:-1:-1;;;14960:111:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14717:373;;;:::o;15098:782::-;15188:14;15176:8;;:26;;;;;;;;;15169:34;;;;15241:1;:19;;;15220:1;:18;;;:40;15216:356;;;15277:54;15291:1;:7;;;15300:1;:10;;;15312:1;:18;;;15277:13;:54::i;:::-;15346:56;15360:1;:7;;;15369:1;:11;;;15382:1;:19;;;15346:13;:56::i;:::-;15216:356;;;15435:56;15449:1;:7;;;15458:1;:11;;;15471:1;:19;;;15435:13;:56::i;:::-;15506:54;15520:1;:7;;;15529:1;:10;;;15541:1;:18;;;15506:13;:54::i;:::-;15614:11;;;;:16;;;:47;;15649:1;:12;;;15614:47;;;15633:1;:13;;;15614:47;15584:13;:25;15598:1;:10;;;15584:25;;;;;;;;;;;;:78;;;;;;;;;;;15710:1;:9;;;15701:1;:7;;;-1:-1:-1;;;;;15680:192:0;15689:10;-1:-1:-1;;;;;15680:192:0;;15721:1;:7;;;15730:1;:10;;;15742:1;:11;;;15755:1;:7;;;15764:1;:12;;;15778:1;:17;;;15797:1;:13;;;15812:1;:18;;;15832:1;:18;;;15852:1;:19;;;15680:192;;;;-1:-1:-1;;;;;15680:192:0;-1:-1:-1;;;;;15680:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15098:782;;:::o;24371:195::-;24476:82;;;24449:7;24476:82;;;;;;;;;;;;;24510:3;24504:9;;;24498:2;:16;24476:82;;;;;;;;;;;-1:-1:-1;;;;;24537:19:0;;24476:82;;;;;;24449:7;;24476:82;;;;;;;-1:-1:-1;;24476:82:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;24476:82:0;;-1:-1:-1;;24476:82:0;;;24371:195;-1:-1:-1;;;;;24371:195:0:o;26406:116::-;26460:4;26489:1;26484;:6;;26477:14;;;;-1:-1:-1;26509:5:0;;;26406:116::o;3305:551::-;3408:9;;3422:4;3408:19;3390:38;;3449:9;;-1:-1:-1;;;3449:28:0;:33;:59;;3498:10;3449:59;;;3493:1;3449:59;-1:-1:-1;;;;;3439:69:0;:7;;;;:69;;;;3530:9;;;;3544:4;3530:19;;;3519:8;;;:30;3577:9;;3598:4;3577:27;3607:10;3577:40;3560:7;;;:58;3650:9;;3664:4;3650:19;3673:4;3649:28;3629:11;;;:49;3701:9;;3715:3;3701:18;3723:12;3700:35;;;3689:8;;;:46;3760:9;;:24;;;3746:11;;;:38;3810:9;;3822:26;3810:38;3795:12;;;;:53;3305:551::o;3864:161::-;3974:7;;3983;;;;;3992:8;;;;4002:12;;;;3957:58;;-1:-1:-1;;3957:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3957:58:0;;;;;;;3947:69;;;;;3929:10;;;;:88;3864:161::o;18040:303::-;18113:4;18130:12;18145:94;18165:5;-1:-1:-1;;;;;18153:28:0;;18182:4;18153:34;;;;;;;;;;;;;-1:-1:-1;;;;;18153:34:0;-1:-1:-1;;;;;18153:34:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18153:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18153:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18153:34:0;18189:49;;;-1:-1:-1;;;18189:49:0;;-1:-1:-1;;;;;18189:49:0;;;;;;;18232:4;18189:49;;;;;;:28;;;;;;:49;;;;;18153:34;;18189:49;;;;;;;;:28;:49;;;5:2:-1;;;;30:1;27;20:12;5:2;18189:49:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18189:49:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18189:49:0;18145:7;:94::i;:::-;18130:109;;-1:-1:-1;;;;;18258:7:0;:26;;18250:58;;;;;-1:-1:-1;;;18250:58:0;;;;;;;;;;;;-1:-1:-1;;;18250:58:0;;;;;;;;;;;;;;24754:440;24861:4;24902:7;24922:229;;;;24964:1;24953:8;:12;24949:73;;;24992:29;25005:8;25004:9;;25015:5;24992:11;:29::i;:::-;24967:55;24949:73;24922:229;;;25070:1;25059:8;:12;25055:84;;;25098:40;25110:8;25132:5;642:10;25120:17;25098:11;:40::i;:::-;25073:66;25055:84;25170:16;24754:440;-1:-1:-1;;;;;24754:440:0:o;26530:99::-;26584:4;26612:1;26608;:5;:13;;26620:1;26608:13;;;-1:-1:-1;26616:1:0;;26601:20;-1:-1:-1;26530:99:0:o;25202:533::-;25307:4;25313;25330:20;25408:5;25367:38;25375:10;25399:5;642:10;25387:17;25367:7;:38::i;:::-;:46;;;;;;25353:10;:61;25330:84;;25425:21;25507:5;642:10;25495:17;25464:27;25472:11;25485:5;25464:7;:27::i;:::-;:49;;;;;;25449:11;:65;25425:89;;25549:16;25531:15;:34;25527:201;;;25609:11;25590:16;:30;25622:11;25582:52;;;;;;;;25527:201;-1:-1:-1;25675:10:0;;-1:-1:-1;25687:28:0;;;;-1:-1:-1;25202:533:0;;;;;;;:::o;26247:151::-;26301:4;26327:5;;;26350:6;;;:20;;;26369:1;26364;26360;:5;;;;;;:10;26350:20;26343:28;;;26741:95;26792:3;26819:1;26815;:5;:13;;26827:1;26815:13;;26637:96;26688:3;26716:1;26711;:6;;:14;;26724:1;26711:14;;25743:496;25925:3;;25977:19;;;25973:86;;;26033:26;26040:1;26043:15;26033:6;:26::i;:::-;26015:44;;25998:61;25973:86;26093:1;26074:16;:20;26070:89;;;26132:27;26139:1;26142:16;26132:6;:27::i;:::-;26113:46;;26096:63;;26070:89;26179:32;;:52;;;-1:-1:-1;25743:496:0;;;;;;;;:::o;458:26381::-;;;;;;;;;;-1:-1:-1;;;;;458:26381:0;;;;;;-1:-1:-1;;;;;458:26381:0;;;;;;-1:-1:-1;;;;;458:26381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;-1:-1:-1;458:26381:0;;;;;-1:-1:-1;;;;;458:26381:0;;;;;;-1:-1:-1;;;;;458:26381:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://234ae9917cb53dcdb37b322e8a94bfeba87c62b41bee5f8ed9bcc59f5b4370e5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
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.