Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CompFarmingSummaryV3
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-06-10
*/
pragma solidity ^0.5.16;
pragma experimental ABIEncoderV2;
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* @dev Multiplies two numbers, throws on overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
if (a == 0) {
return 0;
}
c = a * b;
assert(c / a == b);
return c;
}
/**
* @dev Integer division of two numbers, truncating the quotient.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
// assert(b > 0); // Solidity automatically throws when dividing by 0
// uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return a / b;
}
/**
* @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
assert(b <= a);
return a - b;
}
/**
* @dev Adds two numbers, throws on overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
c = a + b;
assert(c >= a);
return c;
}
}
contract StringUtil {
function compareStrings(string memory a, string memory b) internal pure returns (bool) {
return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
}
function append(string memory a, string memory b) internal pure returns (string memory) {
return string(abi.encodePacked(a, b));
}
function append2(string memory a, string memory b, string memory c) internal pure returns (string memory) {
return string(abi.encodePacked(a, b, c));
}
function append3(string memory a, string memory b, string memory c, string memory d) internal pure returns (string memory) {
return string(abi.encodePacked(a, b, c, d));
}
function bool2str(bool b) internal pure returns(string memory){
if(b) return "true";
return "false";
}
function address2str(address x) internal pure returns (string memory) {
bytes memory s = new bytes(40);
for (uint i = 0; i < 20; i++) {
bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
bytes1 hi = bytes1(uint8(b) / 16);
bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
s[2*i] = char(hi);
s[2*i+1] = char(lo);
}
return string(s);
}
function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
if (_i == 0) {
return "0";
}
uint j = _i;
uint len;
while (j != 0) {
len++;
j /= 10;
}
bytes memory bstr = new bytes(len);
uint k = len - 1;
while (_i != 0) {
bstr[k--] = byte(uint8(48 + _i % 10));
_i /= 10;
}
return string(bstr);
}
function char(bytes1 b) internal pure returns (bytes1 c) {
if (uint8(b) < 10) return bytes1(uint8(b) + 0x30);
else return bytes1(uint8(b) + 0x57);
}
}
contract Constants {
uint internal constant oneMantissa = 10**18;
enum LoopControl {
NONE,
CONTINUE,
BREAK
}
}
contract CompoundAddresses {
address internal constant cDAIAddr = 0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643;
address internal constant cETHAddr = 0x4Ddc2D193948926D02f9B1fE9e1daa0718270ED5;
address internal constant cUSDCAddr = 0x39AA39c021dfbaE8faC545936693aC917d5E7563;
address internal constant cUSDTAddr = 0xf650C3d88D12dB855b8bf7D11Be6C55A4e07dCC9;
address internal constant cWBTCAddr = 0xC11b1268C1A384e55C48c2391d8d480264A3A7F4;
address internal constant cWBTC2Addr = 0xccF4429DB6322D5C611ee964527D42E5d685DD6a; //migrated at block number 12069867
address internal constant cCOMPAddr = 0x70e36f6BF80a52b3B46b3aF8e106CC0ed743E8e4;
address internal constant cSAIAddr = 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC;
address internal constant compAddr = 0xc00e94Cb662C3520282E6f5717214004A7f26888;
address internal constant compoundLensAddr = 0xd513d22422a3062Bd342Ae374b4b9c20E0a9a074;
address internal constant comptrollerAddr = 0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B;
address internal constant uniswapAnchoredViewAddr = 0x922018674c12a7F0D394ebEEf9B58F186CdE13c1;
function getCWBTCAddr(uint blockNumber) public pure returns(address){
if(blockNumber >= 12069867){
return cWBTC2Addr;
}
return cWBTCAddr;
}
}
contract ERC20Addresses {
address internal constant usdtAddr = 0xdAC17F958D2ee523a2206206994597C13D831ec7;
}
contract UniswapV2Addresses {
address internal constant uniswapV2Router02Address = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
address internal constant wETHAddr = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
}
contract ERC20 {
uint8 public decimals;
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
function balanceOf(address owner) external view returns (uint);
function transfer(address dst, uint amount) external returns (bool);
function symbol() external view returns (string memory);
}
contract USDT_ERC20 {
function approve(address spender, uint value) external;
}
contract Comptroller {
struct Market {
bool isListed;
uint collateralFactorMantissa;
bool isComped;
}
mapping(address => Market) public markets;
mapping(address => uint) public compAccrued;
uint public closeFactorMantissa;
uint public liquidationIncentiveMantissa;
address public oracle;
function getAccountLiquidity(address account) public view returns (uint, uint, uint);
function getAssetsIn(address account) external view returns (address[] memory);
function compSpeeds(address cTokenAddress) external view returns(uint);
function getAllMarkets() public view returns (CToken[] memory);
}
contract CToken is ERC20{
address public underlying;
uint public totalBorrows;
uint public totalReserves;
function mint(uint mintAmount) external returns (uint);
function redeem(uint redeemTokens) external returns (uint);
function exchangeRateStored() public view returns (uint);
function balanceOfUnderlying(address owner) external returns (uint);
function borrowBalanceStored(address account) public view returns (uint);
function getCash() external view returns (uint);
function totalBorrowsCurrent() external view returns (uint);
function borrowRatePerBlock() external view returns (uint);
function supplyRatePerBlock() external view returns (uint);
function getAccountSnapshot(address account) external view returns (uint, uint, uint, uint);
}
contract PriceOracle {
function getUnderlyingPrice(CToken cToken) public view returns (uint);
}
contract UniswapAnchoredView {
function price(string memory symbol) public view returns (uint);
}
contract CErc20 is CToken {
address public underlying;
function liquidateBorrow(address borrower, uint repayAmount, CToken cTokenCollateral) external returns (uint);
}
contract CompoundLens {
struct CompBalanceMetadataExt{
uint balance;
uint votes;
address delegate;
uint allocated;
}
function getCompBalanceMetadataExt(Comp comp, ComptrollerLensInterface comptroller, address account) external returns (CompBalanceMetadataExt memory);
}
contract Comp {
}
interface ComptrollerLensInterface {
}
contract ERC20ErrorReporter {
enum ERC20Error {
NO_ERROR,
TRANSFER_FROM_FAILED,
APPROVE_FAILED,
TRANSFER_FAILED
}
event fail(uint err);
}
contract ERC20Methods is ERC20ErrorReporter, ERC20Addresses{
function getDecimals(address token) internal view returns(uint decimals){
if(token == address(0)){
return 18;
}
return ERC20(token).decimals();
}
function transferIn(address token, address from, address to, uint amount) internal returns(ERC20Error){
if(!ERC20(token).transferFrom(from, to, amount)){
emit fail(uint(ERC20Error.TRANSFER_FROM_FAILED));
return ERC20Error.TRANSFER_FROM_FAILED;
}
return ERC20Error.NO_ERROR;
}
function transferOut(address token, address to, uint amount) internal returns(ERC20Error){
ERC20 erc20 = ERC20(token);
if(!erc20.approve(to, amount)){
emit fail(uint(ERC20Error.APPROVE_FAILED));
return ERC20Error.APPROVE_FAILED;
}
if(!erc20.transfer(to, amount)){
emit fail(uint(ERC20Error.TRANSFER_FAILED));
return ERC20Error.TRANSFER_FAILED;
}
return ERC20Error.NO_ERROR;
}
//works with ETH and ERC20
function balanceOf(address tokenAddr, address accAddr) internal view returns(uint){
//for ETH
if(tokenAddr == address(0)){
return accAddr.balance;
}
return ERC20(tokenAddr).balanceOf(accAddr);
}
//works with standard and non-standard ERC20
function approve(address tokenAddr, address spender, uint256 amount) internal returns(bool){
if(tokenAddr == usdtAddr){
USDT_ERC20(usdtAddr).approve(spender, 0);
USDT_ERC20(usdtAddr).approve(spender, amount);
return true;
}
return ERC20(tokenAddr).approve(spender, amount);
}
}
contract CompoundMethodsErrorReporter {
enum CompoundMethodsError {
NO_ERROR,
Liquidation_Failed,
APPROVE_FAILED,
Redeem_Failed
}
event fail(uint err);
event fail(uint err, uint detail);
}
contract CompoundMethods is CompoundMethodsErrorReporter, ERC20Methods, CompoundAddresses, UniswapV2Addresses, Constants, StringUtil{
using SafeMath for uint;
function cmp_redeemUnderlying(address cToken, uint amount) internal returns(CompoundMethodsError err){
uint error_redeem = CToken(cToken).redeem(amount);
if(error_redeem != 0){
emit fail(uint(CompoundMethodsError.Redeem_Failed), error_redeem);
return CompoundMethodsError.Redeem_Failed;
}
return CompoundMethodsError.NO_ERROR;
}
function cmp_liquidateBorrow(address cTokenBorrowed, address underlyingBorrowed, address borrower, uint repayAmount, CToken cTokenCollateral) internal returns(CompoundMethodsError err){
//approve USDT won't work
if(!approve(underlyingBorrowed, cTokenBorrowed, repayAmount)){
emit fail(uint(CompoundMethodsError.APPROVE_FAILED));
return CompoundMethodsError.APPROVE_FAILED;
}
//liquidate
uint err_liquidateBorrow = CErc20(cTokenBorrowed).liquidateBorrow(borrower, repayAmount, cTokenCollateral);
if(err_liquidateBorrow != 0){
emit fail(uint(CompoundMethodsError.APPROVE_FAILED), err_liquidateBorrow);
return CompoundMethodsError.APPROVE_FAILED;
}
return CompoundMethodsError.NO_ERROR;
}
function cmp_getUnderlyingAddr(address cTokenAddr) internal view returns(address underlyingAddr) {
if(cTokenAddr == cETHAddr){
return address(0);
}
underlyingAddr = CToken(cTokenAddr).underlying();
return underlyingAddr;
}
function cmp_underlyingValueInUSD(uint underlyingBalance, address cTokenAddr) internal view returns(uint valueInUSD){
uint underlyingDecimals = cmp_getUnderlyingDecimals(cTokenAddr);
valueInUSD = cmp_getUnderlyingPriceInUSD(cTokenAddr).mul(underlyingBalance).div(10**underlyingDecimals);
return valueInUSD;
}
function cmp_getUnderlyingPriceInUSD(address cTokenAddr) internal view returns (uint priceInUSD){
address oracleAddr = Comptroller(comptrollerAddr).oracle();
if(cTokenAddr == cUSDCAddr || cTokenAddr == cUSDTAddr){
priceInUSD = oneMantissa;
return priceInUSD;
}
if(cTokenAddr == cWBTC2Addr || cTokenAddr == cWBTCAddr){
priceInUSD = PriceOracle(oracleAddr).getUnderlyingPrice(CToken(cTokenAddr)).div(10**10);
return priceInUSD;
}
priceInUSD = PriceOracle(oracleAddr).getUnderlyingPrice(CToken(cTokenAddr));
return priceInUSD;
}
function cmp_getPriceInUSDByUnderlyingAddr(address underlyingAddr) internal view returns(uint underlyingPriceInUSD){
string memory symbol = ERC20(underlyingAddr).symbol();
if(compareStrings(symbol, "wBTC")){
symbol = "BTC";
}
return cmp_getPriceBySymbol(symbol).mul(10**12);
}
function cmp_getPriceBySymbol(string memory symbol) internal view returns(uint priceInUSDMantissa6){
return UniswapAnchoredView(uniswapAnchoredViewAddr).price(symbol);
}
function cmp_getUnderlyingSymbol(address cTokenAddr) internal view returns(string memory getUnderlyingSymbol){
if(cTokenAddr == cETHAddr) return "ETH";
if(cTokenAddr == cSAIAddr) return "SAI";
return ERC20(CToken(cTokenAddr).underlying()).symbol();
}
function cmp_getUnderlyingDecimals(address cTokenAddr) internal view returns(uint decimals){
if(cTokenAddr == cETHAddr){
decimals = 18;
return decimals;
}
address underlyingAddr = cmp_getUnderlyingAddr(cTokenAddr);
decimals = ERC20(underlyingAddr).decimals();
return decimals;
}
//not tested
function cmp_getTotalSupplyInUSD(address cTokenAddr) internal view returns(uint totalSupplyInUSD){
return cmp_underlyingValueInUSD(cmp_getTotalSupply(cTokenAddr), cTokenAddr);
}
function cmp_getTotalSupply(address cTokenAddr) internal view returns(uint totalSupply){
CToken cToken = CToken(cTokenAddr);
uint cash = cToken.getCash();
uint totalBorrow = cToken.totalBorrows();
uint totalReserves = cToken.totalReserves();
return cash.add(totalBorrow).sub(totalReserves);
}
function cmp_getCompDistSpeedPerBlock(address cTokenAddr) internal view returns(uint compDistSpeedPerBlock){
Comptroller comptroller = Comptroller(comptrollerAddr);
return comptroller.compSpeeds(cTokenAddr);
}
function cmp_getCompDistAmount(address cTokenAddr, uint numberOfBlocks) internal view returns(uint compDistAmount){
return cmp_getCompDistSpeedPerBlock(cTokenAddr).mul(numberOfBlocks);
}
function cmp_getCurrentCTokenAddrList() internal view returns(address[] memory cTokenAddrList){
Comptroller comptroller = Comptroller(comptrollerAddr);
CToken[] memory allMarkets = comptroller.getAllMarkets();
cTokenAddrList = new address[](cmp_getNumberOfCurrentCTokens(allMarkets));
CToken eachCToken;
uint index;
for(uint i = 0; i < allMarkets.length; i++){
eachCToken = allMarkets[i];
if(!cmp_isCurrentCToken(address(eachCToken))) continue;
cTokenAddrList[index] = address(eachCToken);
index++;
}
return cTokenAddrList;
}
function cmp_getCurrentCTokenSymbolList() internal view returns(string[] memory cTokenSymbolList){
Comptroller comptroller = Comptroller(comptrollerAddr);
CToken[] memory allMarkets = comptroller.getAllMarkets();
cTokenSymbolList = new string[](cmp_getNumberOfCurrentCTokens(allMarkets));
CToken eachCToken;
uint index;
for(uint i = 0; i < allMarkets.length; i++){
eachCToken = allMarkets[i];
if(!cmp_isCurrentCToken(address(eachCToken))) continue;
cTokenSymbolList[index] = eachCToken.symbol();
index++;
}
return cTokenSymbolList;
}
function cmp_isCurrentCToken(address cTokenAddr) internal view returns(bool){
bool isListed;
bool isComped;
Comptroller comptroller = Comptroller(comptrollerAddr);
(isListed, , isComped) = comptroller.markets(cTokenAddr);
if(isListed && isComped) return true;
return false;
}
function cmp_getNumberOfCurrentCTokens(CToken[] memory allMarkets) internal view returns(uint numberOfCurrentCTokens){
for(uint i = 0; i < allMarkets.length; i++){
if(cmp_isCurrentCToken(address(allMarkets[i]))) numberOfCurrentCTokens++;
}
return numberOfCurrentCTokens;
}
function cmp_getPercentageOfStakeOnSupplyMantissa(address acc, address cTokenAddr) internal view returns(uint percentageOfStakeOnSupplyMantissa){
uint supplyByTheAcc = cmp_getUnderlyingBalanceOfAnAcc(acc, cTokenAddr);
return cmp_calPercentageOfStakeOnSupplyMantissa(cTokenAddr, supplyByTheAcc);
}
function cmp_calPercentageOfStakeOnSupplyMantissa(address cTokenAddr, uint supplyByTheAcc) internal view returns(uint percentageOfStakeOnSupplyMantissa){
uint totalSupply = cmp_getTotalSupply(cTokenAddr);
return supplyByTheAcc.mul(oneMantissa).div(totalSupply);
}
function cmp_getPercentageOfStakeOnBorrowMantissa(address acc, address cTokenAddr) internal view returns(uint percentageOfStakeOnBorrowMantissa){
uint err;
uint borrowByTheAcc;
(err, ,borrowByTheAcc, ) = CToken(cTokenAddr).getAccountSnapshot(acc);
if(err != 0){
return 0;
}
return cmp_calPercentageOfStakeOnBorrowMantissa(cTokenAddr, borrowByTheAcc);
}
function cmp_calPercentageOfStakeOnBorrowMantissa(address cTokenAddr, uint borrowByTheAcc) internal view returns(uint percentageOfStakeOnBorrowMantissa){
uint totalBorrow = CToken(cTokenAddr).totalBorrows();
return borrowByTheAcc.mul(oneMantissa).div(totalBorrow);
}
function cmp_getUnderlyingBalanceOfAnAcc(address acc, address cTokenAddr) internal view returns(uint underlyingBalanceOfAnAcc){
CToken cToken = CToken(cTokenAddr);
return cToken.balanceOf(acc).mul(cToken.exchangeRateStored()).div(oneMantissa);
}
function cmp_getBorrowedTokenList(address acc) internal view returns(address[] memory borrowedCTokenList){
CToken[] memory allMarkets = Comptroller(comptrollerAddr).getAllMarkets();
uint length;
for(uint i = 0; i < allMarkets.length; i++){
//require(false, uint2str(CToken(cDAIAddr).borrowBalanceStored(acc)));
if(allMarkets[i].borrowBalanceStored(acc) == 0) continue;
length++;
}
borrowedCTokenList = new address[](length);
uint index;
for(uint i = 0; i < allMarkets.length; i++){
if(allMarkets[i].borrowBalanceStored(acc) == 0) continue;
borrowedCTokenList[index] = address(allMarkets[i]);
index++;
}
return borrowedCTokenList;
}
function cmp_getCollateralFactorMantissa(address cTokenAddr) internal view returns(uint collateralFactorMantissa){
bool isListed;
(isListed, collateralFactorMantissa, ) = Comptroller(comptrollerAddr).markets(cTokenAddr);
if(!isListed) return 0;
return collateralFactorMantissa;
}
}
contract ArrayUtil {
function quickSortDESC(string[] memory keys, uint[] memory values) internal pure returns (string[] memory, uint[] memory){
string[] memory keysPlus = new string[](keys.length + 1);
uint[] memory valuesPlus = new uint[](values.length + 1);
for(uint i = 0; i < keys.length; i++){
keysPlus[i] = keys[i];
valuesPlus[i] = values[i];
}
(keysPlus, valuesPlus) = quickSort(keysPlus, valuesPlus, 0, keysPlus.length - 1);
string[] memory keys_desc = new string[](keys.length);
uint[] memory values_desc = new uint[](values.length);
for(uint i = 0; i < keys.length; i++){
keys_desc[keys.length - 1 - i] = keysPlus[i + 1];
values_desc[keys.length - 1 - i] = valuesPlus[i + 1];
}
return (keys_desc, values_desc);
}
function quickSort(string[] memory keys, uint[] memory values, uint left, uint right) internal pure returns (string[] memory, uint[] memory){
uint i = left;
uint j = right;
uint pivot = values[left + (right - left) / 2];
while (i <= j) {
while (values[i] < pivot) i++;
while (pivot < values[j]) j--;
if (i <= j) {
(keys[i], keys[j]) = (keys[j], keys[i]);
(values[i], values[j]) = (values[j], values[i]);
i++;
j--;
}
}
if (left < j)
quickSort(keys, values, left, j);
if (i < right)
quickSort(keys, values, i, right);
return (keys, values);
}
}
contract Logging is StringUtil{
function debug(string memory name, string[] memory values) internal pure{
string memory log_name = append(name, ": ");
string memory valueStr;
for(uint i = 0; i < values.length; i++){
valueStr = append(valueStr, values[i]);
valueStr = append(valueStr, ", ");
}
require(false, append(log_name, valueStr));
}
function debug(string memory name, address[] memory values) internal pure{
string memory log_name = append(name, ": ");
string memory valueStr;
for(uint i = 0; i < values.length; i++){
valueStr = append(valueStr, address2str(values[i]));
valueStr = append(valueStr, ", ");
}
require(false, append(log_name, valueStr));
}
function debug(string memory name, uint[] memory values) internal pure{
string memory log_name = append(name, ": ");
string memory valueStr;
for(uint i = 0; i < values.length; i++){
valueStr = append(valueStr, uint2str(values[i]));
valueStr = append(valueStr, ", ");
}
require(false, append(log_name, valueStr));
}
function debug(string memory name, string memory value) internal pure{
string memory log_name = append(name, ": ");
string memory valueStr = value;
require(false, append(log_name, valueStr));
}
function debug(string memory name, address value) internal pure{
string memory log_name = append(name, ": ");
string memory valueStr = address2str(value);
require(false, append(log_name, valueStr));
}
function debug(string memory name, uint value) internal pure{
string memory log_name = append(name, ": ");
string memory valueStr = uint2str(value);
require(false, append(log_name, valueStr));
}
function debug(string memory name, bool value) internal pure{
string memory log_name = append(name, ": ");
string memory valueStr = bool2str(value);
require(false, append(log_name, valueStr));
}
event log(string name, address value);
event log(string name, uint value);
event log(string name, string value);
event log(string name, bool value);
event log(string name, uint[] value);
event log(string name, address[] value);
}
contract CompFarmingSummaryV3Model is CompoundMethods, ArrayUtil{
uint256 constant public MAX_INT_NUMBER = 115792089237316195423570985008687907853269984665640564039457584007913129639935;
enum LiquidationRiskRanking{
ZERO_RISK,
INTEREST_RISK_ONLY,
PRICE_MOVEMENT_RISK
}
struct CompProfile{
uint balance;
uint yetToClaimed;
}
struct AccountInterestProfile{
CTokenInterest[] supplyInterests;
CTokenInterest[] borrowInterests;
uint totalInterestInUSD_;
bool isPositiveInterest_;
}
struct CTokenInterest{
address cTokenAddr;
uint interestRateMantissa;
uint balance;
uint numberOfBlocks;
string underlyingSymbol_;
uint interestInUSD_;
}
struct AccountProfile{
SupplyAsset[] suppliedAssets;
BorrowAsset[] borrowedAssets;
uint totalSuppliedInUSD_;
uint totalBorrowedInUSD_;
uint totalSuppliedInUsdAsCollateral_;
uint borrowLimitPCTMantissa_;
uint accountCapital_;
uint[] borrowLimitPCTLineItemMantissaList;
}
struct SupplyAsset{
Asset asset;
uint collateralFactorMantissa_;
uint suppliedInUsdAsCollateral_;
}
struct BorrowAsset{
Asset asset;
}
struct Asset{
address cTokenAddr;
uint amount;
string underlyingSymbol_;
uint underlyingDecimals_;
uint valueInUSD_;
uint compSpeed_;
}
function createCTokenInterest(address cTokenAddr, uint interestRateMantissa, uint balance, uint numberOfBlocks) internal view returns(CTokenInterest memory cTokenInterest){
cTokenInterest.cTokenAddr = cTokenAddr;
cTokenInterest.interestRateMantissa = interestRateMantissa;
cTokenInterest.balance = balance;
cTokenInterest.numberOfBlocks = numberOfBlocks;
refreshCTokenInterest(cTokenInterest);
return cTokenInterest;
}
function refreshCTokenInterest(CTokenInterest memory cTokenInterest) internal view{
cTokenInterest.underlyingSymbol_ = cmp_getUnderlyingSymbol(cTokenInterest.cTokenAddr);
cTokenInterest.interestInUSD_ = cmp_underlyingValueInUSD(cTokenInterest.balance.mul(cTokenInterest.interestRateMantissa), cTokenInterest.cTokenAddr).mul(cTokenInterest.numberOfBlocks).div(oneMantissa);
}
function createAccountInterestProfile(CTokenInterest[] memory supplyInterests, CTokenInterest[] memory borrowInterests) internal pure returns(AccountInterestProfile memory accountInterestProfile){
accountInterestProfile.supplyInterests = supplyInterests;
accountInterestProfile.borrowInterests = borrowInterests;
refreshAccountInterestProfile(accountInterestProfile);
return accountInterestProfile;
}
function refreshAccountInterestProfile(AccountInterestProfile memory accountInterestProfile) internal pure {
uint totalSupplyInterestInUSD;
uint totalBorrowInterestInUSD;
for(uint i = 0; i < accountInterestProfile.supplyInterests.length; i++){
totalSupplyInterestInUSD += accountInterestProfile.supplyInterests[i].interestInUSD_;
}
for(uint i = 0; i < accountInterestProfile.borrowInterests.length; i++){
totalBorrowInterestInUSD += accountInterestProfile.borrowInterests[i].interestInUSD_;
}
if(totalSupplyInterestInUSD > totalBorrowInterestInUSD){
accountInterestProfile.totalInterestInUSD_ = totalSupplyInterestInUSD.sub(totalBorrowInterestInUSD);
accountInterestProfile.isPositiveInterest_ = true;
}
if(totalSupplyInterestInUSD <= totalBorrowInterestInUSD){
accountInterestProfile.totalInterestInUSD_ = totalBorrowInterestInUSD.sub(totalSupplyInterestInUSD);
accountInterestProfile.isPositiveInterest_ = false;
}
}
function createSupplyAsset(address cTokenAddr, uint amount) internal view returns(SupplyAsset memory supplyAsset){
Asset memory asset = createAsset(cTokenAddr, amount);
supplyAsset.asset = asset;
refreshSupplyAsset(supplyAsset);
return supplyAsset;
}
function createBorrowAsset(address cTokenAddr, uint amount) internal view returns(BorrowAsset memory borrowAsset){
Asset memory asset = createAsset(cTokenAddr, amount);
borrowAsset.asset = asset;
return borrowAsset;
}
function updateSupplyAssetAmount(SupplyAsset memory supplyAsset, uint newAmount) internal view{
supplyAsset.asset.amount = newAmount;
refreshAsset(supplyAsset.asset);
refreshSupplyAsset(supplyAsset);
}
function updateBorrowAssetAmount(BorrowAsset memory borrowAsset, uint newAmount) internal view{
borrowAsset.asset.amount = newAmount;
refreshAsset(borrowAsset.asset);
}
function refreshSupplyAsset(SupplyAsset memory supplyAsset) internal view{
supplyAsset.collateralFactorMantissa_ = cmp_getCollateralFactorMantissa(supplyAsset.asset.cTokenAddr);
supplyAsset.suppliedInUsdAsCollateral_ = supplyAsset.asset.valueInUSD_.mul(supplyAsset.collateralFactorMantissa_).div(oneMantissa);
}
function createAsset(address cTokenAddr, uint amount) internal view returns(Asset memory asset){
updateAsset(asset, cTokenAddr, amount);
return asset;
}
function updateAsset(Asset memory asset, address cTokenAddr, uint amount) internal view{
asset.cTokenAddr = cTokenAddr;
asset.amount = amount;
refreshAsset(asset);
}
function refreshAsset(Asset memory asset) internal view{
asset.underlyingSymbol_ = cmp_getUnderlyingSymbol(asset.cTokenAddr);
asset.underlyingDecimals_ = cmp_getUnderlyingDecimals(asset.cTokenAddr);
asset.valueInUSD_ = cmp_underlyingValueInUSD(asset.amount, asset.cTokenAddr);
asset.compSpeed_ = cmp_getCompDistSpeedPerBlock(asset.cTokenAddr);
}
function createAccountProfile(SupplyAsset[] memory suppliedAssets, BorrowAsset[] memory borrowedAssets) internal pure returns(AccountProfile memory accountProfile){
accountProfile.suppliedAssets = suppliedAssets;
accountProfile.borrowedAssets = borrowedAssets;
refreshAccountProfile(accountProfile);
}
function refreshAccountProfile(AccountProfile memory accountProfile) internal pure{
accountProfile.totalSuppliedInUSD_ = calTotalSuppliedInUSD(accountProfile.suppliedAssets);
accountProfile.totalBorrowedInUSD_ = calTotalBorrowedInUSD(accountProfile.borrowedAssets);
accountProfile.totalSuppliedInUsdAsCollateral_ = calTotalSuppliedInUsdAsCollateral(accountProfile.suppliedAssets);
accountProfile.accountCapital_ = calAccountCapital(accountProfile.totalSuppliedInUSD_, accountProfile.totalBorrowedInUSD_);
accountProfile.borrowLimitPCTMantissa_ = calBorrowLimitPCTMantissa(accountProfile.totalSuppliedInUsdAsCollateral_, accountProfile.totalBorrowedInUSD_);
accountProfile.borrowLimitPCTLineItemMantissaList = calBorrowLimitPCTLineItemMantissaList(accountProfile.suppliedAssets, accountProfile.borrowedAssets);
}
function calTotalSuppliedInUSD(SupplyAsset[] memory suppliedAssets) internal pure returns(uint totalSuppliedInUSD){
for(uint i = 0; i < suppliedAssets.length; i++){
totalSuppliedInUSD += suppliedAssets[i].asset.valueInUSD_;
}
return totalSuppliedInUSD;
}
function calTotalBorrowedInUSD(BorrowAsset[] memory borrowedAssets) internal pure returns(uint totalBorrowedInUSD){
for(uint i = 0; i < borrowedAssets.length; i++){
totalBorrowedInUSD += borrowedAssets[i].asset.valueInUSD_;
}
return totalBorrowedInUSD;
}
function calTotalSuppliedInUsdAsCollateral(SupplyAsset[] memory suppliedAssets) internal pure returns(uint totalSuppliedInUsdAsCollateral){
for(uint i = 0; i < suppliedAssets.length; i++){
totalSuppliedInUsdAsCollateral += suppliedAssets[i].suppliedInUsdAsCollateral_;
}
return totalSuppliedInUsdAsCollateral;
}
function calBorrowLimitPCTMantissa(uint totalSuppliedInUsdAsCollateral, uint totalBorrowedInUSD) internal pure returns(uint borrowLimitPCTMantissa){
if(totalSuppliedInUsdAsCollateral == 0) return oneMantissa;
return totalBorrowedInUSD.mul(oneMantissa).div(totalSuppliedInUsdAsCollateral);
}
function calBorrowLimitPCTLineItemMantissaList(SupplyAsset[] memory suppliedAssets, BorrowAsset[] memory borrowedAssets) internal pure returns(uint[] memory borrowLimitPCTLineItemMantissaList){
borrowLimitPCTLineItemMantissaList = new uint[](suppliedAssets.length);
bool _hasFound;
BorrowAsset memory _borrowedAsset;
for(uint i = 0; i < suppliedAssets.length; i++){
(_hasFound, _borrowedAsset) = findBorrowedAssetBycTokenAddr(suppliedAssets[i].asset.cTokenAddr, borrowedAssets);
if(suppliedAssets[i].suppliedInUsdAsCollateral_ == 0){
borrowLimitPCTLineItemMantissaList[i] = MAX_INT_NUMBER;
}
if(!_hasFound){
borrowLimitPCTLineItemMantissaList[i] = 0;
continue;
}
if(suppliedAssets[i].suppliedInUsdAsCollateral_ != 0){
borrowLimitPCTLineItemMantissaList[i] = _borrowedAsset.asset.valueInUSD_.mul(oneMantissa).div(suppliedAssets[i].suppliedInUsdAsCollateral_);
}
}
return borrowLimitPCTLineItemMantissaList;
}
function calAccountCapital(uint totalSuppliedInUSD, uint totalBorrowedInUSD) internal pure returns(uint accountCapital){
if(totalSuppliedInUSD > totalBorrowedInUSD){
return totalSuppliedInUSD.sub(totalBorrowedInUSD);
}
return 0;
}
function findBorrowedAssetBycTokenAddr(address cTokenAddr, BorrowAsset[] memory borrowedAssets) internal pure returns(bool hasFound, BorrowAsset memory borrowAsset){
for(uint i = 0; i < borrowedAssets.length; i++){
if(borrowedAssets[i].asset.cTokenAddr == cTokenAddr) return (true, borrowedAssets[i]);
}
return (false, borrowAsset);
}
function addSuppliedAsset(AccountProfile memory accountProfile, SupplyAsset memory supplyAsset) internal view{
for(uint i = 0; i < accountProfile.suppliedAssets.length; i++){
if(accountProfile.suppliedAssets[i].asset.cTokenAddr != supplyAsset.asset.cTokenAddr) continue;
updateSupplyAssetAmount(accountProfile.suppliedAssets[i], accountProfile.suppliedAssets[i].asset.amount.add(supplyAsset.asset.amount));
refreshAccountProfile(accountProfile);
return;
}
//if not matching existing supplyAsset found
uint length = accountProfile.suppliedAssets.length.add(1);
SupplyAsset[] memory newSupplyAsset = new SupplyAsset[](length);
for(uint i = 0; i < accountProfile.suppliedAssets.length; i++){
newSupplyAsset[i] = accountProfile.suppliedAssets[i];
}
newSupplyAsset[length-1] = supplyAsset;
accountProfile.suppliedAssets = newSupplyAsset;
refreshAccountProfile(accountProfile);
}
function addBorrowAsset(AccountProfile memory accountProfile, BorrowAsset memory borrowAsset) internal view{
for(uint i = 0; i < accountProfile.borrowedAssets.length; i++){
if(accountProfile.borrowedAssets[i].asset.cTokenAddr != borrowAsset.asset.cTokenAddr) continue;
updateBorrowAssetAmount(accountProfile.borrowedAssets[i], accountProfile.borrowedAssets[i].asset.amount.add(borrowAsset.asset.amount));
refreshAccountProfile(accountProfile);
return;
}
uint length = accountProfile.borrowedAssets.length.add(1);
BorrowAsset[] memory newBorrowAssets = new BorrowAsset[](length);
for(uint i = 0; i < accountProfile.borrowedAssets.length; i++){
newBorrowAssets[i] = accountProfile.borrowedAssets[i];
}
newBorrowAssets[length-1] = borrowAsset;
accountProfile.borrowedAssets = newBorrowAssets;
refreshAccountProfile(accountProfile);
}
function findSuppliedAsset(address cTokenAddr, SupplyAsset[] memory supplyAssets) internal pure returns(bool hasFound, SupplyAsset memory supplyAsset){
for(uint i = 0; i < supplyAssets.length; i++){
if(cTokenAddr == supplyAssets[i].asset.cTokenAddr){
return (true, supplyAssets[i]);
}
}
return (false, supplyAsset);
}
function findBorrowAsset(address cTokenAddr, BorrowAsset[] memory borrowAssets) internal pure returns(bool hasFound, BorrowAsset memory borrowAsset){
for(uint i = 0; i < borrowAssets.length; i++){
if(cTokenAddr == borrowAssets[i].asset.cTokenAddr){
return (true, borrowAssets[i]);
}
}
return (false, borrowAsset);
}
function removeEmptySupplyAsset(SupplyAsset[] memory supplyAssets) internal pure returns(SupplyAsset[] memory newSupplyAssets){
uint length;
for(uint i = 0; i < supplyAssets.length; i++){
if(supplyAssets[i].asset.valueInUSD_ == 0) continue;
length++;
}
newSupplyAssets = new SupplyAsset[](length);
uint index;
for(uint i = 0; i < supplyAssets.length; i++){
if(supplyAssets[i].asset.valueInUSD_ == 0) continue;
newSupplyAssets[index] = supplyAssets[i];
index++;
}
return newSupplyAssets;
}
function removeEmptyBorrowAsset(BorrowAsset[] memory borrowAssets) internal pure returns(BorrowAsset[] memory newBorrowAssets){
uint length;
for(uint i = 0; i < borrowAssets.length; i++){
if(borrowAssets[i].asset.valueInUSD_ == 0) continue;
length++;
}
newBorrowAssets = new BorrowAsset[](length);
uint index;
for(uint i = 0; i < borrowAssets.length; i++){
if(borrowAssets[i].asset.valueInUSD_ == 0) continue;
newBorrowAssets[index] = borrowAssets[i];
index++;
}
return newBorrowAssets;
}
}
contract CompFarmingSummaryV3 is CompFarmingSummaryV3Model{
string constant public version = "v3";
uint constant internal n80PCTMantissa = 800000000000000000;
uint constant internal n1PCTMantissa = 10000000000000000;
uint constant internal borrowLimitPCTDelta = 50000000000000000;
function getCompProfile(address acc) external returns(CompProfile memory compProfile){
return getCompProfileInternal(acc);
}
function getCOMPPriceInUSD() public view returns(uint compPriceInUSD){
return cmp_getUnderlyingPriceInUSD(cCOMPAddr);
}
//bulk testing required
function getTotalCompReceivable(address acc, uint numberOfBlocks) public view returns(uint totalCompReceivable){
return getTotalCompReceivableInternal(acc, numberOfBlocks);
}
function getTotalCompReceivablByAP(AccountProfile memory accountProfile, uint numberOfBlocks) public view returns(uint compReceivable){
return getTotalCompReceivableInternal(accountProfile, numberOfBlocks);
}
//bulk testing done
function getAccountProfile(address acc) external view returns(AccountProfile memory accountProfile){
return getAccountProfileInternal(acc);
}
function getAccountInterestProfile(address acc, uint numberOfBlocks) external view returns(AccountInterestProfile memory accountInterestProfile){
return getAccountInterestProfileInternal(acc, numberOfBlocks);
}
function getFarmingAccountProfileByAP(AccountProfile memory accountProfile, uint targetedBorrowLimitPCTMantissa) public view returns(bool isValidated, AccountProfile memory farmingAccountProfile){
return getFarmingAccountProfileInternal(accountProfile, targetedBorrowLimitPCTMantissa);
}
function getAccountInterestProfileByAP(AccountProfile memory accountProfile, uint numberOfBlocks) public view returns(AccountInterestProfile memory accountInterestProfile){
return getAccountInterestProfileInternal(accountProfile, numberOfBlocks);
}
//bulk testing done
function getLiquidationRiskRanking(address acc) external view returns(LiquidationRiskRanking liquidationRiskRanking){
return getLiquidationRiskRankingInternal(acc);
}
function getLiquidationRiskRankingByAP(AccountProfile memory accountProfile) public view returns(LiquidationRiskRanking liquidationRiskRanking){
return getLiquidationRiskRankingInternal(accountProfile);
}
function getMaxInterestAccountProfileByAP(AccountProfile memory accountProfile) public view returns(bool isValidated, AccountProfile memory maxInterestAccountProfile){
return getMaxInterestAccountProfileInternal(accountProfile);
}
//internal functions below
function getTotalCompReceivableInternal(address acc, uint numberOfBlocks) internal view returns(uint compReceivable){
return getTotalCompReceivableInternal(getAccountProfileInternal(acc), numberOfBlocks);
}
function getCompReceivableOfCToken(uint supplyByTheAcc, uint borrowByTheAcc, address cTokenAddr, uint numberOfBlocks) internal view returns(uint compReceivableByCToken){
uint compDistAmount = cmp_getCompDistAmount(cTokenAddr, numberOfBlocks);
uint percentageOfStakeOnSupplyMantissa = cmp_calPercentageOfStakeOnSupplyMantissa(cTokenAddr, supplyByTheAcc);
uint percentageOfStakeOnBorrowMantissa = cmp_calPercentageOfStakeOnBorrowMantissa(cTokenAddr, borrowByTheAcc);
uint decimals = cmp_getUnderlyingDecimals(cCOMPAddr);
//formula: compDistAmount * (stakeSupplied + stakeBorrowed)
compReceivableByCToken = compDistAmount.mul(percentageOfStakeOnSupplyMantissa.add(percentageOfStakeOnBorrowMantissa)).div(10**decimals);
return compReceivableByCToken;
}
function getTotalCompReceivableInternal(AccountProfile memory accountProfile, uint numberOfBlocks) internal view returns(uint compReceivable){
SupplyAsset[] memory suppliedAssets = accountProfile.suppliedAssets;
BorrowAsset[] memory borrowedAssets = accountProfile.borrowedAssets;
for(uint i = 0; i < suppliedAssets.length; i++){
compReceivable += getCompReceivableOfCToken(suppliedAssets[i].asset.amount, 0, suppliedAssets[i].asset.cTokenAddr, numberOfBlocks);
}
for(uint i = 0; i < borrowedAssets.length; i++){
compReceivable += getCompReceivableOfCToken(0, borrowedAssets[i].asset.amount, borrowedAssets[i].asset.cTokenAddr, numberOfBlocks);
}
return compReceivable;
}
function getCompProfileInternal(address acc) internal returns(CompProfile memory compProfile){
compProfile.balance = ERC20(compAddr).balanceOf(acc);
CompoundLens compoundLens = CompoundLens(compoundLensAddr);
compProfile.yetToClaimed = compoundLens.getCompBalanceMetadataExt(Comp(compAddr), ComptrollerLensInterface(comptrollerAddr), acc).allocated;
}
function getAccountProfileInternal(address acc) internal view returns(AccountProfile memory accountProfile){
SupplyAsset[] memory suppliedAssets = getSuppliedAssets(acc);
BorrowAsset[] memory borrowedAssets = getBorrowedAssets(acc);
return createAccountProfile(suppliedAssets, borrowedAssets);
}
function getSuppliedAssets(address acc) internal view returns(SupplyAsset[] memory suppliedAssets){
address[] memory suppliedCTokenAddrList = Comptroller(comptrollerAddr).getAssetsIn(acc);
suppliedAssets = new SupplyAsset[](suppliedCTokenAddrList.length);
for(uint i = 0; i < suppliedCTokenAddrList.length; i++){
//filter out cSAI
//if(suppliedCTokenAddrList[i] == 0xF5DCe57282A584D2746FaF1593d3121Fcac444dC) continue;
suppliedAssets[i] = createSupplyAsset(suppliedCTokenAddrList[i], cmp_getUnderlyingBalanceOfAnAcc(acc, suppliedCTokenAddrList[i]));
}
suppliedAssets = removeEmptySupplyAsset(suppliedAssets);
return suppliedAssets;
}
function getBorrowedAssets(address acc) internal view returns(BorrowAsset[] memory borrowedAssets){
address[] memory borrowedCTokenList = cmp_getBorrowedTokenList(acc);
borrowedAssets = new BorrowAsset[](borrowedCTokenList.length);
for(uint i = 0; i < borrowedCTokenList.length; i++){
borrowedAssets[i] = createBorrowAsset(borrowedCTokenList[i], CToken(borrowedCTokenList[i]).borrowBalanceStored(acc));
}
borrowedAssets = removeEmptyBorrowAsset(borrowedAssets);
return borrowedAssets;
}
function getFarmingAccountProfileInternal(AccountProfile memory accountProfile, uint targetedBorrowLimitPCTMantissa) internal view returns(bool isValidated, AccountProfile memory farmingAccountProfile){
//liquidation risk ranking needs to be lower or equials to 2
if(uint(getLiquidationRiskRankingInternal(accountProfile)) > 1) return (false, farmingAccountProfile);
//each supplied asset, run borrowANDsupplym check util borrowLimitsPCTPerAsset hits 80%withDelta
SupplyAsset[] memory suppliedAssets = accountProfile.suppliedAssets;
for(uint i = 0; i < suppliedAssets.length; i++){
if(suppliedAssets[i].collateralFactorMantissa_ == 0) continue;
uint maxBorrowAmount;
BorrowAsset memory moreBorrowAsset;
SupplyAsset memory moreSupplyAsset;
while(accountProfile.borrowLimitPCTLineItemMantissaList[i] <= targetedBorrowLimitPCTMantissa.sub(n1PCTMantissa)){
maxBorrowAmount = suppliedAssets[i].asset.amount.mul(suppliedAssets[i].collateralFactorMantissa_).mul(targetedBorrowLimitPCTMantissa.sub(accountProfile.borrowLimitPCTLineItemMantissaList[i])).div(oneMantissa).div(oneMantissa);
moreBorrowAsset = createBorrowAsset(suppliedAssets[i].asset.cTokenAddr, maxBorrowAmount);
moreSupplyAsset = createSupplyAsset(suppliedAssets[i].asset.cTokenAddr, maxBorrowAmount);
addBorrowAsset(accountProfile, moreBorrowAsset);
addSuppliedAsset(accountProfile, moreSupplyAsset);
}
}
return (true, accountProfile);
}
function getAccountInterestProfileInternal(address acc, uint numberOfBlocks) internal view returns(AccountInterestProfile memory accountInterestProfile){
return getAccountInterestProfileInternal(getAccountProfileInternal(acc), numberOfBlocks);
}
function getAccountInterestProfileInternal(AccountProfile memory accountProfile, uint numberOfBlocks) internal view returns(AccountInterestProfile memory accountInterestProfile){
return createAccountInterestProfile(getSupplyInterests(accountProfile.suppliedAssets, numberOfBlocks), getBorrowInterests(accountProfile.borrowedAssets, numberOfBlocks));
}
function getSupplyInterests(SupplyAsset[] memory supplyAssets, uint numberOfBlocks) internal view returns(CTokenInterest[] memory supplyInterests){
supplyInterests = new CTokenInterest[](supplyAssets.length);
address cTokenAddr;
uint interestRateMantissa;
uint balance;
for(uint i = 0; i < supplyAssets.length; i++){
cTokenAddr = supplyAssets[i].asset.cTokenAddr;
interestRateMantissa = CToken(cTokenAddr).supplyRatePerBlock();
balance = supplyAssets[i].asset.amount;
supplyInterests[i] = createCTokenInterest(cTokenAddr, interestRateMantissa, balance, numberOfBlocks);
}
return supplyInterests;
}
function getBorrowInterests(BorrowAsset[] memory borrowedAssets, uint numberOfBlocks) internal view returns(CTokenInterest[] memory borrowInterests){
borrowInterests = new CTokenInterest[](borrowedAssets.length);
address cTokenAddr;
uint interestRateMantissa;
uint balance;
for(uint i = 0; i < borrowedAssets.length; i++){
cTokenAddr = borrowedAssets[i].asset.cTokenAddr;
interestRateMantissa = CToken(cTokenAddr).borrowRatePerBlock();
balance = borrowedAssets[i].asset.amount;
borrowInterests[i] = createCTokenInterest(cTokenAddr, interestRateMantissa, balance, numberOfBlocks);
}
return borrowInterests;
}
function getLiquidationRiskRankingInternal(AccountProfile memory accountProfile) internal view returns(LiquidationRiskRanking liquidationRiskRanking){
//find all the supplied asset
//find all the matching asset
//find calBorrowLimitPCTLineItemMantissaList
//check to see if any borrowed asset outside from supplied asset, acceptable asset require valueInUSD over 1
//check to see if any borrowed asset with underlying supplied of 0 collateral factor
//get account interest profile
liquidationRiskRanking = LiquidationRiskRanking.ZERO_RISK;
///
if(!getAccountInterestProfileInternal(accountProfile, 1).isPositiveInterest_){
liquidationRiskRanking = LiquidationRiskRanking.INTEREST_RISK_ONLY;
}
for(uint i = 0; i < accountProfile.borrowLimitPCTLineItemMantissaList.length; i++){
if(accountProfile.borrowLimitPCTLineItemMantissaList[i] == MAX_INT_NUMBER) continue;
if(accountProfile.borrowLimitPCTLineItemMantissaList[i] > oneMantissa) {
liquidationRiskRanking = LiquidationRiskRanking.PRICE_MOVEMENT_RISK;
break;
}
}
bool hasFound;
SupplyAsset memory suppliedAsset;
for(uint i = 0; i < accountProfile.borrowedAssets.length; i++){
if(accountProfile.borrowedAssets[i].asset.valueInUSD_ < oneMantissa) continue; //filter small value asset(asset USD value less than 1 USD)
(hasFound, suppliedAsset) = findSuppliedAsset(accountProfile.borrowedAssets[i].asset.cTokenAddr, accountProfile.suppliedAssets);
if(!hasFound){
liquidationRiskRanking = LiquidationRiskRanking.PRICE_MOVEMENT_RISK;
break;
}
if(suppliedAsset.collateralFactorMantissa_ == 0){
liquidationRiskRanking = LiquidationRiskRanking.PRICE_MOVEMENT_RISK;
break;
}
}
return liquidationRiskRanking;
}
function getLiquidationRiskRankingInternal(address acc) internal view returns(LiquidationRiskRanking liquidationRiskRanking){
return getLiquidationRiskRankingInternal(getAccountProfileInternal(acc));
}
function getMaxInterestAccountProfileInternal(AccountProfile memory accountProfile) internal view returns(bool isValidated, AccountProfile memory maxInterestAccountProfile){
if(uint(getLiquidationRiskRankingInternal(accountProfile)) > 1) return (false, maxInterestAccountProfile);
SupplyAsset[] memory newSupplyAssets = new SupplyAsset[](accountProfile.suppliedAssets.length);
address cTokenAddr;
uint amount;
bool hasFound;
BorrowAsset memory borrowedAsset;
for(uint i = 0; i < accountProfile.suppliedAssets.length; i++){
cTokenAddr = accountProfile.suppliedAssets[i].asset.cTokenAddr;
(hasFound, borrowedAsset) = findBorrowAsset(cTokenAddr, accountProfile.borrowedAssets);
if(!hasFound){
amount = accountProfile.suppliedAssets[i].asset.amount;
}
amount = accountProfile.suppliedAssets[i].asset.amount.sub(borrowedAsset.asset.amount);
newSupplyAssets[i] = createSupplyAsset(cTokenAddr, amount);
}
BorrowAsset[] memory borrowedAssets;
return (true, createAccountProfile(newSupplyAssets, borrowedAssets));
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"err","type":"uint256"}],"name":"fail","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"err","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"detail","type":"uint256"}],"name":"fail","type":"event"},{"constant":true,"inputs":[],"name":"MAX_INT_NUMBER","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getAccountInterestProfile","outputs":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"supplyInterests","type":"tuple[]"},{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"borrowInterests","type":"tuple[]"},{"internalType":"uint256","name":"totalInterestInUSD_","type":"uint256"},{"internalType":"bool","name":"isPositiveInterest_","type":"bool"}],"internalType":"struct CompFarmingSummaryV3Model.AccountInterestProfile","name":"accountInterestProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getAccountInterestProfileByAP","outputs":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"supplyInterests","type":"tuple[]"},{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"interestRateMantissa","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"interestInUSD_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CTokenInterest[]","name":"borrowInterests","type":"tuple[]"},{"internalType":"uint256","name":"totalInterestInUSD_","type":"uint256"},{"internalType":"bool","name":"isPositiveInterest_","type":"bool"}],"internalType":"struct CompFarmingSummaryV3Model.AccountInterestProfile","name":"accountInterestProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"getAccountProfile","outputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCOMPPriceInUSD","outputs":[{"internalType":"uint256","name":"compPriceInUSD","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"getCWBTCAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"getCompProfile","outputs":[{"components":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"yetToClaimed","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.CompProfile","name":"compProfile","type":"tuple"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"},{"internalType":"uint256","name":"targetedBorrowLimitPCTMantissa","type":"uint256"}],"name":"getFarmingAccountProfileByAP","outputs":[{"internalType":"bool","name":"isValidated","type":"bool"},{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"farmingAccountProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"}],"name":"getLiquidationRiskRanking","outputs":[{"internalType":"enum CompFarmingSummaryV3Model.LiquidationRiskRanking","name":"liquidationRiskRanking","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"}],"name":"getLiquidationRiskRankingByAP","outputs":[{"internalType":"enum CompFarmingSummaryV3Model.LiquidationRiskRanking","name":"liquidationRiskRanking","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"}],"name":"getMaxInterestAccountProfileByAP","outputs":[{"internalType":"bool","name":"isValidated","type":"bool"},{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"maxInterestAccountProfile","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"},{"internalType":"uint256","name":"collateralFactorMantissa_","type":"uint256"},{"internalType":"uint256","name":"suppliedInUsdAsCollateral_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.SupplyAsset[]","name":"suppliedAssets","type":"tuple[]"},{"components":[{"components":[{"internalType":"address","name":"cTokenAddr","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"string","name":"underlyingSymbol_","type":"string"},{"internalType":"uint256","name":"underlyingDecimals_","type":"uint256"},{"internalType":"uint256","name":"valueInUSD_","type":"uint256"},{"internalType":"uint256","name":"compSpeed_","type":"uint256"}],"internalType":"struct CompFarmingSummaryV3Model.Asset","name":"asset","type":"tuple"}],"internalType":"struct CompFarmingSummaryV3Model.BorrowAsset[]","name":"borrowedAssets","type":"tuple[]"},{"internalType":"uint256","name":"totalSuppliedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalBorrowedInUSD_","type":"uint256"},{"internalType":"uint256","name":"totalSuppliedInUsdAsCollateral_","type":"uint256"},{"internalType":"uint256","name":"borrowLimitPCTMantissa_","type":"uint256"},{"internalType":"uint256","name":"accountCapital_","type":"uint256"},{"internalType":"uint256[]","name":"borrowLimitPCTLineItemMantissaList","type":"uint256[]"}],"internalType":"struct CompFarmingSummaryV3Model.AccountProfile","name":"accountProfile","type":"tuple"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getTotalCompReceivablByAP","outputs":[{"internalType":"uint256","name":"compReceivable","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"acc","type":"address"},{"internalType":"uint256","name":"numberOfBlocks","type":"uint256"}],"name":"getTotalCompReceivable","outputs":[{"internalType":"uint256","name":"totalCompReceivable","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b506149df806100206000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063bee42a951161008c578063f690a1f611610066578063f690a1f6146102ac578063fa57b27d146102dc578063fcdf209b1461030d578063fe7c5f4b1461033d576100ea565b8063bee42a951461021b578063cbe3b1be1461024b578063e9bf882a1461027b576100ea565b806354fd4d50116100c857806354fd4d501461017f57806359883d791461019d5780635d2a23f8146101bb5780638ab8e35b146101eb576100ea565b806307dc96dd146100ef5780633d44b4561461011f5780634874cf8f1461014f575b600080fd5b61010960048036036101049190810190613da8565b61035b565b604051610116919061441f565b60405180910390f35b61013960048036036101349190810190613d2b565b6103a0565b6040516101469190614558565b60405180910390f35b61016960048036036101649190810190613b4a565b6103b4565b604051610176919061453d565b60405180910390f35b6101876103cc565b60405161019491906144d7565b60405180910390f35b6101a5610405565b6040516101b29190614558565b60405180910390f35b6101d560048036036101d09190810190613b4a565b610429565b6040516101e291906144bc565b60405180910390f35b61020560048036036102009190810190613b9c565b61043b565b6040516102129190614558565b60405180910390f35b61023560048036036102309190810190613b9c565b61044f565b60405161024291906144f9565b60405180910390f35b61026560048036036102609190810190613b4a565b610469565b604051610272919061451b565b60405180910390f35b61029560048036036102909190810190613d2b565b610481565b6040516102a392919061443a565b60405180910390f35b6102c660048036036102c19190810190613cea565b6104a0565b6040516102d391906144bc565b60405180910390f35b6102f660048036036102f19190810190613cea565b6104b2565b60405161030492919061443a565b60405180910390f35b61032760048036036103229190810190613d2b565b6104ce565b60405161033491906144f9565b60405180910390f35b6103456104e8565b6040516103529190614558565b60405180910390f35b600062b82beb82106103835773ccf4429db6322d5c611ee964527d42e5d685dd6a905061039b565b73c11b1268c1a384e55c48c2391d8d480264a3a7f490505b919050565b60006103ac838361050c565b905092915050565b6103bc613267565b6103c5826105f3565b9050919050565b6040518060400160405280600281526020017f763300000000000000000000000000000000000000000000000000000000000081525081565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600061043482610784565b9050919050565b6000610447838361079e565b905092915050565b610457613281565b61046183836107ba565b905092915050565b6104716132ab565b61047a826107dc565b9050919050565b600061048b6132ab565b6104958484610811565b915091509250929050565b60006104ab82610a09565b9050919050565b60006104bc6132ab565b6104c583610b7f565b91509150915091565b6104d6613281565b6104e08383610cfe565b905092915050565b60006105077370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4610d32565b905090565b600060608360000151905060608460200151905060008090505b82518110156105835761057283828151811061053e57fe5b60200260200101516000015160200151600085848151811061055c57fe5b6020026020010151600001516000015188611041565b840193508080600101915050610526565b5060008090505b81518110156105e7576105d660008383815181106105a457fe5b602002602001015160000151602001518484815181106105c057fe5b6020026020010151600001516000015188611041565b84019350808060010191505061058a565b50829250505092915050565b6105fb613267565b73c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610648919061441f565b60206040518083038186803b15801561066057600080fd5b505afa158015610674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106989190810190613dd1565b816000018181525050600073d513d22422a3062bd342ae374b4b9c20e0a9a07490508073ffffffffffffffffffffffffffffffffffffffff16631ea6374173c00e94cb662c3520282e6f5717214004a7f26888733d9819210a31b4961b30ef54be2aed79b9c9cd3b866040518463ffffffff1660e01b815260040161071f93929190614485565b608060405180830381600087803b15801561073957600080fd5b505af115801561074d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107719190810190613d7f565b6060015182602001818152505050919050565b6000610797610792836107dc565b610a09565b9050919050565b60006107b26107ac846107dc565b8361050c565b905092915050565b6107c2613281565b6107d46107ce846107dc565b83610cfe565b905092915050565b6107e46132ab565b60606107ef836110d8565b905060606107fc8461123e565b9050610808828261138a565b92505050919050565b600061081b6132ab565b600161082685610a09565b600281111561083157fe5b11156108435760008191509150610a02565b60608460000151905060008090505b81518110156109f857600082828151811061086957fe5b6020026020010151602001511415610880576109eb565b600061088a6132f0565b610892613309565b5b6108ad662386f26fc10000896113b390919063ffffffff16565b8960e0015185815181106108bd57fe5b6020026020010151116109e75761097e670de0b6b3a7640000610970670de0b6b3a764000061096261090f8e60e001518a815181106108f857fe5b60200260200101518e6113b390919063ffffffff16565b6109548b8b8151811061091e57fe5b6020026020010151602001518c8c8151811061093657fe5b602002602001015160000151602001516113ca90919063ffffffff16565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b6113fe90919063ffffffff16565b92506109a585858151811061098f57fe5b6020026020010151600001516000015184611412565b91506109cc8585815181106109b657fe5b6020026020010151600001516000015184611441565b90506109d88983611479565b6109e28982611642565b610893565b5050505b8080600101915050610852565b5060018592509250505b9250929050565b6000809050610a19826001610cfe565b60600151610a2657600190505b60008090505b8260e0015151811015610abb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360e001518281518110610a6a57fe5b60200260200101511415610a7d57610aae565b670de0b6b3a76400008360e001518281518110610a9657fe5b60200260200101511115610aad5760029150610abb565b5b8080600101915050610a2c565b506000610ac6613309565b60008090505b846020015151811015610b7457670de0b6b3a764000085602001518281518110610af257fe5b602002602001015160000151608001511015610b0d57610b67565b610b3a85602001518281518110610b2057fe5b60200260200101516000015160000151866000015161180b565b809350819450505082610b505760029350610b74565b600082602001511415610b665760029350610b74565b5b8080600101915050610acc565b508292505050919050565b6000610b896132ab565b6001610b9484610a09565b6002811115610b9f57fe5b1115610bb15760008191509150610cf9565b6060836000015151604051908082528060200260200182016040528015610bf257816020015b610bdf613330565b815260200190600190039081610bd75790505b5090506000806000610c026132f0565b60008090505b886000015151811015610cdf5788600001518181518110610c2557fe5b602002602001015160000151600001519450610c45858a602001516118b3565b809350819450505082610c755788600001518181518110610c6257fe5b6020026020010151600001516020015193505b610caf8260000151602001518a600001518381518110610c9157fe5b602002602001015160000151602001516113b390919063ffffffff16565b9350610cbb8585611441565b868281518110610cc757fe5b60200260200101819052508080600101915050610c08565b5060606001610cee878361138a565b975097505050505050505b915091565b610d06613281565b610d2a610d1784600001518461195b565b610d25856020015185611aa8565b611bf5565b905092915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8f57600080fd5b505afa158015610da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dc79190810190613b73565b90507339aa39c021dfbae8fac545936693ac917d5e756373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e56575073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610e6f57670de0b6b3a764000091508191505061103c565b73ccf4429db6322d5c611ee964527d42e5d685dd6a73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610efc575073c11b1268c1a384e55c48c2391d8d480264a3a7f473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610fac57610fa16402540be4008273ffffffffffffffffffffffffffffffffffffffff1663fc57d4df866040518263ffffffff1660e01b8152600401610f43919061446a565b60206040518083038186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f939190810190613dd1565b6113fe90919063ffffffff16565b91508191505061103c565b8073ffffffffffffffffffffffffffffffffffffffff1663fc57d4df846040518263ffffffff1660e01b8152600401610fe5919061446a565b60206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190613dd1565b9150819150505b919050565b60008061104e8484611c21565b9050600061105c8588611c46565b9050600061106a8688611c8a565b9050600061108b7370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4611d43565b90506110c781600a0a6110b96110aa8587611e3390919063ffffffff16565b876113ca90919063ffffffff16565b6113fe90919063ffffffff16565b945084945050505050949350505050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663abfceffc846040518263ffffffff1660e01b8152600401611128919061441f565b60006040518083038186803b15801561114057600080fd5b505afa158015611154573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061117d9190810190613bd8565b905080516040519080825280602002602001820160405280156111ba57816020015b6111a7613330565b81526020019060019003908161119f5790505b50915060008090505b8151811015611229576112058282815181106111db57fe5b6020026020010151611200868585815181106111f357fe5b6020026020010151611e4d565b611441565b83828151811061121157fe5b602002602001018190525080806001019150506111c3565b5061123382611f8e565b915081915050919050565b60608061124a836120a4565b9050805160405190808252806020026020018201604052801561128757816020015b611274613357565b81526020019060019003908161126c5790505b50915060008090505b8151811015611375576113518282815181106112a857fe5b60200260200101518383815181106112bc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b81526004016112fc919061441f565b60206040518083038186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061134c9190810190613dd1565b611412565b83828151811061135d57fe5b60200260200101819052508080600101915050611290565b5061137f82612379565b915081915050919050565b6113926132ab565b8281600001819052508181602001819052506113ad8161248f565b92915050565b6000828211156113bf57fe5b818303905092915050565b6000808314156113dd57600090506113f8565b8183029050818382816113ec57fe5b04146113f457fe5b8090505b92915050565b600081838161140957fe5b04905092915050565b61141a6132f0565b611422613370565b61142c8484612524565b90508082600001819052508191505092915050565b611449613309565b611451613370565b61145b8484612524565b905080826000018190525061146f82612540565b8191505092915050565b60008090505b8260200151518110156115615781600001516000015173ffffffffffffffffffffffffffffffffffffffff16836020015182815181106114bb57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146114eb57611554565b611545836020015182815181106114fe57fe5b60200260200101516115408460000151602001518660200151858151811061152257fe5b60200260200101516000015160200151611e3390919063ffffffff16565b61259f565b61154e8361248f565b5061163e565b808060010191505061147f565b50600061157d6001846020015151611e3390919063ffffffff16565b90506060816040519080825280602002602001820160405280156115bb57816020015b6115a8613357565b8152602001906001900390816115a05790505b50905060008090505b84602001515181101561160d57846020015181815181106115e157fe5b60200260200101518282815181106115f557fe5b602002602001018190525080806001019150506115c4565b508281600184038151811061161e57fe5b602002602001018190525080846020018190525061163b8461248f565b50505b5050565b60008090505b82600001515181101561172a5781600001516000015173ffffffffffffffffffffffffffffffffffffffff168360000151828151811061168457fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146116b45761171d565b61170e836000015182815181106116c757fe5b6020026020010151611709846000015160200151866000015185815181106116eb57fe5b60200260200101516000015160200151611e3390919063ffffffff16565b6125be565b6117178361248f565b50611807565b8080600101915050611648565b5060006117466001846000015151611e3390919063ffffffff16565b905060608160405190808252806020026020018201604052801561178457816020015b611771613330565b8152602001906001900390816117695790505b50905060008090505b8460000151518110156117d657846000015181815181106117aa57fe5b60200260200101518282815181106117be57fe5b6020026020010181905250808060010191505061178d565b50828160018403815181106117e757fe5b60200260200101819052508084600001819052506118048461248f565b50505b5050565b6000611815613309565b60008090505b83518110156118a35783818151811061183057fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561189657600184828151811061188157fe5b602002602001015180905092509250506118ac565b808060010191505061181b565b50600081915091505b9250929050565b60006118bd6132f0565b60008090505b835181101561194b578381815181106118d857fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561193e57600184828151811061192957fe5b60200260200101518090509250925050611954565b80806001019150506118c3565b50600081915091505b9250929050565b6060825160405190808252806020026020018201604052801561199857816020015b6119856133bc565b81526020019060019003908161197d5790505b509050600080600080600090505b8651811015611a9b578681815181106119bb57fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a4b9190810190613dd1565b9250868181518110611a5957fe5b602002602001015160000151602001519150611a77848484896125e6565b858281518110611a8357fe5b602002602001018190525080806001019150506119a6565b5083935050505092915050565b60608251604051908082528060200260200182016040528015611ae557816020015b611ad26133bc565b815260200190600190039081611aca5790505b509050600080600080600090505b8651811015611be857868181518110611b0857fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015611b6057600080fd5b505afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b989190810190613dd1565b9250868181518110611ba657fe5b602002602001015160000151602001519150611bc4848484896125e6565b858281518110611bd057fe5b60200260200101819052508080600101915050611af3565b5083935050505092915050565b611bfd613281565b828160000181905250818160200181905250611c1881612658565b80905092915050565b6000611c3e82611c308561274d565b6113ca90919063ffffffff16565b905092915050565b600080611c52846127f8565b9050611c8181611c73670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d0b9190810190613dd1565b9050611d3a81611d2c670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d995760129050809050611e2e565b6000611da4836129b4565b90508073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611dec57600080fd5b505afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e249190810190613dfa565b60ff169150819150505b919050565b6000818301905082811015611e4457fe5b80905092915050565b600080829050611f85670de0b6b3a7640000611f778373ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea857600080fd5b505afa158015611ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ee09190810190613dd1565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401611f19919061441f565b60206040518083038186803b158015611f3157600080fd5b505afa158015611f45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f699190810190613dd1565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6060600080600090505b8351811015611fe0576000848281518110611faf57fe5b602002602001015160000151608001511415611fca57611fd3565b81806001019250505b8080600101915050611f98565b508060405190808252806020026020018201604052801561201b57816020015b612008613330565b8152602001906001900390816120005790505b509150600080600090505b845181101561209957600085828151811061203d57fe5b6020026020010151600001516080015114156120585761208c565b84818151811061206457fe5b602002602001015184838151811061207857fe5b602002602001018190525081806001019250505b8080600101915050612026565b508292505050919050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663b0772d0b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561210157600080fd5b505afa158015612115573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061213e9190810190613c19565b9050600080600090505b825181101561221057600083828151811061215f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b815260040161219f919061441f565b60206040518083038186803b1580156121b757600080fd5b505afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121ef9190810190613dd1565b14156121fa57612203565b81806001019250505b8080600101915050612148565b50806040519080825280602002602001820160405280156122405781602001602082028038833980820191505090505b509250600080600090505b835181101561236d57600084828151811061226257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193886040518263ffffffff1660e01b81526004016122a2919061441f565b60206040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122f29190810190613dd1565b14156122fd57612360565b83818151811061230957fe5b602002602001015185838151811061231d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081806001019250505b808060010191505061224b565b50839350505050919050565b6060600080600090505b83518110156123cb57600084828151811061239a57fe5b6020026020010151600001516080015114156123b5576123be565b81806001019250505b8080600101915050612383565b508060405190808252806020026020018201604052801561240657816020015b6123f3613357565b8152602001906001900390816123eb5790505b509150600080600090505b845181101561248457600085828151811061242857fe5b60200260200101516000015160800151141561244357612477565b84818151811061244f57fe5b602002602001015184838151811061246357fe5b602002602001018190525081806001019250505b8080600101915050612411565b508292505050919050565b61249c8160000151612a90565b8160400181815250506124b28160200151612ad7565b8160600181815250506124c88160000151612b1e565b8160800181815250506124e381604001518260600151612b61565b8160c00181815250506124fe81608001518260600151612b90565b8160a001818152505061251981600001518260200151612be0565b8160e0018190525050565b61252c613370565b612537818484612d77565b80905092915050565b612551816000015160000151612dc7565b816020018181525050612593670de0b6b3a764000061258583602001518460000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b81604001818152505050565b80826000015160200181815250506125ba8260000151612e89565b5050565b80826000015160200181815250506125d98260000151612e89565b6125e282612540565b5050565b6125ee613408565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816020018181525050828160400181815250508181606001818152505061264d81612ee8565b809050949350505050565b60008060008090505b83600001515181101561269b578360000151818151811061267e57fe5b602002602001015160a00151830192508080600101915050612661565b5060008090505b8360200151518110156126dc57836020015181815181106126bf57fe5b602002602001015160a001518201915080806001019150506126a2565b5080821115612713576126f881836113b390919063ffffffff16565b83604001818152505060018360600190151590811515815250505b8082116127485761272d82826113b390919063ffffffff16565b83604001818152505060008360600190151590811515815250505b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b90508073ffffffffffffffffffffffffffffffffffffffff16631d7b33d7846040518263ffffffff1660e01b81526004016127a0919061441f565b60206040518083038186803b1580156127b857600080fd5b505afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127f09190810190613dd1565b915050919050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561284657600080fd5b505afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061287e9190810190613dd1565b905060008273ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c857600080fd5b505afa1580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129009190810190613dd1565b905060008373ffffffffffffffffffffffffffffffffffffffff16638f840ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294a57600080fd5b505afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129829190810190613dd1565b90506129a98161299b8486611e3390919063ffffffff16565b6113b390919063ffffffff16565b945050505050919050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a075760009050612a8b565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4d57600080fd5b505afa158015612a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a859190810190613b73565b90508090505b919050565b600080600090505b8251811015612ace57828181518110612aad57fe5b60200260200101516000015160800151820191508080600101915050612a98565b50809050919050565b600080600090505b8251811015612b1557828181518110612af457fe5b60200260200101516000015160800151820191508080600101915050612adf565b50809050919050565b600080600090505b8251811015612b5857828181518110612b3b57fe5b602002602001015160400151820191508080600101915050612b26565b50809050919050565b600081831115612b8557612b7e82846113b390919063ffffffff16565b9050612b8a565b600090505b92915050565b600080831415612baa57670de0b6b3a76400009050612bda565b612bd783612bc9670de0b6b3a7640000856113ca90919063ffffffff16565b6113fe90919063ffffffff16565b90505b92915050565b60608251604051908082528060200260200182016040528015612c125781602001602082028038833980820191505090505b5090506000612c1f6132f0565b60008090505b8551811015612d6b57612c53868281518110612c3d57fe5b6020026020010151600001516000015186612f61565b80935081945050506000868281518110612c6957fe5b6020026020010151604001511415612cb5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848281518110612ca857fe5b6020026020010181815250505b82612cd9576000848281518110612cc857fe5b602002602001018181525050612d5e565b6000868281518110612ce757fe5b60200260200101516040015114612d5d57612d44868281518110612d0757fe5b602002602001015160400151612d36670de0b6b3a76400008560000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b848281518110612d5057fe5b6020026020010181815250505b5b8080600101915050612c25565b50829250505092915050565b81836000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080836020018181525050612dc283612e89565b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16638e8f294b846040518263ffffffff1660e01b8152600401612e17919061441f565b60606040518083038186803b158015612e2f57600080fd5b505afa158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e679190810190613c5a565b50809350819250505080612e7f576000915050612e84565b819150505b919050565b612e968160000151613009565b8160400181905250612eab8160000151611d43565b816060018181525050612ec68160200151826000015161321d565b816080018181525050612edc816000015161274d565b8160a001818152505050565b612ef58160000151613009565b8160800181905250612f55670de0b6b3a7640000612f478360600151612f39612f2f866020015187604001516113ca90919063ffffffff16565b866000015161321d565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b8160a001818152505050565b6000612f6b6132f0565b60008090505b8351811015612ff9578473ffffffffffffffffffffffffffffffffffffffff16848281518110612f9d57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff161415612fec576001848281518110612fd757fe5b60200260200101518090509250925050613002565b8080600101915050612f71565b50600081915091505b9250929050565b6060734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613090576040518060400160405280600381526020017f45544800000000000000000000000000000000000000000000000000000000008152509050613218565b73f5dce57282a584d2746faf1593d3121fcac444dc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613115576040518060400160405280600381526020017f53414900000000000000000000000000000000000000000000000000000000008152509050613218565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561315b57600080fd5b505afa15801561316f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131939190810190613b73565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156131d857600080fd5b505afa1580156131ec573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506132159190810190613ca9565b90505b919050565b60008061322983611d43565b905061325b81600a0a61324d8661323f87610d32565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91508191505092915050565b604051806040016040528060008152602001600081525090565b60405180608001604052806060815260200160608152602001600081526020016000151581525090565b60405180610100016040528060608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001606081525090565b6040518060200160405280613303613454565b81525090565b604051806060016040528061331c613454565b815260200160008152602001600081525090565b6040518060600160405280613343613454565b815260200160008152602001600081525090565b604051806020016040528061336a613454565b81525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6000813590506134af81614929565b92915050565b6000815190506134c481614929565b92915050565b600082601f8301126134db57600080fd5b81516134ee6134e9826145a0565b614573565b9150818183526020840193506020810190508385602084028201111561351357600080fd5b60005b83811015613543578161352988826134b5565b845260208401935060208301925050600181019050613516565b5050505092915050565b600082601f83011261355e57600080fd5b815161357161356c826145c8565b614573565b9150818183526020840193506020810190508385602084028201111561359657600080fd5b60005b838110156135c657816135ac8882613750565b845260208401935060208301925050600181019050613599565b5050505092915050565b600082601f8301126135e157600080fd5b81356135f46135ef826145f0565b614573565b9150818183526020840193506020810190508360005b8381101561363a578135860161362088826139cf565b84526020840193506020830192505060018101905061360a565b5050505092915050565b600082601f83011261365557600080fd5b813561366861366382614618565b614573565b9150818183526020840193506020810190508360005b838110156136ae57813586016136948882613a93565b84526020840193506020830192505060018101905061367e565b5050505092915050565b600082601f8301126136c957600080fd5b81356136dc6136d782614640565b614573565b9150818183526020840193506020810190508385602084028201111561370157600080fd5b60005b8381101561373157816137178882613b0b565b845260208401935060208301925050600181019050613704565b5050505092915050565b60008151905061374a81614940565b92915050565b60008151905061375f81614957565b92915050565b600082601f83011261377657600080fd5b813561378961378482614668565b614573565b915080825260208301602083018583830111156137a557600080fd5b6137b08382846148c9565b50505092915050565b600082601f8301126137ca57600080fd5b81516137dd6137d882614694565b614573565b915080825260208301602083018583830111156137f957600080fd5b6138048382846148d8565b50505092915050565b6000610100828403121561382057600080fd5b61382b610100614573565b9050600082013567ffffffffffffffff81111561384757600080fd5b61385384828501613644565b600083015250602082013567ffffffffffffffff81111561387357600080fd5b61387f848285016135d0565b602083015250604061389384828501613b0b565b60408301525060606138a784828501613b0b565b60608301525060806138bb84828501613b0b565b60808301525060a06138cf84828501613b0b565b60a08301525060c06138e384828501613b0b565b60c08301525060e082013567ffffffffffffffff81111561390357600080fd5b61390f848285016136b8565b60e08301525092915050565b600060c0828403121561392d57600080fd5b61393760c0614573565b90506000613947848285016134a0565b600083015250602061395b84828501613b0b565b602083015250604082013567ffffffffffffffff81111561397b57600080fd5b61398784828501613765565b604083015250606061399b84828501613b0b565b60608301525060806139af84828501613b0b565b60808301525060a06139c384828501613b0b565b60a08301525092915050565b6000602082840312156139e157600080fd5b6139eb6020614573565b9050600082013567ffffffffffffffff811115613a0757600080fd5b613a138482850161391b565b60008301525092915050565b600060808284031215613a3157600080fd5b613a3b6080614573565b90506000613a4b84828501613b20565b6000830152506020613a5f84828501613b20565b6020830152506040613a73848285016134b5565b6040830152506060613a8784828501613b20565b60608301525092915050565b600060608284031215613aa557600080fd5b613aaf6060614573565b9050600082013567ffffffffffffffff811115613acb57600080fd5b613ad78482850161391b565b6000830152506020613aeb84828501613b0b565b6020830152506040613aff84828501613b0b565b60408301525092915050565b600081359050613b1a8161496e565b92915050565b600081519050613b2f8161496e565b92915050565b600081519050613b4481614985565b92915050565b600060208284031215613b5c57600080fd5b6000613b6a848285016134a0565b91505092915050565b600060208284031215613b8557600080fd5b6000613b93848285016134b5565b91505092915050565b60008060408385031215613baf57600080fd5b6000613bbd858286016134a0565b9250506020613bce85828601613b0b565b9150509250929050565b600060208284031215613bea57600080fd5b600082015167ffffffffffffffff811115613c0457600080fd5b613c10848285016134ca565b91505092915050565b600060208284031215613c2b57600080fd5b600082015167ffffffffffffffff811115613c4557600080fd5b613c518482850161354d565b91505092915050565b600080600060608486031215613c6f57600080fd5b6000613c7d8682870161373b565b9350506020613c8e86828701613b20565b9250506040613c9f8682870161373b565b9150509250925092565b600060208284031215613cbb57600080fd5b600082015167ffffffffffffffff811115613cd557600080fd5b613ce1848285016137b9565b91505092915050565b600060208284031215613cfc57600080fd5b600082013567ffffffffffffffff811115613d1657600080fd5b613d228482850161380d565b91505092915050565b60008060408385031215613d3e57600080fd5b600083013567ffffffffffffffff811115613d5857600080fd5b613d648582860161380d565b9250506020613d7585828601613b0b565b9150509250929050565b600060808284031215613d9157600080fd5b6000613d9f84828501613a1f565b91505092915050565b600060208284031215613dba57600080fd5b6000613dc884828501613b0b565b91505092915050565b600060208284031215613de357600080fd5b6000613df184828501613b20565b91505092915050565b600060208284031215613e0c57600080fd5b6000613e1a84828501613b35565b91505092915050565b6000613e2f83836142cf565b905092915050565b6000613e4383836142f9565b905092915050565b6000613e5783836143b1565b905092915050565b6000613e6b8383614401565b60208301905092915050565b613e80816147d1565b82525050565b613e8f816147d1565b82525050565b6000613ea082614700565b613eaa818561476b565b935083602082028501613ebc856146c0565b8060005b85811015613ef85784840389528151613ed98582613e23565b9450613ee483614737565b925060208a01995050600181019050613ec0565b50829750879550505050505092915050565b6000613f158261470b565b613f1f818561477c565b935083602082028501613f31856146d0565b8060005b85811015613f6d5784840389528151613f4e8582613e37565b9450613f5983614744565b925060208a01995050600181019050613f35565b50829750879550505050505092915050565b6000613f8a82614716565b613f94818561478d565b935083602082028501613fa6856146e0565b8060005b85811015613fe25784840389528151613fc38582613e4b565b9450613fce83614751565b925060208a01995050600181019050613faa565b50829750879550505050505092915050565b6000613fff82614721565b614009818561479e565b9350614014836146f0565b8060005b8381101561404557815161402c8882613e5f565b97506140378361475e565b925050600181019050614018565b5085935050505092915050565b61405b816147e3565b82525050565b61406a816147e3565b82525050565b6140798161484b565b82525050565b6140888161486f565b82525050565b61409781614893565b82525050565b6140a6816148b7565b82525050565b60006140b78261472c565b6140c181856147af565b93506140d18185602086016148d8565b6140da8161490b565b840191505092915050565b60006140f08261472c565b6140fa81856147c0565b935061410a8185602086016148d8565b6141138161490b565b840191505092915050565b6000608083016000830151848203600086015261413b8282613f0a565b915050602083015184820360208601526141558282613f0a565b915050604083015161416a6040860182614401565b50606083015161417d6060860182614052565b508091505092915050565b60006101008301600083015184820360008601526141a68282613f7f565b915050602083015184820360208601526141c08282613e95565b91505060408301516141d56040860182614401565b5060608301516141e86060860182614401565b5060808301516141fb6080860182614401565b5060a083015161420e60a0860182614401565b5060c083015161422160c0860182614401565b5060e083015184820360e08601526142398282613ff4565b9150508091505092915050565b600060c08301600083015161425e6000860182613e77565b5060208301516142716020860182614401565b506040830151848203604086015261428982826140ac565b915050606083015161429e6060860182614401565b5060808301516142b16080860182614401565b5060a08301516142c460a0860182614401565b508091505092915050565b600060208301600083015184820360008601526142ec8282614246565b9150508091505092915050565b600060c0830160008301516143116000860182613e77565b5060208301516143246020860182614401565b5060408301516143376040860182614401565b50606083015161434a6060860182614401565b506080830151848203608086015261436282826140ac565b91505060a083015161437760a0860182614401565b508091505092915050565b6040820160008201516143986000850182614401565b5060208201516143ab6020850182614401565b50505050565b600060608301600083015184820360008601526143ce8282614246565b91505060208301516143e36020860182614401565b5060408301516143f66040860182614401565b508091505092915050565b61440a81614834565b82525050565b61441981614834565b82525050565b60006020820190506144346000830184613e86565b92915050565b600060408201905061444f6000830185614061565b81810360208301526144618184614188565b90509392505050565b600060208201905061447f6000830184614070565b92915050565b600060608201905061449a600083018661407f565b6144a7602083018561408e565b6144b46040830184613e86565b949350505050565b60006020820190506144d1600083018461409d565b92915050565b600060208201905081810360008301526144f181846140e5565b905092915050565b60006020820190508181036000830152614513818461411e565b905092915050565b600060208201905081810360008301526145358184614188565b905092915050565b60006040820190506145526000830184614382565b92915050565b600060208201905061456d6000830184614410565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561459657600080fd5b8060405250919050565b600067ffffffffffffffff8211156145b757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156145df57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561460757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561462f57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561465757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561467f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156146ab57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006147dc82614814565b9050919050565b60008115159050919050565b60006147fa826147d1565b9050919050565b600081905061480f8261491c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006148568261485d565b9050919050565b600061486882614814565b9050919050565b600061487a82614881565b9050919050565b600061488c82614814565b9050919050565b600061489e826148a5565b9050919050565b60006148b082614814565b9050919050565b60006148c282614801565b9050919050565b82818337600083830152505050565b60005b838110156148f65780820151818401526020810190506148db565b83811115614905576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061492657fe5b50565b614932816147d1565b811461493d57600080fd5b50565b614949816147e3565b811461495457600080fd5b50565b614960816147ef565b811461496b57600080fd5b50565b61497781614834565b811461498257600080fd5b50565b61498e8161483e565b811461499957600080fd5b5056fea365627a7a72315820059da9e8fb338326f069bdf45a4bfcc034c0672b81114baa65039095278e3f4b6c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063bee42a951161008c578063f690a1f611610066578063f690a1f6146102ac578063fa57b27d146102dc578063fcdf209b1461030d578063fe7c5f4b1461033d576100ea565b8063bee42a951461021b578063cbe3b1be1461024b578063e9bf882a1461027b576100ea565b806354fd4d50116100c857806354fd4d501461017f57806359883d791461019d5780635d2a23f8146101bb5780638ab8e35b146101eb576100ea565b806307dc96dd146100ef5780633d44b4561461011f5780634874cf8f1461014f575b600080fd5b61010960048036036101049190810190613da8565b61035b565b604051610116919061441f565b60405180910390f35b61013960048036036101349190810190613d2b565b6103a0565b6040516101469190614558565b60405180910390f35b61016960048036036101649190810190613b4a565b6103b4565b604051610176919061453d565b60405180910390f35b6101876103cc565b60405161019491906144d7565b60405180910390f35b6101a5610405565b6040516101b29190614558565b60405180910390f35b6101d560048036036101d09190810190613b4a565b610429565b6040516101e291906144bc565b60405180910390f35b61020560048036036102009190810190613b9c565b61043b565b6040516102129190614558565b60405180910390f35b61023560048036036102309190810190613b9c565b61044f565b60405161024291906144f9565b60405180910390f35b61026560048036036102609190810190613b4a565b610469565b604051610272919061451b565b60405180910390f35b61029560048036036102909190810190613d2b565b610481565b6040516102a392919061443a565b60405180910390f35b6102c660048036036102c19190810190613cea565b6104a0565b6040516102d391906144bc565b60405180910390f35b6102f660048036036102f19190810190613cea565b6104b2565b60405161030492919061443a565b60405180910390f35b61032760048036036103229190810190613d2b565b6104ce565b60405161033491906144f9565b60405180910390f35b6103456104e8565b6040516103529190614558565b60405180910390f35b600062b82beb82106103835773ccf4429db6322d5c611ee964527d42e5d685dd6a905061039b565b73c11b1268c1a384e55c48c2391d8d480264a3a7f490505b919050565b60006103ac838361050c565b905092915050565b6103bc613267565b6103c5826105f3565b9050919050565b6040518060400160405280600281526020017f763300000000000000000000000000000000000000000000000000000000000081525081565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81565b600061043482610784565b9050919050565b6000610447838361079e565b905092915050565b610457613281565b61046183836107ba565b905092915050565b6104716132ab565b61047a826107dc565b9050919050565b600061048b6132ab565b6104958484610811565b915091509250929050565b60006104ab82610a09565b9050919050565b60006104bc6132ab565b6104c583610b7f565b91509150915091565b6104d6613281565b6104e08383610cfe565b905092915050565b60006105077370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4610d32565b905090565b600060608360000151905060608460200151905060008090505b82518110156105835761057283828151811061053e57fe5b60200260200101516000015160200151600085848151811061055c57fe5b6020026020010151600001516000015188611041565b840193508080600101915050610526565b5060008090505b81518110156105e7576105d660008383815181106105a457fe5b602002602001015160000151602001518484815181106105c057fe5b6020026020010151600001516000015188611041565b84019350808060010191505061058a565b50829250505092915050565b6105fb613267565b73c00e94cb662c3520282e6f5717214004a7f2688873ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610648919061441f565b60206040518083038186803b15801561066057600080fd5b505afa158015610674573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106989190810190613dd1565b816000018181525050600073d513d22422a3062bd342ae374b4b9c20e0a9a07490508073ffffffffffffffffffffffffffffffffffffffff16631ea6374173c00e94cb662c3520282e6f5717214004a7f26888733d9819210a31b4961b30ef54be2aed79b9c9cd3b866040518463ffffffff1660e01b815260040161071f93929190614485565b608060405180830381600087803b15801561073957600080fd5b505af115801561074d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107719190810190613d7f565b6060015182602001818152505050919050565b6000610797610792836107dc565b610a09565b9050919050565b60006107b26107ac846107dc565b8361050c565b905092915050565b6107c2613281565b6107d46107ce846107dc565b83610cfe565b905092915050565b6107e46132ab565b60606107ef836110d8565b905060606107fc8461123e565b9050610808828261138a565b92505050919050565b600061081b6132ab565b600161082685610a09565b600281111561083157fe5b11156108435760008191509150610a02565b60608460000151905060008090505b81518110156109f857600082828151811061086957fe5b6020026020010151602001511415610880576109eb565b600061088a6132f0565b610892613309565b5b6108ad662386f26fc10000896113b390919063ffffffff16565b8960e0015185815181106108bd57fe5b6020026020010151116109e75761097e670de0b6b3a7640000610970670de0b6b3a764000061096261090f8e60e001518a815181106108f857fe5b60200260200101518e6113b390919063ffffffff16565b6109548b8b8151811061091e57fe5b6020026020010151602001518c8c8151811061093657fe5b602002602001015160000151602001516113ca90919063ffffffff16565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b6113fe90919063ffffffff16565b92506109a585858151811061098f57fe5b6020026020010151600001516000015184611412565b91506109cc8585815181106109b657fe5b6020026020010151600001516000015184611441565b90506109d88983611479565b6109e28982611642565b610893565b5050505b8080600101915050610852565b5060018592509250505b9250929050565b6000809050610a19826001610cfe565b60600151610a2657600190505b60008090505b8260e0015151811015610abb577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8360e001518281518110610a6a57fe5b60200260200101511415610a7d57610aae565b670de0b6b3a76400008360e001518281518110610a9657fe5b60200260200101511115610aad5760029150610abb565b5b8080600101915050610a2c565b506000610ac6613309565b60008090505b846020015151811015610b7457670de0b6b3a764000085602001518281518110610af257fe5b602002602001015160000151608001511015610b0d57610b67565b610b3a85602001518281518110610b2057fe5b60200260200101516000015160000151866000015161180b565b809350819450505082610b505760029350610b74565b600082602001511415610b665760029350610b74565b5b8080600101915050610acc565b508292505050919050565b6000610b896132ab565b6001610b9484610a09565b6002811115610b9f57fe5b1115610bb15760008191509150610cf9565b6060836000015151604051908082528060200260200182016040528015610bf257816020015b610bdf613330565b815260200190600190039081610bd75790505b5090506000806000610c026132f0565b60008090505b886000015151811015610cdf5788600001518181518110610c2557fe5b602002602001015160000151600001519450610c45858a602001516118b3565b809350819450505082610c755788600001518181518110610c6257fe5b6020026020010151600001516020015193505b610caf8260000151602001518a600001518381518110610c9157fe5b602002602001015160000151602001516113b390919063ffffffff16565b9350610cbb8585611441565b868281518110610cc757fe5b60200260200101819052508080600101915050610c08565b5060606001610cee878361138a565b975097505050505050505b915091565b610d06613281565b610d2a610d1784600001518461195b565b610d25856020015185611aa8565b611bf5565b905092915050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16637dc0d1d06040518163ffffffff1660e01b815260040160206040518083038186803b158015610d8f57600080fd5b505afa158015610da3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610dc79190810190613b73565b90507339aa39c021dfbae8fac545936693ac917d5e756373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610e56575073f650c3d88d12db855b8bf7d11be6c55a4e07dcc973ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610e6f57670de0b6b3a764000091508191505061103c565b73ccf4429db6322d5c611ee964527d42e5d685dd6a73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610efc575073c11b1268c1a384e55c48c2391d8d480264a3a7f473ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15610fac57610fa16402540be4008273ffffffffffffffffffffffffffffffffffffffff1663fc57d4df866040518263ffffffff1660e01b8152600401610f43919061446a565b60206040518083038186803b158015610f5b57600080fd5b505afa158015610f6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610f939190810190613dd1565b6113fe90919063ffffffff16565b91508191505061103c565b8073ffffffffffffffffffffffffffffffffffffffff1663fc57d4df846040518263ffffffff1660e01b8152600401610fe5919061446a565b60206040518083038186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506110359190810190613dd1565b9150819150505b919050565b60008061104e8484611c21565b9050600061105c8588611c46565b9050600061106a8688611c8a565b9050600061108b7370e36f6bf80a52b3b46b3af8e106cc0ed743e8e4611d43565b90506110c781600a0a6110b96110aa8587611e3390919063ffffffff16565b876113ca90919063ffffffff16565b6113fe90919063ffffffff16565b945084945050505050949350505050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663abfceffc846040518263ffffffff1660e01b8152600401611128919061441f565b60006040518083038186803b15801561114057600080fd5b505afa158015611154573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061117d9190810190613bd8565b905080516040519080825280602002602001820160405280156111ba57816020015b6111a7613330565b81526020019060019003908161119f5790505b50915060008090505b8151811015611229576112058282815181106111db57fe5b6020026020010151611200868585815181106111f357fe5b6020026020010151611e4d565b611441565b83828151811061121157fe5b602002602001018190525080806001019150506111c3565b5061123382611f8e565b915081915050919050565b60608061124a836120a4565b9050805160405190808252806020026020018201604052801561128757816020015b611274613357565b81526020019060019003908161126c5790505b50915060008090505b8151811015611375576113518282815181106112a857fe5b60200260200101518383815181106112bc57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b81526004016112fc919061441f565b60206040518083038186803b15801561131457600080fd5b505afa158015611328573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061134c9190810190613dd1565b611412565b83828151811061135d57fe5b60200260200101819052508080600101915050611290565b5061137f82612379565b915081915050919050565b6113926132ab565b8281600001819052508181602001819052506113ad8161248f565b92915050565b6000828211156113bf57fe5b818303905092915050565b6000808314156113dd57600090506113f8565b8183029050818382816113ec57fe5b04146113f457fe5b8090505b92915050565b600081838161140957fe5b04905092915050565b61141a6132f0565b611422613370565b61142c8484612524565b90508082600001819052508191505092915050565b611449613309565b611451613370565b61145b8484612524565b905080826000018190525061146f82612540565b8191505092915050565b60008090505b8260200151518110156115615781600001516000015173ffffffffffffffffffffffffffffffffffffffff16836020015182815181106114bb57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146114eb57611554565b611545836020015182815181106114fe57fe5b60200260200101516115408460000151602001518660200151858151811061152257fe5b60200260200101516000015160200151611e3390919063ffffffff16565b61259f565b61154e8361248f565b5061163e565b808060010191505061147f565b50600061157d6001846020015151611e3390919063ffffffff16565b90506060816040519080825280602002602001820160405280156115bb57816020015b6115a8613357565b8152602001906001900390816115a05790505b50905060008090505b84602001515181101561160d57846020015181815181106115e157fe5b60200260200101518282815181106115f557fe5b602002602001018190525080806001019150506115c4565b508281600184038151811061161e57fe5b602002602001018190525080846020018190525061163b8461248f565b50505b5050565b60008090505b82600001515181101561172a5781600001516000015173ffffffffffffffffffffffffffffffffffffffff168360000151828151811061168457fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff16146116b45761171d565b61170e836000015182815181106116c757fe5b6020026020010151611709846000015160200151866000015185815181106116eb57fe5b60200260200101516000015160200151611e3390919063ffffffff16565b6125be565b6117178361248f565b50611807565b8080600101915050611648565b5060006117466001846000015151611e3390919063ffffffff16565b905060608160405190808252806020026020018201604052801561178457816020015b611771613330565b8152602001906001900390816117695790505b50905060008090505b8460000151518110156117d657846000015181815181106117aa57fe5b60200260200101518282815181106117be57fe5b6020026020010181905250808060010191505061178d565b50828160018403815181106117e757fe5b60200260200101819052508084600001819052506118048461248f565b50505b5050565b6000611815613309565b60008090505b83518110156118a35783818151811061183057fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561189657600184828151811061188157fe5b602002602001015180905092509250506118ac565b808060010191505061181b565b50600081915091505b9250929050565b60006118bd6132f0565b60008090505b835181101561194b578381815181106118d857fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141561193e57600184828151811061192957fe5b60200260200101518090509250925050611954565b80806001019150506118c3565b50600081915091505b9250929050565b6060825160405190808252806020026020018201604052801561199857816020015b6119856133bc565b81526020019060019003908161197d5790505b509050600080600080600090505b8651811015611a9b578681815181106119bb57fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663ae9d70b06040518163ffffffff1660e01b815260040160206040518083038186803b158015611a1357600080fd5b505afa158015611a27573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a4b9190810190613dd1565b9250868181518110611a5957fe5b602002602001015160000151602001519150611a77848484896125e6565b858281518110611a8357fe5b602002602001018190525080806001019150506119a6565b5083935050505092915050565b60608251604051908082528060200260200182016040528015611ae557816020015b611ad26133bc565b815260200190600190039081611aca5790505b509050600080600080600090505b8651811015611be857868181518110611b0857fe5b6020026020010151600001516000015193508373ffffffffffffffffffffffffffffffffffffffff1663f8f9da286040518163ffffffff1660e01b815260040160206040518083038186803b158015611b6057600080fd5b505afa158015611b74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611b989190810190613dd1565b9250868181518110611ba657fe5b602002602001015160000151602001519150611bc4848484896125e6565b858281518110611bd057fe5b60200260200101819052508080600101915050611af3565b5083935050505092915050565b611bfd613281565b828160000181905250818160200181905250611c1881612658565b80905092915050565b6000611c3e82611c308561274d565b6113ca90919063ffffffff16565b905092915050565b600080611c52846127f8565b9050611c8181611c73670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000808373ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b158015611cd357600080fd5b505afa158015611ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611d0b9190810190613dd1565b9050611d3a81611d2c670de0b6b3a7640000866113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d995760129050809050611e2e565b6000611da4836129b4565b90508073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015611dec57600080fd5b505afa158015611e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611e249190810190613dfa565b60ff169150819150505b919050565b6000818301905082811015611e4457fe5b80905092915050565b600080829050611f85670de0b6b3a7640000611f778373ffffffffffffffffffffffffffffffffffffffff1663182df0f56040518163ffffffff1660e01b815260040160206040518083038186803b158015611ea857600080fd5b505afa158015611ebc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611ee09190810190613dd1565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231896040518263ffffffff1660e01b8152600401611f19919061441f565b60206040518083038186803b158015611f3157600080fd5b505afa158015611f45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611f699190810190613dd1565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91505092915050565b6060600080600090505b8351811015611fe0576000848281518110611faf57fe5b602002602001015160000151608001511415611fca57611fd3565b81806001019250505b8080600101915050611f98565b508060405190808252806020026020018201604052801561201b57816020015b612008613330565b8152602001906001900390816120005790505b509150600080600090505b845181101561209957600085828151811061203d57fe5b6020026020010151600001516080015114156120585761208c565b84818151811061206457fe5b602002602001015184838151811061207857fe5b602002602001018190525081806001019250505b8080600101915050612026565b508292505050919050565b606080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff1663b0772d0b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561210157600080fd5b505afa158015612115573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525061213e9190810190613c19565b9050600080600090505b825181101561221057600083828151811061215f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193876040518263ffffffff1660e01b815260040161219f919061441f565b60206040518083038186803b1580156121b757600080fd5b505afa1580156121cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506121ef9190810190613dd1565b14156121fa57612203565b81806001019250505b8080600101915050612148565b50806040519080825280602002602001820160405280156122405781602001602082028038833980820191505090505b509250600080600090505b835181101561236d57600084828151811061226257fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166395dd9193886040518263ffffffff1660e01b81526004016122a2919061441f565b60206040518083038186803b1580156122ba57600080fd5b505afa1580156122ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506122f29190810190613dd1565b14156122fd57612360565b83818151811061230957fe5b602002602001015185838151811061231d57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505081806001019250505b808060010191505061224b565b50839350505050919050565b6060600080600090505b83518110156123cb57600084828151811061239a57fe5b6020026020010151600001516080015114156123b5576123be565b81806001019250505b8080600101915050612383565b508060405190808252806020026020018201604052801561240657816020015b6123f3613357565b8152602001906001900390816123eb5790505b509150600080600090505b845181101561248457600085828151811061242857fe5b60200260200101516000015160800151141561244357612477565b84818151811061244f57fe5b602002602001015184838151811061246357fe5b602002602001018190525081806001019250505b8080600101915050612411565b508292505050919050565b61249c8160000151612a90565b8160400181815250506124b28160200151612ad7565b8160600181815250506124c88160000151612b1e565b8160800181815250506124e381604001518260600151612b61565b8160c00181815250506124fe81608001518260600151612b90565b8160a001818152505061251981600001518260200151612be0565b8160e0018190525050565b61252c613370565b612537818484612d77565b80905092915050565b612551816000015160000151612dc7565b816020018181525050612593670de0b6b3a764000061258583602001518460000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b81604001818152505050565b80826000015160200181815250506125ba8260000151612e89565b5050565b80826000015160200181815250506125d98260000151612e89565b6125e282612540565b5050565b6125ee613408565b84816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505083816020018181525050828160400181815250508181606001818152505061264d81612ee8565b809050949350505050565b60008060008090505b83600001515181101561269b578360000151818151811061267e57fe5b602002602001015160a00151830192508080600101915050612661565b5060008090505b8360200151518110156126dc57836020015181815181106126bf57fe5b602002602001015160a001518201915080806001019150506126a2565b5080821115612713576126f881836113b390919063ffffffff16565b83604001818152505060018360600190151590811515815250505b8082116127485761272d82826113b390919063ffffffff16565b83604001818152505060008360600190151590811515815250505b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b90508073ffffffffffffffffffffffffffffffffffffffff16631d7b33d7846040518263ffffffff1660e01b81526004016127a0919061441f565b60206040518083038186803b1580156127b857600080fd5b505afa1580156127cc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506127f09190810190613dd1565b915050919050565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff16633b1d21a26040518163ffffffff1660e01b815260040160206040518083038186803b15801561284657600080fd5b505afa15801561285a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061287e9190810190613dd1565b905060008273ffffffffffffffffffffffffffffffffffffffff166347bd37186040518163ffffffff1660e01b815260040160206040518083038186803b1580156128c857600080fd5b505afa1580156128dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129009190810190613dd1565b905060008373ffffffffffffffffffffffffffffffffffffffff16638f840ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561294a57600080fd5b505afa15801561295e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506129829190810190613dd1565b90506129a98161299b8486611e3390919063ffffffff16565b6113b390919063ffffffff16565b945050505050919050565b6000734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a075760009050612a8b565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b158015612a4d57600080fd5b505afa158015612a61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612a859190810190613b73565b90508090505b919050565b600080600090505b8251811015612ace57828181518110612aad57fe5b60200260200101516000015160800151820191508080600101915050612a98565b50809050919050565b600080600090505b8251811015612b1557828181518110612af457fe5b60200260200101516000015160800151820191508080600101915050612adf565b50809050919050565b600080600090505b8251811015612b5857828181518110612b3b57fe5b602002602001015160400151820191508080600101915050612b26565b50809050919050565b600081831115612b8557612b7e82846113b390919063ffffffff16565b9050612b8a565b600090505b92915050565b600080831415612baa57670de0b6b3a76400009050612bda565b612bd783612bc9670de0b6b3a7640000856113ca90919063ffffffff16565b6113fe90919063ffffffff16565b90505b92915050565b60608251604051908082528060200260200182016040528015612c125781602001602082028038833980820191505090505b5090506000612c1f6132f0565b60008090505b8551811015612d6b57612c53868281518110612c3d57fe5b6020026020010151600001516000015186612f61565b80935081945050506000868281518110612c6957fe5b6020026020010151604001511415612cb5577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848281518110612ca857fe5b6020026020010181815250505b82612cd9576000848281518110612cc857fe5b602002602001018181525050612d5e565b6000868281518110612ce757fe5b60200260200101516040015114612d5d57612d44868281518110612d0757fe5b602002602001015160400151612d36670de0b6b3a76400008560000151608001516113ca90919063ffffffff16565b6113fe90919063ffffffff16565b848281518110612d5057fe5b6020026020010181815250505b5b8080600101915050612c25565b50829250505092915050565b81836000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505080836020018181525050612dc283612e89565b505050565b600080733d9819210a31b4961b30ef54be2aed79b9c9cd3b73ffffffffffffffffffffffffffffffffffffffff16638e8f294b846040518263ffffffff1660e01b8152600401612e17919061441f565b60606040518083038186803b158015612e2f57600080fd5b505afa158015612e43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250612e679190810190613c5a565b50809350819250505080612e7f576000915050612e84565b819150505b919050565b612e968160000151613009565b8160400181905250612eab8160000151611d43565b816060018181525050612ec68160200151826000015161321d565b816080018181525050612edc816000015161274d565b8160a001818152505050565b612ef58160000151613009565b8160800181905250612f55670de0b6b3a7640000612f478360600151612f39612f2f866020015187604001516113ca90919063ffffffff16565b866000015161321d565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b8160a001818152505050565b6000612f6b6132f0565b60008090505b8351811015612ff9578473ffffffffffffffffffffffffffffffffffffffff16848281518110612f9d57fe5b6020026020010151600001516000015173ffffffffffffffffffffffffffffffffffffffff161415612fec576001848281518110612fd757fe5b60200260200101518090509250925050613002565b8080600101915050612f71565b50600081915091505b9250929050565b6060734ddc2d193948926d02f9b1fe9e1daa0718270ed573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613090576040518060400160405280600381526020017f45544800000000000000000000000000000000000000000000000000000000008152509050613218565b73f5dce57282a584d2746faf1593d3121fcac444dc73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613115576040518060400160405280600381526020017f53414900000000000000000000000000000000000000000000000000000000008152509050613218565b8173ffffffffffffffffffffffffffffffffffffffff16636f307dc36040518163ffffffff1660e01b815260040160206040518083038186803b15801561315b57600080fd5b505afa15801561316f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506131939190810190613b73565b73ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b815260040160006040518083038186803b1580156131d857600080fd5b505afa1580156131ec573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506132159190810190613ca9565b90505b919050565b60008061322983611d43565b905061325b81600a0a61324d8661323f87610d32565b6113ca90919063ffffffff16565b6113fe90919063ffffffff16565b91508191505092915050565b604051806040016040528060008152602001600081525090565b60405180608001604052806060815260200160608152602001600081526020016000151581525090565b60405180610100016040528060608152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001606081525090565b6040518060200160405280613303613454565b81525090565b604051806060016040528061331c613454565b815260200160008152602001600081525090565b6040518060600160405280613343613454565b815260200160008152602001600081525090565b604051806020016040528061336a613454565b81525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000815260200160608152602001600081525090565b6040518060c00160405280600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001606081526020016000815260200160008152602001600081525090565b6000813590506134af81614929565b92915050565b6000815190506134c481614929565b92915050565b600082601f8301126134db57600080fd5b81516134ee6134e9826145a0565b614573565b9150818183526020840193506020810190508385602084028201111561351357600080fd5b60005b83811015613543578161352988826134b5565b845260208401935060208301925050600181019050613516565b5050505092915050565b600082601f83011261355e57600080fd5b815161357161356c826145c8565b614573565b9150818183526020840193506020810190508385602084028201111561359657600080fd5b60005b838110156135c657816135ac8882613750565b845260208401935060208301925050600181019050613599565b5050505092915050565b600082601f8301126135e157600080fd5b81356135f46135ef826145f0565b614573565b9150818183526020840193506020810190508360005b8381101561363a578135860161362088826139cf565b84526020840193506020830192505060018101905061360a565b5050505092915050565b600082601f83011261365557600080fd5b813561366861366382614618565b614573565b9150818183526020840193506020810190508360005b838110156136ae57813586016136948882613a93565b84526020840193506020830192505060018101905061367e565b5050505092915050565b600082601f8301126136c957600080fd5b81356136dc6136d782614640565b614573565b9150818183526020840193506020810190508385602084028201111561370157600080fd5b60005b8381101561373157816137178882613b0b565b845260208401935060208301925050600181019050613704565b5050505092915050565b60008151905061374a81614940565b92915050565b60008151905061375f81614957565b92915050565b600082601f83011261377657600080fd5b813561378961378482614668565b614573565b915080825260208301602083018583830111156137a557600080fd5b6137b08382846148c9565b50505092915050565b600082601f8301126137ca57600080fd5b81516137dd6137d882614694565b614573565b915080825260208301602083018583830111156137f957600080fd5b6138048382846148d8565b50505092915050565b6000610100828403121561382057600080fd5b61382b610100614573565b9050600082013567ffffffffffffffff81111561384757600080fd5b61385384828501613644565b600083015250602082013567ffffffffffffffff81111561387357600080fd5b61387f848285016135d0565b602083015250604061389384828501613b0b565b60408301525060606138a784828501613b0b565b60608301525060806138bb84828501613b0b565b60808301525060a06138cf84828501613b0b565b60a08301525060c06138e384828501613b0b565b60c08301525060e082013567ffffffffffffffff81111561390357600080fd5b61390f848285016136b8565b60e08301525092915050565b600060c0828403121561392d57600080fd5b61393760c0614573565b90506000613947848285016134a0565b600083015250602061395b84828501613b0b565b602083015250604082013567ffffffffffffffff81111561397b57600080fd5b61398784828501613765565b604083015250606061399b84828501613b0b565b60608301525060806139af84828501613b0b565b60808301525060a06139c384828501613b0b565b60a08301525092915050565b6000602082840312156139e157600080fd5b6139eb6020614573565b9050600082013567ffffffffffffffff811115613a0757600080fd5b613a138482850161391b565b60008301525092915050565b600060808284031215613a3157600080fd5b613a3b6080614573565b90506000613a4b84828501613b20565b6000830152506020613a5f84828501613b20565b6020830152506040613a73848285016134b5565b6040830152506060613a8784828501613b20565b60608301525092915050565b600060608284031215613aa557600080fd5b613aaf6060614573565b9050600082013567ffffffffffffffff811115613acb57600080fd5b613ad78482850161391b565b6000830152506020613aeb84828501613b0b565b6020830152506040613aff84828501613b0b565b60408301525092915050565b600081359050613b1a8161496e565b92915050565b600081519050613b2f8161496e565b92915050565b600081519050613b4481614985565b92915050565b600060208284031215613b5c57600080fd5b6000613b6a848285016134a0565b91505092915050565b600060208284031215613b8557600080fd5b6000613b93848285016134b5565b91505092915050565b60008060408385031215613baf57600080fd5b6000613bbd858286016134a0565b9250506020613bce85828601613b0b565b9150509250929050565b600060208284031215613bea57600080fd5b600082015167ffffffffffffffff811115613c0457600080fd5b613c10848285016134ca565b91505092915050565b600060208284031215613c2b57600080fd5b600082015167ffffffffffffffff811115613c4557600080fd5b613c518482850161354d565b91505092915050565b600080600060608486031215613c6f57600080fd5b6000613c7d8682870161373b565b9350506020613c8e86828701613b20565b9250506040613c9f8682870161373b565b9150509250925092565b600060208284031215613cbb57600080fd5b600082015167ffffffffffffffff811115613cd557600080fd5b613ce1848285016137b9565b91505092915050565b600060208284031215613cfc57600080fd5b600082013567ffffffffffffffff811115613d1657600080fd5b613d228482850161380d565b91505092915050565b60008060408385031215613d3e57600080fd5b600083013567ffffffffffffffff811115613d5857600080fd5b613d648582860161380d565b9250506020613d7585828601613b0b565b9150509250929050565b600060808284031215613d9157600080fd5b6000613d9f84828501613a1f565b91505092915050565b600060208284031215613dba57600080fd5b6000613dc884828501613b0b565b91505092915050565b600060208284031215613de357600080fd5b6000613df184828501613b20565b91505092915050565b600060208284031215613e0c57600080fd5b6000613e1a84828501613b35565b91505092915050565b6000613e2f83836142cf565b905092915050565b6000613e4383836142f9565b905092915050565b6000613e5783836143b1565b905092915050565b6000613e6b8383614401565b60208301905092915050565b613e80816147d1565b82525050565b613e8f816147d1565b82525050565b6000613ea082614700565b613eaa818561476b565b935083602082028501613ebc856146c0565b8060005b85811015613ef85784840389528151613ed98582613e23565b9450613ee483614737565b925060208a01995050600181019050613ec0565b50829750879550505050505092915050565b6000613f158261470b565b613f1f818561477c565b935083602082028501613f31856146d0565b8060005b85811015613f6d5784840389528151613f4e8582613e37565b9450613f5983614744565b925060208a01995050600181019050613f35565b50829750879550505050505092915050565b6000613f8a82614716565b613f94818561478d565b935083602082028501613fa6856146e0565b8060005b85811015613fe25784840389528151613fc38582613e4b565b9450613fce83614751565b925060208a01995050600181019050613faa565b50829750879550505050505092915050565b6000613fff82614721565b614009818561479e565b9350614014836146f0565b8060005b8381101561404557815161402c8882613e5f565b97506140378361475e565b925050600181019050614018565b5085935050505092915050565b61405b816147e3565b82525050565b61406a816147e3565b82525050565b6140798161484b565b82525050565b6140888161486f565b82525050565b61409781614893565b82525050565b6140a6816148b7565b82525050565b60006140b78261472c565b6140c181856147af565b93506140d18185602086016148d8565b6140da8161490b565b840191505092915050565b60006140f08261472c565b6140fa81856147c0565b935061410a8185602086016148d8565b6141138161490b565b840191505092915050565b6000608083016000830151848203600086015261413b8282613f0a565b915050602083015184820360208601526141558282613f0a565b915050604083015161416a6040860182614401565b50606083015161417d6060860182614052565b508091505092915050565b60006101008301600083015184820360008601526141a68282613f7f565b915050602083015184820360208601526141c08282613e95565b91505060408301516141d56040860182614401565b5060608301516141e86060860182614401565b5060808301516141fb6080860182614401565b5060a083015161420e60a0860182614401565b5060c083015161422160c0860182614401565b5060e083015184820360e08601526142398282613ff4565b9150508091505092915050565b600060c08301600083015161425e6000860182613e77565b5060208301516142716020860182614401565b506040830151848203604086015261428982826140ac565b915050606083015161429e6060860182614401565b5060808301516142b16080860182614401565b5060a08301516142c460a0860182614401565b508091505092915050565b600060208301600083015184820360008601526142ec8282614246565b9150508091505092915050565b600060c0830160008301516143116000860182613e77565b5060208301516143246020860182614401565b5060408301516143376040860182614401565b50606083015161434a6060860182614401565b506080830151848203608086015261436282826140ac565b91505060a083015161437760a0860182614401565b508091505092915050565b6040820160008201516143986000850182614401565b5060208201516143ab6020850182614401565b50505050565b600060608301600083015184820360008601526143ce8282614246565b91505060208301516143e36020860182614401565b5060408301516143f66040860182614401565b508091505092915050565b61440a81614834565b82525050565b61441981614834565b82525050565b60006020820190506144346000830184613e86565b92915050565b600060408201905061444f6000830185614061565b81810360208301526144618184614188565b90509392505050565b600060208201905061447f6000830184614070565b92915050565b600060608201905061449a600083018661407f565b6144a7602083018561408e565b6144b46040830184613e86565b949350505050565b60006020820190506144d1600083018461409d565b92915050565b600060208201905081810360008301526144f181846140e5565b905092915050565b60006020820190508181036000830152614513818461411e565b905092915050565b600060208201905081810360008301526145358184614188565b905092915050565b60006040820190506145526000830184614382565b92915050565b600060208201905061456d6000830184614410565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561459657600080fd5b8060405250919050565b600067ffffffffffffffff8211156145b757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156145df57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561460757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561462f57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561465757600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561467f57600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156146ab57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b60006147dc82614814565b9050919050565b60008115159050919050565b60006147fa826147d1565b9050919050565b600081905061480f8261491c565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006148568261485d565b9050919050565b600061486882614814565b9050919050565b600061487a82614881565b9050919050565b600061488c82614814565b9050919050565b600061489e826148a5565b9050919050565b60006148b082614814565b9050919050565b60006148c282614801565b9050919050565b82818337600083830152505050565b60005b838110156148f65780820151818401526020810190506148db565b83811115614905576000848401525b50505050565b6000601f19601f8301169050919050565b6003811061492657fe5b50565b614932816147d1565b811461493d57600080fd5b50565b614949816147e3565b811461495457600080fd5b50565b614960816147ef565b811461496b57600080fd5b50565b61497781614834565b811461498257600080fd5b50565b61498e8161483e565b811461499957600080fd5b5056fea365627a7a72315820059da9e8fb338326f069bdf45a4bfcc034c0672b81114baa65039095278e3f4b6c6578706572696d656e74616cf564736f6c63430005100040
Deployed Bytecode Sourcemap
39346:13957:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39346:13957:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4542:196;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40168:222;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39658:138;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39413:37;;;:::i;:::-;;;;;;;;;;;;;;;;24724:119;;;:::i;:::-;;;;;;;;;;;;;;;;41418:180;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39972:188;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40584:224;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40421:155;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;40816:301;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41606:218;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41832:244;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;41125:262;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39804:133;;;:::i;:::-;;;;;;;;;;;;;;;;4542:196;4602:7;4641:8;4626:11;:23;4623:75;;3892:42;4667:17;;;;4623:75;3802:42;4712:16;;4542:196;;;;:::o;40168:222::-;40282:19;40320:62;40351:14;40367;40320:30;:62::i;:::-;40313:69;;40168:222;;;;:::o;39658:138::-;39712:30;;:::i;:::-;39761:27;39784:3;39761:22;:27::i;:::-;39754:34;;39658:138;;;:::o;39413:37::-;;;;;;;;;;;;;;;;;;;:::o;24724:119::-;24765:78;24724:119;:::o;41418:180::-;41488:45;41552:38;41586:3;41552:33;:38::i;:::-;41545:45;;41418:180;;;:::o;39972:188::-;40058:24;40101:51;40132:3;40137:14;40101:30;:51::i;:::-;40094:58;;39972:188;;;;:::o;40584:224::-;40675:52;;:::i;:::-;40746:54;40780:3;40785:14;40746:33;:54::i;:::-;40739:61;;40584:224;;;;:::o;40421:155::-;40483:36;;:::i;:::-;40538:30;40564:3;40538:25;:30::i;:::-;40531:37;;40421:155;;;:::o;40816:301::-;40949:16;40967:43;;:::i;:::-;41029:80;41062:14;41078:30;41029:32;:80::i;:::-;41022:87;;;;40816:301;;;;;:::o;41606:218::-;41703:45;41767:49;41801:14;41767:33;:49::i;:::-;41760:56;;41606:218;;;:::o;41832:244::-;41932:16;41950:47;;:::i;:::-;42016:52;42053:14;42016:36;:52::i;:::-;42009:59;;;;41832:244;;;:::o;41125:262::-;41243:52;;:::i;:::-;41314:65;41348:14;41364;41314:33;:65::i;:::-;41307:72;;41125:262;;;;:::o;39804:133::-;39853:19;39891:38;4017:42;39891:27;:38::i;:::-;39884:45;;39804:133;:::o;43176:771::-;43297:19;43328:35;43366:14;:29;;;43328:67;;43406:35;43444:14;:29;;;43406:67;;43490:6;43499:1;43490:10;;43486:204;43506:14;:21;43502:1;:25;43486:204;;;43566:112;43592:14;43607:1;43592:17;;;;;;;;;;;;;;:23;;;:30;;;43624:1;43627:14;43642:1;43627:17;;;;;;;;;;;;;;:23;;;:34;;;43663:14;43566:25;:112::i;:::-;43548:130;;;;43529:3;;;;;;;43486:204;;;;43706:6;43715:1;43706:10;;43702:204;43722:14;:21;43718:1;:25;43702:204;;;43782:112;43808:1;43811:14;43826:1;43811:17;;;;;;;;;;;;;;:23;;;:30;;;43843:14;43858:1;43843:17;;;;;;;;;;;;;;:23;;;:34;;;43879:14;43782:25;:112::i;:::-;43764:130;;;;43745:3;;;;;;;43702:204;;;;43925:14;43918:21;;;;43176:771;;;;:::o;43955:389::-;44017:30;;:::i;:::-;4193:42;44083:25;;;44109:3;44083:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44083:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44083:30:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44083:30:0;;;;;;;;;44061:11;:19;;:52;;;;;44126:25;4291:42;44126:58;;44222:12;:38;;;4193:42;4386;44320:3;44222:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44222:102:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44222:102:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44222:102:0;;;;;;;;;:112;;;44195:11;:24;;:139;;;;;43955:389;;;;:::o;51861:215::-;51939:45;52003:65;52037:30;52063:3;52037:25;:30::i;:::-;52003:33;:65::i;:::-;51996:72;;51861:215;;;:::o;42116:220::-;42212:19;42250:78;42281:30;42307:3;42281:25;:30::i;:::-;42313:14;42250:30;:78::i;:::-;42243:85;;42116:220;;;;:::o;47685:259::-;47784:52;;:::i;:::-;47855:81;47889:30;47915:3;47889:25;:30::i;:::-;47921:14;47855:33;:81::i;:::-;47848:88;;47685:259;;;;:::o;44352:331::-;44422:36;;:::i;:::-;44472:35;44510:22;44528:3;44510:17;:22::i;:::-;44472:60;;44543:35;44581:22;44599:3;44581:17;:22::i;:::-;44543:60;;44623:52;44644:14;44660;44623:20;:52::i;:::-;44616:59;;;;44352:331;;;:::o;46012:1665::-;46151:16;46169:43;;:::i;:::-;46355:1;46302:49;46336:14;46302:33;:49::i;:::-;46297:55;;;;;;;;:59;46294:101;;;46366:5;46373:21;46358:37;;;;;;46294:101;46514:35;46552:14;:29;;;46514:67;;46598:6;46607:1;46598:10;;46594:1034;46614:14;:21;46610:1;:25;46594:1034;;;46710:1;46663:14;46678:1;46663:17;;;;;;;;;;;;;;:43;;;:48;46660:61;;;46713:8;;46660:61;46740:20;46777:34;;:::i;:::-;46828;;:::i;:::-;46881:736;46943:49;39561:17;46943:30;:34;;:49;;;;:::i;:::-;46887:14;:49;;;46937:1;46887:52;;;;;;;;;;;;;;:105;46881:736;;47032:207;3278:6;47032:190;3278:6;47032:173;47116:88;47151:14;:49;;;47201:1;47151:52;;;;;;;;;;;;;;47116:30;:34;;:88;;;;:::i;:::-;47032:79;47067:14;47082:1;47067:17;;;;;;;;;;;;;;:43;;;47032:14;47047:1;47032:17;;;;;;;;;;;;;;:23;;;:30;;;:34;;:79;;;;:::i;:::-;:83;;:173;;;;:::i;:::-;:177;;:190;;;;:::i;:::-;:194;;:207;;;;:::i;:::-;47014:225;;47278:70;47296:14;47311:1;47296:17;;;;;;;;;;;;;;:23;;;:34;;;47332:15;47278:17;:70::i;:::-;47260:88;;47387:70;47405:14;47420:1;47405:17;;;;;;;;;;;;;;:23;;;:34;;;47441:15;47387:17;:70::i;:::-;47369:88;;47480:47;47495:14;47511:15;47480:14;:47::i;:::-;47548:49;47565:14;47581:15;47548:16;:49::i;:::-;46881:736;;;46594:1034;;;;46637:3;;;;;;;46594:1034;;;;47648:4;47654:14;47640:29;;;;;46012:1665;;;;;;:::o;49797:2056::-;49900:45;50372:32;50347:57;;50424:52;50458:14;50474:1;50424:33;:52::i;:::-;:72;;;50420:170;;50537:41;50512:66;;50420:170;50606:6;50615:1;50606:10;;50602:407;50622:14;:49;;;:56;50618:1;:60;50602:407;;;24765:78;50702:14;:49;;;50752:1;50702:52;;;;;;;;;;;;;;:70;50699:83;;;50774:8;;50699:83;3278:6;50802:14;:49;;;50852:1;50802:52;;;;;;;;;;;;;;:66;50799:197;;;50914:42;50889:67;;50975:5;;50799:197;50602:407;50680:3;;;;;;;50602:407;;;;51021:13;51045:32;;:::i;:::-;51092:6;51101:1;51092:10;;51088:716;51108:14;:29;;;:36;51104:1;:40;51088:716;;;3278:6;51168:14;:29;;;51198:1;51168:32;;;;;;;;;;;;;;:38;;;:50;;;:64;51165:77;;;51234:8;;51165:77;51348:99;51366:14;:29;;;51396:1;51366:32;;;;;;;;;;;;;;:38;;;:49;;;51417:14;:29;;;51348:17;:99::i;:::-;51320:127;;;;;;;;51468:8;51464:139;;51521:42;51496:67;;51582:5;;51464:139;51665:1;51622:13;:39;;;:44;51619:174;;;51711:42;51686:67;;51772:5;;51619:174;51088:716;51146:3;;;;;;;51088:716;;;;51823:22;51816:29;;;;49797:2056;;;:::o;52084:1210::-;52190:16;52208:47;;:::i;:::-;52328:1;52275:49;52309:14;52275:33;:49::i;:::-;52270:55;;;;;;;;:59;52267:105;;;52339:5;52346:25;52331:41;;;;;;52267:105;52385:36;52442:14;:29;;;:36;52424:55;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;52385:94;;52492:18;52521:11;52543:13;52567:32;;:::i;:::-;52614:6;52623:1;52614:10;;52610:548;52630:14;:29;;;:36;52626:1;:40;52610:548;;;52700:14;:29;;;52730:1;52700:32;;;;;;;;;;;;;;:38;;;:49;;;52687:62;;52794:58;52810:10;52822:14;:29;;;52794:15;:58::i;:::-;52766:86;;;;;;;;52871:8;52867:102;;52908:14;:29;;;52938:1;52908:32;;;;;;;;;;;;;;:38;;;:45;;;52899:54;;52867:102;52994:77;53044:13;:19;;;:26;;;52994:14;:29;;;53024:1;52994:32;;;;;;;;;;;;;;:38;;;:45;;;:49;;:77;;;;:::i;:::-;52985:86;;53109:37;53127:10;53139:6;53109:17;:37::i;:::-;53088:15;53104:1;53088:18;;;;;;;;;;;;;:58;;;;52668:3;;;;;;;52610:548;;;;53170:35;53226:4;53232:53;53253:15;53270:14;53232:20;:53::i;:::-;53218:68;;;;;;;;;;52084:1210;;;;:::o;47952:365::-;48076:52;;:::i;:::-;48147:162;48176:65;48195:14;:29;;;48226:14;48176:18;:65::i;:::-;48243;48262:14;:29;;;48293:14;48243:18;:65::i;:::-;48147:28;:162::i;:::-;48140:169;;47952:365;;;;:::o;12336:699::-;12416:15;12449:18;4386:42;12470:35;;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12470:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12470:37:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12470:37:0;;;;;;;;;12449:58;;3624:42;12527:23;;:10;:23;;;:50;;;;3713:42;12554:23;;:10;:23;;;12527:50;12524:149;;;3278:6;12597:24;;12647:10;12640:17;;;;;12524:149;3892:42;12692:24;;:10;:24;;;:51;;;;3802:42;12720:23;;:10;:23;;;12692:51;12689:213;;;12776:74;12843:6;12788:10;12776:42;;;12826:10;12776:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12776:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12776:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12776:62:0;;;;;;;;;:66;;:74;;;;:::i;:::-;12763:87;;12876:10;12869:17;;;;;12689:213;12943:10;12931:42;;;12981:10;12931:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;12931:62:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;12931:62:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;12931:62:0;;;;;;;;;12918:75;;13015:10;13008:17;;;12336:699;;;;:::o;42344:822::-;42484:27;42525:19;42547:49;42569:10;42581:14;42547:21;:49::i;:::-;42525:71;;42607:38;42648:68;42689:10;42701:14;42648:40;:68::i;:::-;42607:109;;42727:38;42768:68;42809:10;42821:14;42768:40;:68::i;:::-;42727:109;;42847:13;42863:36;4017:42;42863:25;:36::i;:::-;42847:52;;43006:110;43107:8;43103:2;:12;43006:92;43025:72;43063:33;43025;:37;;:72;;;;:::i;:::-;43006:14;:18;;:92;;;;:::i;:::-;:96;;:110;;;;:::i;:::-;42981:135;;43136:22;43129:29;;;;;;42344:822;;;;;;:::o;44691:737::-;44753:35;44800:39;4386:42;44842:40;;;44883:3;44842:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44842:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44842:45:0;;;;;;39:16:-1;36:1;17:17;2:54;44842:45:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;44842:45:0;;;;;;;;;44800:87;;44933:22;:29;44915:48;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;44898:65;;44980:6;44989:1;44980:10;;44976:343;44996:22;:29;44992:1;:33;44976:343;;;45198:109;45216:22;45239:1;45216:25;;;;;;;;;;;;;;45243:63;45275:3;45280:22;45303:1;45280:25;;;;;;;;;;;;;;45243:31;:63::i;:::-;45198:17;:109::i;:::-;45178:14;45193:1;45178:17;;;;;;;;;;;;;:129;;;;45027:3;;;;;;;44976:343;;;;45348:38;45371:14;45348:22;:38::i;:::-;45331:55;;45406:14;45399:21;;;44691:737;;;:::o;45436:566::-;45498:35;45545;45583:29;45608:3;45583:24;:29::i;:::-;45545:67;;45660:18;:25;45642:44;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45625:61;;45703:6;45712:1;45703:10;;45699:194;45719:18;:25;45715:1;:29;45699:194;;;45785:96;45803:18;45822:1;45803:21;;;;;;;;;;;;;;45833:18;45852:1;45833:21;;;;;;;;;;;;;;45826:49;;;45876:3;45826:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45826:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45826:54:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45826:54:0;;;;;;;;;45785:17;:96::i;:::-;45765:14;45780:1;45765:17;;;;;;;;;;;;;:116;;;;45746:3;;;;;;;45699:194;;;;45922:38;45945:14;45922:22;:38::i;:::-;45905:55;;45980:14;45973:21;;;45436:566;;;:::o;30832:335::-;30958:36;;:::i;:::-;31038:14;31006;:29;;:46;;;;31095:14;31063;:29;;:46;;;;31122:37;31144:14;31122:21;:37::i;:::-;30832:335;;;;:::o;905:113::-;963:7;991:1;986;:6;;979:14;;;;1011:1;1007;:5;1000:12;;905:113;;;;:::o;250:174::-;308:9;335:1;330;:6;326:37;;;354:1;347:8;;;;326:37;377:1;373;:5;369:9;;401:1;396;392;:5;;;;;;:10;385:18;;;;417:1;410:8;;250:174;;;;;:::o;511:277::-;569:7;781:1;777;:5;;;;;;770:12;;511:277;;;;:::o;29001:251::-;29083:30;;:::i;:::-;29125:18;;:::i;:::-;29146:31;29158:10;29170:6;29146:11;:31::i;:::-;29125:52;;29208:5;29188:11;:17;;:25;;;;29233:11;29226:18;;;29001:251;;;;:::o;28698:295::-;28780:30;;:::i;:::-;28822:18;;:::i;:::-;28843:31;28855:10;28867:6;28843:11;:31::i;:::-;28822:52;;28905:5;28885:11;:17;;:25;;;;28923:31;28942:11;28923:18;:31::i;:::-;28974:11;28967:18;;;28698:295;;;;:::o;36238:995::-;36360:6;36369:1;36360:10;;36356:409;36376:14;:29;;;:36;36372:1;:40;36356:409;;;36489:11;:17;;;:28;;;36436:81;;:14;:29;;;36466:1;36436:32;;;;;;;;;;;;;;:38;;;:49;;;:81;;;36433:94;;36519:8;;36433:94;36544:134;36568:14;:29;;;36598:1;36568:32;;;;;;;;;;;;;;36602:75;36652:11;:17;;;:24;;;36602:14;:29;;;36632:1;36602:32;;;;;;;;;;;;;;:38;;;:45;;;:49;;:75;;;;:::i;:::-;36544:23;:134::i;:::-;36693:37;36715:14;36693:21;:37::i;:::-;36747:7;;;36356:409;36414:3;;;;;;;36356:409;;;;36777:11;36791:43;36832:1;36791:14;:29;;;:36;:40;;:43;;;;:::i;:::-;36777:57;;36845:36;36902:6;36884:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;36845:64;;36926:6;36935:1;36926:10;;36922:142;36942:14;:29;;;:36;36938:1;:40;36922:142;;;37020:14;:29;;;37050:1;37020:32;;;;;;;;;;;;;;36999:15;37015:1;36999:18;;;;;;;;;;;;;:53;;;;36980:3;;;;;;;36922:142;;;;37104:11;37076:15;37099:1;37092:6;:8;37076:25;;;;;;;;;;;;;:39;;;;37160:15;37128:14;:29;;:47;;;;37186:37;37208:14;37186:21;:37::i;:::-;36238:995;;;;;:::o;35183:1047::-;35309:6;35318:1;35309:10;;35305:409;35325:14;:29;;;:36;35321:1;:40;35305:409;;;35438:11;:17;;;:28;;;35385:81;;:14;:29;;;35415:1;35385:32;;;;;;;;;;;;;;:38;;;:49;;;:81;;;35382:94;;35468:8;;35382:94;35493:134;35517:14;:29;;;35547:1;35517:32;;;;;;;;;;;;;;35551:75;35601:11;:17;;;:24;;;35551:14;:29;;;35581:1;35551:32;;;;;;;;;;;;;;:38;;;:45;;;:49;;:75;;;;:::i;:::-;35493:23;:134::i;:::-;35642:37;35664:14;35642:21;:37::i;:::-;35696:7;;;35305:409;35363:3;;;;;;;35305:409;;;;35780:11;35794:43;35835:1;35794:14;:29;;;:36;:40;;:43;;;;:::i;:::-;35780:57;;35848:35;35904:6;35886:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;35848:63;;35928:6;35937:1;35928:10;;35924:141;35944:14;:29;;;:36;35940:1;:40;35924:141;;;36021:14;:29;;;36051:1;36021:32;;;;;;;;;;;;;;36001:14;36016:1;36001:17;;;;;;;;;;;;;:52;;;;35982:3;;;;;;;35924:141;;;;36104:11;36077:14;36099:1;36092:6;:8;36077:24;;;;;;;;;;;;;:38;;;;36158:14;36126;:29;;:46;;;;36185:37;36207:14;36185:21;:37::i;:::-;35183:1047;;;;;:::o;37241:394::-;37345:13;37360:30;;:::i;:::-;37406:6;37415:1;37406:10;;37402:186;37422:12;:19;37418:1;:23;37402:186;;;37479:12;37492:1;37479:15;;;;;;;;;;;;;;:21;;;:32;;;37465:46;;:10;:46;;;37462:115;;;37539:4;37545:12;37558:1;37545:15;;;;;;;;;;;;;;37531:30;;;;;;;;;;37462:115;37443:3;;;;;;;37402:186;;;;37608:5;37615:11;37600:27;;;;37241:394;;;;;;:::o;37643:392::-;37745:13;37760:30;;:::i;:::-;37806:6;37815:1;37806:10;;37802:186;37822:12;:19;37818:1;:23;37802:186;;;37879:12;37892:1;37879:15;;;;;;;;;;;;;;:21;;;:32;;;37865:46;;:10;:46;;;37862:115;;;37939:4;37945:12;37958:1;37945:15;;;;;;;;;;;;;;37931:30;;;;;;;;;;37862:115;37843:3;;;;;;;37802:186;;;;38008:5;38015:11;38000:27;;;;37643:392;;;;;;:::o;48325:723::-;48431:39;48521:12;:19;48500:41;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;48482:59;;48554:18;48583:25;48619:12;48646:6;48655:1;48646:10;;48642:364;48662:12;:19;48658:1;:23;48642:364;;;48715:12;48728:1;48715:15;;;;;;;;;;;;;;:21;;;:32;;;48702:45;;48792:10;48785:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48785:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48785:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;48785:39:0;;;;;;;;;48762:62;;48849:12;48862:1;48849:15;;;;;;;;;;;;;;:21;;;:28;;;48839:38;;48915:79;48936:10;48948:20;48970:7;48979:14;48915:20;:79::i;:::-;48894:15;48910:1;48894:18;;;;;;;;;;;;;:100;;;;48683:3;;;;;;;48642:364;;;;49025:15;49018:22;;;;;48325:723;;;;:::o;49056:733::-;49164:39;49254:14;:21;49233:43;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;49215:61;;49289:18;49318:25;49354:12;49381:6;49390:1;49381:10;;49377:370;49397:14;:21;49393:1;:25;49377:370;;;49452:14;49467:1;49452:17;;;;;;;;;;;;;;:23;;;:34;;;49439:47;;49531:10;49524:37;;;:39;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49524:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;49524:39:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;49524:39:0;;;;;;;;;49501:62;;49588:14;49603:1;49588:17;;;;;;;;;;;;;;:23;;;:30;;;49578:40;;49656:79;49677:10;49689:20;49711:7;49720:14;49656:20;:79::i;:::-;49635:15;49651:1;49635:18;;;;;;;;;;;;;:100;;;;49420:3;;;;;;;49377:370;;;;49766:15;49759:22;;;;;49056:733;;;;:::o;27138:445::-;27280:52;;:::i;:::-;27385:15;27344:22;:38;;:56;;;;27452:15;27411:22;:38;;:56;;;;27480:53;27510:22;27480:29;:53::i;:::-;27553:22;27546:29;;27138:445;;;;:::o;15125:204::-;15219:19;15259:60;15304:14;15259:40;15288:10;15259:28;:40::i;:::-;:44;;:60;;;;:::i;:::-;15252:67;;15125:204;;;;:::o;17843:294::-;17956:38;18008:16;18027:30;18046:10;18027:18;:30::i;:::-;18008:49;;18079:48;18115:11;18079:31;3278:6;18079:14;:18;;:31;;;;:::i;:::-;:35;;:48;;;;:::i;:::-;18072:55;;;17843:294;;;;:::o;18605:299::-;18718:38;18772:16;18798:10;18791:31;;;:33;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18791:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;18791:33:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;18791:33:0;;;;;;;;;18772:52;;18846:48;18882:11;18846:31;3278:6;18846:14;:18;;:31;;;;:::i;:::-;:35;;:48;;;;:::i;:::-;18839:55;;;18605:299;;;;:::o;13900:374::-;13977:13;3535:42;14007:22;;:10;:22;;;14004:104;;;14059:2;14048:13;;14086:8;14079:15;;;;14004:104;14122:22;14147:33;14169:10;14147:21;:33::i;:::-;14122:58;;14210:14;14204:30;;;:32;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14204:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14204:32:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;14204:32:0;;;;;;;;;14193:43;;;;14256:8;14249:15;;;13900:374;;;;:::o;1085:127::-;1143:9;1169:1;1165;:5;1161:9;;1189:1;1184;:6;;1177:14;;;;1205:1;1198:8;;1085:127;;;;:::o;18914:274::-;19010:29;19053:13;19076:10;19053:34;;19107:71;3278:6;19107:54;19133:6;:25;;;:27;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19133:27:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19133:27:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19133:27:0;;;;;;;;;19107:6;:16;;;19124:3;19107:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19107:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19107:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19107:21:0;;;;;;;;;:25;;:54;;;;:::i;:::-;:58;;:71;;;;:::i;:::-;19100:78;;;18914:274;;;;:::o;38043:642::-;38132:36;38180:11;38208:6;38217:1;38208:10;;38204:148;38224:12;:19;38220:1;:23;38204:148;;;38304:1;38267:12;38280:1;38267:15;;;;;;;;;;;;;;:21;;;:33;;;:38;38264:51;;;38307:8;;38264:51;38332:8;;;;;;;38204:148;38245:3;;;;;;;38204:148;;;;38400:6;38382:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;38364:43;;38418:10;38445:6;38454:1;38445:10;;38441:202;38461:12;:19;38457:1;:23;38441:202;;;38541:1;38504:12;38517:1;38504:15;;;;;;;;;;;;;;:21;;;:33;;;:38;38501:51;;;38544:8;;38501:51;38594:12;38607:1;38594:15;;;;;;;;;;;;;;38569;38585:5;38569:22;;;;;;;;;;;;;:40;;;;38624:7;;;;;;;38441:202;38482:3;;;;;;;38441:202;;;;38662:15;38655:22;;;;38043:642;;;:::o;19198:825::-;19267:35;19316:26;4386:42;19345;;;:44;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19345:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19345:44:0;;;;;;39:16:-1;36:1;17:17;2:54;19345:44:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19345:44:0;;;;;;;;;19316:73;;19404:11;19432:6;19441:1;19432:10;;19428:229;19448:10;:17;19444:1;:21;19428:229;;;19605:1;19563:10;19574:1;19563:13;;;;;;;;;;;;;;:33;;;19597:3;19563:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19563:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19563:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19563:38:0;;;;;;;;;:43;19560:56;;;19608:8;;19560:56;19635:8;;;;;;;19428:229;19467:3;;;;;;;19428:229;;;;19706:6;19692:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;19692:21:0;;;;19671:42;;19728:10;19755:6;19764:1;19755:10;;19751:223;19771:10;:17;19767:1;:21;19751:223;;;19856:1;19814:10;19825:1;19814:13;;;;;;;;;;;;;;:33;;;19848:3;19814:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19814:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19814:38:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;19814:38:0;;;;;;;;;:43;19811:56;;;19859:8;;19811:56;19922:10;19933:1;19922:13;;;;;;;;;;;;;;19886:18;19905:5;19886:25;;;;;;;;;;;;;:50;;;;;;;;;;;19953:7;;;;;;;19751:223;19790:3;;;;;;;19751:223;;;;19995:18;19988:25;;;;;19198:825;;;:::o;38693:642::-;38782:36;38830:11;38858:6;38867:1;38858:10;;38854:148;38874:12;:19;38870:1;:23;38854:148;;;38954:1;38917:12;38930:1;38917:15;;;;;;;;;;;;;;:21;;;:33;;;:38;38914:51;;;38957:8;;38914:51;38982:8;;;;;;;38854:148;38895:3;;;;;;;38854:148;;;;39050:6;39032:25;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;39014:43;;39068:10;39095:6;39104:1;39095:10;;39091:202;39111:12;:19;39107:1;:23;39091:202;;;39191:1;39154:12;39167:1;39154:15;;;;;;;;;;;;;;:21;;;:33;;;:38;39151:51;;;39194:8;;39151:51;39244:12;39257:1;39244:15;;;;;;;;;;;;;;39219;39235:5;39219:22;;;;;;;;;;;;;:40;;;;39274:7;;;;;;;39091:202;39132:3;;;;;;;39091:202;;;;39312:15;39305:22;;;;38693:642;;;:::o;31175:870::-;31305:52;31327:14;:29;;;31305:21;:52::i;:::-;31268:14;:34;;:89;;;;;31405:52;31427:14;:29;;;31405:21;:52::i;:::-;31368:14;:34;;:89;;;;;31517:64;31551:14;:29;;;31517:33;:64::i;:::-;31468:14;:46;;:113;;;;;31625:89;31643:14;:34;;;31679:14;:34;;;31625:17;:89::i;:::-;31592:14;:30;;:122;;;;;31766:109;31792:14;:46;;;31840:14;:34;;;31766:25;:109::i;:::-;31725:14;:38;;:150;;;;;31938:99;31976:14;:29;;;32007:14;:29;;;31938:37;:99::i;:::-;31886:14;:49;;:151;;;;31175:870;:::o;30046:177::-;30122:18;;:::i;:::-;30152:38;30164:5;30171:10;30183:6;30152:11;:38::i;:::-;30210:5;30203:12;;30046:177;;;;:::o;29704:334::-;29828:61;29860:11;:17;;;:28;;;29828:31;:61::i;:::-;29788:11;:37;;:101;;;;;29941:89;3278:6;29941:72;29975:11;:37;;;29941:11;:17;;;:29;;;:33;;:72;;;;:::i;:::-;:76;;:89;;;;:::i;:::-;29900:11;:38;;:130;;;;;29704:334;:::o;29503:193::-;29635:9;29608:11;:17;;;:24;;:36;;;;;29657:31;29670:11;:17;;;29657:12;:31::i;:::-;29503:193;;:::o;29260:235::-;29392:9;29365:11;:17;;;:24;;:36;;;;;29414:31;29427:11;:17;;;29414:12;:31::i;:::-;29456;29475:11;29456:18;:31::i;:::-;29260:235;;:::o;26244:481::-;26378:36;;:::i;:::-;26454:10;26426:14;:25;;:38;;;;;;;;;;;26513:20;26475:14;:35;;:58;;;;;26569:7;26544:14;:22;;:32;;;;;26619:14;26587;:29;;:46;;;;;26646:37;26668:14;26646:21;:37::i;:::-;26703:14;26696:21;;26244:481;;;;;;:::o;27591:1099::-;27709:29;27749;27795:6;27804:1;27795:10;;27791:182;27811:22;:38;;;:45;27807:1;:49;27791:182;;;27905:22;:38;;;27944:1;27905:41;;;;;;;;;;;;;;:56;;;27877:84;;;;27858:3;;;;;;;27791:182;;;;27989:6;27998:1;27989:10;;27985:182;28005:22;:38;;;:45;28001:1;:49;27985:182;;;28099:22;:38;;;28138:1;28099:41;;;;;;;;;;;;;;:56;;;28071:84;;;;28052:3;;;;;;;27985:182;;;;28209:24;28182;:51;28179:245;;;28294:54;28323:24;28294;:28;;:54;;;;:::i;:::-;28249:22;:42;;:99;;;;;28408:4;28363:22;:42;;:49;;;;;;;;;;;28179:245;28467:24;28439;:52;28436:247;;28552:54;28581:24;28552;:28;;:54;;;;:::i;:::-;28507:22;:42;;:99;;;;;28666:5;28621:22;:42;;:50;;;;;;;;;;;28436:247;27591:1099;;;:::o;14875:238::-;14955:26;14995:23;4386:42;14995:54;;15069:11;:22;;;15092:10;15069:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15069:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;15069:34:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;15069:34:0;;;;;;;;;15062:41;;;14875:238;;;:::o;14509:356::-;14579:16;14609:13;14632:10;14609:34;;14656:9;14668:6;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14668:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14668:16:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;14668:16:0;;;;;;;;;14656:28;;14697:16;14716:6;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14716:21:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14716:21:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;14716:21:0;;;;;;;;;14697:40;;14750:18;14771:6;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14771:22:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;14771:22:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;14771:22:0;;;;;;;;;14750:43;;14815:40;14841:13;14815:21;14824:11;14815:4;:8;;:21;;;;:::i;:::-;:25;;:40;;;;:::i;:::-;14808:47;;;;;;14509:356;;;:::o;11670:292::-;11743:22;3535:42;11783:22;;:10;:22;;;11780:74;;;11838:1;11823:17;;;;11780:74;11892:10;11885:29;;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11885:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11885:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;11885:31:0;;;;;;;;;11868:48;;11938:14;11931:21;;11670:292;;;;:::o;32053:301::-;32143:23;32182:6;32191:1;32182:10;;32178:131;32198:14;:21;32194:1;:25;32178:131;;;32262:14;32277:1;32262:17;;;;;;;;;;;;;;:23;;;:35;;;32240:57;;;;32221:3;;;;;;;32178:131;;;;32328:18;32321:25;;32053:301;;;:::o;32362:::-;32452:23;32491:6;32500:1;32491:10;;32487:131;32507:14;:21;32503:1;:25;32487:131;;;32571:14;32586:1;32571:17;;;;;;;;;;;;;;:23;;;:35;;;32549:57;;;;32530:3;;;;;;;32487:131;;;;32637:18;32630:25;;32362:301;;;:::o;32671:358::-;32773:35;32824:6;32833:1;32824:10;;32820:152;32840:14;:21;32836:1;:25;32820:152;;;32916:14;32931:1;32916:17;;;;;;;;;;;;;;:44;;;32882:78;;;;32863:3;;;;;;;32820:152;;;;32991:30;32984:37;;32671:358;;;:::o;34509:277::-;34608:19;34663:18;34642;:39;34639:119;;;34704:42;34727:18;34704;:22;;:42;;;;:::i;:::-;34697:49;;;;34639:119;34777:1;34770:8;;34509:277;;;;;:::o;33037:315::-;33156:27;33232:1;33198:30;:35;33195:58;;;3278:6;33235:18;;;;33195:58;33273:71;33313:30;33273:35;3278:6;33273:18;:22;;:35;;;;:::i;:::-;:39;;:71;;;;:::i;:::-;33266:78;;33037:315;;;;;:::o;33360:1141::-;33503:48;33613:14;:21;33602:33;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;33602:33:0;;;;33565:70;;33648:14;33673:33;;:::i;:::-;33723:6;33732:1;33723:10;;33719:721;33739:14;:21;33735:1;:25;33719:721;;;33811:81;33841:14;33856:1;33841:17;;;;;;;;;;;;;;:23;;;:34;;;33877:14;33811:29;:81::i;:::-;33781:111;;;;;;;;33960:1;33912:14;33927:1;33912:17;;;;;;;;;;;;;;:44;;;:49;33909:142;;;24765:78;33981:34;34016:1;33981:37;;;;;;;;;;;;;:54;;;;;33909:142;34071:9;34067:117;;34140:1;34100:34;34135:1;34100:37;;;;;;;;;;;;;:41;;;;;34160:8;;34067:117;34251:1;34203:14;34218:1;34203:17;;;;;;;;;;;;;;:44;;;:49;34200:227;;34312:99;34366:14;34381:1;34366:17;;;;;;;;;;;;;;:44;;;34312:49;3278:6;34312:14;:20;;;:32;;;:36;;:49;;;;:::i;:::-;:53;;:99;;;;:::i;:::-;34272:34;34307:1;34272:37;;;;;;;;;;;;;:139;;;;;34200:227;33719:721;33762:3;;;;;;;33719:721;;;;34459:34;34452:41;;;;33360:1141;;;;:::o;30231:199::-;30348:10;30329:5;:16;;:29;;;;;;;;;;;30384:6;30369:5;:12;;:21;;;;;30403:19;30416:5;30403:12;:19::i;:::-;30231:199;;;:::o;20033:336::-;20116:29;20159:13;4386:42;20228:36;;;20265:10;20228:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20228:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20228:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;20228:48:0;;;;;;;;;20187:89;;;;;;;;;20295:8;20291:22;;20312:1;20305:8;;;;;20291:22;20335:24;20328:31;;;20033:336;;;;:::o;30438:386::-;30530:41;30554:5;:16;;;30530:23;:41::i;:::-;30504:5;:23;;:67;;;;30610:43;30636:5;:16;;;30610:25;:43::i;:::-;30582:5;:25;;:71;;;;;30684:56;30709:5;:12;;;30723:5;:16;;;30684:24;:56::i;:::-;30664:5;:17;;:76;;;;;30770:46;30799:5;:16;;;30770:28;:46::i;:::-;30751:5;:16;;:65;;;;;30438:386;:::o;26733:397::-;26861:50;26885:14;:25;;;26861:23;:50::i;:::-;26826:14;:32;;:85;;;;26954:168;3278:6;26954:151;27075:14;:29;;;26954:116;26979:63;27006:14;:35;;;26979:14;:22;;;:26;;:63;;;;:::i;:::-;27044:14;:25;;;26954:24;:116::i;:::-;:120;;:151;;;;:::i;:::-;:155;;:168;;;;:::i;:::-;26922:14;:29;;:200;;;;;26733:397;:::o;34794:381::-;34912:13;34927:30;;:::i;:::-;34973:6;34982:1;34973:10;;34969:159;34989:14;:21;34985:1;:25;34969:159;;;35072:10;35034:48;;:14;35049:1;35034:17;;;;;;;;;;;;;;:23;;;:34;;;:48;;;35031:85;;;35092:4;35098:14;35113:1;35098:17;;;;;;;;;;;;;;35084:32;;;;;;;;;;35031:85;35012:3;;;;;;;34969:159;;;;35148:5;35155:11;35140:27;;;;34794:381;;;;;;:::o;13596:294::-;13671:33;3535:42;13721:22;;:10;:22;;;13718:39;;;13745:12;;;;;;;;;;;;;;;;;;;;;13718:39;4105:42;13775:22;;:10;:22;;;13772:39;;;13799:12;;;;;;;;;;;;;;;;;;;;;13772:39;13846:10;13839:29;;;:31;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13839:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13839:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13839:31:0;;;;;;;;;13833:45;;;:47;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13833:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13833:47:0;;;;;;39:16:-1;36:1;17:17;2:54;13833:47:0;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13833:47:0;;;;;;;;;13826:54;;13596:294;;;;:::o;11974:352::-;12074:15;12105:23;12131:37;12157:10;12131:25;:37::i;:::-;12105:63;;12194:90;12265:18;12261:2;:22;12194:62;12238:17;12194:39;12222:10;12194:27;:39::i;:::-;:43;;:62;;;;:::i;:::-;:66;;:90;;;;:::i;:::-;12181:103;;12306:10;12299:17;;;11974:352;;;;:::o;39346:13957::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;301:722;;429:3;422:4;414:6;410:17;406:27;396:2;;447:1;444;437:12;396:2;477:6;471:13;499:80;514:64;571:6;514:64;;;499:80;;;490:89;;596:5;621:6;614:5;607:21;651:4;643:6;639:17;629:27;;673:4;668:3;664:14;657:21;;726:6;773:3;765:4;757:6;753:17;748:3;744:27;741:36;738:2;;;790:1;787;780:12;738:2;815:1;800:217;825:6;822:1;819:13;800:217;;;883:3;905:48;949:3;937:10;905:48;;;900:3;893:61;977:4;972:3;968:14;961:21;;1005:4;1000:3;996:14;989:21;;857:160;847:1;844;840:9;835:14;;800:217;;;804:14;389:634;;;;;;;;1057:764;;1199:3;1192:4;1184:6;1180:17;1176:27;1166:2;;1217:1;1214;1207:12;1166:2;1247:6;1241:13;1269:94;1284:78;1355:6;1284:78;;;1269:94;;;1260:103;;1380:5;1405:6;1398:5;1391:21;1435:4;1427:6;1423:17;1413:27;;1457:4;1452:3;1448:14;1441:21;;1510:6;1557:3;1549:4;1541:6;1537:17;1532:3;1528:27;1525:36;1522:2;;;1574:1;1571;1564:12;1522:2;1599:1;1584:231;1609:6;1606:1;1603:13;1584:231;;;1667:3;1689:62;1747:3;1735:10;1689:62;;;1684:3;1677:75;1775:4;1770:3;1766:14;1759:21;;1803:4;1798:3;1794:14;1787:21;;1641:174;1631:1;1628;1624:9;1619:14;;1584:231;;;1588:14;1159:662;;;;;;;;1884:745;;2022:3;2015:4;2007:6;2003:17;1999:27;1989:2;;2040:1;2037;2030:12;1989:2;2077:6;2064:20;2099:101;2114:85;2192:6;2114:85;;;2099:101;;;2090:110;;2217:5;2242:6;2235:5;2228:21;2272:4;2264:6;2260:17;2250:27;;2294:4;2289:3;2285:14;2278:21;;2347:6;2380:1;2365:258;2390:6;2387:1;2384:13;2365:258;;;2473:3;2460:17;2452:6;2448:30;2497:62;2555:3;2543:10;2497:62;;;2492:3;2485:75;2583:4;2578:3;2574:14;2567:21;;2611:4;2606:3;2602:14;2595:21;;2422:201;2412:1;2409;2405:9;2400:14;;2365:258;;;2369:14;1982:647;;;;;;;;2692:745;;2830:3;2823:4;2815:6;2811:17;2807:27;2797:2;;2848:1;2845;2838:12;2797:2;2885:6;2872:20;2907:101;2922:85;3000:6;2922:85;;;2907:101;;;2898:110;;3025:5;3050:6;3043:5;3036:21;3080:4;3072:6;3068:17;3058:27;;3102:4;3097:3;3093:14;3086:21;;3155:6;3188:1;3173:258;3198:6;3195:1;3192:13;3173:258;;;3281:3;3268:17;3260:6;3256:30;3305:62;3363:3;3351:10;3305:62;;;3300:3;3293:75;3391:4;3386:3;3382:14;3375:21;;3419:4;3414:3;3410:14;3403:21;;3230:201;3220:1;3217;3213:9;3208:14;;3173:258;;;3177:14;2790:647;;;;;;;;3463:699;;3576:3;3569:4;3561:6;3557:17;3553:27;3543:2;;3594:1;3591;3584:12;3543:2;3631:6;3618:20;3653:76;3668:60;3721:6;3668:60;;;3653:76;;;3644:85;;3746:5;3771:6;3764:5;3757:21;3801:4;3793:6;3789:17;3779:27;;3823:4;3818:3;3814:14;3807:21;;3876:6;3923:3;3915:4;3907:6;3903:17;3898:3;3894:27;3891:36;3888:2;;;3940:1;3937;3930:12;3888:2;3965:1;3950:206;3975:6;3972:1;3969:13;3950:206;;;4033:3;4055:37;4088:3;4076:10;4055:37;;;4050:3;4043:50;4116:4;4111:3;4107:14;4100:21;;4144:4;4139:3;4135:14;4128:21;;4007:149;3997:1;3994;3990:9;3985:14;;3950:206;;;3954:14;3536:626;;;;;;;;4170:128;;4251:6;4245:13;4236:22;;4263:30;4287:5;4263:30;;;4230:68;;;;;4305:162;;4403:6;4397:13;4388:22;;4415:47;4456:5;4415:47;;;4382:85;;;;;4475:434;;4573:3;4566:4;4558:6;4554:17;4550:27;4540:2;;4591:1;4588;4581:12;4540:2;4628:6;4615:20;4650:61;4665:45;4703:6;4665:45;;;4650:61;;;4641:70;;4731:6;4724:5;4717:21;4767:4;4759:6;4755:17;4800:4;4793:5;4789:16;4835:3;4826:6;4821:3;4817:16;4814:25;4811:2;;;4852:1;4849;4842:12;4811:2;4862:41;4896:6;4891:3;4886;4862:41;;;4533:376;;;;;;;;4918:444;;5031:3;5024:4;5016:6;5012:17;5008:27;4998:2;;5049:1;5046;5039:12;4998:2;5079:6;5073:13;5101:65;5116:49;5158:6;5116:49;;;5101:65;;;5092:74;;5186:6;5179:5;5172:21;5222:4;5214:6;5210:17;5255:4;5248:5;5244:16;5290:3;5281:6;5276:3;5272:16;5269:25;5266:2;;;5307:1;5304;5297:12;5266:2;5317:39;5349:6;5344:3;5339;5317:39;;;4991:371;;;;;;;;5424:1854;;5545:6;5533:9;5528:3;5524:19;5520:32;5517:2;;;5565:1;5562;5555:12;5517:2;5583:22;5598:6;5583:22;;;5574:31;;5693:1;5682:9;5678:17;5665:31;5716:18;5708:6;5705:30;5702:2;;;5748:1;5745;5738:12;5702:2;5783:95;5874:3;5865:6;5854:9;5850:22;5783:95;;;5776:4;5769:5;5765:16;5758:121;5615:275;5978:2;5967:9;5963:18;5950:32;6002:18;5994:6;5991:30;5988:2;;;6034:1;6031;6024:12;5988:2;6069:95;6160:3;6151:6;6140:9;6136:22;6069:95;;;6062:4;6055:5;6051:16;6044:121;5900:276;6241:2;6274:49;6319:3;6310:6;6299:9;6295:22;6274:49;;;6267:4;6260:5;6256:16;6249:75;6186:149;6400:2;6433:49;6478:3;6469:6;6458:9;6454:22;6433:49;;;6426:4;6419:5;6415:16;6408:75;6345:149;6571:3;6605:49;6650:3;6641:6;6630:9;6626:22;6605:49;;;6598:4;6591:5;6587:16;6580:75;6504:162;6735:3;6769:49;6814:3;6805:6;6794:9;6790:22;6769:49;;;6762:4;6755:5;6751:16;6744:75;6676:154;6891:3;6925:49;6970:3;6961:6;6950:9;6946:22;6925:49;;;6918:4;6911:5;6907:16;6900:75;6840:146;7094:3;7083:9;7079:19;7066:33;7119:18;7111:6;7108:30;7105:2;;;7151:1;7148;7141:12;7105:2;7186:70;7252:3;7243:6;7232:9;7228:22;7186:70;;;7179:4;7172:5;7168:16;7161:96;6996:272;5511:1767;;;;;7330:1180;;7438:4;7426:9;7421:3;7417:19;7413:30;7410:2;;;7456:1;7453;7446:12;7410:2;7474:20;7489:4;7474:20;;;7465:29;;7550:1;7582:49;7627:3;7618:6;7607:9;7603:22;7582:49;;;7575:4;7568:5;7564:16;7557:75;7504:139;7695:2;7728:49;7773:3;7764:6;7753:9;7749:22;7728:49;;;7721:4;7714:5;7710:16;7703:75;7653:136;7880:2;7869:9;7865:18;7852:32;7904:18;7896:6;7893:30;7890:2;;;7936:1;7933;7926:12;7890:2;7971:55;8022:3;8013:6;8002:9;7998:22;7971:55;;;7964:4;7957:5;7953:16;7946:81;7799:239;8103:2;8136:49;8181:3;8172:6;8161:9;8157:22;8136:49;;;8129:4;8122:5;8118:16;8111:75;8048:149;8254:3;8288:49;8333:3;8324:6;8313:9;8309:22;8288:49;;;8281:4;8274:5;8270:16;8263:75;8207:142;8405:3;8439:49;8484:3;8475:6;8464:9;8460:22;8439:49;;;8432:4;8425:5;8421:16;8414:75;8359:141;7404:1106;;;;;8568:429;;8682:4;8670:9;8665:3;8661:19;8657:30;8654:2;;;8700:1;8697;8690:12;8654:2;8718:20;8733:4;8718:20;;;8709:29;;8817:1;8806:9;8802:17;8789:31;8840:18;8832:6;8829:30;8826:2;;;8872:1;8869;8862:12;8826:2;8907:68;8971:3;8962:6;8951:9;8947:22;8907:68;;;8900:4;8893:5;8889:16;8882:94;8748:239;8648:349;;;;;9053:837;;9192:4;9180:9;9175:3;9171:19;9167:30;9164:2;;;9210:1;9207;9200:12;9164:2;9228:20;9243:4;9228:20;;;9219:29;;9301:1;9333:60;9389:3;9380:6;9369:9;9365:22;9333:60;;;9326:4;9319:5;9315:16;9308:86;9258:147;9456:2;9489:60;9545:3;9536:6;9525:9;9521:22;9489:60;;;9482:4;9475:5;9471:16;9464:86;9415:146;9615:2;9648:60;9704:3;9695:6;9684:9;9680:22;9648:60;;;9641:4;9634:5;9630:16;9623:86;9571:149;9775:2;9808:60;9864:3;9855:6;9844:9;9840:22;9808:60;;;9801:4;9794:5;9790:16;9783:86;9730:150;9158:732;;;;;9948:760;;10062:4;10050:9;10045:3;10041:19;10037:30;10034:2;;;10080:1;10077;10070:12;10034:2;10098:20;10113:4;10098:20;;;10089:29;;10197:1;10186:9;10182:17;10169:31;10220:18;10212:6;10209:30;10206:2;;;10252:1;10249;10242:12;10206:2;10287:68;10351:3;10342:6;10331:9;10327:22;10287:68;;;10280:4;10273:5;10269:16;10262:94;10128:239;10438:2;10471:49;10516:3;10507:6;10496:9;10492:22;10471:49;;;10464:4;10457:5;10453:16;10446:75;10377:155;10604:2;10637:49;10682:3;10673:6;10662:9;10658:22;10637:49;;;10630:4;10623:5;10619:16;10612:75;10542:156;10028:680;;;;;10715:130;;10795:6;10782:20;10773:29;;10807:33;10834:5;10807:33;;;10767:78;;;;;10852:134;;10936:6;10930:13;10921:22;;10948:33;10975:5;10948:33;;;10915:71;;;;;10993:130;;11075:6;11069:13;11060:22;;11087:31;11112:5;11087:31;;;11054:69;;;;;11130:241;;11234:2;11222:9;11213:7;11209:23;11205:32;11202:2;;;11250:1;11247;11240:12;11202:2;11285:1;11302:53;11347:7;11338:6;11327:9;11323:22;11302:53;;;11292:63;;11264:97;11196:175;;;;;11378:263;;11493:2;11481:9;11472:7;11468:23;11464:32;11461:2;;;11509:1;11506;11499:12;11461:2;11544:1;11561:64;11617:7;11608:6;11597:9;11593:22;11561:64;;;11551:74;;11523:108;11455:186;;;;;11648:366;;;11769:2;11757:9;11748:7;11744:23;11740:32;11737:2;;;11785:1;11782;11775:12;11737:2;11820:1;11837:53;11882:7;11873:6;11862:9;11858:22;11837:53;;;11827:63;;11799:97;11927:2;11945:53;11990:7;11981:6;11970:9;11966:22;11945:53;;;11935:63;;11906:98;11731:283;;;;;;12021:392;;12161:2;12149:9;12140:7;12136:23;12132:32;12129:2;;;12177:1;12174;12167:12;12129:2;12233:1;12222:9;12218:17;12212:24;12256:18;12248:6;12245:30;12242:2;;;12288:1;12285;12278:12;12242:2;12308:89;12389:7;12380:6;12369:9;12365:22;12308:89;;;12298:99;;12191:212;12123:290;;;;;12420:420;;12574:2;12562:9;12553:7;12549:23;12545:32;12542:2;;;12590:1;12587;12580:12;12542:2;12646:1;12635:9;12631:17;12625:24;12669:18;12661:6;12658:30;12655:2;;;12701:1;12698;12691:12;12655:2;12721:103;12816:7;12807:6;12796:9;12792:22;12721:103;;;12711:113;;12604:226;12536:304;;;;;12847:523;;;;12990:2;12978:9;12969:7;12965:23;12961:32;12958:2;;;13006:1;13003;12996:12;12958:2;13041:1;13058:61;13111:7;13102:6;13091:9;13087:22;13058:61;;;13048:71;;13020:105;13156:2;13174:64;13230:7;13221:6;13210:9;13206:22;13174:64;;;13164:74;;13135:109;13275:2;13293:61;13346:7;13337:6;13326:9;13322:22;13293:61;;;13283:71;;13254:106;12952:418;;;;;;13377:362;;13502:2;13490:9;13481:7;13477:23;13473:32;13470:2;;;13518:1;13515;13508:12;13470:2;13574:1;13563:9;13559:17;13553:24;13597:18;13589:6;13586:30;13583:2;;;13629:1;13626;13619:12;13583:2;13649:74;13715:7;13706:6;13695:9;13691:22;13649:74;;;13639:84;;13532:197;13464:275;;;;;13746:391;;13882:2;13870:9;13861:7;13857:23;13853:32;13850:2;;;13898:1;13895;13888:12;13850:2;13961:1;13950:9;13946:17;13933:31;13984:18;13976:6;13973:30;13970:2;;;14016:1;14013;14006:12;13970:2;14036:85;14113:7;14104:6;14093:9;14089:22;14036:85;;;14026:95;;13912:215;13844:293;;;;;14144:516;;;14297:2;14285:9;14276:7;14272:23;14268:32;14265:2;;;14313:1;14310;14303:12;14265:2;14376:1;14365:9;14361:17;14348:31;14399:18;14391:6;14388:30;14385:2;;;14431:1;14428;14421:12;14385:2;14451:85;14528:7;14519:6;14508:9;14504:22;14451:85;;;14441:95;;14327:215;14573:2;14591:53;14636:7;14627:6;14616:9;14612:22;14591:53;;;14581:63;;14552:98;14259:401;;;;;;14667:342;;14821:3;14809:9;14800:7;14796:23;14792:33;14789:2;;;14838:1;14835;14828:12;14789:2;14873:1;14890:103;14985:7;14976:6;14965:9;14961:22;14890:103;;;14880:113;;14852:147;14783:226;;;;;15016:241;;15120:2;15108:9;15099:7;15095:23;15091:32;15088:2;;;15136:1;15133;15126:12;15088:2;15171:1;15188:53;15233:7;15224:6;15213:9;15209:22;15188:53;;;15178:63;;15150:97;15082:175;;;;;15264:263;;15379:2;15367:9;15358:7;15354:23;15350:32;15347:2;;;15395:1;15392;15385:12;15347:2;15430:1;15447:64;15503:7;15494:6;15483:9;15479:22;15447:64;;;15437:74;;15409:108;15341:186;;;;;15534:259;;15647:2;15635:9;15626:7;15622:23;15618:32;15615:2;;;15663:1;15660;15653:12;15615:2;15698:1;15715:62;15769:7;15760:6;15749:9;15745:22;15715:62;;;15705:72;;15677:106;15609:184;;;;;15801:257;;15952:100;16048:3;16040:6;15952:100;;;15938:114;;15931:127;;;;;16067:269;;16224:106;16326:3;16318:6;16224:106;;;16210:120;;16203:133;;;;;16345:257;;16496:100;16592:3;16584:6;16496:100;;;16482:114;;16475:127;;;;;16611:173;;16698:46;16740:3;16732:6;16698:46;;;16773:4;16768:3;16764:14;16750:28;;16691:93;;;;;16792:103;16865:24;16883:5;16865:24;;;16860:3;16853:37;16847:48;;;16902:113;16985:24;17003:5;16985:24;;;16980:3;16973:37;16967:48;;;17127:1012;;17308:75;17377:5;17308:75;;;17396:101;17490:6;17485:3;17396:101;;;17389:108;;17520:3;17562:4;17554:6;17550:17;17545:3;17541:27;17589:77;17660:5;17589:77;;;17686:7;17714:1;17699:401;17724:6;17721:1;17718:13;17699:401;;;17786:9;17780:4;17776:20;17771:3;17764:33;17831:6;17825:13;17853:114;17962:4;17947:13;17853:114;;;17845:122;;17984:81;18058:6;17984:81;;;17974:91;;18088:4;18083:3;18079:14;18072:21;;17756:344;17746:1;17743;17739:9;17734:14;;17699:401;;;17703:14;18113:4;18106:11;;18130:3;18123:10;;17287:852;;;;;;;;;;18258:1036;;18445:78;18517:5;18445:78;;;18536:104;18633:6;18628:3;18536:104;;;18529:111;;18663:3;18705:4;18697:6;18693:17;18688:3;18684:27;18732:80;18806:5;18732:80;;;18832:7;18860:1;18845:410;18870:6;18867:1;18864:13;18845:410;;;18932:9;18926:4;18922:20;18917:3;18910:33;18977:6;18971:13;18999:120;19114:4;19099:13;18999:120;;;18991:128;;19136:84;19213:6;19136:84;;;19126:94;;19243:4;19238:3;19234:14;19227:21;;18902:353;18892:1;18889;18885:9;18880:14;;18845:410;;;18849:14;19268:4;19261:11;;19285:3;19278:10;;18424:870;;;;;;;;;;19407:1012;;19588:75;19657:5;19588:75;;;19676:101;19770:6;19765:3;19676:101;;;19669:108;;19800:3;19842:4;19834:6;19830:17;19825:3;19821:27;19869:77;19940:5;19869:77;;;19966:7;19994:1;19979:401;20004:6;20001:1;19998:13;19979:401;;;20066:9;20060:4;20056:20;20051:3;20044:33;20111:6;20105:13;20133:114;20242:4;20227:13;20133:114;;;20125:122;;20264:81;20338:6;20264:81;;;20254:91;;20368:4;20363:3;20359:14;20352:21;;20036:344;20026:1;20023;20019:9;20014:14;;19979:401;;;19983:14;20393:4;20386:11;;20410:3;20403:10;;19567:852;;;;;;;;;;20458:654;;20589:50;20633:5;20589:50;;;20652:76;20721:6;20716:3;20652:76;;;20645:83;;20749:52;20795:5;20749:52;;;20821:7;20849:1;20834:256;20859:6;20856:1;20853:13;20834:256;;;20926:6;20920:13;20947:63;21006:3;20991:13;20947:63;;;20940:70;;21027:56;21076:6;21027:56;;;21017:66;;20891:199;20881:1;20878;20874:9;20869:14;;20834:256;;;20838:14;21103:3;21096:10;;20568:544;;;;;;;;21120:94;21187:21;21202:5;21187:21;;;21182:3;21175:34;21169:45;;;21221:104;21298:21;21313:5;21298:21;;;21293:3;21286:34;21280:45;;;21332:154;21429:51;21474:5;21429:51;;;21424:3;21417:64;21411:75;;;21493:150;21588:49;21631:5;21588:49;;;21583:3;21576:62;21570:73;;;21650:190;21765:69;21828:5;21765:69;;;21760:3;21753:82;21747:93;;;21847:176;21955:62;22011:5;21955:62;;;21950:3;21943:75;21937:86;;;22030:319;;22128:35;22157:5;22128:35;;;22175:61;22229:6;22224:3;22175:61;;;22168:68;;22241:52;22286:6;22281:3;22274:4;22267:5;22263:16;22241:52;;;22314:29;22336:6;22314:29;;;22309:3;22305:39;22298:46;;22108:241;;;;;;22356:339;;22464:35;22493:5;22464:35;;;22511:71;22575:6;22570:3;22511:71;;;22504:78;;22587:52;22632:6;22627:3;22620:4;22613:5;22609:16;22587:52;;;22660:29;22682:6;22660:29;;;22655:3;22651:39;22644:46;;22444:251;;;;;;22823:1195;;23004:4;22999:3;22995:14;23098:4;23091:5;23087:16;23081:23;23150:3;23144:4;23140:14;23133:4;23128:3;23124:14;23117:38;23170:155;23320:4;23306:12;23170:155;;;23162:163;;23024:313;23421:4;23414:5;23410:16;23404:23;23473:3;23467:4;23463:14;23456:4;23451:3;23447:14;23440:38;23493:155;23643:4;23629:12;23493:155;;;23485:163;;23347:313;23748:4;23741:5;23737:16;23731:23;23760:63;23817:4;23812:3;23808:14;23794:12;23760:63;;;23670:159;23917:4;23910:5;23906:16;23900:23;23929:57;23980:4;23975:3;23971:14;23957:12;23929:57;;;23839:153;24009:4;24002:11;;22977:1041;;;;;;24130:1978;;24295:6;24290:3;24286:16;24390:4;24383:5;24379:16;24373:23;24442:3;24436:4;24432:14;24425:4;24420:3;24416:14;24409:38;24462:149;24606:4;24592:12;24462:149;;;24454:157;;24317:306;24706:4;24699:5;24695:16;24689:23;24758:3;24752:4;24748:14;24741:4;24736:3;24732:14;24725:38;24778:149;24922:4;24908:12;24778:149;;;24770:157;;24633:306;25027:4;25020:5;25016:16;25010:23;25039:63;25096:4;25091:3;25087:14;25073:12;25039:63;;;24949:159;25196:4;25189:5;25185:16;25179:23;25208:63;25265:4;25260:3;25256:14;25242:12;25208:63;;;25118:159;25377:4;25370:5;25366:16;25360:23;25389:63;25446:4;25441:3;25437:14;25423:12;25389:63;;;25287:171;25550:4;25543:5;25539:16;25533:23;25562:63;25619:4;25614:3;25610:14;25596:12;25562:63;;;25468:163;25715:4;25708:5;25704:16;25698:23;25727:63;25784:4;25779:3;25775:14;25761:12;25727:63;;;25641:155;25899:4;25892:5;25888:16;25882:23;25951:3;25945:4;25941:14;25934:4;25929:3;25925:14;25918:38;25971:99;26065:4;26051:12;25971:99;;;25963:107;;25806:276;26099:4;26092:11;;24268:1840;;;;;;26202:1214;;26335:4;26330:3;26326:14;26424:4;26417:5;26413:16;26407:23;26436:63;26493:4;26488:3;26484:14;26470:12;26436:63;;;26355:150;26580:4;26573:5;26569:16;26563:23;26592:63;26649:4;26644:3;26640:14;26626:12;26592:63;;;26515:146;26747:4;26740:5;26736:16;26730:23;26799:3;26793:4;26789:14;26782:4;26777:3;26773:14;26766:38;26819:69;26883:4;26869:12;26819:69;;;26811:77;;26671:229;26988:4;26981:5;26977:16;26971:23;27000:63;27057:4;27052:3;27048:14;27034:12;27000:63;;;26910:159;27149:4;27142:5;27138:16;27132:23;27161:63;27218:4;27213:3;27209:14;27195:12;27161:63;;;27079:151;27309:4;27302:5;27298:16;27292:23;27321:63;27378:4;27373:3;27369:14;27355:12;27321:63;;;27240:150;27407:4;27400:11;;26308:1108;;;;;;27522:434;;27667:4;27662:3;27658:14;27751:4;27744:5;27740:16;27734:23;27803:3;27797:4;27793:14;27786:4;27781:3;27777:14;27770:38;27823:95;27913:4;27899:12;27823:95;;;27815:103;;27687:243;27947:4;27940:11;;27640:316;;;;;;28068:1241;;28219:4;28214:3;28210:14;28308:4;28301:5;28297:16;28291:23;28320:63;28377:4;28372:3;28368:14;28354:12;28320:63;;;28239:150;28478:4;28471:5;28467:16;28461:23;28490:63;28547:4;28542:3;28538:14;28524:12;28490:63;;;28399:160;28635:4;28628:5;28624:16;28618:23;28647:63;28704:4;28699:3;28695:14;28681:12;28647:63;;;28569:147;28799:4;28792:5;28788:16;28782:23;28811:63;28868:4;28863:3;28859:14;28845:12;28811:63;;;28726:154;28966:4;28959:5;28955:16;28949:23;29018:3;29012:4;29008:14;29001:4;28996:3;28992:14;28985:38;29038:69;29102:4;29088:12;29038:69;;;29030:77;;28890:229;29202:4;29195:5;29191:16;29185:23;29214:63;29271:4;29266:3;29262:14;29248:12;29214:63;;;29129:154;29300:4;29293:11;;28192:1117;;;;;;29415:495;29566:4;29561:3;29557:14;29652:4;29645:5;29641:16;29635:23;29664:63;29721:4;29716:3;29712:14;29698:12;29664:63;;;29586:147;29814:4;29807:5;29803:16;29797:23;29826:63;29883:4;29878:3;29874:14;29860:12;29826:63;;;29743:152;29539:371;;;;30016:785;;30161:4;30156:3;30152:14;30245:4;30238:5;30234:16;30228:23;30297:3;30291:4;30287:14;30280:4;30275:3;30271:14;30264:38;30317:95;30407:4;30393:12;30317:95;;;30309:103;;30181:243;30518:4;30511:5;30507:16;30501:23;30530:63;30587:4;30582:3;30578:14;30564:12;30530:63;;;30434:165;30694:4;30687:5;30683:16;30677:23;30706:63;30763:4;30758:3;30754:14;30740:12;30706:63;;;30609:166;30792:4;30785:11;;30134:667;;;;;;30808:103;30881:24;30899:5;30881:24;;;30876:3;30869:37;30863:48;;;30918:113;31001:24;31019:5;31001:24;;;30996:3;30989:37;30983:48;;;31038:213;;31156:2;31145:9;31141:18;31133:26;;31170:71;31238:1;31227:9;31223:17;31214:6;31170:71;;;31127:124;;;;;31258:488;;31462:2;31451:9;31447:18;31439:26;;31476:65;31538:1;31527:9;31523:17;31514:6;31476:65;;;31589:9;31583:4;31579:20;31574:2;31563:9;31559:18;31552:48;31614:122;31731:4;31722:6;31614:122;;;31606:130;;31433:313;;;;;;31753:241;;31885:2;31874:9;31870:18;31862:26;;31899:85;31981:1;31970:9;31966:17;31957:6;31899:85;;;31856:138;;;;;32001:523;;32219:2;32208:9;32204:18;32196:26;;32233:83;32313:1;32302:9;32298:17;32289:6;32233:83;;;32327:104;32427:2;32416:9;32412:18;32403:6;32327:104;;;32442:72;32510:2;32499:9;32495:18;32486:6;32442:72;;;32190:334;;;;;;;32531:263;;32674:2;32663:9;32659:18;32651:26;;32688:96;32781:1;32770:9;32766:17;32757:6;32688:96;;;32645:149;;;;;32801:293;;32935:2;32924:9;32920:18;32912:26;;32985:9;32979:4;32975:20;32971:1;32960:9;32956:17;32949:47;33010:74;33079:4;33070:6;33010:74;;;33002:82;;32906:188;;;;;33101:421;;33299:2;33288:9;33284:18;33276:26;;33349:9;33343:4;33339:20;33335:1;33324:9;33320:17;33313:47;33374:138;33507:4;33498:6;33374:138;;;33366:146;;33270:252;;;;;33529:389;;33711:2;33700:9;33696:18;33688:26;;33761:9;33755:4;33751:20;33747:1;33736:9;33732:17;33725:47;33786:122;33903:4;33894:6;33786:122;;;33778:130;;33682:236;;;;;33925:329;;34101:2;34090:9;34086:18;34078:26;;34115:129;34241:1;34230:9;34226:17;34217:6;34115:129;;;34072:182;;;;;34261:213;;34379:2;34368:9;34364:18;34356:26;;34393:71;34461:1;34450:9;34446:17;34437:6;34393:71;;;34350:124;;;;;34481:256;;34543:2;34537:9;34527:19;;34581:4;34573:6;34569:17;34680:6;34668:10;34665:22;34644:18;34632:10;34629:34;34626:62;34623:2;;;34701:1;34698;34691:12;34623:2;34721:10;34717:2;34710:22;34521:216;;;;;34744:304;;34903:18;34895:6;34892:30;34889:2;;;34935:1;34932;34925:12;34889:2;34970:4;34962:6;34958:17;34950:25;;35033:4;35027;35023:15;35015:23;;34826:222;;;;35055:318;;35228:18;35220:6;35217:30;35214:2;;;35260:1;35257;35250:12;35214:2;35295:4;35287:6;35283:17;35275:25;;35358:4;35352;35348:15;35340:23;;35151:222;;;;35380:325;;35560:18;35552:6;35549:30;35546:2;;;35592:1;35589;35582:12;35546:2;35627:4;35619:6;35615:17;35607:25;;35690:4;35684;35680:15;35672:23;;35483:222;;;;35712:325;;35892:18;35884:6;35881:30;35878:2;;;35924:1;35921;35914:12;35878:2;35959:4;35951:6;35947:17;35939:25;;36022:4;36016;36012:15;36004:23;;35815:222;;;;36044:300;;36199:18;36191:6;36188:30;36185:2;;;36231:1;36228;36221:12;36185:2;36266:4;36258:6;36254:17;36246:25;;36329:4;36323;36319:15;36311:23;;36122:222;;;;36351:318;;36491:18;36483:6;36480:30;36477:2;;;36523:1;36520;36513:12;36477:2;36590:4;36586:9;36579:4;36571:6;36567:17;36563:33;36555:41;;36654:4;36648;36644:15;36636:23;;36414:255;;;;36676:322;;36820:18;36812:6;36809:30;36806:2;;;36852:1;36849;36842:12;36806:2;36919:4;36915:9;36908:4;36900:6;36896:17;36892:33;36884:41;;36983:4;36977;36973:15;36965:23;;36743:255;;;;37005:172;;37112:3;37104:11;;37150:4;37145:3;37141:14;37133:22;;37098:79;;;;37184:175;;37294:3;37286:11;;37332:4;37327:3;37323:14;37315:22;;37280:79;;;;37366:172;;37473:3;37465:11;;37511:4;37506:3;37502:14;37494:22;;37459:79;;;;37545:147;;37627:3;37619:11;;37665:4;37660:3;37656:14;37648:22;;37613:79;;;;37699:158;;37829:5;37823:12;37813:22;;37794:63;;;;37864:161;;37997:5;37991:12;37981:22;;37962:63;;;;38032:158;;38162:5;38156:12;38146:22;;38127:63;;;;38197:133;;38302:5;38296:12;38286:22;;38267:63;;;;38337:118;;38427:5;38421:12;38411:22;;38392:63;;;;38462:129;;38581:4;38576:3;38572:14;38564:22;;38558:33;;;;38598:132;;38720:4;38715:3;38711:14;38703:22;;38697:33;;;;38737:129;;38856:4;38851:3;38847:14;38839:22;;38833:33;;;;38873:104;;38967:4;38962:3;38958:14;38950:22;;38944:33;;;;38985:193;;39130:6;39125:3;39118:19;39167:4;39162:3;39158:14;39143:29;;39111:67;;;;;39187:196;;39335:6;39330:3;39323:19;39372:4;39367:3;39363:14;39348:29;;39316:67;;;;;39392:193;;39537:6;39532:3;39525:19;39574:4;39569:3;39565:14;39550:29;;39518:67;;;;;39594:168;;39714:6;39709:3;39702:19;39751:4;39746:3;39742:14;39727:29;;39695:67;;;;;39771:153;;39876:6;39871:3;39864:19;39913:4;39908:3;39904:14;39889:29;;39857:67;;;;;39933:163;;40048:6;40043:3;40036:19;40085:4;40080:3;40076:14;40061:29;;40029:67;;;;;40104:91;;40166:24;40184:5;40166:24;;;40155:35;;40149:46;;;;40202:85;;40275:5;40268:13;40261:21;40250:32;;40244:43;;;;40294:105;;40370:24;40388:5;40370:24;;;40359:35;;40353:46;;;;40406:160;;40495:5;40484:16;;40501:60;40555:5;40501:60;;;40478:88;;;;40573:121;;40646:42;40639:5;40635:54;40624:65;;40618:76;;;;40701:72;;40763:5;40752:16;;40746:27;;;;40780:81;;40851:4;40844:5;40840:16;40829:27;;40823:38;;;;40868:149;;40961:51;41006:5;40961:51;;;40948:64;;40942:75;;;;41024:122;;41117:24;41135:5;41117:24;;;41104:37;;41098:48;;;;41153:145;;41244:49;41287:5;41244:49;;;41231:62;;41225:73;;;;41305:120;;41396:24;41414:5;41396:24;;;41383:37;;41377:48;;;;41432:185;;41543:69;41606:5;41543:69;;;41530:82;;41524:93;;;;41624:140;;41735:24;41753:5;41735:24;;;41722:37;;41716:48;;;;41771:160;;41875:51;41920:5;41875:51;;;41862:64;;41856:75;;;;41939:145;42020:6;42015:3;42010;41997:30;42076:1;42067:6;42062:3;42058:16;42051:27;41990:94;;;;42093:268;42158:1;42165:101;42179:6;42176:1;42173:13;42165:101;;;42255:1;42250:3;42246:11;42240:18;42236:1;42231:3;42227:11;42220:39;42201:2;42198:1;42194:10;42189:15;;42165:101;;;42281:6;42278:1;42275:13;42272:2;;;42346:1;42337:6;42332:3;42328:16;42321:27;42272:2;42142:219;;;;;42369:97;;42457:2;42453:7;42448:2;42441:5;42437:14;42433:28;42423:38;;42417:49;;;;42474:118;42570:1;42563:5;42560:12;42550:2;;42576:9;42550:2;42544:48;;42599:117;42668:24;42686:5;42668:24;;;42661:5;42658:35;42648:2;;42707:1;42704;42697:12;42648:2;42642:74;;42723:111;42789:21;42804:5;42789:21;;;42782:5;42779:32;42769:2;;42825:1;42822;42815:12;42769:2;42763:71;;42841:145;42924:38;42956:5;42924:38;;;42917:5;42914:49;42904:2;;42977:1;42974;42967:12;42904:2;42898:88;;42993:117;43062:24;43080:5;43062:24;;;43055:5;43052:35;43042:2;;43101:1;43098;43091:12;43042:2;43036:74;;43117:113;43184:22;43200:5;43184:22;;;43177:5;43174:33;43164:2;;43221:1;43218;43211:12;43164:2;43158:72;
Swarm Source
bzzr://059da9e8fb338326f069bdf45a4bfcc034c0672b81114baa65039095278e3f4b
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.