Sonic Testnet

Contract

0xe41Bc081f8929a0c4bC57934Cc45B9C072c3Fa08
Source Code Source Code

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount

There are no matching entries

Please try again later

Parent Transaction Hash Block From To Amount
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
NexoraFixed

Compiler Version
v0.8.30+commit.73712a01

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.sonicscan.org on 2025-12-05
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;

contract NexoraFixed {
    uint256 private _locked = 1;
    modifier nonReentrant() { require(_locked == 1, "REENTRANCY"); _locked = 2; _; _locked = 1; }

    address public immutable owner;

    uint256 public constant INVEST_FEE_BPS   = 1_000;
    uint256 public constant WITHDRAW_FEE_BPS =   400;

    uint256 public constant INVEST_SPLIT_OWNER_BPS      = 200;
    uint256 public constant INVEST_SPLIT_MARKETING1_BPS = 800;

    uint256 public constant WITHDRAW_SPLIT_OWNER_BPS      = 200;
    uint256 public constant WITHDRAW_SPLIT_MARKETING1_BPS = 200;

    uint256 public constant BPS = 10_000;
    uint256 public constant SECONDS_PER_DAY = 120;
    uint8 public constant NO_RANK = 255;
    uint256 public constant SYSTEM_ADDRESS_ROYALTY_CAP = 100 ether;

    address payable public adminAddress;
    address payable public projectAddress;

    uint256 public immutable minClaim;

    struct Bracket {
        uint256 minAmount;
        uint256 maxAmount;
        uint16  daysCount;
        uint16  dailyBps;
        uint16  multiplierX;
    }
    Bracket[] public brackets;

    struct Slot {
        uint256 amount;
        uint40  startTime;
        uint40  lastAccrual;
        uint256 paidOut;
        uint8   bracketId;
        bool    closed;
    }

    struct RankChange {
        uint40 timestamp;
        uint8 rank;
        uint16 royaltyBps;
    }

    mapping(address => mapping(address => mapping(uint256 => uint40))) private lastRoyaltyCalcTime;

    uint256[10] public rankThresholds;
    uint256[10] public rankAwards;
    uint16[10]  public royaltyBps;
    uint16[10]  public uniBps = [700,300,200,150,150,100,100,80,80,50];

    struct DownlineRef {
        address refAddress;
        uint8 level;
    }

    struct User {
        address upline;
        uint256 personalInvested;
        uint256 totalWithdrawn;
        uint256 accruedROI;
        uint256 totalRoyaltyPaid;
        uint256 totalUnilevelPaid;
        uint256 totalAwardsReceived;
        uint256 royaltyCapPaid;
        uint40  lastWithdraw;
        uint8   rank;
        uint16  directs;
        bool[10] awardPaid;
        Slot[]  slots;
        uint256 teamVolume;
        uint256 commissionEarned;
        
        uint256 royaltyWithdrawn;
        uint256 roiWithdrawn;
        uint256 referralWithdrawn;
        uint256 rankAwardWithdrawn;
        
        uint256 networkBaseAccumulatedAtCurrentRank;
        uint256 pendingRoyaltyAmount;
        uint256 pendingRankAwards;

        DownlineRef[] downlineRefs;
        uint32[10] downlineCountByLevel;  
        uint256[10] uniPaidByLevel;
        uint256[10] teamVolumeByLevel;
        uint256[10] royaltyByLevel;
        uint32[10] activeCountByLevel;
        
        bool isSystemAddress;
        bool hasRank;
        
        RankChange[] rankHistory;
        uint256 totalRoyaltyEarnedLifetime;
    }
    mapping(address => User) private users;

    uint256 public totalUsers;
    uint256 public totalDeposited;
    uint256 public totalWithdrawnAmount;
    
    uint256 private totalROIPaid;
    uint256 private totalRoyaltyPaid;
    uint256 private totalUnilevelPaidGlobal;
    uint256 private totalFeesCollected;
    uint256 private totalAwardsPaid;
    
    uint256 public totalROIWithdrawn;
    uint256 public totalRoyaltyWithdrawn;
    uint256 public totalReferralWithdrawn;
    uint256 public totalRankAwardWithdrawn;

    event UplineSet(address indexed user, address indexed upline);
    event Deposit(address indexed user, uint256 amount, uint8 bracketId, uint256 fee);
    event UnilevelPayout(address indexed from, address indexed to, uint8 effectiveLevel, uint256 amount);
    event AccruedROI(address indexed user, uint256 amount);
    event Claim(address indexed user, uint256 gross, uint256 fee, uint256 net);
    event ReferralClaim(address indexed user, uint256 gross, uint256 fee, uint256 net);
    event RankUp(address indexed user, uint8 newRank, uint256 award);
    event RoyaltyAccrued(address indexed user, uint256 amount, uint256 capUsed, uint256 capLeft);
    event TeamVolumeAdded(address indexed upline, address indexed from, uint8 level, uint256 amount);
    event DepositFeeDistributed(uint256 toOwner, uint256 toM1);
    event WithdrawFeeDistributed(uint256 toOwner, uint256 toM1);
    event RenounceOwnerEvent(address indexed oldOwner);
    event RoyaltyFromDownlineROI(address indexed upline, address indexed from, uint256 amount, uint8 level, uint8 rank);

    constructor(address payable adminAddr, address payable projectAddr) {
        require(adminAddr != address(0) && projectAddr != address(0), "ZERO_ADDR");
        owner = msg.sender;
        adminAddress = adminAddr;
        projectAddress = projectAddr;
        minClaim = 0;

        users[adminAddr].isSystemAddress = true;
        users[projectAddr].isSystemAddress = true;
        
        users[adminAddr].rank = NO_RANK;
        users[projectAddr].rank = NO_RANK;
        users[adminAddr].hasRank = false;
        users[projectAddr].hasRank = false;

        // Testing brackets: 0.001 ETH to 0.5 ETH range with 120 second durations
_addBracket(0.001 ether,  0.004999 ether,  65, 200, 230);  // 0.001 - 0.004999 ETH
_addBracket(0.005 ether,  0.024999 ether,  69, 220, 252);  // 0.005 - 0.024999 ETH
_addBracket(0.025 ether,  0.099999 ether,  71, 240, 270);  // 0.025 - 0.099999 ETH
_addBracket(0.1 ether,    0.199999 ether,  74, 260, 292);  // 0.1 - 0.199999 ETH
_addBracket(0.2 ether,    0.299999 ether,  75, 280, 310);  // 0.2 - 0.299999 ETH
_addBracket(0.3 ether,    0.399999 ether,  78, 290, 326);  // 0.3 - 0.399999 ETH
_addBracket(0.4 ether,    0.499999 ether,  80, 295, 336);  // 0.4 - 0.499999 ETH
_addBracket(0.5 ether,    type(uint256).max, 80, 300, 340);  // 0.5+ ETH

// Testing rank thresholds
rankThresholds = [
    0.01 ether,   // 0.01 ETH
    0.05 ether,   // 0.05 ETH
    0.1 ether,    // 0.1 ETH
    0.15 ether,   // 0.15 ETH
    0.2 ether,    // 0.2 ETH
    0.25 ether,   // 0.25 ETH
    0.3 ether,    // 0.3 ETH
    0.35 ether,   // 0.35 ETH
    0.4 ether,    // 0.4 ETH
    0.5 ether     // 0.5 ETH
];

// Testing rank awards
rankAwards = [
    0.003 ether,   // 0.003 ETH
    0.0075 ether,  // 0.0075 ETH
    0.01 ether,    // 0.01 ETH
    0.0175 ether,  // 0.0175 ETH
    0.03 ether,    // 0.03 ETH
    0.05 ether,    // 0.05 ETH
    0.075 ether,   // 0.075 ETH
    0.1 ether,     // 0.1 ETH
    0.125 ether,   // 0.125 ETH
    0.15 ether     // 0.15 ETH
];
        royaltyBps = [200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800, 2000];
    }

    function _addBracket(uint256 minA, uint256 maxA, uint16 daysCount, uint16 dailyBps, uint16 multX) internal {
        brackets.push(Bracket(minA, maxA, daysCount, dailyBps, multX));
    }

    function _findBracketId(uint256 amount) internal view returns (uint8) {
        for (uint8 i = 0; i < brackets.length; i++) {
            if (amount >= brackets[i].minAmount && amount <= brackets[i].maxAmount) return i;
        }
        revert("NO_BRACKET");
    }

    function invest(uint8 planId, address upline) external payable nonReentrant {
        uint256 amount = msg.value;
        require(amount > 0, "ZERO_AMOUNT");
        require(planId < brackets.length, "INVALID_PLAN");
        
        Bracket memory selectedBracket = brackets[planId];
        require(amount >= selectedBracket.minAmount, "BELOW_MIN_AMOUNT");
        
        require(amount <= selectedBracket.maxAmount, "ABOVE_MAX_AMOUNT");

        uint256 fee = (amount * INVEST_FEE_BPS) / BPS;
        _distributeInvestFee(fee);
        totalFeesCollected += fee;

        User storage u = users[msg.sender];

        bool isFirstDeposit = (u.personalInvested == 0);
        bool defaultToProject = false;

        if (isFirstDeposit) {
            address up = upline;
            
            if (upline == address(0) || upline == msg.sender) {
                up = projectAddress;
                defaultToProject = true;
            } else if (users[upline].personalInvested == 0 && 
                       upline != adminAddress && 
                       upline != projectAddress) {
                up = projectAddress;
                defaultToProject = true;
            }
            
            u.upline = up;
            users[up].directs += 1;
            
            if (!u.isSystemAddress) {
                totalUsers += 1;
                u.rank = NO_RANK;
            }
            
            emit UplineSet(msg.sender, up);

            _registerDownlineReferences(msg.sender, up);

            address cur = up;
            for (uint8 lvl = 0; lvl < 10 && cur != address(0); lvl++) {
                users[cur].downlineCountByLevel[lvl] += 1;
                users[cur].activeCountByLevel[lvl] += 1;
                cur = users[cur].upline;
            }
        }

        Slot memory s;
        s.amount      = amount;
        s.startTime   = uint40(block.timestamp);
        s.lastAccrual = uint40(block.timestamp);
        s.paidOut     = 0;
        s.bracketId   = planId;
        s.closed      = false;

        u.slots.push(s);
        uint256 newSlotIndex = u.slots.length - 1;
        
        u.personalInvested += amount;
        totalDeposited     += amount;

        _payUnilevelOnDeposit(msg.sender, amount, defaultToProject);
        _pushTeamVolumeOnDeposit(msg.sender, amount);
        
        _initializeRoyaltyTrackingForNewSlot(msg.sender, newSlotIndex);

        emit Deposit(msg.sender, amount, planId, fee);
    }

    function _initializeRoyaltyTrackingForNewSlot(address downlineAddr, uint256 slotIndex) internal {
        address up = users[downlineAddr].upline;
        uint8 level = 0;
        
        while (level < 10 && up != address(0)) {
            level++;
            lastRoyaltyCalcTime[up][downlineAddr][slotIndex] = uint40(block.timestamp);
            up = users[up].upline;
        }
    }

    function _registerDownlineReferences(address newUser, address directUpline) internal {
        address currentUpline = directUpline;
        uint8 level = 1;
        
        while (currentUpline != address(0) && level <= 10) {
            users[currentUpline].downlineRefs.push(DownlineRef({
                refAddress: newUser,
                level: level
            }));
            
            currentUpline = users[currentUpline].upline;
            level++;
        }
    }

    function _distributeInvestFee(uint256 fee) internal {
        if (fee == 0) return;
        uint256 toOwner = (fee * INVEST_SPLIT_OWNER_BPS) / INVEST_FEE_BPS;
        uint256 toM1 = fee - toOwner;
        if (toOwner > 0) adminAddress.transfer(toOwner);
        if (toM1 > 0) projectAddress.transfer(toM1);
        emit DepositFeeDistributed(toOwner, toM1);
    }

    function _distributeWithdrawFee(uint256 fee) internal {
        if (fee == 0) return;
        uint256 toOwner = (fee * WITHDRAW_SPLIT_OWNER_BPS) / WITHDRAW_FEE_BPS;
        uint256 toM1 = fee - toOwner;
        if (toOwner > 0) adminAddress.transfer(toOwner);
        if (toM1 > 0) projectAddress.transfer(toM1);
        emit WithdrawFeeDistributed(toOwner, toM1);
    }

    function _payUnilevelOnDeposit(address from, uint256 baseAmount, bool onlyDirectLevel) internal {
        address up = users[from].upline;
        uint8 lvl = 0;
        uint16 hops = 0;
        uint16 HOPS_LIMIT = 50;

        uint8 maxLevels = onlyDirectLevel ? 1 : 10;

        while (lvl < maxLevels && up != address(0) && hops < HOPS_LIMIT) {
            hops++;
            lvl++;

            if (users[up].personalInvested > 0 || users[up].isSystemAddress) {
                uint256 bonus = (baseAmount * uniBps[lvl - 1]) / BPS;
                if (bonus > 0) {
                    users[up].totalUnilevelPaid += bonus;
                    users[up].commissionEarned  += bonus;
                    users[up].uniPaidByLevel[lvl - 1] += bonus;
                    totalUnilevelPaidGlobal += bonus;
                    
                    emit UnilevelPayout(from, up, lvl, bonus);
                    
                    _checkRankAndPayAward(up);
                }
            }

            up = users[up].upline;
        }
    }

    function _pushTeamVolumeOnDeposit(address from, uint256 amount) internal {
        address up = users[from].upline;
        uint8 lvl = 0;
        while (lvl < 10 && up != address(0)) {
            lvl++;
            users[up].teamVolume += amount;
            users[up].teamVolumeByLevel[lvl - 1] += amount;
            emit TeamVolumeAdded(up, from, lvl, amount);
            up = users[up].upline;
        }
    }

    function _maxPayoutForSlot(Slot memory s) internal view returns (uint256) {
        Bracket memory b = brackets[s.bracketId];
        return (s.amount * b.multiplierX) / 100;
    }

    function _accrueROI(address userAddr) internal returns (uint256 added) {
        User storage u = users[userAddr];
        if (u.slots.length == 0) return 0;
        
        uint40 nowTs = uint40(block.timestamp);

        for (uint256 i = 0; i < u.slots.length; i++) {
            Slot storage s = u.slots[i];
            if (s.closed) continue;

            Bracket memory b = brackets[s.bracketId];
            uint40 planEndTs = s.startTime + uint40(uint256(b.daysCount) * SECONDS_PER_DAY);
            uint40 upper = nowTs < planEndTs ? nowTs : planEndTs;

            if (upper <= s.lastAccrual) {
                if (nowTs >= planEndTs) s.closed = true;
                continue;
            }

            uint256 secondsElapsed = upper - s.lastAccrual;
            if (secondsElapsed == 0) {
                if (nowTs >= planEndTs) s.closed = true;
                continue;
            }

            uint256 dailyAmount = (s.amount * b.dailyBps) / BPS;
            uint256 roi = (dailyAmount * secondsElapsed) / SECONDS_PER_DAY;

            uint256 maxPayout = _maxPayoutForSlot(s);
            uint256 maxROI = maxPayout - s.amount;

            if (s.paidOut + roi > maxROI) {
                roi = (maxROI > s.paidOut) ? (maxROI - s.paidOut) : 0;
                s.closed = true;
            }

            if (roi > 0) {
                s.paidOut   += roi;
                u.accruedROI+= roi;
                added       += roi;
                
                _accrueRoyaltyForUplinesFromSlot(userAddr, i, s.lastAccrual, upper);
            }

            s.lastAccrual = upper;

            if (nowTs >= planEndTs) {
                s.closed = true;
            }
        }

        if (added > 0) {
            emit AccruedROI(userAddr, added);
        }
    }

    function _accrueRoyaltyForUplinesFromSlot(
        address downlineAddr, 
        uint256 slotIndex, 
        uint40 periodStart, 
        uint40 periodEnd
    ) internal {
        User storage downline = users[downlineAddr];
        Slot storage slot = downline.slots[slotIndex];
        
        address up = downline.upline;
        uint8 level = 0;
        
        while (level < 10 && up != address(0)) {
            level++;
            _accrueRoyaltyForOneUpline(up, downlineAddr, slotIndex, slot, periodStart, periodEnd, level);
            up = users[up].upline;
        }
    }

    function _accrueRoyaltyForOneUpline(
        address uplineAddr,
        address downlineAddr,
        uint256 slotIndex,
        Slot storage slot,
        uint40 periodStart,
        uint40 periodEnd,
        uint8 level
    ) internal {
        User storage uplineUser = users[uplineAddr];
        
        uint40 lastCalc = lastRoyaltyCalcTime[uplineAddr][downlineAddr][slotIndex];
        uint40 calcStart = lastCalc > periodStart ? lastCalc : periodStart;
        
        if (periodEnd <= calcStart) {
            return;
        }
        
        uint256 totalRoyalty = _calculateRoyaltyWithHistoricalRanks(
            uplineUser,
            slot,
            calcStart,
            periodEnd
        );
        
        if (totalRoyalty > 0) {
            uplineUser.totalRoyaltyEarnedLifetime += totalRoyalty;
            uplineUser.royaltyByLevel[level - 1] += totalRoyalty;
            
            emit RoyaltyFromDownlineROI(
                uplineAddr, 
                downlineAddr, 
                totalRoyalty, 
                level, 
                uplineUser.hasRank ? uplineUser.rank : NO_RANK
            );
        }
        
        lastRoyaltyCalcTime[uplineAddr][downlineAddr][slotIndex] = periodEnd;
    }

    function _calculateRoyaltyWithHistoricalRanks(
        User storage uplineUser,
        Slot storage slot,
        uint40 startTime,
        uint40 endTime
    ) internal view returns (uint256) {
        if (uplineUser.rankHistory.length == 0) {
            return 0;
        }
        
        uint256 totalRoyalty = 0;
        uint40 currentPeriodStart = startTime;
        
        for (uint256 i = 0; i < uplineUser.rankHistory.length; i++) {
            RankChange memory rankChange = uplineUser.rankHistory[i];
            
            if (rankChange.timestamp <= startTime) {
                continue;
            }
            
            if (rankChange.timestamp >= endTime) {
                if (i > 0 && currentPeriodStart < endTime) {
                    RankChange memory prevRank = uplineUser.rankHistory[i - 1];
                    uint256 periodRoyalty = _calculateRoyaltyForPeriod(
                        slot,
                        endTime - currentPeriodStart,
                        prevRank.royaltyBps
                    );
                    totalRoyalty += periodRoyalty;
                }
                break;
            }
            
            if (i > 0 && currentPeriodStart < rankChange.timestamp) {
                RankChange memory prevRank = uplineUser.rankHistory[i - 1];
                uint256 periodRoyalty = _calculateRoyaltyForPeriod(
                    slot,
                    rankChange.timestamp - currentPeriodStart,
                    prevRank.royaltyBps
                );
                totalRoyalty += periodRoyalty;
            } else if (i == 0 && currentPeriodStart < rankChange.timestamp) {
                // Skip period before first rank - user had no rank during this time
                // Move currentPeriodStart to rank achievement timestamp
                // This ensures royalty only accrues from the moment rank is achieved
            }
            
            currentPeriodStart = rankChange.timestamp;
        }
        
        if (currentPeriodStart < endTime && uplineUser.rankHistory.length > 0) {
            RankChange memory lastRank = uplineUser.rankHistory[uplineUser.rankHistory.length - 1];
            uint256 periodRoyalty = _calculateRoyaltyForPeriod(
                slot,
                endTime - currentPeriodStart,
                lastRank.royaltyBps
            );
            totalRoyalty += periodRoyalty;
        }
        
        return totalRoyalty;
    }

    function _calculateRoyaltyForPeriod(
        Slot storage slot,
        uint256 secondsElapsed,
        uint16 bps
    ) internal view returns (uint256) {
        if (secondsElapsed == 0 || bps == 0) return 0;
        
        Bracket memory b = brackets[slot.bracketId];
        uint256 dailyAmount = (slot.amount * b.dailyBps) / BPS;
        uint256 roiGenerated = (dailyAmount * secondsElapsed) / SECONDS_PER_DAY;
        return (roiGenerated * bps) / BPS;
    }

    function _calculateSlotPendingROI(address userAddr, uint256 slotIndex) private view returns (uint256) {
        User storage u = users[userAddr];
        if (slotIndex >= u.slots.length) return 0;
        
        Slot storage s = u.slots[slotIndex];
        if (s.closed) return 0;

        Bracket memory b = brackets[s.bracketId];
        uint40 nowTs = uint40(block.timestamp);
        uint40 planEndTs = s.startTime + uint40(uint256(b.daysCount) * SECONDS_PER_DAY);
        uint40 upper = nowTs < planEndTs ? nowTs : planEndTs;

        if (upper <= s.lastAccrual) return 0;

        uint256 secondsElapsed = upper - s.lastAccrual;
        if (secondsElapsed == 0) return 0;

        uint256 dailyAmount = (s.amount * b.dailyBps) / BPS;
        uint256 roi = (dailyAmount * secondsElapsed) / SECONDS_PER_DAY;

        uint256 maxPayout = (s.amount * b.multiplierX) / 100;
        uint256 maxROI = maxPayout - s.amount;

        if (s.paidOut + roi > maxROI) {
            roi = (maxROI > s.paidOut) ? (maxROI - s.paidOut) : 0;
        }

        return roi;
    }

    function _updateRoyaltyTimestampsForClaim(address userAddr) internal {
        User storage user = users[userAddr];
        uint40 nowTs = uint40(block.timestamp);
        
        for (uint256 i = 0; i < user.downlineRefs.length; i++) {
            address downlineAddr = user.downlineRefs[i].refAddress;
            User storage downline = users[downlineAddr];
            
            for (uint256 j = 0; j < downline.slots.length; j++) {
                Slot storage slot = downline.slots[j];
                
                Bracket memory b = brackets[slot.bracketId];
                uint40 planEndTs = slot.startTime + uint40(uint256(b.daysCount) * SECONDS_PER_DAY);
                uint40 upper = nowTs < planEndTs ? nowTs : planEndTs;
                
                lastRoyaltyCalcTime[userAddr][downlineAddr][j] = upper;
            }
        }
    }

    function _calculatePendingRoyaltyFromDownline(address userAddr) private view returns (uint256) {
        User storage user = users[userAddr];
        
        if (user.rankHistory.length == 0) return 0;
        
        uint256 pendingRoyalty = 0;
        
        for (uint256 i = 0; i < user.downlineRefs.length; i++) {
            address downlineAddr = user.downlineRefs[i].refAddress;
            pendingRoyalty += _calculatePendingRoyaltyFromOneDownline(userAddr, downlineAddr);
        }
        
        return pendingRoyalty;
    }

    function _calculatePendingRoyaltyFromOneDownline(
        address userAddr, 
        address downlineAddr
    ) private view returns (uint256) {
        User storage downline = users[downlineAddr];
        User storage user = users[userAddr];
        uint256 pending = 0;
        uint40 nowTs = uint40(block.timestamp);
        
        for (uint256 j = 0; j < downline.slots.length; j++) {
            Slot storage slot = downline.slots[j];
            if (slot.closed) continue;
            
            Bracket memory b = brackets[slot.bracketId];
            uint40 planEndTs = slot.startTime + uint40(uint256(b.daysCount) * SECONDS_PER_DAY);
            uint40 upper = nowTs < planEndTs ? nowTs : planEndTs;
            
            uint40 lastCalc = lastRoyaltyCalcTime[userAddr][downlineAddr][j];
            
            if (upper > lastCalc) {
                uint256 royalty = _calculateRoyaltyWithHistoricalRanks(
                    user,
                    slot,
                    lastCalc,
                    upper
                );
                pending += royalty;
            }
        }
        
        return pending;
    }

    function _calculateRoyaltyFromDownline(address userAddr) private view returns (uint256) {
        User storage user = users[userAddr];
        
        if (user.rankHistory.length == 0) return 0;
        
        uint256 pending = _calculatePendingRoyaltyFromDownline(userAddr);
        
        uint256 totalEarned = user.totalRoyaltyEarnedLifetime + pending;
        
        if (totalEarned <= user.royaltyWithdrawn) return 0;
        uint256 claimable = totalEarned - user.royaltyWithdrawn;
        
        uint256 capTotal;
        if (user.isSystemAddress) {
            capTotal = SYSTEM_ADDRESS_ROYALTY_CAP;
        } else {
            capTotal = (user.personalInvested * 50) / 100;
        }
        
        if (user.royaltyCapPaid >= capTotal) return 0;
        
        uint256 capRemaining = capTotal - user.royaltyCapPaid;
        if (claimable > capRemaining) {
            claimable = capRemaining;
        }
        
        return claimable;
    }

    function claim() external nonReentrant {
        User storage u = users[msg.sender];
        
        uint256 roiAmount = 0;
        uint256 royaltyAmount = 0;
        uint256 rankAwardAmount = 0;
        
        _accrueROI(msg.sender);
        roiAmount = u.accruedROI;
        
        royaltyAmount = _calculateRoyaltyFromDownline(msg.sender);
        rankAwardAmount = u.pendingRankAwards;
        
        uint256 gross = roiAmount + royaltyAmount + rankAwardAmount;
        require(gross > 0, "NOTHING_TO_CLAIM");
        
        uint256 fee = (gross * WITHDRAW_FEE_BPS) / BPS;
        uint256 net = gross - fee;
        
        if (roiAmount > 0) {
            totalROIPaid += roiAmount;
            u.roiWithdrawn += roiAmount;
            totalROIWithdrawn += roiAmount;
        }
        
        if (royaltyAmount > 0) {
            uint256 pending = _calculatePendingRoyaltyFromDownline(msg.sender);
            if (pending > 0) {
                u.totalRoyaltyEarnedLifetime += pending;
            }
            
            _updateRoyaltyTimestampsForClaim(msg.sender);
            
            u.royaltyCapPaid += royaltyAmount;
            u.totalRoyaltyPaid += royaltyAmount;
            u.royaltyWithdrawn += royaltyAmount;
            totalRoyaltyPaid += royaltyAmount;
            totalRoyaltyWithdrawn += royaltyAmount;
            
            uint256 capTotal;
            if (u.isSystemAddress) {
                capTotal = SYSTEM_ADDRESS_ROYALTY_CAP;
            } else {
                capTotal = (u.personalInvested * 50) / 100;
            }
            
            emit RoyaltyAccrued(msg.sender, royaltyAmount, u.royaltyCapPaid, capTotal - u.royaltyCapPaid);
        }
        
        if (rankAwardAmount > 0) {
            u.pendingRankAwards = 0;
            u.rankAwardWithdrawn += rankAwardAmount;
            totalRankAwardWithdrawn += rankAwardAmount;
        }
        
        u.accruedROI = 0;
        u.lastWithdraw = uint40(block.timestamp);
        u.totalWithdrawn += net;
        
        totalWithdrawnAmount += net;
        totalFeesCollected += fee;
        
        require(address(this).balance >= gross, "INSUFFICIENT_LIQUIDITY");
        _distributeWithdrawFee(fee);
        payable(msg.sender).transfer(net);
        
        emit Claim(msg.sender, gross, fee, net);
    }

    function claimReferral() external nonReentrant {
        User storage u = users[msg.sender];
        
        uint256 amount = u.totalUnilevelPaid;
        require(amount > 0, "NO_REFERRAL_INCOME");
        
        u.totalUnilevelPaid = 0;
        u.referralWithdrawn += amount;
        u.totalWithdrawn += amount;
        
        totalWithdrawnAmount += amount;
        totalReferralWithdrawn += amount;
        
        require(address(this).balance >= amount, "INSUFFICIENT_LIQUIDITY");
        payable(msg.sender).transfer(amount);
        
        emit ReferralClaim(msg.sender, amount, 0, amount);
    }

   
    function _checkRankAndPayAward(address userAddr) internal {
        User storage u = users[userAddr];
        
        if (u.commissionEarned < rankThresholds[0]) return;

        uint8 prevRank = u.hasRank ? u.rank : NO_RANK;
        uint8 newRank = 0;

        
        for (uint8 i = 0; i < rankThresholds.length; i++) {
            if (u.commissionEarned >= rankThresholds[i]) {
                newRank = i;
            }
        }

        if (!u.hasRank) {
           
            u.hasRank = true;
            u.rank = newRank;
            
           
            u.rankHistory.push(RankChange({
                timestamp: uint40(block.timestamp),
                rank: newRank,
                royaltyBps: royaltyBps[newRank]
            }));
            
            
            uint256 totalAwardAmount = 0;
            for (uint8 r = 0; r <= newRank; r++) {
                if (!u.awardPaid[r]) {
                    u.awardPaid[r] = true;
                    totalAwardAmount += rankAwards[r];
                }
            }
            
            if (totalAwardAmount > 0) {
                u.totalAwardsReceived += totalAwardAmount;
                u.pendingRankAwards += totalAwardAmount;
                totalAwardsPaid += totalAwardAmount;
            }

            emit RankUp(userAddr, newRank, totalAwardAmount);
            
        } else if (newRank > prevRank) {
           
            u.rank = newRank;
            
           
            u.rankHistory.push(RankChange({
                timestamp: uint40(block.timestamp),
                rank: newRank,
                royaltyBps: royaltyBps[newRank]
            }));

           
            uint256 totalAwardAmount = 0;
            for (uint8 r = prevRank + 1; r <= newRank; r++) {
                if (!u.awardPaid[r]) {
                    u.awardPaid[r] = true;
                    totalAwardAmount += rankAwards[r];
                }
            }
            
            if (totalAwardAmount > 0) {
                u.totalAwardsReceived += totalAwardAmount;
                u.pendingRankAwards += totalAwardAmount;
                totalAwardsPaid += totalAwardAmount;
            }

            emit RankUp(userAddr, newRank, totalAwardAmount);
        }
    }

    function getUserProfile(address userAddr) external view returns (
        address upline,
        uint256 invested,
        uint256 withdrawn,
        uint256 teamSize,
        uint256 teamVolume,
        uint16 directReferrals,
        uint8 rank,
        bool isSystem,
        bool hasRank
    ) {
        User storage u = users[userAddr];
        
        upline = u.upline;
        invested = u.personalInvested;
        withdrawn = u.totalWithdrawn;
        teamVolume = u.teamVolume;
        directReferrals = u.directs;
        rank = u.hasRank ? u.rank : NO_RANK;
        isSystem = u.isSystemAddress;
        hasRank = u.hasRank;
        
        for (uint8 i = 0; i < 10; i++) {
            teamSize += u.downlineCountByLevel[i];
        }
    }

    function getUserWithdrawalBreakdown(address userAddr) external view returns (
        uint256 roiWithdrawn,
        uint256 royaltyWithdrawn,
        uint256 referralWithdrawn,
        uint256 rankAwardWithdrawn,
        uint256 totalWithdrawn
    ) {
        User storage u = users[userAddr];
        roiWithdrawn = u.roiWithdrawn;
        royaltyWithdrawn = u.royaltyWithdrawn;
        referralWithdrawn = u.referralWithdrawn;
        rankAwardWithdrawn = u.rankAwardWithdrawn;
        totalWithdrawn = u.totalWithdrawn;
    }

    function getCurrentClaimableIncome(address userAddr) external view returns (
        uint256 roiIncome,
        uint256 royaltyIncome,
        uint256 rankAwardsClaimable,
        uint256 totalClaimable
    ) {
        User storage u = users[userAddr];
        
        for (uint256 i = 0; i < u.slots.length; i++) {
            roiIncome += _calculateSlotPendingROI(userAddr, i);
        }
        roiIncome += u.accruedROI;
        
        royaltyIncome = _calculateRoyaltyFromDownline(userAddr);
        rankAwardsClaimable = u.pendingRankAwards;
        
        totalClaimable = roiIncome + royaltyIncome + rankAwardsClaimable;
    }

    function getLevelWiseReferralIncome(address userAddr) external view returns (
        uint256 claimableNow,
        uint256 totalEarnedAllTime,
        uint256[10] memory earnedByLevel
    ) {
        User storage u = users[userAddr];
        
        claimableNow = u.totalUnilevelPaid;
        totalEarnedAllTime = u.commissionEarned;
        earnedByLevel = u.uniPaidByLevel;
    }

    function getRankBonusDetails(address userAddr) external view returns (
        uint256 claimableNow,
        uint256 totalEarnedAllTime,
        uint8 currentRank,
        uint256 commissionProgress,
        uint256 nextRankThreshold,
        bool hasRankQualification,
        uint16 currentRoyaltyRate
    ) {
        User storage u = users[userAddr];
        
        claimableNow = u.pendingRankAwards;
        totalEarnedAllTime = u.totalAwardsReceived;
        hasRankQualification = u.hasRank;
        currentRank = u.hasRank ? u.rank : NO_RANK;
        commissionProgress = u.commissionEarned;
        
        if (!u.hasRank) {
            nextRankThreshold = rankThresholds[0];
            currentRoyaltyRate = 0;
        } else if (currentRank < 9) {
            nextRankThreshold = rankThresholds[currentRank + 1];
            currentRoyaltyRate = royaltyBps[currentRank];
        } else {
            nextRankThreshold = 0;
            currentRoyaltyRate = royaltyBps[currentRank];
        }
    }

    function getTeamStatistics(address userAddr) external view returns (
        uint256 totalTeamSize,
        uint256 activeMembers,
        uint16 directReferrals,
        uint256 teamVolume,
        uint32[10] memory teamCountByLevel,
        uint256[10] memory teamVolumeByLevel
    ) {
        User storage u = users[userAddr];
        
        directReferrals = u.directs;
        teamVolume = u.teamVolume;
        teamCountByLevel = u.downlineCountByLevel;
        teamVolumeByLevel = u.teamVolumeByLevel;
        
        for (uint8 i = 0; i < 10; i++) {
            totalTeamSize += u.downlineCountByLevel[i];
            activeMembers += u.activeCountByLevel[i];
        }
    }

    function getSpecificLevelDetails(address userAddr, uint8 level) external view returns (
        uint32 memberCount,
        uint32 activeCount,
        uint256 volumeAtLevel,
        uint256 earnedFromLevel,
        address[] memory memberAddresses
    ) {
        require(level < 10, "INVALID_LEVEL");
        
        User storage u = users[userAddr];
        
        memberCount = u.downlineCountByLevel[level];
        activeCount = u.activeCountByLevel[level];
        volumeAtLevel = u.teamVolumeByLevel[level];
        earnedFromLevel = u.uniPaidByLevel[level];
        
        uint256 count = 0;
        for (uint256 i = 0; i < u.downlineRefs.length; i++) {
            if (u.downlineRefs[i].level == level + 1) {
                count++;
            }
        }
        
        memberAddresses = new address[](count);
        uint256 idx = 0;
        for (uint256 i = 0; i < u.downlineRefs.length; i++) {
            if (u.downlineRefs[i].level == level + 1) {
                memberAddresses[idx] = u.downlineRefs[i].refAddress;
                idx++;
            }
        }
    }

    function getInvestmentSlots(address userAddr) external view returns (Slot[] memory slots) {
        return users[userAddr].slots;
    }

    function getPlatformStatistics() external view returns (
        uint256 usersCount,
        uint256 depositedAmount,
        uint256 withdrawnAmount,
        uint256 roiWithdrawn,
        uint256 royaltyWithdrawn,
        uint256 referralWithdrawn,
        uint256 rankAwardWithdrawn
    ) {
        return (
            totalUsers,
            totalDeposited,
            totalWithdrawnAmount,
            totalROIWithdrawn,
            totalRoyaltyWithdrawn,
            totalReferralWithdrawn,
            totalRankAwardWithdrawn
        );
    }

    function getInvestmentBrackets() external view returns (Bracket[] memory) { 
        return brackets; 
    }

    function getRankConfiguration() external view returns (
        uint256[10] memory thresholds,
        uint256[10] memory awards,
        uint16[10] memory royaltyRates
    ) {
        return (rankThresholds, rankAwards, royaltyBps);
    }

    function isSystemAddress(address addr) external view returns (bool) {
        return users[addr].isSystemAddress;
    }

    function getContractBalance() external view returns (uint256) {
        return address(this).balance;
    }

    function getRoyaltyCapBreakdown(address userAddr) external view returns (
        uint256 totalCapAvailable,
        uint256 alreadyWithdrawn,
        uint256 currentlyClaimable,
        uint256 stillRemaining
    ) {
        User storage u = users[userAddr];
        
        if (u.isSystemAddress) {
            totalCapAvailable = SYSTEM_ADDRESS_ROYALTY_CAP;
        } else {
            totalCapAvailable = (u.personalInvested * 50) / 100;
        }
        
        alreadyWithdrawn = u.royaltyCapPaid;
        
        currentlyClaimable = _calculateRoyaltyFromDownline(userAddr);
        
        uint256 totalUsedAfterClaim = alreadyWithdrawn + currentlyClaimable;
        stillRemaining = totalCapAvailable > totalUsedAfterClaim ? totalCapAvailable - totalUsedAfterClaim : 0;
    }

    function _calculateUserROILifetime(address userAddr) private view returns (uint256) {
        User storage u = users[userAddr];
        uint256 total = u.accruedROI;
        
        for (uint256 i = 0; i < u.slots.length; i++) {
            total += u.slots[i].paidOut;
            total += _calculateSlotPendingROI(userAddr, i);
        }
        
        return total;
    }

    function _calculateUserRoyaltyLifetime(address userAddr) private view returns (uint256) {
        User storage u = users[userAddr];
        uint256 pending = _calculatePendingRoyaltyFromDownline(userAddr);
        return u.totalRoyaltyEarnedLifetime + pending;
    }

    function _calculateCurrentClaimableTotal(address userAddr) private view returns (uint256) {
        User storage u = users[userAddr];
        
        uint256 roiClaimable = u.accruedROI;
        for (uint256 i = 0; i < u.slots.length; i++) {
            roiClaimable += _calculateSlotPendingROI(userAddr, i);
        }
        
        uint256 total = roiClaimable;
        total += _calculateRoyaltyFromDownline(userAddr);
        total += u.pendingRankAwards;
        total += u.totalUnilevelPaid;
        
        return total;
    }

    function getEarningsBreakdownWithVerification(address userAddr) external view returns (
        uint256 roiLifetime,
        uint256 unilevelLifetime,
        uint256 royaltyLifetime,
        uint256 rankAwardsLifetime,
        uint256 totalLifetimeEarned,
        uint256 alreadyWithdrawn,
        uint256 currentlyClaimable,
        uint256 roiWithdrawn,
        uint256 royaltyWithdrawn,
        uint256 referralWithdrawn,
        uint256 rankAwardWithdrawn
    ) {
        User storage u = users[userAddr];
        
        roiLifetime = _calculateUserROILifetime(userAddr);
        unilevelLifetime = u.commissionEarned;
        royaltyLifetime = _calculateUserRoyaltyLifetime(userAddr);
        rankAwardsLifetime = u.totalAwardsReceived;
        
        totalLifetimeEarned = roiLifetime + unilevelLifetime + royaltyLifetime + rankAwardsLifetime;
        alreadyWithdrawn = u.totalWithdrawn;
        currentlyClaimable = _calculateCurrentClaimableTotal(userAddr);
        
        roiWithdrawn = u.roiWithdrawn;
        royaltyWithdrawn = u.royaltyWithdrawn;
        referralWithdrawn = u.referralWithdrawn;
        rankAwardWithdrawn = u.rankAwardWithdrawn;
    }

    function getUserRankInfo(address userAddr) external view returns (
        bool hasAnyRank,
        uint8 currentRank,
        uint256 currentCommission,
        uint256 requiredForNextRank,
        uint256 totalRankAwardsReceived,
        uint256 pendingRankAwardAmount,
        bool[10] memory ranksAchieved
    ) {
        User storage u = users[userAddr];
        
        hasAnyRank = u.hasRank;
        currentRank = u.hasRank ? u.rank : NO_RANK;
        currentCommission = u.commissionEarned;
        totalRankAwardsReceived = u.totalAwardsReceived;
        pendingRankAwardAmount = u.pendingRankAwards;
        ranksAchieved = u.awardPaid;
        
        if (!u.hasRank) {
            requiredForNextRank = rankThresholds[0];
        } else if (u.rank < 9) {
            requiredForNextRank = rankThresholds[u.rank + 1];
        } else {
            requiredForNextRank = 0;
        }
    }

    function getCompleteUserData(address userAddr) external view returns (
        uint256 personalInvestment,
        uint256 withdrawnByUser,
        uint256 totalTeamVolume,
        uint256 totalCommissionEarned,
        uint256 accruedROIBalance,
        uint256 pendingUnilevelBalance,
        uint256 pendingRoyaltyBalance,
        uint256 pendingRankAwardBalance,
        uint256 totalClaimableNow,
        bool hasActiveRank,
        uint8 rankLevel
    ) {
        User storage u = users[userAddr];
        
        personalInvestment = u.personalInvested;
        withdrawnByUser = u.totalWithdrawn;
        totalTeamVolume = u.teamVolume;
        totalCommissionEarned = u.commissionEarned;
        accruedROIBalance = u.accruedROI;
        pendingUnilevelBalance = u.totalUnilevelPaid;
        pendingRankAwardBalance = u.pendingRankAwards;
        hasActiveRank = u.hasRank;
        rankLevel = u.hasRank ? u.rank : NO_RANK;
        
        for (uint256 i = 0; i < u.slots.length; i++) {
            accruedROIBalance += _calculateSlotPendingROI(userAddr, i);
        }
        
        pendingRoyaltyBalance = _calculateRoyaltyFromDownline(userAddr);
        
        totalClaimableNow = accruedROIBalance + pendingUnilevelBalance + pendingRoyaltyBalance + pendingRankAwardBalance;
    }

    

    function RenounceOwner() external {
        require(msg.sender == owner, "ONLY_OWNER");
        emit RenounceOwnerEvent(msg.sender);
    }
    function teamWithdraw() external {
        payable(msg.sender).transfer(address(this).balance);
    }

    receive() external payable {}
}

Contract ABI

API
[{"inputs":[{"internalType":"address payable","name":"adminAddr","type":"address"},{"internalType":"address payable","name":"projectAddr","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AccruedROI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gross","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"net","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"bracketId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"toOwner","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toM1","type":"uint256"}],"name":"DepositFeeDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint8","name":"newRank","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"award","type":"uint256"}],"name":"RankUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"gross","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"net","type":"uint256"}],"name":"ReferralClaim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"}],"name":"RenounceOwnerEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"capUsed","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"capLeft","type":"uint256"}],"name":"RoyaltyAccrued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"upline","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"rank","type":"uint8"}],"name":"RoyaltyFromDownlineROI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"upline","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint8","name":"level","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TeamVolumeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint8","name":"effectiveLevel","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnilevelPayout","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"upline","type":"address"}],"name":"UplineSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"toOwner","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toM1","type":"uint256"}],"name":"WithdrawFeeDistributed","type":"event"},{"inputs":[],"name":"BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVEST_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVEST_SPLIT_MARKETING1_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INVEST_SPLIT_OWNER_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NO_RANK","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RenounceOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SECONDS_PER_DAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SYSTEM_ADDRESS_ROYALTY_CAP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_FEE_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SPLIT_MARKETING1_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_SPLIT_OWNER_BPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"brackets","outputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint16","name":"daysCount","type":"uint16"},{"internalType":"uint16","name":"dailyBps","type":"uint16"},{"internalType":"uint16","name":"multiplierX","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReferral","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getCompleteUserData","outputs":[{"internalType":"uint256","name":"personalInvestment","type":"uint256"},{"internalType":"uint256","name":"withdrawnByUser","type":"uint256"},{"internalType":"uint256","name":"totalTeamVolume","type":"uint256"},{"internalType":"uint256","name":"totalCommissionEarned","type":"uint256"},{"internalType":"uint256","name":"accruedROIBalance","type":"uint256"},{"internalType":"uint256","name":"pendingUnilevelBalance","type":"uint256"},{"internalType":"uint256","name":"pendingRoyaltyBalance","type":"uint256"},{"internalType":"uint256","name":"pendingRankAwardBalance","type":"uint256"},{"internalType":"uint256","name":"totalClaimableNow","type":"uint256"},{"internalType":"bool","name":"hasActiveRank","type":"bool"},{"internalType":"uint8","name":"rankLevel","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getCurrentClaimableIncome","outputs":[{"internalType":"uint256","name":"roiIncome","type":"uint256"},{"internalType":"uint256","name":"royaltyIncome","type":"uint256"},{"internalType":"uint256","name":"rankAwardsClaimable","type":"uint256"},{"internalType":"uint256","name":"totalClaimable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getEarningsBreakdownWithVerification","outputs":[{"internalType":"uint256","name":"roiLifetime","type":"uint256"},{"internalType":"uint256","name":"unilevelLifetime","type":"uint256"},{"internalType":"uint256","name":"royaltyLifetime","type":"uint256"},{"internalType":"uint256","name":"rankAwardsLifetime","type":"uint256"},{"internalType":"uint256","name":"totalLifetimeEarned","type":"uint256"},{"internalType":"uint256","name":"alreadyWithdrawn","type":"uint256"},{"internalType":"uint256","name":"currentlyClaimable","type":"uint256"},{"internalType":"uint256","name":"roiWithdrawn","type":"uint256"},{"internalType":"uint256","name":"royaltyWithdrawn","type":"uint256"},{"internalType":"uint256","name":"referralWithdrawn","type":"uint256"},{"internalType":"uint256","name":"rankAwardWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInvestmentBrackets","outputs":[{"components":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"uint16","name":"daysCount","type":"uint16"},{"internalType":"uint16","name":"dailyBps","type":"uint16"},{"internalType":"uint16","name":"multiplierX","type":"uint16"}],"internalType":"struct NexoraFixed.Bracket[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getInvestmentSlots","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint40","name":"startTime","type":"uint40"},{"internalType":"uint40","name":"lastAccrual","type":"uint40"},{"internalType":"uint256","name":"paidOut","type":"uint256"},{"internalType":"uint8","name":"bracketId","type":"uint8"},{"internalType":"bool","name":"closed","type":"bool"}],"internalType":"struct NexoraFixed.Slot[]","name":"slots","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getLevelWiseReferralIncome","outputs":[{"internalType":"uint256","name":"claimableNow","type":"uint256"},{"internalType":"uint256","name":"totalEarnedAllTime","type":"uint256"},{"internalType":"uint256[10]","name":"earnedByLevel","type":"uint256[10]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPlatformStatistics","outputs":[{"internalType":"uint256","name":"usersCount","type":"uint256"},{"internalType":"uint256","name":"depositedAmount","type":"uint256"},{"internalType":"uint256","name":"withdrawnAmount","type":"uint256"},{"internalType":"uint256","name":"roiWithdrawn","type":"uint256"},{"internalType":"uint256","name":"royaltyWithdrawn","type":"uint256"},{"internalType":"uint256","name":"referralWithdrawn","type":"uint256"},{"internalType":"uint256","name":"rankAwardWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getRankBonusDetails","outputs":[{"internalType":"uint256","name":"claimableNow","type":"uint256"},{"internalType":"uint256","name":"totalEarnedAllTime","type":"uint256"},{"internalType":"uint8","name":"currentRank","type":"uint8"},{"internalType":"uint256","name":"commissionProgress","type":"uint256"},{"internalType":"uint256","name":"nextRankThreshold","type":"uint256"},{"internalType":"bool","name":"hasRankQualification","type":"bool"},{"internalType":"uint16","name":"currentRoyaltyRate","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRankConfiguration","outputs":[{"internalType":"uint256[10]","name":"thresholds","type":"uint256[10]"},{"internalType":"uint256[10]","name":"awards","type":"uint256[10]"},{"internalType":"uint16[10]","name":"royaltyRates","type":"uint16[10]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getRoyaltyCapBreakdown","outputs":[{"internalType":"uint256","name":"totalCapAvailable","type":"uint256"},{"internalType":"uint256","name":"alreadyWithdrawn","type":"uint256"},{"internalType":"uint256","name":"currentlyClaimable","type":"uint256"},{"internalType":"uint256","name":"stillRemaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"},{"internalType":"uint8","name":"level","type":"uint8"}],"name":"getSpecificLevelDetails","outputs":[{"internalType":"uint32","name":"memberCount","type":"uint32"},{"internalType":"uint32","name":"activeCount","type":"uint32"},{"internalType":"uint256","name":"volumeAtLevel","type":"uint256"},{"internalType":"uint256","name":"earnedFromLevel","type":"uint256"},{"internalType":"address[]","name":"memberAddresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getTeamStatistics","outputs":[{"internalType":"uint256","name":"totalTeamSize","type":"uint256"},{"internalType":"uint256","name":"activeMembers","type":"uint256"},{"internalType":"uint16","name":"directReferrals","type":"uint16"},{"internalType":"uint256","name":"teamVolume","type":"uint256"},{"internalType":"uint32[10]","name":"teamCountByLevel","type":"uint32[10]"},{"internalType":"uint256[10]","name":"teamVolumeByLevel","type":"uint256[10]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getUserProfile","outputs":[{"internalType":"address","name":"upline","type":"address"},{"internalType":"uint256","name":"invested","type":"uint256"},{"internalType":"uint256","name":"withdrawn","type":"uint256"},{"internalType":"uint256","name":"teamSize","type":"uint256"},{"internalType":"uint256","name":"teamVolume","type":"uint256"},{"internalType":"uint16","name":"directReferrals","type":"uint16"},{"internalType":"uint8","name":"rank","type":"uint8"},{"internalType":"bool","name":"isSystem","type":"bool"},{"internalType":"bool","name":"hasRank","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getUserRankInfo","outputs":[{"internalType":"bool","name":"hasAnyRank","type":"bool"},{"internalType":"uint8","name":"currentRank","type":"uint8"},{"internalType":"uint256","name":"currentCommission","type":"uint256"},{"internalType":"uint256","name":"requiredForNextRank","type":"uint256"},{"internalType":"uint256","name":"totalRankAwardsReceived","type":"uint256"},{"internalType":"uint256","name":"pendingRankAwardAmount","type":"uint256"},{"internalType":"bool[10]","name":"ranksAchieved","type":"bool[10]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddr","type":"address"}],"name":"getUserWithdrawalBreakdown","outputs":[{"internalType":"uint256","name":"roiWithdrawn","type":"uint256"},{"internalType":"uint256","name":"royaltyWithdrawn","type":"uint256"},{"internalType":"uint256","name":"referralWithdrawn","type":"uint256"},{"internalType":"uint256","name":"rankAwardWithdrawn","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"planId","type":"uint8"},{"internalType":"address","name":"upline","type":"address"}],"name":"invest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isSystemAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projectAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rankAwards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rankThresholds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"royaltyBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalROIWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRankAwardWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReferralWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRoyaltyWithdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalUsers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWithdrawnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uniBps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60015f556102006040526102bc60c090815261012c60e05260c86101005260966101208190526101405260646101608190526101805260506101a08190526101c05260326101e05261005590601a90600a610952565b50348015610061575f5ffd5b5060405161554138038061554183398101604081905261008091610a4f565b6001600160a01b038216158015906100a057506001600160a01b03811615155b6100dc5760405162461bcd60e51b81526020600482015260096024820152682d22a927afa0a2222960b91b604482015260640160405180910390fd5b336080908152600180546001600160a01b038581166001600160a01b031992831681178455600280549287169290931682179092555f60a0818152928152601b602090815260408083206037808201805460ff199081168a1782559686528386209182018054909716891787556008928301805460ff60281b1990811665ff0000000000908117909255939092018054909316909117909155805461ff00199081169091558454169093558251938401835266038d7ea4c6800084526611c290633b7000908401908152604192840192835260c86060850190815260e6968501968752600380549687018155928390529351949091025f5160206155015f395f51905f52810194909455515f5160206154e15f395f51905f52840155515f5160206155215f395f51905f5290920180549151935161ffff9081166401000000000261ffff60201b19958216620100000263ffffffff19909416919094161791909117929092161790556040805160a0810182526611c37937e0800081526658d07542bd700060208201908152604592820192835260dc6060830190815260fc60808401908152600380546001810182555f829052945194025f5160206155015f395f51905f5281019490945591515f5160206154e15f395f51905f5284015592515f5160206155215f395f51905f5290920180549351915161ffff9081166401000000000261ffff60201b19938216620100000263ffffffff19909616919094161793909317161790556040805160a0810182526658d15e176280008152670163448f88e4f00060208201908152604792820192835260f06060830190815261010e60808401908152600380546001810182555f829052945194025f5160206155015f395f51905f5281019490945591515f5160206154e15f395f51905f5284015592515f5160206155215f395f51905f5290920180549351915161ffff9081166401000000000261ffff60201b19938216620100000263ffffffff19909616919094161793909317161790556040805160a08101825267016345785d8a000081526702c68a07e66ef00060208201908152604a9282019283526101046060830190815261012460808401908152600380546001810182555f829052945194025f5160206155015f395f51905f5281019490945591515f5160206154e15f395f51905f5284015592515f5160206155215f395f51905f5290920180549351915161ffff9081166401000000000261ffff60201b19938216620100000263ffffffff19909616919094161793909317161790556040805160a0810182526702c68af0bb1400008152670429cf8043f8f00060208201908152604b9282019283526101186060830190815261013660808401908152600380546001810182555f829052945194025f5160206155015f395f51905f5281019490945591515f5160206154e15f395f51905f5284015592515f5160206155215f395f51905f5290920180549351915161ffff9081166401000000000261ffff60201b19938216620100000263ffffffff19909616919094161793909317161790556040805160a081018252670429d069189e0000815267058d14f8a182f00060208201908152604e9282019283526101226060830190815261014660808401908152600380546001810182555f829052945194025f5160206155015f395f51905f5281019490945591515f5160206154e15f395f51905f5284015592515f5160206155215f395f51905f5290920180549351915161ffff9081166401000000000261ffff60201b19938216620100000263ffffffff19909616919094161793909317161790556040805160a08101825267058d15e17628000081526706f05a70ff0cf0006020820190815260509282019283526101276060830190815261015060808401908152600380546001810182555f829052945194025f5160206155015f395f51905f5281019490945591515f5160206154e15f395f51905f5284015592515f5160206155215f395f51905f5290920180549351915161ffff9081166401000000000261ffff60201b19938216620100000263ffffffff19909616919094161793909317161790556040805160a0810182526706f05b59d3b2000081525f1960208201908152605092820192835261012c6060830190815261015460808401908152600380546001810182555f829052945194025f5160206155015f395f51905f5281019490945591515f5160206154e15f395f51905f5284015592515f5160206155215f395f51905f5290920180549351915161ffff9081166401000000000261ffff60201b19938216620100000263ffffffff19909616919094161793909317161790556040805161014081018252662386f26fc10000815266b1a2bc2ec50000602082015267016345785d8a000091810191909152670214e8348c4f000060608201526702c68af0bb14000060808201526703782dace9d9000060a0820152670429d069189e000060c08201526704db73254763000060e082015267058d15e1762800006101008201526706f05b59d3b2000061012082015261083f90600590600a6109e7565b506040805161014081018252660aa87bee5380008152661aa535d3d0c0006020820152662386f26fc1000091810191909152663e2c284391c0006060820152666a94d74f430000608082015266b1a2bc2ec5000060a082015267010a741a4627800060c082015267016345785d8a000060e08201526701bc16d674ec8000610100820152670214e8348c4f00006101208201526108e090600f90600a6109e7565b50604080516101408101825260c8815261019060208201526102589181019190915261032060608201526103e860808201526104b060a082015261057860c082015261064060e08201526107086101008201526107d061012082015261094a90601990600a610952565b505050610a80565b6001830191839082156109d7579160200282015f5b838211156109a757835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302610967565b80156109d55782816101000a81549061ffff02191690556002016020816001010492830192600103026109a7565b505b506109e3929150610a20565b5090565b82600a81019282156109d7579160200282015b828111156109d757825182906001600160401b03169055916020019190600101906109fa565b5b808211156109e3575f8155600101610a21565b80516001600160a01b0381168114610a4a575f5ffd5b919050565b5f5f60408385031215610a60575f5ffd5b610a6983610a34565b9150610a7760208401610a34565b90509250929050565b60805160a051614a39610aa85f395f61077b01525f818161068a0152611bf10152614a395ff3fe60806040526004361061028e575f3560e01c80638da5cb5b11610155578063e02f1ebd116100be578063f2c768d111610078578063f2c768d114610976578063f2d997cf1461098b578063fc41aebf14610a02578063fc6f946814610a21578063ff434ac714610a40578063ff50abdc14610a66575f5ffd5b8063e02f1ebd146108c1578063e2fdc9bf146108d5578063e4b64970146108e9578063ee1b0953146108fc578063ef0ccd7e1461094c578063f0a9d03314610961575f5ffd5b8063bdfada1d1161010f578063bdfada1d1461079d578063bff1f9e1146107bc578063cda64284146107d1578063cfbb7d361461084d578063db57bf5f14610861578063dd1e18f714610893575f5ffd5b80638da5cb5b146106795780639585f91b146106ac578063987ee156146106c857806398c2892c146107405780639c048dd014610755578063ab937cc11461076a575f5ffd5b806343e0ac89116101f75780636cec99b6116101b15780636cec99b6146106045780636f9fb98a146106345780636fd83a04146103fc57806374f0314f1461064657806383a191751461065a5780638416ad59146103fc575f5ffd5b806343e0ac89146105045780634e71d92d1461052357806350327d0f146105395780635603e8601461055c578063569e9c3a146105b25780635dbaed19146105e3575f5ffd5b806329ca23ec1161024857806329ca23ec146103fc5780632bc911e5146104105780632f9ec7ba146104425780633a98ad9b1461048c5780633cf96af1146104b85780634082fa9b146104ef575f5ffd5b806317a7b3dc146102995780631c5af9d1146102dd5780631d8b44c51461034f5780632406333114610372578063249d39e91461038757806324d6d2c41461039c575f5ffd5b3661029557005b5f5ffd5b3480156102a4575f5ffd5b506102b86102b33660046144f3565b610a7b565b6040805194855260208501939093529183015260608201526080015b60405180910390f35b3480156102e8575f5ffd5b506102fc6102f73660046144f3565b610b08565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830152610140820152610160016102d4565b34801561035a575f5ffd5b50610364601e5481565b6040519081526020016102d4565b34801561037d575f5ffd5b5061036461032081565b348015610392575f5ffd5b5061036461271081565b3480156103a7575f5ffd5b506103bb6103b63660046144f3565b610bbe565b60408051978852602088019690965260ff909416948601949094526060850191909152608084015290151560a083015261ffff1660c082015260e0016102d4565b348015610407575f5ffd5b5061036460c881565b34801561041b575f5ffd5b5061042f61042a36600461450c565b610ce6565b60405161ffff90911681526020016102d4565b34801561044d575f5ffd5b5061047c61045c3660046144f3565b6001600160a01b03165f908152601b602052604090206037015460ff1690565b60405190151581526020016102d4565b348015610497575f5ffd5b506104ab6104a63660046144f3565b610d13565b6040516102d49190614523565b3480156104c3575f5ffd5b506002546104d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102d4565b3480156104fa575f5ffd5b5061036461019081565b34801561050f575f5ffd5b5061036461051e36600461450c565b610dd5565b34801561052e575f5ffd5b50610537610deb565b005b348015610544575f5ffd5b5061054d6111e6565b6040516102d4939291906145d4565b348015610567575f5ffd5b50601c54601d54601e54602454602554602654602754604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102d4565b3480156105bd575f5ffd5b506105d16105cc3660046144f3565b6112c9565b6040516102d496959493929190614627565b3480156105ee575f5ffd5b506105f7611453565b6040516102d49190614684565b34801561060f575f5ffd5b5061062361061e366004614707565b6114ec565b6040516102d4959493929190614738565b34801561063f575f5ffd5b5047610364565b348015610651575f5ffd5b50610364607881565b348015610665575f5ffd5b5061036461067436600461450c565b611760565b348015610684575f5ffd5b506104d77f000000000000000000000000000000000000000000000000000000000000000081565b3480156106b7575f5ffd5b5061036468056bc75e2d6310000081565b3480156106d3575f5ffd5b506106e76106e23660046144f3565b61176f565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915261ffff1660a085015260ff1660c0840152151560e08301521515610100820152610120016102d4565b34801561074b575f5ffd5b506103646103e881565b348015610760575f5ffd5b5061036460265481565b348015610775575f5ffd5b506103647f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a8575f5ffd5b5061042f6107b736600461450c565b611868565b3480156107c7575f5ffd5b50610364601c5481565b3480156107dc575f5ffd5b506108256107eb3660046144f3565b6001600160a01b03165f908152601b60205260409020600e810154600d820154600f83015460108401546002909401549294919390929091565b604080519586526020860194909452928401919091526060830152608082015260a0016102d4565b348015610858575f5ffd5b50610537611877565b34801561086c575f5ffd5b5061088061087b3660046144f3565b6118a3565b6040516102d497969594939291906147af565b34801561089e575f5ffd5b506108b26108ad3660046144f3565b6119d7565b6040516102d493929190614814565b3480156108cc575f5ffd5b50610537611a43565b3480156108e0575f5ffd5b50610537611be6565b6105376108f7366004614830565b611c77565b348015610907575f5ffd5b5061091b61091636600461450c565b61236c565b60408051958652602086019490945261ffff928316938501939093528116606084015216608082015260a0016102d4565b348015610957575f5ffd5b5061036460245481565b34801561096c575f5ffd5b5061036460275481565b348015610981575f5ffd5b5061036460255481565b348015610996575f5ffd5b506109aa6109a53660046144f3565b6123b6565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152151561012083015260ff16610140820152610160016102d4565b348015610a0d575f5ffd5b506102b8610a1c3660046144f3565b612498565b348015610a2c575f5ffd5b506001546104d7906001600160a01b031681565b348015610a4b575f5ffd5b50610a5460ff81565b60405160ff90911681526020016102d4565b348015610a71575f5ffd5b50610364601d5481565b6001600160a01b0381165f908152601b60205260408120819081908190815b600a820154811015610ac457610ab08782612535565b610aba908761486c565b9550600101610a9a565b506003810154610ad4908661486c565b9450610adf86612793565b6013820154909450925082610af4858761486c565b610afe919061486c565b9150509193509193565b5f5f5f5f5f5f5f5f5f5f5f5f601b5f8e6001600160a01b03166001600160a01b031681526020019081526020015f209050610b428d612886565b9b5080600c01549a50610b548d612908565b6006820154909a509850888a610b6a8d8f61486c565b610b74919061486c565b610b7e919061486c565b975080600201549650610b908d612943565b955080600e0154945080600d0154935080600f01549250806010015491505091939597999b90929496989a50565b6001600160a01b0381165f908152601b6020526040812060138101546006820154603783015491939092909182918291610100900460ff1690829082610c055760ff610c15565b6008810154600160281b900460ff165b600c82015460378301549197509550610100900460ff16610c3d5760055493505f9150610cda565b60098660ff161015610ca4576005610c56876001614893565b60ff16600a8110610c6957610c6961487f565b0154935060198660ff16600a8110610c8357610c8361487f565b601091828204019190066002029054906101000a900461ffff169150610cda565b5f935060198660ff16600a8110610cbd57610cbd61487f565b601091828204019190066002029054906101000a900461ffff1691505b50919395979092949650565b601981600a8110610cf5575f80fd5b60109182820401919006600202915054906101000a900461ffff1681565b6001600160a01b0381165f908152601b60209081526040808320600a01805482518185028101850190935280835260609492939192909184015b82821015610dca575f8481526020908190206040805160c081018252600486029092018054835260018082015464ffffffffff80821686880152600160281b9091041692840192909252600281015460608401526003015460ff808216608085015261010090910416151560a08301529083529092019101610d4d565b505050509050919050565b600581600a8110610de4575f80fd5b0154905081565b5f54600114610e155760405162461bcd60e51b8152600401610e0c906148ac565b60405180910390fd5b60025f90815533808252601b60205260408220919081908190610e37906129cd565b5083600301549250610e4833612793565b601385015490925090505f81610e5e848661486c565b610e68919061486c565b90505f8111610eac5760405162461bcd60e51b815260206004820152601060248201526f4e4f5448494e475f544f5f434c41494d60801b6044820152606401610e0c565b5f612710610ebc610190846148d0565b610ec691906148e7565b90505f610ed38284614906565b90508515610f245785601f5f828254610eec919061486c565b925050819055508587600e015f828254610f06919061486c565b925050819055508560245f828254610f1e919061486c565b90915550505b841561106f575f610f3433612dc5565b90508015610f555780886039015f828254610f4f919061486c565b90915550505b610f5e33612e49565b85886007015f828254610f71919061486c565b9250508190555085886004015f828254610f8b919061486c565b925050819055508588600d015f828254610fa5919061486c565b925050819055508560205f828254610fbd919061486c565b925050819055508560255f828254610fd5919061486c565b909155505060378801545f9060ff1615610ff9575068056bc75e2d63100000611019565b60648960010154603261100c91906148d0565b61101691906148e7565b90505b600789015433907f7531fd1cb3d7da742c99281f573b74ad9b206faebac0d78980231d1b8f9e8b8890899061104e8186614906565b6040805193845260208401929092529082015260600160405180910390a250505b83156110af575f876013018190555083876010015f828254611091919061486c565b925050819055508360275f8282546110a9919061486c565b90915550505b5f6003880181905560088801805464ffffffffff19164264ffffffffff161790556002880180548392906110e490849061486c565b9250508190555080601e5f8282546110fc919061486c565b925050819055508160225f828254611114919061486c565b9091555050478311156111625760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b6044820152606401610e0c565b61116b82612ffe565b604051339082156108fc029083905f818181858888f19350505050158015611195573d5f5f3e3d5ffd5b50604080518481526020810184905290810182905233907f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef19060600160405180910390a2505060015f555050505050565b6111ee6144b9565b6111f66144b9565b6111fe6144b9565b60408051610140810191829052600591600f916019918490600a9082845b81548152602001906001019080831161121c57505060408051610140810191829052949750869350600a9250905082845b81548152602001906001019080831161124d57505060408051610140810191829052949650859350600a92509050825f855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161127f57905050505050509050925092509250909192565b5f5f5f5f6112d56144b9565b6112dd6144b9565b6001600160a01b0387165f908152601b60205260408082206008810154600b8201548351610140810194859052600160301b90920461ffff1698509650909290916015840191600a91908390855b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161132b57505060408051610140810191829052959850602187019450600a93509150839050845b81548152602001906001019080831161138857509395505f93505050505b600a8160ff16101561144857816015018160ff16600a81106113ca576113ca61487f565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16886113f7919061486c565b9750816035018160ff16600a81106114115761141161487f565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168761143e919061486c565b96506001016113a6565b505091939550919395565b60606003805480602002602001604051908101604052809291908181526020015f905b828210156114e3575f8481526020908190206040805160a08101825260038602909201805483526001808201548486015260029091015461ffff8082169385019390935262010000810483166060850152600160201b900490911660808301529083529092019101611476565b50505050905090565b5f5f5f5f6060600a8660ff16106115355760405162461bcd60e51b815260206004820152600d60248201526c1253959053125117d311559153609a1b6044820152606401610e0c565b6001600160a01b0387165f908152601b602052604090206015810160ff8816600a81106115645761156461487f565b600891828204019190066004029054906101000a900463ffffffff169550806035018760ff16600a811061159a5761159a61487f565b600891828204019190066004029054906101000a900463ffffffff169450806021018760ff16600a81106115d0576115d061487f565b01549350806017018760ff16600a81106115ec576115ec61487f565b015492505f805b60148301548110156116525761160a896001614893565b60ff168360140182815481106116225761162261487f565b5f91825260209091200154600160a01b900460ff160361164a578161164681614919565b9250505b6001016115f3565b508067ffffffffffffffff81111561166c5761166c614931565b604051908082528060200260200182016040528015611695578160200160208202803683370190505b5092505f805b6014840154811015611752576116b28a6001614893565b60ff168460140182815481106116ca576116ca61487f565b5f91825260209091200154600160a01b900460ff160361174a578360140181815481106116f9576116f961487f565b5f9182526020909120015485516001600160a01b03909116908690849081106117245761172461487f565b6001600160a01b03909216602092830291909101909101528161174681614919565b9250505b60010161169b565b505050509295509295909350565b600f81600a8110610de4575f80fd5b6001600160a01b038181165f908152601b60205260408120805460018201546002830154600b8401546008850154603786015494909716969295919491939092600160301b900461ffff1691849182918291610100900460ff166117d45760ff6117e4565b6008810154600160281b900460ff165b603782015490945060ff80821694506101009091041691505f5b600a8160ff16101561185957816015018160ff16600a81106118225761182261487f565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168861184f919061486c565b97506001016117fe565b50509193959799909294969850565b601a81600a8110610cf5575f80fd5b60405133904780156108fc02915f818181858888f193505050501580156118a0573d5f5f3e3d5ffd5b50565b5f5f5f5f5f5f6118b16144b9565b6001600160a01b0388165f908152601b602052604090206037810154610100900460ff169750876118e35760ff6118f3565b6008810154600160281b900460ff165b600c8201546006830154601384015460408051610140810191829052949b5092995090965094506009830190600a90825f855b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611926579050505050505091508060370160019054906101000a900460ff166119805760055f5b01549450610cda565b60088101546009600160281b90910460ff1610156119c85760088101546005906119b590600160281b900460ff166001614893565b60ff16600a81106119775761197761487f565b5f945050919395979092949650565b5f5f6119e16144b9565b6001600160a01b0384165f908152601b6020526040908190206005810154600c8201548351610140810194859052919650945090916017830190600a9082845b815481526020019060010190808311611a215750505050509150509193909250565b5f54600114611a645760405162461bcd60e51b8152600401610e0c906148ac565b60025f908155338152601b60205260409020600581015480611abd5760405162461bcd60e51b81526020600482015260126024820152714e4f5f524546455252414c5f494e434f4d4560701b6044820152606401610e0c565b5f82600501819055508082600f015f828254611ad9919061486c565b9250508190555080826002015f828254611af3919061486c565b9250508190555080601e5f828254611b0b919061486c565b925050819055508060265f828254611b23919061486c565b909155505047811115611b715760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b6044820152606401610e0c565b604051339082156108fc029083905f818181858888f19350505050158015611b9b573d5f5f3e3d5ffd5b50604080518281525f602082015290810182905233907f8a937adb2fdee6fb043d3664f142409049f55943bc2dabe922dedd6247a26e4b9060600160405180910390a2505060015f55565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611c4b5760405162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b6044820152606401610e0c565b60405133907f56478dd866af6c13e1eb2804a1c8b2c23542519caf1c7f3ebcf6efa8bd770776905f90a2565b5f54600114611c985760405162461bcd60e51b8152600401610e0c906148ac565b60025f553480611cd85760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d05353d5539560aa1b6044820152606401610e0c565b60035460ff841610611d1b5760405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa82620a760a11b6044820152606401610e0c565b5f60038460ff1681548110611d3257611d3261487f565b5f9182526020918290206040805160a081018252600390930290910180548084526001820154948401949094526002015461ffff8082169284019290925262010000810482166060840152600160201b90041660808201529150821015611dce5760405162461bcd60e51b815260206004820152601060248201526f10915313d5d7d3525397d05353d5539560821b6044820152606401610e0c565b8060200151821115611e155760405162461bcd60e51b815260206004820152601060248201526f105093d59157d3505617d05353d5539560821b6044820152606401610e0c565b5f612710611e256103e8856148d0565b611e2f91906148e7565b9050611e3a816130ed565b8060225f828254611e4b919061486c565b9091555050335f908152601b6020526040812060018101549091901590811561214657866001600160a01b0381161580611e8d57506001600160a01b03881633145b15611ea85750506002546001906001600160a01b0316611f0f565b6001600160a01b0388165f908152601b6020526040902060010154158015611ede57506001546001600160a01b03898116911614155b8015611ef857506002546001600160a01b03898116911614155b15611f0f5750506002546001906001600160a01b03165b83546001600160a01b0319166001600160a01b03821690811785555f908152601b60205260409020600801805460019190600690611f59908490600160301b900461ffff16614945565b825461ffff9182166101009390930a928302919092021990911617905550603784015460ff16611fb4576001601c5f828254611f95919061486c565b909155505060088401805465ff0000000000191665ff00000000001790555b6040516001600160a01b0382169033907f20390f9b9e011275249991882e5d453ec648c3036dbea9c0782f2a0c1efa16d4905f90a3611ff333826131d3565b805f5b600a8160ff1610801561201157506001600160a01b03821615155b15612142576001600160a01b0382165f908152601b6020526040902060019060150160ff8316600a81106120475761204761487f565b600891828204019190066004028282829054906101000a900463ffffffff16612070919061495f565b92506101000a81548163ffffffff021916908363ffffffff1602179055506001601b5f846001600160a01b03166001600160a01b031681526020019081526020015f206035018260ff16600a81106120ca576120ca61487f565b600891828204019190066004028282829054906101000a900463ffffffff166120f3919061495f565b825463ffffffff9182166101009390930a9283029190920219909116179055506001600160a01b039182165f908152601b6020526040902054909116908061213a8161497b565b915050611ff6565b5050505b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081019190915286815f01818152505042816020019064ffffffffff16908164ffffffffff168152505042816040019064ffffffffff16908164ffffffffff16815250505f81606001818152505088816080019060ff16908160ff16815250505f8160a001901515908115158152505083600a0181908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f01556020820151816001015f6101000a81548164ffffffffff021916908364ffffffffff16021790555060408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600201556080820151816003015f6101000a81548160ff021916908360ff16021790555060a08201518160030160016101000a81548160ff02191690831515021790555050505f600185600a01805490506122c59190614906565b905087856001015f8282546122da919061486c565b9250508190555087601d5f8282546122f2919061486c565b909155506123039050338985613285565b61230d33896134f7565b612317338261362e565b6040805189815260ff8c16602082015290810187905233907f999cbaf5148925f92ba8d941276e0a13cadad3823058b47817fb1a10875310579060600160405180910390a2505060015f555050505050505050565b6003818154811061237b575f80fd5b5f91825260209091206003909102018054600182015460029092015490925061ffff80821691620100008104821691600160201b9091041685565b6001600160a01b0381165f908152601b6020526040812060018101546002820154600b830154600c840154600385015460058601546013870154603788015496989597949693959294919390918391610100900460ff169082908261241c5760ff61242c565b6008810154600160281b900460ff165b91505f5b600a82015481101561245a576124468e82612535565b612450908a61486c565b9850600101612430565b506124648d612793565b95508486612472898b61486c565b61247c919061486c565b612486919061486c565b93505091939597999b90929496989a50565b6001600160a01b0381165f908152601b6020526040812060378101548291829182919060ff16156124d45768056bc75e2d6310000094506124f4565b6064816001015460326124e791906148d0565b6124f191906148e7565b94505b8060070154935061250486612793565b92505f612511848661486c565b9050808611612520575f61252a565b61252a8187614906565b925050509193509193565b6001600160a01b0382165f908152601b60205260408120600a8101548310612560575f91505061278d565b5f81600a0184815481106125765761257661487f565b905f5260205f20906004020190508060030160019054906101000a900460ff16156125a5575f9250505061278d565b60038181015481545f929160ff169081106125c2576125c261487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b90910416608083015290925042919061262c906078906148d0565b6001850154612642919064ffffffffff16614999565b90505f8164ffffffffff168364ffffffffff16106126605781612662565b825b600186015490915064ffffffffff600160281b909104811690821611612690575f965050505050505061278d565b60018501545f906126af90600160281b900464ffffffffff16836149b6565b64ffffffffff169050805f036126ce575f97505050505050505061278d565b5f612710866060015161ffff16885f01546126e991906148d0565b6126f391906148e7565b90505f607861270284846148d0565b61270c91906148e7565b90505f6064886080015161ffff168a5f015461272891906148d0565b61273291906148e7565b89549091505f906127439083614906565b905080838b60020154612756919061486c565b111561277f578960020154811161276d575f61277c565b60028a015461277c9082614906565b92505b509099505050505050505050505b92915050565b6001600160a01b0381165f908152601b60205260408120603881015482036127bd57505f92915050565b5f6127c784612dc5565b90505f8183603901546127da919061486c565b905082600d015481116127f157505f949350505050565b5f83600d0154826128029190614906565b60378501549091505f9060ff1615612824575068056bc75e2d63100000612844565b60648560010154603261283791906148d0565b61284191906148e7565b90505b8085600701541061285b57505f9695505050505050565b5f85600701548261286c9190614906565b90508083111561287a578092505b50909695505050505050565b6001600160a01b0381165f908152601b602052604081206003810154825b600a8301548110156129005782600a0181815481106128c5576128c561487f565b905f5260205f20906004020160020154826128e0919061486c565b91506128ec8582612535565b6128f6908361486c565b91506001016128a4565b509392505050565b6001600160a01b0381165f908152601b602052604081208161292984612dc5565b905080826039015461293b919061486c565b949350505050565b6001600160a01b0381165f908152601b602052604081206003810154825b600a83015481101561298b576129778582612535565b612981908361486c565b9150600101612961565b508061299685612793565b6129a0908261486c565b90508260130154816129b2919061486c565b90508260050154816129c4919061486c565b95945050505050565b6001600160a01b0381165f908152601b60205260408120600a81015482036129f757505f92915050565b425f5b600a830154811015612d73575f83600a018281548110612a1c57612a1c61487f565b905f5260205f20906004020190508060030160019054906101000a900460ff1615612a475750612d6b565b60038181015481545f929160ff16908110612a6457612a6461487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b909104166080830152909250612acb906078906148d0565b6001840154612ae1919064ffffffffff16614999565b90505f8164ffffffffff168664ffffffffff1610612aff5781612b01565b855b600185015490915064ffffffffff600160281b909104811690821611612b51578164ffffffffff168664ffffffffff1610612b485760038401805461ff0019166101001790555b50505050612d6b565b60018401545f90612b7090600160281b900464ffffffffff16836149b6565b64ffffffffff169050805f03612bb1578264ffffffffff168764ffffffffff1610612ba75760038501805461ff0019166101001790555b5050505050612d6b565b5f612710856060015161ffff16875f0154612bcc91906148d0565b612bd691906148e7565b90505f6078612be584846148d0565b612bef91906148e7565b6040805160c0810182528954815260018a015464ffffffffff8082166020840152600160281b909104169181019190915260028901546060820152600389015460ff808216608084015261010090910416151560a08201529091505f90612c55906136ce565b88549091505f90612c669083614906565b905080838a60020154612c79919061486c565b1115612cb35788600201548111612c90575f612c9f565b6002890154612c9f9082614906565b60038a01805461ff00191661010017905592505b8215612d195782896002015f828254612ccc919061486c565b92505081905550828c6003015f828254612ce6919061486c565b90915550612cf69050838e61486c565b9c50612d198e8b8b60010160059054906101000a900464ffffffffff168961376a565b60018901805464ffffffffff808916600160281b0269ffffffffff00000000001990921691909117909155878116908c1610612d615760038901805461ff0019166101001790555b5050505050505050505b6001016129fa565b508215612dbe57836001600160a01b03167fc5d56b12034b42d9add738e9411f79df060787f4332b19f5c9d65a5e28683ad084604051612db591815260200190565b60405180910390a25b5050919050565b6001600160a01b0381165f908152601b6020526040812060388101548203612def57505f92915050565b5f805b6014830154811015612900575f836014018281548110612e1457612e1461487f565b5f918252602090912001546001600160a01b03169050612e348682613815565b612e3e908461486c565b925050600101612df2565b6001600160a01b0381165f908152601b602052604081209042905b6014830154811015612ff8575f836014018281548110612e8657612e8661487f565b5f9182526020808320909101546001600160a01b0316808352601b90915260408220909250905b600a820154811015612fed575f82600a018281548110612ecf57612ecf61487f565b5f91825260208220600360049092020181810154825491945060ff16908110612efa57612efa61487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b909104166080830152909250612f61906078906148d0565b6001840154612f77919064ffffffffff16614999565b90505f8164ffffffffff168964ffffffffff1610612f955781612f97565b885b6001600160a01b038c81165f908152600460209081526040808320938c168352928152828220898352905220805464ffffffffff191664ffffffffff92909216919091179055505060019092019150612ead9050565b505050600101612e64565b50505050565b805f036130085750565b5f61019061301760c8846148d0565b61302191906148e7565b90505f61302e8284614906565b9050811561306f576001546040516001600160a01b039091169083156108fc029084905f818181858888f1935050505015801561306d573d5f5f3e3d5ffd5b505b80156130ae576002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156130ac573d5f5f3e3d5ffd5b505b60408051838152602081018390527f5fe403761682314bb72c5dafc81799822655425b6ab8b939d991abc492d52a5691015b60405180910390a1505050565b805f036130f75750565b5f6103e861310660c8846148d0565b61311091906148e7565b90505f61311d8284614906565b9050811561315e576001546040516001600160a01b039091169083156108fc029084905f818181858888f1935050505015801561315c573d5f5f3e3d5ffd5b505b801561319d576002546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561319b573d5f5f3e3d5ffd5b505b60408051838152602081018390527f8bbbd8c7716eb46b28777fbe99d1543fe6d38fce3ad72bb6eed2878b7d20bf0691016130e0565b8060015b6001600160a01b038216158015906131f35750600a8160ff1611155b15612ff8576001600160a01b039182165f818152601b602081815260408084208151808301909252898816825260ff8088168385019081526014830180546001810182559088528588209451940180549151909216600160a01b026001600160a81b0319909116938a16939093179290921790915593909252905254909116908061327d8161497b565b9150506131d7565b6001600160a01b038084165f908152601b60205260408120549091169080603281856132b257600a6132b5565b60015b90505b8060ff168460ff161080156132d557506001600160a01b03851615155b80156132e857508161ffff168361ffff16105b156134ed57826132f7816149d3565b93505083806133059061497b565b6001600160a01b0387165f908152601b6020526040902060010154909550151590508061334c57506001600160a01b0385165f908152601b602052604090206037015460ff165b156134cb575f612710601a6133626001886149ea565b60ff16600a81106133755761337561487f565b601091828204019190066002029054906101000a900461ffff1661ffff168961339e91906148d0565b6133a891906148e7565b905080156134c9576001600160a01b0386165f908152601b6020526040812060050180548392906133da90849061486c565b90915550506001600160a01b0386165f908152601b60205260408120600c01805483929061340990849061486c565b90915550506001600160a01b0386165f908152601b6020526040902081906017016134356001886149ea565b60ff16600a81106134485761344861487f565b015f828254613457919061486c565b925050819055508060215f82825461346f919061486c565b90915550506040805160ff87168152602081018390526001600160a01b0380891692908c16917f41d82d5c8308a419bd4e816c115466f1de6ab68fb03b31fbd39a8dc0ff88732e910160405180910390a36134c9866139ed565b505b6001600160a01b039485165f908152601b6020526040902054909416936132b8565b5050505050505050565b6001600160a01b038083165f908152601b6020526040812054909116905b600a8160ff1610801561353057506001600160a01b03821615155b15612ff8578061353f8161497b565b6001600160a01b0384165f908152601b60205260408120600b0180549294508693509161356d90849061486c565b90915550506001600160a01b0382165f908152601b6020526040902083906021016135996001846149ea565b60ff16600a81106135ac576135ac61487f565b015f8282546135bb919061486c565b90915550506040805160ff83168152602081018590526001600160a01b0380871692908516917ff6376f9d2c99d81876349971d9bffab844eab2ef6e9dad9ec1a4370a4b5fc512910160405180910390a36001600160a01b039182165f908152601b602052604090205490911690613515565b6001600160a01b038083165f908152601b6020526040812054909116905b600a8160ff1610801561366757506001600160a01b03821615155b15612ff857806136768161497b565b6001600160a01b039384165f8181526004602090815260408083208a8916845282528083208984528252808320805464ffffffffff19164264ffffffffff16179055928252601b9052205490931692915061364c9050565b5f5f6003836080015160ff16815481106136ea576136ea61487f565b5f9182526020918290206040805160a08101825260039093029091018054835260018101549383019390935260029092015461ffff8082169383019390935262010000810483166060830152600160201b900490911660808201819052845191925060649161375991906148d0565b61376391906148e7565b9392505050565b6001600160a01b0384165f908152601b60205260408120600a810180549192918690811061379a5761379a61487f565b5f91825260208220845460049092020192506001600160a01b0316905b600a8160ff161080156137d257506001600160a01b03821615155b156134ed57806137e18161497b565b9150506137f3828989868a8a87613f20565b6001600160a01b039182165f908152601b6020526040902054909116906137b7565b6001600160a01b038082165f908152601b6020526040808220928516825281209091908242815b600a85015481101561287a575f85600a01828154811061385e5761385e61487f565b905f5260205f20906004020190508060030160019054906101000a900460ff161561388957506139e5565b60038181015481545f929160ff169081106138a6576138a661487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b90910416608083015290925061390d906078906148d0565b6001840154613923919064ffffffffff16614999565b90505f8164ffffffffff168664ffffffffff16106139415781613943565b855b90505f60045f8e6001600160a01b03166001600160a01b031681526020019081526020015f205f8d6001600160a01b03166001600160a01b031681526020019081526020015f205f8781526020019081526020015f205f9054906101000a900464ffffffffff1690508064ffffffffff168264ffffffffff1611156139df575f6139cf8a8784866140cd565b90506139db818a61486c565b9850505b50505050505b60010161383c565b6001600160a01b0381165f908152601b60205260409020600554600c8201541015613a16575050565b60378101545f90610100900460ff16613a305760ff613a40565b6008820154600160281b900460ff165b90505f805b600a8160ff161015613a895760058160ff16600a8110613a6757613a6761487f565b015484600c015410613a77578091505b80613a818161497b565b915050613a45565b506037830154610100900460ff16613cda5760378301805461ff00191661010017905560088301805460ff8316600160281b810265ff000000000019909216919091179091556040805160608101825264ffffffffff421681526020810183905260388601929091820190601990600a8110613b0757613b0761487f565b601081049091015461ffff6002600f909316929092026101000a9004811690915282546001810184555f938452602080852084519201805491850151604090950151909316600160301b0267ffff0000000000001960ff909516600160281b0265ffffffffffff1990921664ffffffffff909316929092171792909216919091179055805b8260ff168160ff1611613c3b57846009018160ff16600a8110613bb157613bb161487f565b602081049091015460ff601f9092166101000a900416613c29576001856009018260ff16600a8110613be557613be561487f565b602091828204019190066101000a81548160ff021916908315150217905550600f8160ff16600a8110613c1a57613c1a61487f565b0154613c26908361486c565b91505b80613c338161497b565b915050613b8c565b508015613c8d5780846006015f828254613c55919061486c565b9250508190555080846013015f828254613c6f919061486c565b925050819055508060235f828254613c87919061486c565b90915550505b6040805160ff84168152602081018390526001600160a01b038716917fb299b3a0632ed5ba499219bed3f5738b98f94cd64e8490982192d1c112ec5ddc910160405180910390a250612ff8565b8160ff168160ff161115612ff857808360080160056101000a81548160ff021916908360ff1602179055508260380160405180606001604052804264ffffffffff1681526020018360ff16815260200160198460ff16600a8110613d4057613d4061487f565b601081049091015461ffff6002600f909316929092026101000a900481169091528254600181810185555f948552602080862085519301805491860151604090960151909416600160301b0267ffff0000000000001960ff909616600160281b0265ffffffffffff1990921664ffffffffff9094169390931717939093161790558190613dce908590614893565b90505b8260ff168160ff1611613e8057846009018160ff16600a8110613df657613df661487f565b602081049091015460ff601f9092166101000a900416613e6e576001856009018260ff16600a8110613e2a57613e2a61487f565b602091828204019190066101000a81548160ff021916908315150217905550600f8160ff16600a8110613e5f57613e5f61487f565b0154613e6b908361486c565b91505b80613e788161497b565b915050613dd1565b508015613ed25780846006015f828254613e9a919061486c565b9250508190555080846013015f828254613eb4919061486c565b925050819055508060235f828254613ecc919061486c565b90915550505b6040805160ff84168152602081018390526001600160a01b038716917fb299b3a0632ed5ba499219bed3f5738b98f94cd64e8490982192d1c112ec5ddc910160405180910390a25050505050565b6001600160a01b038088165f908152601b6020908152604080832060048352818420948b16845293825280832089845290915281205464ffffffffff908116919086168211613f6f5785613f71565b815b90508064ffffffffff168564ffffffffff1611613f90575050506140c4565b5f613f9d848984896140cd565b9050801561407e5780846039015f828254613fb8919061486c565b90915550819050602b8501613fce6001886149ea565b60ff16600a8110613fe157613fe161487f565b015f828254613ff0919061486c565b92505081905550896001600160a01b03168b6001600160a01b03167f0fdc51e6f6559f422f683d309cd0472b5bbb27e907c537950b0ec789b2d829e683888860370160019054906101000a900460ff1661404b5760ff61405b565b6008890154600160281b900460ff165b6040805193845260ff928316602085015291169082015260600160405180910390a35b505050506001600160a01b038781165f908152600460209081526040808320938a168352928152828220888352905220805464ffffffffff191664ffffffffff84161790555b50505050505050565b60388401545f9081036140e157505f61293b565b5f83815b603888015481101561430c575f8860380182815481106141075761410761487f565b5f91825260209182902060408051606081018252929091015464ffffffffff808216808552600160281b830460ff1695850195909552600160301b90910461ffff16918301919091529092508816106141605750614304565b805164ffffffffff80881691161061422e575f8211801561418e57508564ffffffffff168364ffffffffff16105b15614228575f60388a016141a3600185614906565b815481106141b3576141b361487f565b5f918252602080832060408051606081018252939091015464ffffffffff81168452600160281b810460ff1692840192909252600160301b90910461ffff169082015291506142178a614206878b6149b6565b64ffffffffff1684604001516143c5565b9050614223818761486c565b955050505b5061430c565b5f8211801561424d5750805f015164ffffffffff168364ffffffffff16105b156142e0575f60388a01614262600185614906565b815481106142725761427261487f565b5f918252602080832060408051606081018252939091015464ffffffffff81168452600160281b810460ff1692840192909252600160301b90910461ffff169082015283519092506142cb908b906142069088906149b6565b90506142d7818761486c565b95505050614300565b811580156142fe5750805f015164ffffffffff168364ffffffffff16105b505b5191505b6001016140e5565b508364ffffffffff168164ffffffffff1610801561432d5750603887015415155b156143bb576038870180545f919061434790600190614906565b815481106143575761435761487f565b5f918252602080832060408051606081018252939091015464ffffffffff81168452600160281b810460ff1692840192909252600160301b90910461ffff169082015291506143aa8861420685896149b6565b90506143b6818561486c565b935050505b5095945050505050565b5f8215806143d5575061ffff8216155b156143e157505f613763565b60038481015481545f929160ff169081106143fe576143fe61487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840192909252620100008104821660608401819052600160201b909104909116608083015287549193506127109161446e91906148d0565b61447891906148e7565b90505f607861448787846148d0565b61449191906148e7565b90506127106144a461ffff8716836148d0565b6144ae91906148e7565b979650505050505050565b604051806101400160405280600a906020820280368337509192915050565b80356001600160a01b03811681146144ee575f5ffd5b919050565b5f60208284031215614503575f5ffd5b613763826144d8565b5f6020828403121561451c575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156145a75783518051845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151606085015260ff608082015116608085015260a0810151151560a08501525060c08301925060208401935060018101905061453c565b509095945050505050565b805f5b600a811015612ff85781518452602093840193909101906001016145b5565b6103c081016145e382866145b2565b6145f16101408301856145b2565b6102808201835f5b600a81101561461c57815161ffff168352602092830192909101906001016145f9565b505050949350505050565b8681526020810186905261ffff8516604082015260608101849052610300810160808201845f5b600a81101561467357815163ffffffff1683526020928301929091019060010161464e565b5050506144ae6101c08301846145b2565b602080825282518282018190525f918401906040840190835b818110156145a7578351805184526020810151602085015261ffff604082015116604085015261ffff606082015116606085015261ffff60808201511660808501525060a08301925060208401935060018101905061469d565b803560ff811681146144ee575f5ffd5b5f5f60408385031215614718575f5ffd5b614721836144d8565b915061472f602084016146f7565b90509250929050565b5f60a0820163ffffffff8816835263ffffffff8716602084015285604084015284606084015260a0608084015280845180835260c0850191506020860192505f5b818110156147a05783516001600160a01b0316835260209384019390920191600101614779565b50909998505050505050505050565b5f61020082019050881515825260ff881660208301528660408301528560608301528460808301528360a083015260c08201835f5b600a81101561480557815115158352602092830192909101906001016147e4565b50505098975050505050505050565b83815260208101839052610180810161293b60408301846145b2565b5f5f60408385031215614841575f5ffd5b61484a836146f7565b915061472f602084016144d8565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561278d5761278d614858565b634e487b7160e01b5f52603260045260245ffd5b60ff818116838216019081111561278d5761278d614858565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b808202811582820484141761278d5761278d614858565b5f8261490157634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561278d5761278d614858565b5f6001820161492a5761492a614858565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b61ffff818116838216019081111561278d5761278d614858565b63ffffffff818116838216019081111561278d5761278d614858565b5f60ff821660ff810361499057614990614858565b60010192915050565b64ffffffffff818116838216019081111561278d5761278d614858565b64ffffffffff828116828216039081111561278d5761278d614858565b5f61ffff821661ffff810361499057614990614858565b60ff828116828216039081111561278d5761278d61485856fea2646970667358221220d59c0d6ee9f4eb4c5f286db25c759bced152e696a000282a9507a8502ca63a4664736f6c634300081e0033c2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85cc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85bc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85d000000000000000000000000ab38fb55fe3cd5d7edf653b5fb5bb35a622e88ea00000000000000000000000098b137209686a67f030e123e1e1d828eda78087a

Deployed Bytecode

0x60806040526004361061028e575f3560e01c80638da5cb5b11610155578063e02f1ebd116100be578063f2c768d111610078578063f2c768d114610976578063f2d997cf1461098b578063fc41aebf14610a02578063fc6f946814610a21578063ff434ac714610a40578063ff50abdc14610a66575f5ffd5b8063e02f1ebd146108c1578063e2fdc9bf146108d5578063e4b64970146108e9578063ee1b0953146108fc578063ef0ccd7e1461094c578063f0a9d03314610961575f5ffd5b8063bdfada1d1161010f578063bdfada1d1461079d578063bff1f9e1146107bc578063cda64284146107d1578063cfbb7d361461084d578063db57bf5f14610861578063dd1e18f714610893575f5ffd5b80638da5cb5b146106795780639585f91b146106ac578063987ee156146106c857806398c2892c146107405780639c048dd014610755578063ab937cc11461076a575f5ffd5b806343e0ac89116101f75780636cec99b6116101b15780636cec99b6146106045780636f9fb98a146106345780636fd83a04146103fc57806374f0314f1461064657806383a191751461065a5780638416ad59146103fc575f5ffd5b806343e0ac89146105045780634e71d92d1461052357806350327d0f146105395780635603e8601461055c578063569e9c3a146105b25780635dbaed19146105e3575f5ffd5b806329ca23ec1161024857806329ca23ec146103fc5780632bc911e5146104105780632f9ec7ba146104425780633a98ad9b1461048c5780633cf96af1146104b85780634082fa9b146104ef575f5ffd5b806317a7b3dc146102995780631c5af9d1146102dd5780631d8b44c51461034f5780632406333114610372578063249d39e91461038757806324d6d2c41461039c575f5ffd5b3661029557005b5f5ffd5b3480156102a4575f5ffd5b506102b86102b33660046144f3565b610a7b565b6040805194855260208501939093529183015260608201526080015b60405180910390f35b3480156102e8575f5ffd5b506102fc6102f73660046144f3565b610b08565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152610120830152610140820152610160016102d4565b34801561035a575f5ffd5b50610364601e5481565b6040519081526020016102d4565b34801561037d575f5ffd5b5061036461032081565b348015610392575f5ffd5b5061036461271081565b3480156103a7575f5ffd5b506103bb6103b63660046144f3565b610bbe565b60408051978852602088019690965260ff909416948601949094526060850191909152608084015290151560a083015261ffff1660c082015260e0016102d4565b348015610407575f5ffd5b5061036460c881565b34801561041b575f5ffd5b5061042f61042a36600461450c565b610ce6565b60405161ffff90911681526020016102d4565b34801561044d575f5ffd5b5061047c61045c3660046144f3565b6001600160a01b03165f908152601b602052604090206037015460ff1690565b60405190151581526020016102d4565b348015610497575f5ffd5b506104ab6104a63660046144f3565b610d13565b6040516102d49190614523565b3480156104c3575f5ffd5b506002546104d7906001600160a01b031681565b6040516001600160a01b0390911681526020016102d4565b3480156104fa575f5ffd5b5061036461019081565b34801561050f575f5ffd5b5061036461051e36600461450c565b610dd5565b34801561052e575f5ffd5b50610537610deb565b005b348015610544575f5ffd5b5061054d6111e6565b6040516102d4939291906145d4565b348015610567575f5ffd5b50601c54601d54601e54602454602554602654602754604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016102d4565b3480156105bd575f5ffd5b506105d16105cc3660046144f3565b6112c9565b6040516102d496959493929190614627565b3480156105ee575f5ffd5b506105f7611453565b6040516102d49190614684565b34801561060f575f5ffd5b5061062361061e366004614707565b6114ec565b6040516102d4959493929190614738565b34801561063f575f5ffd5b5047610364565b348015610651575f5ffd5b50610364607881565b348015610665575f5ffd5b5061036461067436600461450c565b611760565b348015610684575f5ffd5b506104d77f000000000000000000000000d733b8fdcfaff240c602203d574c05de12ae358c81565b3480156106b7575f5ffd5b5061036468056bc75e2d6310000081565b3480156106d3575f5ffd5b506106e76106e23660046144f3565b61176f565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915261ffff1660a085015260ff1660c0840152151560e08301521515610100820152610120016102d4565b34801561074b575f5ffd5b506103646103e881565b348015610760575f5ffd5b5061036460265481565b348015610775575f5ffd5b506103647f000000000000000000000000000000000000000000000000000000000000000081565b3480156107a8575f5ffd5b5061042f6107b736600461450c565b611868565b3480156107c7575f5ffd5b50610364601c5481565b3480156107dc575f5ffd5b506108256107eb3660046144f3565b6001600160a01b03165f908152601b60205260409020600e810154600d820154600f83015460108401546002909401549294919390929091565b604080519586526020860194909452928401919091526060830152608082015260a0016102d4565b348015610858575f5ffd5b50610537611877565b34801561086c575f5ffd5b5061088061087b3660046144f3565b6118a3565b6040516102d497969594939291906147af565b34801561089e575f5ffd5b506108b26108ad3660046144f3565b6119d7565b6040516102d493929190614814565b3480156108cc575f5ffd5b50610537611a43565b3480156108e0575f5ffd5b50610537611be6565b6105376108f7366004614830565b611c77565b348015610907575f5ffd5b5061091b61091636600461450c565b61236c565b60408051958652602086019490945261ffff928316938501939093528116606084015216608082015260a0016102d4565b348015610957575f5ffd5b5061036460245481565b34801561096c575f5ffd5b5061036460275481565b348015610981575f5ffd5b5061036460255481565b348015610996575f5ffd5b506109aa6109a53660046144f3565b6123b6565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e0850152610100840152151561012083015260ff16610140820152610160016102d4565b348015610a0d575f5ffd5b506102b8610a1c3660046144f3565b612498565b348015610a2c575f5ffd5b506001546104d7906001600160a01b031681565b348015610a4b575f5ffd5b50610a5460ff81565b60405160ff90911681526020016102d4565b348015610a71575f5ffd5b50610364601d5481565b6001600160a01b0381165f908152601b60205260408120819081908190815b600a820154811015610ac457610ab08782612535565b610aba908761486c565b9550600101610a9a565b506003810154610ad4908661486c565b9450610adf86612793565b6013820154909450925082610af4858761486c565b610afe919061486c565b9150509193509193565b5f5f5f5f5f5f5f5f5f5f5f5f601b5f8e6001600160a01b03166001600160a01b031681526020019081526020015f209050610b428d612886565b9b5080600c01549a50610b548d612908565b6006820154909a509850888a610b6a8d8f61486c565b610b74919061486c565b610b7e919061486c565b975080600201549650610b908d612943565b955080600e0154945080600d0154935080600f01549250806010015491505091939597999b90929496989a50565b6001600160a01b0381165f908152601b6020526040812060138101546006820154603783015491939092909182918291610100900460ff1690829082610c055760ff610c15565b6008810154600160281b900460ff165b600c82015460378301549197509550610100900460ff16610c3d5760055493505f9150610cda565b60098660ff161015610ca4576005610c56876001614893565b60ff16600a8110610c6957610c6961487f565b0154935060198660ff16600a8110610c8357610c8361487f565b601091828204019190066002029054906101000a900461ffff169150610cda565b5f935060198660ff16600a8110610cbd57610cbd61487f565b601091828204019190066002029054906101000a900461ffff1691505b50919395979092949650565b601981600a8110610cf5575f80fd5b60109182820401919006600202915054906101000a900461ffff1681565b6001600160a01b0381165f908152601b60209081526040808320600a01805482518185028101850190935280835260609492939192909184015b82821015610dca575f8481526020908190206040805160c081018252600486029092018054835260018082015464ffffffffff80821686880152600160281b9091041692840192909252600281015460608401526003015460ff808216608085015261010090910416151560a08301529083529092019101610d4d565b505050509050919050565b600581600a8110610de4575f80fd5b0154905081565b5f54600114610e155760405162461bcd60e51b8152600401610e0c906148ac565b60405180910390fd5b60025f90815533808252601b60205260408220919081908190610e37906129cd565b5083600301549250610e4833612793565b601385015490925090505f81610e5e848661486c565b610e68919061486c565b90505f8111610eac5760405162461bcd60e51b815260206004820152601060248201526f4e4f5448494e475f544f5f434c41494d60801b6044820152606401610e0c565b5f612710610ebc610190846148d0565b610ec691906148e7565b90505f610ed38284614906565b90508515610f245785601f5f828254610eec919061486c565b925050819055508587600e015f828254610f06919061486c565b925050819055508560245f828254610f1e919061486c565b90915550505b841561106f575f610f3433612dc5565b90508015610f555780886039015f828254610f4f919061486c565b90915550505b610f5e33612e49565b85886007015f828254610f71919061486c565b9250508190555085886004015f828254610f8b919061486c565b925050819055508588600d015f828254610fa5919061486c565b925050819055508560205f828254610fbd919061486c565b925050819055508560255f828254610fd5919061486c565b909155505060378801545f9060ff1615610ff9575068056bc75e2d63100000611019565b60648960010154603261100c91906148d0565b61101691906148e7565b90505b600789015433907f7531fd1cb3d7da742c99281f573b74ad9b206faebac0d78980231d1b8f9e8b8890899061104e8186614906565b6040805193845260208401929092529082015260600160405180910390a250505b83156110af575f876013018190555083876010015f828254611091919061486c565b925050819055508360275f8282546110a9919061486c565b90915550505b5f6003880181905560088801805464ffffffffff19164264ffffffffff161790556002880180548392906110e490849061486c565b9250508190555080601e5f8282546110fc919061486c565b925050819055508160225f828254611114919061486c565b9091555050478311156111625760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b6044820152606401610e0c565b61116b82612ffe565b604051339082156108fc029083905f818181858888f19350505050158015611195573d5f5f3e3d5ffd5b50604080518481526020810184905290810182905233907f45c072aa05b9853b5a993de7a28bc332ee01404a628cec1a23ce0f659f842ef19060600160405180910390a2505060015f555050505050565b6111ee6144b9565b6111f66144b9565b6111fe6144b9565b60408051610140810191829052600591600f916019918490600a9082845b81548152602001906001019080831161121c57505060408051610140810191829052949750869350600a9250905082845b81548152602001906001019080831161124d57505060408051610140810191829052949650859350600a92509050825f855b82829054906101000a900461ffff1661ffff168152602001906002019060208260010104928301926001038202915080841161127f57905050505050509050925092509250909192565b5f5f5f5f6112d56144b9565b6112dd6144b9565b6001600160a01b0387165f908152601b60205260408082206008810154600b8201548351610140810194859052600160301b90920461ffff1698509650909290916015840191600a91908390855b82829054906101000a900463ffffffff1663ffffffff168152602001906004019060208260030104928301926001038202915080841161132b57505060408051610140810191829052959850602187019450600a93509150839050845b81548152602001906001019080831161138857509395505f93505050505b600a8160ff16101561144857816015018160ff16600a81106113ca576113ca61487f565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff16886113f7919061486c565b9750816035018160ff16600a81106114115761141161487f565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168761143e919061486c565b96506001016113a6565b505091939550919395565b60606003805480602002602001604051908101604052809291908181526020015f905b828210156114e3575f8481526020908190206040805160a08101825260038602909201805483526001808201548486015260029091015461ffff8082169385019390935262010000810483166060850152600160201b900490911660808301529083529092019101611476565b50505050905090565b5f5f5f5f6060600a8660ff16106115355760405162461bcd60e51b815260206004820152600d60248201526c1253959053125117d311559153609a1b6044820152606401610e0c565b6001600160a01b0387165f908152601b602052604090206015810160ff8816600a81106115645761156461487f565b600891828204019190066004029054906101000a900463ffffffff169550806035018760ff16600a811061159a5761159a61487f565b600891828204019190066004029054906101000a900463ffffffff169450806021018760ff16600a81106115d0576115d061487f565b01549350806017018760ff16600a81106115ec576115ec61487f565b015492505f805b60148301548110156116525761160a896001614893565b60ff168360140182815481106116225761162261487f565b5f91825260209091200154600160a01b900460ff160361164a578161164681614919565b9250505b6001016115f3565b508067ffffffffffffffff81111561166c5761166c614931565b604051908082528060200260200182016040528015611695578160200160208202803683370190505b5092505f805b6014840154811015611752576116b28a6001614893565b60ff168460140182815481106116ca576116ca61487f565b5f91825260209091200154600160a01b900460ff160361174a578360140181815481106116f9576116f961487f565b5f9182526020909120015485516001600160a01b03909116908690849081106117245761172461487f565b6001600160a01b03909216602092830291909101909101528161174681614919565b9250505b60010161169b565b505050509295509295909350565b600f81600a8110610de4575f80fd5b6001600160a01b038181165f908152601b60205260408120805460018201546002830154600b8401546008850154603786015494909716969295919491939092600160301b900461ffff1691849182918291610100900460ff166117d45760ff6117e4565b6008810154600160281b900460ff165b603782015490945060ff80821694506101009091041691505f5b600a8160ff16101561185957816015018160ff16600a81106118225761182261487f565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff168861184f919061486c565b97506001016117fe565b50509193959799909294969850565b601a81600a8110610cf5575f80fd5b60405133904780156108fc02915f818181858888f193505050501580156118a0573d5f5f3e3d5ffd5b50565b5f5f5f5f5f5f6118b16144b9565b6001600160a01b0388165f908152601b602052604090206037810154610100900460ff169750876118e35760ff6118f3565b6008810154600160281b900460ff165b600c8201546006830154601384015460408051610140810191829052949b5092995090965094506009830190600a90825f855b825461010083900a900460ff161515815260206001928301818104948501949093039092029101808411611926579050505050505091508060370160019054906101000a900460ff166119805760055f5b01549450610cda565b60088101546009600160281b90910460ff1610156119c85760088101546005906119b590600160281b900460ff166001614893565b60ff16600a81106119775761197761487f565b5f945050919395979092949650565b5f5f6119e16144b9565b6001600160a01b0384165f908152601b6020526040908190206005810154600c8201548351610140810194859052919650945090916017830190600a9082845b815481526020019060010190808311611a215750505050509150509193909250565b5f54600114611a645760405162461bcd60e51b8152600401610e0c906148ac565b60025f908155338152601b60205260409020600581015480611abd5760405162461bcd60e51b81526020600482015260126024820152714e4f5f524546455252414c5f494e434f4d4560701b6044820152606401610e0c565b5f82600501819055508082600f015f828254611ad9919061486c565b9250508190555080826002015f828254611af3919061486c565b9250508190555080601e5f828254611b0b919061486c565b925050819055508060265f828254611b23919061486c565b909155505047811115611b715760405162461bcd60e51b8152602060048201526016602482015275494e53554646494349454e545f4c495155494449545960501b6044820152606401610e0c565b604051339082156108fc029083905f818181858888f19350505050158015611b9b573d5f5f3e3d5ffd5b50604080518281525f602082015290810182905233907f8a937adb2fdee6fb043d3664f142409049f55943bc2dabe922dedd6247a26e4b9060600160405180910390a2505060015f55565b336001600160a01b037f000000000000000000000000d733b8fdcfaff240c602203d574c05de12ae358c1614611c4b5760405162461bcd60e51b815260206004820152600a60248201526927a7262cafa7aba722a960b11b6044820152606401610e0c565b60405133907f56478dd866af6c13e1eb2804a1c8b2c23542519caf1c7f3ebcf6efa8bd770776905f90a2565b5f54600114611c985760405162461bcd60e51b8152600401610e0c906148ac565b60025f553480611cd85760405162461bcd60e51b815260206004820152600b60248201526a16915493d7d05353d5539560aa1b6044820152606401610e0c565b60035460ff841610611d1b5760405162461bcd60e51b815260206004820152600c60248201526b24a72b20a624a22fa82620a760a11b6044820152606401610e0c565b5f60038460ff1681548110611d3257611d3261487f565b5f9182526020918290206040805160a081018252600390930290910180548084526001820154948401949094526002015461ffff8082169284019290925262010000810482166060840152600160201b90041660808201529150821015611dce5760405162461bcd60e51b815260206004820152601060248201526f10915313d5d7d3525397d05353d5539560821b6044820152606401610e0c565b8060200151821115611e155760405162461bcd60e51b815260206004820152601060248201526f105093d59157d3505617d05353d5539560821b6044820152606401610e0c565b5f612710611e256103e8856148d0565b611e2f91906148e7565b9050611e3a816130ed565b8060225f828254611e4b919061486c565b9091555050335f908152601b6020526040812060018101549091901590811561214657866001600160a01b0381161580611e8d57506001600160a01b03881633145b15611ea85750506002546001906001600160a01b0316611f0f565b6001600160a01b0388165f908152601b6020526040902060010154158015611ede57506001546001600160a01b03898116911614155b8015611ef857506002546001600160a01b03898116911614155b15611f0f5750506002546001906001600160a01b03165b83546001600160a01b0319166001600160a01b03821690811785555f908152601b60205260409020600801805460019190600690611f59908490600160301b900461ffff16614945565b825461ffff9182166101009390930a928302919092021990911617905550603784015460ff16611fb4576001601c5f828254611f95919061486c565b909155505060088401805465ff0000000000191665ff00000000001790555b6040516001600160a01b0382169033907f20390f9b9e011275249991882e5d453ec648c3036dbea9c0782f2a0c1efa16d4905f90a3611ff333826131d3565b805f5b600a8160ff1610801561201157506001600160a01b03821615155b15612142576001600160a01b0382165f908152601b6020526040902060019060150160ff8316600a81106120475761204761487f565b600891828204019190066004028282829054906101000a900463ffffffff16612070919061495f565b92506101000a81548163ffffffff021916908363ffffffff1602179055506001601b5f846001600160a01b03166001600160a01b031681526020019081526020015f206035018260ff16600a81106120ca576120ca61487f565b600891828204019190066004028282829054906101000a900463ffffffff166120f3919061495f565b825463ffffffff9182166101009390930a9283029190920219909116179055506001600160a01b039182165f908152601b6020526040902054909116908061213a8161497b565b915050611ff6565b5050505b6040805160c0810182525f80825260208201819052918101829052606081018290526080810182905260a081019190915286815f01818152505042816020019064ffffffffff16908164ffffffffff168152505042816040019064ffffffffff16908164ffffffffff16815250505f81606001818152505088816080019060ff16908160ff16815250505f8160a001901515908115158152505083600a0181908060018154018082558091505060019003905f5260205f2090600402015f909190919091505f820151815f01556020820151816001015f6101000a81548164ffffffffff021916908364ffffffffff16021790555060408201518160010160056101000a81548164ffffffffff021916908364ffffffffff160217905550606082015181600201556080820151816003015f6101000a81548160ff021916908360ff16021790555060a08201518160030160016101000a81548160ff02191690831515021790555050505f600185600a01805490506122c59190614906565b905087856001015f8282546122da919061486c565b9250508190555087601d5f8282546122f2919061486c565b909155506123039050338985613285565b61230d33896134f7565b612317338261362e565b6040805189815260ff8c16602082015290810187905233907f999cbaf5148925f92ba8d941276e0a13cadad3823058b47817fb1a10875310579060600160405180910390a2505060015f555050505050505050565b6003818154811061237b575f80fd5b5f91825260209091206003909102018054600182015460029092015490925061ffff80821691620100008104821691600160201b9091041685565b6001600160a01b0381165f908152601b6020526040812060018101546002820154600b830154600c840154600385015460058601546013870154603788015496989597949693959294919390918391610100900460ff169082908261241c5760ff61242c565b6008810154600160281b900460ff165b91505f5b600a82015481101561245a576124468e82612535565b612450908a61486c565b9850600101612430565b506124648d612793565b95508486612472898b61486c565b61247c919061486c565b612486919061486c565b93505091939597999b90929496989a50565b6001600160a01b0381165f908152601b6020526040812060378101548291829182919060ff16156124d45768056bc75e2d6310000094506124f4565b6064816001015460326124e791906148d0565b6124f191906148e7565b94505b8060070154935061250486612793565b92505f612511848661486c565b9050808611612520575f61252a565b61252a8187614906565b925050509193509193565b6001600160a01b0382165f908152601b60205260408120600a8101548310612560575f91505061278d565b5f81600a0184815481106125765761257661487f565b905f5260205f20906004020190508060030160019054906101000a900460ff16156125a5575f9250505061278d565b60038181015481545f929160ff169081106125c2576125c261487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b90910416608083015290925042919061262c906078906148d0565b6001850154612642919064ffffffffff16614999565b90505f8164ffffffffff168364ffffffffff16106126605781612662565b825b600186015490915064ffffffffff600160281b909104811690821611612690575f965050505050505061278d565b60018501545f906126af90600160281b900464ffffffffff16836149b6565b64ffffffffff169050805f036126ce575f97505050505050505061278d565b5f612710866060015161ffff16885f01546126e991906148d0565b6126f391906148e7565b90505f607861270284846148d0565b61270c91906148e7565b90505f6064886080015161ffff168a5f015461272891906148d0565b61273291906148e7565b89549091505f906127439083614906565b905080838b60020154612756919061486c565b111561277f578960020154811161276d575f61277c565b60028a015461277c9082614906565b92505b509099505050505050505050505b92915050565b6001600160a01b0381165f908152601b60205260408120603881015482036127bd57505f92915050565b5f6127c784612dc5565b90505f8183603901546127da919061486c565b905082600d015481116127f157505f949350505050565b5f83600d0154826128029190614906565b60378501549091505f9060ff1615612824575068056bc75e2d63100000612844565b60648560010154603261283791906148d0565b61284191906148e7565b90505b8085600701541061285b57505f9695505050505050565b5f85600701548261286c9190614906565b90508083111561287a578092505b50909695505050505050565b6001600160a01b0381165f908152601b602052604081206003810154825b600a8301548110156129005782600a0181815481106128c5576128c561487f565b905f5260205f20906004020160020154826128e0919061486c565b91506128ec8582612535565b6128f6908361486c565b91506001016128a4565b509392505050565b6001600160a01b0381165f908152601b602052604081208161292984612dc5565b905080826039015461293b919061486c565b949350505050565b6001600160a01b0381165f908152601b602052604081206003810154825b600a83015481101561298b576129778582612535565b612981908361486c565b9150600101612961565b508061299685612793565b6129a0908261486c565b90508260130154816129b2919061486c565b90508260050154816129c4919061486c565b95945050505050565b6001600160a01b0381165f908152601b60205260408120600a81015482036129f757505f92915050565b425f5b600a830154811015612d73575f83600a018281548110612a1c57612a1c61487f565b905f5260205f20906004020190508060030160019054906101000a900460ff1615612a475750612d6b565b60038181015481545f929160ff16908110612a6457612a6461487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b909104166080830152909250612acb906078906148d0565b6001840154612ae1919064ffffffffff16614999565b90505f8164ffffffffff168664ffffffffff1610612aff5781612b01565b855b600185015490915064ffffffffff600160281b909104811690821611612b51578164ffffffffff168664ffffffffff1610612b485760038401805461ff0019166101001790555b50505050612d6b565b60018401545f90612b7090600160281b900464ffffffffff16836149b6565b64ffffffffff169050805f03612bb1578264ffffffffff168764ffffffffff1610612ba75760038501805461ff0019166101001790555b5050505050612d6b565b5f612710856060015161ffff16875f0154612bcc91906148d0565b612bd691906148e7565b90505f6078612be584846148d0565b612bef91906148e7565b6040805160c0810182528954815260018a015464ffffffffff8082166020840152600160281b909104169181019190915260028901546060820152600389015460ff808216608084015261010090910416151560a08201529091505f90612c55906136ce565b88549091505f90612c669083614906565b905080838a60020154612c79919061486c565b1115612cb35788600201548111612c90575f612c9f565b6002890154612c9f9082614906565b60038a01805461ff00191661010017905592505b8215612d195782896002015f828254612ccc919061486c565b92505081905550828c6003015f828254612ce6919061486c565b90915550612cf69050838e61486c565b9c50612d198e8b8b60010160059054906101000a900464ffffffffff168961376a565b60018901805464ffffffffff808916600160281b0269ffffffffff00000000001990921691909117909155878116908c1610612d615760038901805461ff0019166101001790555b5050505050505050505b6001016129fa565b508215612dbe57836001600160a01b03167fc5d56b12034b42d9add738e9411f79df060787f4332b19f5c9d65a5e28683ad084604051612db591815260200190565b60405180910390a25b5050919050565b6001600160a01b0381165f908152601b6020526040812060388101548203612def57505f92915050565b5f805b6014830154811015612900575f836014018281548110612e1457612e1461487f565b5f918252602090912001546001600160a01b03169050612e348682613815565b612e3e908461486c565b925050600101612df2565b6001600160a01b0381165f908152601b602052604081209042905b6014830154811015612ff8575f836014018281548110612e8657612e8661487f565b5f9182526020808320909101546001600160a01b0316808352601b90915260408220909250905b600a820154811015612fed575f82600a018281548110612ecf57612ecf61487f565b5f91825260208220600360049092020181810154825491945060ff16908110612efa57612efa61487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b909104166080830152909250612f61906078906148d0565b6001840154612f77919064ffffffffff16614999565b90505f8164ffffffffff168964ffffffffff1610612f955781612f97565b885b6001600160a01b038c81165f908152600460209081526040808320938c168352928152828220898352905220805464ffffffffff191664ffffffffff92909216919091179055505060019092019150612ead9050565b505050600101612e64565b50505050565b805f036130085750565b5f61019061301760c8846148d0565b61302191906148e7565b90505f61302e8284614906565b9050811561306f576001546040516001600160a01b039091169083156108fc029084905f818181858888f1935050505015801561306d573d5f5f3e3d5ffd5b505b80156130ae576002546040516001600160a01b039091169082156108fc029083905f818181858888f193505050501580156130ac573d5f5f3e3d5ffd5b505b60408051838152602081018390527f5fe403761682314bb72c5dafc81799822655425b6ab8b939d991abc492d52a5691015b60405180910390a1505050565b805f036130f75750565b5f6103e861310660c8846148d0565b61311091906148e7565b90505f61311d8284614906565b9050811561315e576001546040516001600160a01b039091169083156108fc029084905f818181858888f1935050505015801561315c573d5f5f3e3d5ffd5b505b801561319d576002546040516001600160a01b039091169082156108fc029083905f818181858888f1935050505015801561319b573d5f5f3e3d5ffd5b505b60408051838152602081018390527f8bbbd8c7716eb46b28777fbe99d1543fe6d38fce3ad72bb6eed2878b7d20bf0691016130e0565b8060015b6001600160a01b038216158015906131f35750600a8160ff1611155b15612ff8576001600160a01b039182165f818152601b602081815260408084208151808301909252898816825260ff8088168385019081526014830180546001810182559088528588209451940180549151909216600160a01b026001600160a81b0319909116938a16939093179290921790915593909252905254909116908061327d8161497b565b9150506131d7565b6001600160a01b038084165f908152601b60205260408120549091169080603281856132b257600a6132b5565b60015b90505b8060ff168460ff161080156132d557506001600160a01b03851615155b80156132e857508161ffff168361ffff16105b156134ed57826132f7816149d3565b93505083806133059061497b565b6001600160a01b0387165f908152601b6020526040902060010154909550151590508061334c57506001600160a01b0385165f908152601b602052604090206037015460ff165b156134cb575f612710601a6133626001886149ea565b60ff16600a81106133755761337561487f565b601091828204019190066002029054906101000a900461ffff1661ffff168961339e91906148d0565b6133a891906148e7565b905080156134c9576001600160a01b0386165f908152601b6020526040812060050180548392906133da90849061486c565b90915550506001600160a01b0386165f908152601b60205260408120600c01805483929061340990849061486c565b90915550506001600160a01b0386165f908152601b6020526040902081906017016134356001886149ea565b60ff16600a81106134485761344861487f565b015f828254613457919061486c565b925050819055508060215f82825461346f919061486c565b90915550506040805160ff87168152602081018390526001600160a01b0380891692908c16917f41d82d5c8308a419bd4e816c115466f1de6ab68fb03b31fbd39a8dc0ff88732e910160405180910390a36134c9866139ed565b505b6001600160a01b039485165f908152601b6020526040902054909416936132b8565b5050505050505050565b6001600160a01b038083165f908152601b6020526040812054909116905b600a8160ff1610801561353057506001600160a01b03821615155b15612ff8578061353f8161497b565b6001600160a01b0384165f908152601b60205260408120600b0180549294508693509161356d90849061486c565b90915550506001600160a01b0382165f908152601b6020526040902083906021016135996001846149ea565b60ff16600a81106135ac576135ac61487f565b015f8282546135bb919061486c565b90915550506040805160ff83168152602081018590526001600160a01b0380871692908516917ff6376f9d2c99d81876349971d9bffab844eab2ef6e9dad9ec1a4370a4b5fc512910160405180910390a36001600160a01b039182165f908152601b602052604090205490911690613515565b6001600160a01b038083165f908152601b6020526040812054909116905b600a8160ff1610801561366757506001600160a01b03821615155b15612ff857806136768161497b565b6001600160a01b039384165f8181526004602090815260408083208a8916845282528083208984528252808320805464ffffffffff19164264ffffffffff16179055928252601b9052205490931692915061364c9050565b5f5f6003836080015160ff16815481106136ea576136ea61487f565b5f9182526020918290206040805160a08101825260039093029091018054835260018101549383019390935260029092015461ffff8082169383019390935262010000810483166060830152600160201b900490911660808201819052845191925060649161375991906148d0565b61376391906148e7565b9392505050565b6001600160a01b0384165f908152601b60205260408120600a810180549192918690811061379a5761379a61487f565b5f91825260208220845460049092020192506001600160a01b0316905b600a8160ff161080156137d257506001600160a01b03821615155b156134ed57806137e18161497b565b9150506137f3828989868a8a87613f20565b6001600160a01b039182165f908152601b6020526040902054909116906137b7565b6001600160a01b038082165f908152601b6020526040808220928516825281209091908242815b600a85015481101561287a575f85600a01828154811061385e5761385e61487f565b905f5260205f20906004020190508060030160019054906101000a900460ff161561388957506139e5565b60038181015481545f929160ff169081106138a6576138a661487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840183905262010000820481166060850152600160201b90910416608083015290925061390d906078906148d0565b6001840154613923919064ffffffffff16614999565b90505f8164ffffffffff168664ffffffffff16106139415781613943565b855b90505f60045f8e6001600160a01b03166001600160a01b031681526020019081526020015f205f8d6001600160a01b03166001600160a01b031681526020019081526020015f205f8781526020019081526020015f205f9054906101000a900464ffffffffff1690508064ffffffffff168264ffffffffff1611156139df575f6139cf8a8784866140cd565b90506139db818a61486c565b9850505b50505050505b60010161383c565b6001600160a01b0381165f908152601b60205260409020600554600c8201541015613a16575050565b60378101545f90610100900460ff16613a305760ff613a40565b6008820154600160281b900460ff165b90505f805b600a8160ff161015613a895760058160ff16600a8110613a6757613a6761487f565b015484600c015410613a77578091505b80613a818161497b565b915050613a45565b506037830154610100900460ff16613cda5760378301805461ff00191661010017905560088301805460ff8316600160281b810265ff000000000019909216919091179091556040805160608101825264ffffffffff421681526020810183905260388601929091820190601990600a8110613b0757613b0761487f565b601081049091015461ffff6002600f909316929092026101000a9004811690915282546001810184555f938452602080852084519201805491850151604090950151909316600160301b0267ffff0000000000001960ff909516600160281b0265ffffffffffff1990921664ffffffffff909316929092171792909216919091179055805b8260ff168160ff1611613c3b57846009018160ff16600a8110613bb157613bb161487f565b602081049091015460ff601f9092166101000a900416613c29576001856009018260ff16600a8110613be557613be561487f565b602091828204019190066101000a81548160ff021916908315150217905550600f8160ff16600a8110613c1a57613c1a61487f565b0154613c26908361486c565b91505b80613c338161497b565b915050613b8c565b508015613c8d5780846006015f828254613c55919061486c565b9250508190555080846013015f828254613c6f919061486c565b925050819055508060235f828254613c87919061486c565b90915550505b6040805160ff84168152602081018390526001600160a01b038716917fb299b3a0632ed5ba499219bed3f5738b98f94cd64e8490982192d1c112ec5ddc910160405180910390a250612ff8565b8160ff168160ff161115612ff857808360080160056101000a81548160ff021916908360ff1602179055508260380160405180606001604052804264ffffffffff1681526020018360ff16815260200160198460ff16600a8110613d4057613d4061487f565b601081049091015461ffff6002600f909316929092026101000a900481169091528254600181810185555f948552602080862085519301805491860151604090960151909416600160301b0267ffff0000000000001960ff909616600160281b0265ffffffffffff1990921664ffffffffff9094169390931717939093161790558190613dce908590614893565b90505b8260ff168160ff1611613e8057846009018160ff16600a8110613df657613df661487f565b602081049091015460ff601f9092166101000a900416613e6e576001856009018260ff16600a8110613e2a57613e2a61487f565b602091828204019190066101000a81548160ff021916908315150217905550600f8160ff16600a8110613e5f57613e5f61487f565b0154613e6b908361486c565b91505b80613e788161497b565b915050613dd1565b508015613ed25780846006015f828254613e9a919061486c565b9250508190555080846013015f828254613eb4919061486c565b925050819055508060235f828254613ecc919061486c565b90915550505b6040805160ff84168152602081018390526001600160a01b038716917fb299b3a0632ed5ba499219bed3f5738b98f94cd64e8490982192d1c112ec5ddc910160405180910390a25050505050565b6001600160a01b038088165f908152601b6020908152604080832060048352818420948b16845293825280832089845290915281205464ffffffffff908116919086168211613f6f5785613f71565b815b90508064ffffffffff168564ffffffffff1611613f90575050506140c4565b5f613f9d848984896140cd565b9050801561407e5780846039015f828254613fb8919061486c565b90915550819050602b8501613fce6001886149ea565b60ff16600a8110613fe157613fe161487f565b015f828254613ff0919061486c565b92505081905550896001600160a01b03168b6001600160a01b03167f0fdc51e6f6559f422f683d309cd0472b5bbb27e907c537950b0ec789b2d829e683888860370160019054906101000a900460ff1661404b5760ff61405b565b6008890154600160281b900460ff165b6040805193845260ff928316602085015291169082015260600160405180910390a35b505050506001600160a01b038781165f908152600460209081526040808320938a168352928152828220888352905220805464ffffffffff191664ffffffffff84161790555b50505050505050565b60388401545f9081036140e157505f61293b565b5f83815b603888015481101561430c575f8860380182815481106141075761410761487f565b5f91825260209182902060408051606081018252929091015464ffffffffff808216808552600160281b830460ff1695850195909552600160301b90910461ffff16918301919091529092508816106141605750614304565b805164ffffffffff80881691161061422e575f8211801561418e57508564ffffffffff168364ffffffffff16105b15614228575f60388a016141a3600185614906565b815481106141b3576141b361487f565b5f918252602080832060408051606081018252939091015464ffffffffff81168452600160281b810460ff1692840192909252600160301b90910461ffff169082015291506142178a614206878b6149b6565b64ffffffffff1684604001516143c5565b9050614223818761486c565b955050505b5061430c565b5f8211801561424d5750805f015164ffffffffff168364ffffffffff16105b156142e0575f60388a01614262600185614906565b815481106142725761427261487f565b5f918252602080832060408051606081018252939091015464ffffffffff81168452600160281b810460ff1692840192909252600160301b90910461ffff169082015283519092506142cb908b906142069088906149b6565b90506142d7818761486c565b95505050614300565b811580156142fe5750805f015164ffffffffff168364ffffffffff16105b505b5191505b6001016140e5565b508364ffffffffff168164ffffffffff1610801561432d5750603887015415155b156143bb576038870180545f919061434790600190614906565b815481106143575761435761487f565b5f918252602080832060408051606081018252939091015464ffffffffff81168452600160281b810460ff1692840192909252600160301b90910461ffff169082015291506143aa8861420685896149b6565b90506143b6818561486c565b935050505b5095945050505050565b5f8215806143d5575061ffff8216155b156143e157505f613763565b60038481015481545f929160ff169081106143fe576143fe61487f565b5f91825260208083206040805160a08101825260039094029091018054845260018101549284019290925260029091015461ffff80821692840192909252620100008104821660608401819052600160201b909104909116608083015287549193506127109161446e91906148d0565b61447891906148e7565b90505f607861448787846148d0565b61449191906148e7565b90506127106144a461ffff8716836148d0565b6144ae91906148e7565b979650505050505050565b604051806101400160405280600a906020820280368337509192915050565b80356001600160a01b03811681146144ee575f5ffd5b919050565b5f60208284031215614503575f5ffd5b613763826144d8565b5f6020828403121561451c575f5ffd5b5035919050565b602080825282518282018190525f918401906040840190835b818110156145a75783518051845264ffffffffff602082015116602085015264ffffffffff60408201511660408501526060810151606085015260ff608082015116608085015260a0810151151560a08501525060c08301925060208401935060018101905061453c565b509095945050505050565b805f5b600a811015612ff85781518452602093840193909101906001016145b5565b6103c081016145e382866145b2565b6145f16101408301856145b2565b6102808201835f5b600a81101561461c57815161ffff168352602092830192909101906001016145f9565b505050949350505050565b8681526020810186905261ffff8516604082015260608101849052610300810160808201845f5b600a81101561467357815163ffffffff1683526020928301929091019060010161464e565b5050506144ae6101c08301846145b2565b602080825282518282018190525f918401906040840190835b818110156145a7578351805184526020810151602085015261ffff604082015116604085015261ffff606082015116606085015261ffff60808201511660808501525060a08301925060208401935060018101905061469d565b803560ff811681146144ee575f5ffd5b5f5f60408385031215614718575f5ffd5b614721836144d8565b915061472f602084016146f7565b90509250929050565b5f60a0820163ffffffff8816835263ffffffff8716602084015285604084015284606084015260a0608084015280845180835260c0850191506020860192505f5b818110156147a05783516001600160a01b0316835260209384019390920191600101614779565b50909998505050505050505050565b5f61020082019050881515825260ff881660208301528660408301528560608301528460808301528360a083015260c08201835f5b600a81101561480557815115158352602092830192909101906001016147e4565b50505098975050505050505050565b83815260208101839052610180810161293b60408301846145b2565b5f5f60408385031215614841575f5ffd5b61484a836146f7565b915061472f602084016144d8565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561278d5761278d614858565b634e487b7160e01b5f52603260045260245ffd5b60ff818116838216019081111561278d5761278d614858565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b808202811582820484141761278d5761278d614858565b5f8261490157634e487b7160e01b5f52601260045260245ffd5b500490565b8181038181111561278d5761278d614858565b5f6001820161492a5761492a614858565b5060010190565b634e487b7160e01b5f52604160045260245ffd5b61ffff818116838216019081111561278d5761278d614858565b63ffffffff818116838216019081111561278d5761278d614858565b5f60ff821660ff810361499057614990614858565b60010192915050565b64ffffffffff818116838216019081111561278d5761278d614858565b64ffffffffff828116828216039081111561278d5761278d614858565b5f61ffff821661ffff810361499057614990614858565b60ff828116828216039081111561278d5761278d61485856fea2646970667358221220d59c0d6ee9f4eb4c5f286db25c759bced152e696a000282a9507a8502ca63a4664736f6c634300081e0033

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

000000000000000000000000ab38fb55fe3cd5d7edf653b5fb5bb35a622e88ea00000000000000000000000098b137209686a67f030e123e1e1d828eda78087a

-----Decoded View---------------
Arg [0] : adminAddr (address): 0xAB38FB55FE3cD5d7edf653b5FB5Bb35a622E88ea
Arg [1] : projectAddr (address): 0x98B137209686a67f030E123e1E1d828eDA78087A

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000ab38fb55fe3cd5d7edf653b5fb5bb35a622e88ea
Arg [1] : 00000000000000000000000098b137209686a67f030e123e1e1d828eda78087a


Deployed Bytecode Sourcemap

61:42446:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31384:656;;;;;;;;;;-1:-1:-1;31384:656:0;;;;;:::i;:::-;;:::i;:::-;;;;614:25:1;;;670:2;655:18;;648:34;;;;698:18;;;691:34;756:2;741:18;;734:34;601:3;586:19;31384:656:0;;;;;;;;38729:1200;;;;;;;;;;-1:-1:-1;38729:1200:0;;;;;:::i;:::-;;:::i;:::-;;;;1207:25:1;;;1263:2;1248:18;;1241:34;;;;1291:18;;;1284:34;;;;1349:2;1334:18;;1327:34;;;;1392:3;1377:19;;1370:35;;;;1436:3;1421:19;;1414:35;;;;1480:3;1465:19;;1458:35;1524:3;1509:19;;1502:35;1568:3;1553:19;;1546:35;1612:3;1597:19;;1590:35;1656:3;1641:19;;1634:36;1194:3;1179:19;38729:1200:0;779:897:1;3138:35:0;;;;;;;;;;;;;;;;;;;1827:25:1;;;1815:2;1800:18;3138:35:0;1681:177:1;439:57:0;;;;;;;;;;;;493:3;439:57;;639:36;;;;;;;;;;;;669:6;639:36;;32450:1037;;;;;;;;;;-1:-1:-1;32450:1037:0;;;;;:::i;:::-;;:::i;:::-;;;;2166:25:1;;;2222:2;2207:18;;2200:34;;;;2282:4;2270:17;;;2250:18;;;2243:45;;;;2319:2;2304:18;;2297:34;;;;2362:3;2347:19;;2340:35;2419:14;;2412:22;2406:3;2391:19;;2384:51;2484:6;2472:19;2466:3;2451:19;;2444:48;2153:3;2138:19;32450:1037:0;1863:635:1;505:59:0;;;;;;;;;;;;561:3;505:59;;1660:29;;;;;;;;;;-1:-1:-1;1660:29:0;;;;;:::i;:::-;;:::i;:::-;;;2862:6:1;2850:19;;;2832:38;;2820:2;2805:18;1660:29:0;2688:188:1;36433:121:0;;;;;;;;;;-1:-1:-1;36433:121:0;;;;;:::i;:::-;-1:-1:-1;;;;;36519:11:0;36495:4;36519:11;;;:5;:11;;;;;:27;;;;;;36433:121;;;;3046:14:1;;3039:22;3021:41;;3009:2;2994:18;36433:121:0;2881:187:1;35341:137:0;;;;;;;;;;-1:-1:-1;35341:137:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;889:37::-;;;;;;;;;;-1:-1:-1;889:37:0;;;;-1:-1:-1;;;;;889:37:0;;;;;;-1:-1:-1;;;;;4285:32:1;;;4267:51;;4255:2;4240:18;889:37:0;4105:219:1;318:48:0;;;;;;;;;;;;363:3;318:48;;1584:33;;;;;;;;;;-1:-1:-1;1584:33:0;;;;;:::i;:::-;;:::i;24667:2398::-;;;;;;;;;;;;;:::i;:::-;;36180:245;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::i;35486:568::-;;;;;;;;;;-1:-1:-1;35818:10:0;;35843:14;;35872:20;;35907:17;;35939:21;;35975:22;;36012:23;;35486:568;;;5712:25:1;;;5768:2;5753:18;;5746:34;;;;5796:18;;;5789:34;;;;5854:2;5839:18;;5832:34;;;;5897:3;5882:19;;5875:35;5941:3;5926:19;;5919:35;5985:3;5970:19;;5963:35;5699:3;5684:19;35486:568:0;5397:607:1;33495:705:0;;;;;;;;;;-1:-1:-1;33495:705:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;36062:110::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34208:1125::-;;;;;;;;;;-1:-1:-1;34208:1125:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;36562:109::-;;;;;;;;;;-1:-1:-1;36642:21:0;36562:109;;682:45;;;;;;;;;;;;724:3;682:45;;1624:29;;;;;;;;;;-1:-1:-1;1624:29:0;;;;;:::i;:::-;;:::i;224:30::-;;;;;;;;;;;;;;;776:62;;;;;;;;;;;;829:9;776:62;;30046:781;;;;;;;;;;-1:-1:-1;30046:781:0;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;9843:32:1;;;9825:51;;9907:2;9892:18;;9885:34;;;;9935:18;;;9928:34;;;;9993:2;9978:18;;9971:34;;;;10036:3;10021:19;;10014:35;;;;10098:6;10086:19;9863:3;10065:19;;10058:48;10155:4;10143:17;10137:3;10122:19;;10115:46;10205:14;10198:22;10192:3;10177:19;;10170:51;10265:14;10258:22;10252:3;10237:19;;10230:51;9812:3;9797:19;30046:781:0;9472:815:1;263:48:0;;;;;;;;;;;;306:5;263:48;;3473:37;;;;;;;;;;;;;;;;935:33;;;;;;;;;;;;;;;1696:66;;;;;;;;;;-1:-1:-1;1696:66:0;;;;;:::i;:::-;;:::i;3070:25::-;;;;;;;;;;;;;;;;30835:541;;;;;;;;;;-1:-1:-1;30835:541:0;;;;;:::i;:::-;-1:-1:-1;;;;;31119:15:0;30922:20;31119:15;;;:5;:15;;;;;31160:14;;;;31204:18;;;;31253:19;;;;31304:20;;;;31352:16;;;;;31160:14;;31204:18;;31253:19;;31304:20;;30835:541;;;;;10551:25:1;;;10607:2;10592:18;;10585:34;;;;10635:18;;;10628:34;;;;10693:2;10678:18;;10671:34;10736:3;10721:19;;10714:35;10538:3;10523:19;30835:541:0;10292:463:1;42364:103:0;;;;;;;;;;;;;:::i;39937:926::-;;;;;;;;;;-1:-1:-1;39937:926:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;32048:394::-;;;;;;;;;;-1:-1:-1;32048:394:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;27073:628::-;;;;;;;;;;;;;:::i;42217:141::-;;;;;;;;;;;;;:::i;7250:2536::-;;;;;;:::i;:::-;;:::i;1147:25::-;;;;;;;;;;-1:-1:-1;1147:25:0;;;;;:::i;:::-;;:::i;:::-;;;;12590::1;;;12646:2;12631:18;;12624:34;;;;12706:6;12694:19;;;12674:18;;;12667:47;;;;12750:19;;12745:2;12730:18;;12723:47;12807:19;12801:3;12786:19;;12779:48;12577:3;12562:19;1147:25:0;12337:496:1;3391:32:0;;;;;;;;;;;;;;;;3517:38;;;;;;;;;;;;;;;;3430:36;;;;;;;;;;;;;;;;40871:1330;;;;;;;;;;-1:-1:-1;40871:1330:0;;;;;:::i;:::-;;:::i;:::-;;;;13256:25:1;;;13312:2;13297:18;;13290:34;;;;13340:18;;;13333:34;;;;13398:2;13383:18;;13376:34;;;;13441:3;13426:19;;13419:35;;;;13485:3;13470:19;;13463:35;;;;13529:3;13514:19;;13507:35;13573:3;13558:19;;13551:35;13617:3;13602:19;;13595:35;13674:14;13667:22;13661:3;13646:19;;13639:51;13740:4;13727:18;13721:3;13706:19;;13699:47;13243:3;13228:19;40871:1330:0;12838:914:1;36679:810:0;;;;;;;;;;-1:-1:-1;36679:810:0;;;;;:::i;:::-;;:::i;847:35::-;;;;;;;;;;-1:-1:-1;847:35:0;;;;-1:-1:-1;;;;;847:35:0;;;734;;;;;;;;;;;;766:3;734:35;;;;;13929:4:1;13917:17;;;13899:36;;13887:2;13872:18;734:35:0;13757:184:1;3102:29:0;;;;;;;;;;;;;;;;31384:656;-1:-1:-1;;;;;31626:15:0;;31470:17;31626:15;;;:5;:15;;;;;31470:17;;;;;;;31662:122;31686:7;;;:14;31682:18;;31662:122;;;31735:37;31760:8;31770:1;31735:24;:37::i;:::-;31722:50;;;;:::i;:::-;;-1:-1:-1;31702:3:0;;31662:122;;;-1:-1:-1;31807:12:0;;;;31794:25;;;;:::i;:::-;;;31856:39;31886:8;31856:29;:39::i;:::-;31928:19;;;;31840:55;;-1:-1:-1;31928:19:0;-1:-1:-1;31928:19:0;31985:25;31840:55;31985:9;:25;:::i;:::-;:47;;;;:::i;:::-;31968:64;;31598:442;31384:656;;;;;:::o;38729:1200::-;38826:19;38856:24;38891:23;38925:26;38962:27;39000:24;39035:26;39072:20;39103:24;39138:25;39174:26;39219:14;39236:5;:15;39242:8;-1:-1:-1;;;;;39236:15:0;-1:-1:-1;;;;;39236:15:0;;;;;;;;;;;;39219:32;;39286:35;39312:8;39286:25;:35::i;:::-;39272:49;;39351:1;:18;;;39332:37;;39398:39;39428:8;39398:29;:39::i;:::-;39469:21;;;;39380:57;;-1:-1:-1;39469:21:0;-1:-1:-1;39469:21:0;39380:57;39533:30;39547:16;39533:11;:30;:::i;:::-;:48;;;;:::i;:::-;:69;;;;:::i;:::-;39511:91;;39632:1;:16;;;39613:35;;39680:41;39712:8;39680:31;:41::i;:::-;39659:62;;39757:1;:14;;;39742:29;;39801:1;:18;;;39782:37;;39850:1;:19;;;39830:39;;39901:1;:20;;;39880:41;;39208:721;38729:1200;;;;;;;;;;;;;:::o;32450:1037::-;-1:-1:-1;;;;;32796:15:0;;32530:20;32796:15;;;:5;:15;;;;;32847:19;;;;32898:21;;;;32953:9;;;;32847:19;;32898:21;;32530:20;;;;;;32953:9;;;;;;32530:20;;32953:9;32987:28;;766:3;32987:28;;;32999:6;;;;-1:-1:-1;;;32999:6:0;;;;32987:28;33047:18;;;;33091:9;;;;32973:42;;-1:-1:-1;33047:18:0;-1:-1:-1;33091:9:0;;;;;33086:394;;33137:14;:17;;-1:-1:-1;33152:1:0;;-1:-1:-1;33086:394:0;;;33227:1;33213:11;:15;;;33209:271;;;33265:14;33280:15;:11;33294:1;33280:15;:::i;:::-;33265:31;;;;;;;;;:::i;:::-;;;33245:51;;33332:10;33343:11;33332:23;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33311:44;;33209:271;;;33408:1;33388:21;;33445:10;33456:11;33445:23;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33424:44;;33209:271;32768:719;32450:1037;;;;;;;;;:::o;1660:29::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35341:137::-;-1:-1:-1;;;;;35449:15:0;;;;;;:5;:15;;;;;;;;:21;;35442:28;;;;;;;;;;;;;;;;;35410:19;;35442:28;;35449:21;;35442:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35442:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35341:137;;;:::o;1584:33::-;;;;;;;;;;;;;;;-1:-1:-1;1584:33:0;:::o;24667:2398::-;157:7;;168:1;157:12;149:35;;;;-1:-1:-1;;;149:35:0;;;;;;;:::i;:::-;;;;;;;;;196:1;186:7;:11;;;24740:10:::1;24734:17:::0;;;:5:::1;:17;::::0;;;;;186:7;;;;;24888:22:::1;::::0;:10:::1;:22::i;:::-;;24933:1;:12;;;24921:24;;24982:41;25012:10;24982:29;:41::i;:::-;25052:19;::::0;::::1;::::0;24966:57;;-1:-1:-1;25052:19:0;-1:-1:-1;25092:13:0::1;25052:19:::0;25108:25:::1;24966:57:::0;25108:9;:25:::1;:::i;:::-;:43;;;;:::i;:::-;25092:59;;25178:1;25170:5;:9;25162:38;;;::::0;-1:-1:-1;;;25162:38:0;;15034:2:1;25162:38:0::1;::::0;::::1;15016:21:1::0;15073:2;15053:18;;;15046:30;-1:-1:-1;;;15092:18:1;;;15085:46;15148:18;;25162:38:0::1;14832:340:1::0;25162:38:0::1;25221:11;669:6;25236:24;363:3;25236:5:::0;:24:::1;:::i;:::-;25235:32;;;;:::i;:::-;25221:46:::0;-1:-1:-1;25278:11:0::1;25292;25221:46:::0;25292:5;:11:::1;:::i;:::-;25278:25:::0;-1:-1:-1;25328:13:0;;25324:158:::1;;25374:9;25358:12;;:25;;;;;;;:::i;:::-;;;;;;;;25416:9;25398:1;:14;;;:27;;;;;;;:::i;:::-;;;;;;;;25461:9;25440:17;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25324:158:0::1;25506:17:::0;;25502:916:::1;;25540:15;25558:48;25595:10;25558:36;:48::i;:::-;25540:66:::0;-1:-1:-1;25625:11:0;;25621:91:::1;;25689:7;25657:1;:28;;;:39;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25621:91:0::1;25740:44;25773:10;25740:32;:44::i;:::-;25833:13;25813:1;:16;;;:33;;;;;;;:::i;:::-;;;;;;;;25883:13;25861:1;:18;;;:35;;;;;;;:::i;:::-;;;;;;;;25933:13;25911:1;:18;;;:35;;;;;;;:::i;:::-;;;;;;;;25981:13;25961:16;;:33;;;;;;;:::i;:::-;;;;;;;;26034:13;26009:21;;:38;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26111:17:0::1;::::0;::::1;::::0;26076:16:::1;::::0;26111:17:::1;;26107:178;;;-1:-1:-1::0;829:9:0::1;26107:178;;;26266:3;26239:1;:18;;;26260:2;26239:23;;;;:::i;:::-;26238:31;;;;:::i;:::-;26227:42;;26107:178;26360:16;::::0;::::1;::::0;26333:10:::1;::::0;26318:88:::1;::::0;26345:13;;26378:27:::1;26360:16:::0;26378:8;:27:::1;:::i;:::-;26318:88;::::0;;15907:25:1;;;15963:2;15948:18;;15941:34;;;;15991:18;;;15984:34;15895:2;15880:18;26318:88:0::1;;;;;;;25525:893;;25502:916;26442:19:::0;;26438:186:::1;;26500:1;26478;:19;;:23;;;;26540:15;26516:1;:20;;;:39;;;;;;;:::i;:::-;;;;;;;;26597:15;26570:23;;:42;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26438:186:0::1;26659:1;26644:12;::::0;::::1;:16:::0;;;26671:14:::1;::::0;::::1;:40:::0;;-1:-1:-1;;26671:40:0::1;26695:15;26671:40;;;::::0;;26722:16:::1;::::0;::::1;:23:::0;;26742:3;;26659:1;26722:23:::1;::::0;26742:3;;26722:23:::1;:::i;:::-;;;;;;;;26790:3;26766:20;;:27;;;;;;;:::i;:::-;;;;;;;;26826:3;26804:18;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;26858:21:0::1;:30:::0;-1:-1:-1;26858:30:0::1;26850:65;;;::::0;-1:-1:-1;;;26850:65:0;;16231:2:1;26850:65:0::1;::::0;::::1;16213:21:1::0;16270:2;16250:18;;;16243:30;-1:-1:-1;;;16289:18:1;;;16282:52;16351:18;;26850:65:0::1;16029:346:1::0;26850:65:0::1;26926:27;26949:3;26926:22;:27::i;:::-;26964:33;::::0;26972:10:::1;::::0;26964:33;::::1;;;::::0;26993:3;;26964:33:::1;::::0;;;26993:3;26972:10;26964:33;::::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27023:34:0::1;::::0;;15907:25:1;;;15963:2;15948:18;;15941:34;;;15991:18;;;15984:34;;;27029:10:0::1;::::0;27023:34:::1;::::0;15895:2:1;15880:18;27023:34:0::1;;;;;;;-1:-1:-1::0;;212:1:0;202:7;:11;-1:-1:-1;;;;;24667:2398:0:o;36180:245::-;36245:29;;:::i;:::-;36285:25;;:::i;:::-;36321:30;;:::i;:::-;36370:47;;;;;;;;;;36378:14;;36394:10;;36406;;36378:14;;36370:47;;36378:14;36370:47;;;;;;;;;;;;;;;;;-1:-1:-1;;36370:47:0;;;;;;;;;;;;-1:-1:-1;36370:47:0;;-1:-1:-1;36370:47:0;;-1:-1:-1;36370:47:0;-1:-1:-1;36370:47:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;36370:47:0;;;;;;;;;;;;-1:-1:-1;36370:47:0;;-1:-1:-1;36370:47:0;;-1:-1:-1;36370:47:0;-1:-1:-1;36370:47:0;-1:-1:-1;36370:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36180:245;;;:::o;33495:705::-;33573:21;33605;33637:22;33670:18;33699:34;;:::i;:::-;33744:36;;:::i;:::-;-1:-1:-1;;;;;33816:15:0;;33799:14;33816:15;;;:5;:15;;;;;;33870:9;;;;33903:12;;;;33926:41;;;;;;;;;-1:-1:-1;;;33870:9:0;;;;;;-1:-1:-1;33903:12:0;-1:-1:-1;33816:15:0;;33926:41;;33945:22;;;;33926:41;;;33945:22;;33926:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33978:39:0;;;;;;;;;;33926:41;;-1:-1:-1;33998:19:0;;;;-1:-1:-1;33978:39:0;;-1:-1:-1;33978:39:0;-1:-1:-1;33998:19:0;;-1:-1:-1;33978:39:0;;;;;;;;;;;;;;;;;-1:-1:-1;33978:39:0;;-1:-1:-1;34043:7:0;;-1:-1:-1;;;;34038:155:0;34060:2;34056:1;:6;;;34038:155;;;34101:1;:22;;34124:1;34101:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34084:42;;;;;;;:::i;:::-;;;34158:1;:20;;34179:1;34158:23;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34141:40;;;;;;;:::i;:::-;;-1:-1:-1;34064:3:0;;34038:155;;;;33788:412;33495:705;;;;;;;:::o;36062:110::-;36118:16;36155:8;36148:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;36148:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;36062:110;:::o;34208:1125::-;34305:18;34334;34363:21;34395:23;34429:32;34496:2;34488:5;:10;;;34480:36;;;;-1:-1:-1;;;34480:36:0;;16582:2:1;34480:36:0;;;16564:21:1;16621:2;16601:18;;;16594:30;-1:-1:-1;;;16640:18:1;;;16633:43;16693:18;;34480:36:0;16380:337:1;34480:36:0;-1:-1:-1;;;;;34554:15:0;;34537:14;34554:15;;;:5;:15;;;;;34604:22;;;:29;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34590:43;;34658:1;:20;;34679:5;34658:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34644:41;;34712:1;:19;;34732:5;34712:26;;;;;;;;;:::i;:::-;;;34696:42;;34767:1;:16;;34784:5;34767:23;;;;;;;;;:::i;:::-;;;;-1:-1:-1;34811:13:0;;34839:162;34863:14;;;:21;34859:25;;34839:162;;;34937:9;:5;34945:1;34937:9;:::i;:::-;34910:36;;:1;:14;;34925:1;34910:17;;;;;;;;:::i;:::-;;;;;;;;;;:23;-1:-1:-1;;;34910:23:0;;;;:36;34906:84;;34967:7;;;;:::i;:::-;;;;34906:84;34886:3;;34839:162;;;;35053:5;35039:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35039:20:0;-1:-1:-1;35021:38:0;-1:-1:-1;35070:11:0;;35096:230;35120:14;;;:21;35116:25;;35096:230;;;35194:9;:5;35202:1;35194:9;:::i;:::-;35167:36;;:1;:14;;35182:1;35167:17;;;;;;;;:::i;:::-;;;;;;;;;;:23;-1:-1:-1;;;35167:23:0;;;;:36;35163:152;;35247:1;:14;;35262:1;35247:17;;;;;;;;:::i;:::-;;;;;;;;;;:28;35224:20;;-1:-1:-1;;;;;35247:28:0;;;;35224:15;;35240:3;;35224:20;;;;;;:::i;:::-;-1:-1:-1;;;;;35224:51:0;;;:20;;;;;;;;;;;:51;35294:5;;;;:::i;:::-;;;;35163:152;35143:3;;35096:230;;;;34469:864;;;34208:1125;;;;;;;;:::o;1624:29::-;;;;;;;;;;;30046:781;-1:-1:-1;;;;;30383:15:0;;;30121:14;30383:15;;;:5;:15;;;;;30428:8;;;30458:18;;;30499:16;;;;30539:12;;;;30580:9;;;;30607;;;;30428:8;;;;;30458:18;;30499:16;;30121:14;;30539:12;;-1:-1:-1;;;30580:9:0;;;;;30121:14;;;;;;30428:8;30607:9;;;;:28;;766:3;30607:28;;;30619:6;;;;-1:-1:-1;;;30619:6:0;;;;30607:28;30657:17;;;;30600:35;;-1:-1:-1;30657:17:0;;;;;-1:-1:-1;30657:17:0;30695:9;;;;;-1:-1:-1;30657:17:0;30725:95;30747:2;30743:1;:6;;;30725:95;;;30783:1;:22;;30806:1;30783:25;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30771:37;;;;;;;:::i;:::-;;-1:-1:-1;30751:3:0;;30725:95;;;;30355:472;30046:781;;;;;;;;;;;:::o;1696:66::-;;;;;;;;;;;42364:103;42408:51;;42416:10;;42437:21;42408:51;;;;;;;;;42437:21;42416:10;42408:51;;;;;;;;;;;;;;;;;;;;;42364:103::o;39937:926::-;40013:15;40039:17;40067:25;40103:27;40141:31;40183:30;40224:29;;:::i;:::-;-1:-1:-1;;;;;40289:15:0;;40272:14;40289:15;;;:5;:15;;;;;40338:9;;;;;;;;;;-1:-1:-1;40338:9:0;40372:28;;766:3;40372:28;;;40384:6;;;;-1:-1:-1;;;40384:6:0;;;;40372:28;40431:18;;;;40486:21;;;;40543:19;;;;40573:27;;;;;;;;;;40358:42;;-1:-1:-1;40431:18:0;;-1:-1:-1;40486:21:0;;-1:-1:-1;40543:19:0;-1:-1:-1;40589:11:0;;;;40573:27;;40589:11;-1:-1:-1;40573:27:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40626:1;:9;;;;;;;;;;;;40621:235;;40674:14;40689:1;40674:17;;;40652:39;;40621:235;;;40713:6;;;;40722:1;-1:-1:-1;;;40713:6:0;;;;;:10;40709:147;;;40777:6;;;;40762:14;;40777:10;;-1:-1:-1;;;40777:6:0;;;;40786:1;40777:10;:::i;:::-;40762:26;;;;;;;;;:::i;40709:147::-;40843:1;40821:23;;40261:602;39937:926;;;;;;;;;:::o;32048:394::-;32135:20;32166:26;32203:32;;:::i;:::-;-1:-1:-1;;;;;32271:15:0;;32254:14;32271:15;;;:5;:15;;;;;;;32322:19;;;;32373:18;;;;32402:32;;;;;;;;;32322:19;;-1:-1:-1;32373:18:0;-1:-1:-1;32271:15:0;;32418:16;;;;32402:32;;32418:16;32402:32;;;;;;;;;;;;;;;;;;;;;;;;32243:199;32048:394;;;;;:::o;27073:628::-;157:7;;168:1;157:12;149:35;;;;-1:-1:-1;;;149:35:0;;;;;;;:::i;:::-;196:1;186:7;:11;;;27154:10:::1;27148:17:::0;;:5:::1;:17;::::0;;;;27203:19:::1;::::0;::::1;::::0;27241:10;27233:41:::1;;;::::0;-1:-1:-1;;;27233:41:0;;17196:2:1;27233:41:0::1;::::0;::::1;17178:21:1::0;17235:2;17215:18;;;17208:30;-1:-1:-1;;;17254:18:1;;;17247:48;17312:18;;27233:41:0::1;16994:342:1::0;27233:41:0::1;27317:1;27295;:19;;:23;;;;27352:6;27329:1;:19;;;:29;;;;;;;:::i;:::-;;;;;;;;27389:6;27369:1;:16;;;:26;;;;;;;:::i;:::-;;;;;;;;27440:6;27416:20;;:30;;;;;;;:::i;:::-;;;;;;;;27483:6;27457:22;;:32;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;27518:21:0::1;:31:::0;-1:-1:-1;27518:31:0::1;27510:66;;;::::0;-1:-1:-1;;;27510:66:0;;16231:2:1;27510:66:0::1;::::0;::::1;16213:21:1::0;16270:2;16250:18;;;16243:30;-1:-1:-1;;;16289:18:1;;;16282:52;16351:18;;27510:66:0::1;16029:346:1::0;27510:66:0::1;27587:36;::::0;27595:10:::1;::::0;27587:36;::::1;;;::::0;27616:6;;27587:36:::1;::::0;;;27616:6;27595:10;27587:36;::::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27649:44:0::1;::::0;;15907:25:1;;;27683:1:0::1;15963:2:1::0;15948:18;;15941:34;15991:18;;;15984:34;;;27663:10:0::1;::::0;27649:44:::1;::::0;15895:2:1;15880:18;27649:44:0::1;;;;;;;-1:-1:-1::0;;212:1:0;202:7;:11;27073:628::o;42217:141::-;42270:10;-1:-1:-1;;;;;42284:5:0;42270:19;;42262:42;;;;-1:-1:-1;;;42262:42:0;;17875:2:1;42262:42:0;;;17857:21:1;17914:2;17894:18;;;17887:30;-1:-1:-1;;;17933:18:1;;;17926:40;17983:18;;42262:42:0;17673:334:1;42262:42:0;42320:30;;42339:10;;42320:30;;;;;42217:141::o;7250:2536::-;157:7;;168:1;157:12;149:35;;;;-1:-1:-1;;;149:35:0;;;;;;;:::i;:::-;196:1;186:7;:11;7354:9:::1;7382:10:::0;7374:34:::1;;;::::0;-1:-1:-1;;;7374:34:0;;18214:2:1;7374:34:0::1;::::0;::::1;18196:21:1::0;18253:2;18233:18;;;18226:30;-1:-1:-1;;;18272:18:1;;;18265:41;18323:18;;7374:34:0::1;18012:335:1::0;7374:34:0::1;7436:8;:15:::0;7427:24:::1;::::0;::::1;;7419:49;;;::::0;-1:-1:-1;;;7419:49:0;;18554:2:1;7419:49:0::1;::::0;::::1;18536:21:1::0;18593:2;18573:18;;;18566:30;-1:-1:-1;;;18612:18:1;;;18605:42;18664:18;;7419:49:0::1;18352:336:1::0;7419:49:0::1;7489:30;7522:8;7531:6;7522:16;;;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;7489:49:::1;::::0;;::::1;::::0;::::1;::::0;;7522:16:::1;::::0;;::::1;::::0;;::::1;7489:49:::0;;;;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;7489:49:0;::::1;;::::0;;;;;-1:-1:-1;7557:35:0;::::1;;7549:64;;;::::0;-1:-1:-1;;;7549:64:0;;18895:2:1;7549:64:0::1;::::0;::::1;18877:21:1::0;18934:2;18914:18;;;18907:30;-1:-1:-1;;;18953:18:1;;;18946:46;19009:18;;7549:64:0::1;18693:340:1::0;7549:64:0::1;7652:15;:25;;;7642:6;:35;;7634:64;;;::::0;-1:-1:-1;;;7634:64:0;;19240:2:1;7634:64:0::1;::::0;::::1;19222:21:1::0;19279:2;19259:18;;;19252:30;-1:-1:-1;;;19298:18:1;;;19291:46;19354:18;;7634:64:0::1;19038:340:1::0;7634:64:0::1;7711:11;669:6;7726:23;306:5;7726:6:::0;:23:::1;:::i;:::-;7725:31;;;;:::i;:::-;7711:45;;7767:25;7788:3;7767:20;:25::i;:::-;7825:3;7803:18;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;7864:10:0::1;7841:14;7858:17:::0;;;:5:::1;:17;::::0;;;;7911:18:::1;::::0;::::1;::::0;7858:17;;7911:23;;;7988:1103;::::1;;;8036:6:::0;-1:-1:-1;;;;;8075:20:0;::::1;::::0;;:44:::1;;-1:-1:-1::0;;;;;;8099:20:0;::::1;8109:10;8099:20;8075:44;8071:393;;;-1:-1:-1::0;;8145:14:0::1;::::0;;;-1:-1:-1;;;;;8145:14:0::1;8071:393;;;-1:-1:-1::0;;;;;8227:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;:30:::1;;::::0;:35;:86;::::1;;;-1:-1:-1::0;8301:12:0::1;::::0;-1:-1:-1;;;;;8291:22:0;;::::1;8301:12:::0;::::1;8291:22;;8227:86;:139;;;;-1:-1:-1::0;8352:14:0::1;::::0;-1:-1:-1;;;;;8342:24:0;;::::1;8352:14:::0;::::1;8342:24;;8227:139;8223:241;;;-1:-1:-1::0;;8392:14:0::1;::::0;;;-1:-1:-1;;;;;8392:14:0::1;8223:241;8492:13:::0;;-1:-1:-1;;;;;;8492:13:0::1;-1:-1:-1::0;;;;;8492:13:0;::::1;::::0;;::::1;::::0;;-1:-1:-1;8520:9:0;;;:5:::1;:9;::::0;;;;:17:::1;;:22:::0;;-1:-1:-1;;8520:17:0;::::1;::::0;:22:::1;::::0;-1:-1:-1;;;;;8520:22:0;::::1;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;8576:17:0::1;::::0;::::1;::::0;::::1;;8571:109;;8628:1;8614:10;;:15;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;8648:6:0::1;::::0;::::1;:16:::0;;-1:-1:-1;;8648:16:0::1;::::0;::::1;::::0;;8571:109:::1;8713:25;::::0;-1:-1:-1;;;;;8713:25:0;::::1;::::0;8723:10:::1;::::0;8713:25:::1;::::0;;;::::1;8755:43;8783:10;8795:2;8755:27;:43::i;:::-;8829:2:::0;8815:11:::1;8846:234;8872:2;8866:3;:8;;;:29;;;;-1:-1:-1::0;;;;;;8878:17:0;::::1;::::0;::::1;8866:29;8846:234;;;-1:-1:-1::0;;;;;8923:10:0;::::1;;::::0;;;:5:::1;:10;::::0;;;;8963:1:::1;::::0;8923:31:::1;;:36;::::0;::::1;;::::0;::::1;;;;;:::i;:::-;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;9021:1;8983:5;:10;8989:3;-1:-1:-1::0;;;;;8983:10:0::1;-1:-1:-1::0;;;;;8983:10:0::1;;;;;;;;;;;;:29;;9013:3;8983:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;:39;;;;;;;;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;;::::1;;::::0;;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;;::::0;;-1:-1:-1;;;;;;9047:10:0;;::::1;-1:-1:-1::0;9047:10:0;;;:5:::1;:10;::::0;;;;:17;;;::::1;::::0;8897:5;::::1;::::0;::::1;:::i;:::-;;;;8846:234;;;;8008:1083;;7988:1103;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9143:6:0::1;9127:1;:8;;:22;;;::::0;::::1;9183:15;9160:1;:11;;:39;;;;;;;;;::::0;::::1;9233:15;9210:1;:13;;:39;;;;;;;;;::::0;::::1;9276:1;9260;:9;;:17;;;::::0;::::1;9304:6;9288:1;:11;;:22;;;;;;;;;::::0;::::1;9337:5;9321:1;:8;;:21;;;;;;;;;::::0;::::1;9355:1;:7;;9368:1;9355:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9381:20;9421:1;9404;:7;;:14;;;;:18;;;;:::i;:::-;9381:41;;9465:6;9443:1;:18;;;:28;;;;;;;:::i;:::-;;;;;;;;9504:6;9482:14;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;9523:59:0::1;::::0;-1:-1:-1;9545:10:0::1;9557:6:::0;9565:16;9523:21:::1;:59::i;:::-;9593:44;9618:10;9630:6;9593:24;:44::i;:::-;9658:62;9695:10;9707:12;9658:36;:62::i;:::-;9738:40;::::0;;20093:25:1;;;20166:4;20154:17;;20149:2;20134:18;;20127:45;20188:18;;;20181:34;;;9746:10:0::1;::::0;9738:40:::1;::::0;20081:2:1;20066:18;9738:40:0::1;;;;;;;-1:-1:-1::0;;212:1:0;202:7;:11;-1:-1:-1;;;;;;;;7250:2536:0:o;1147:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1147:25:0;;;;;;;;;;;-1:-1:-1;;;1147:25:0;;;;;:::o;40871:1330::-;-1:-1:-1;;;;;41371:15:0;;40951:26;41371:15;;;:5;:15;;;;;41428:18;;;;41475:16;;;;41520:12;;;;41567:18;;;;41616:12;;;;41664:19;;;;41720;;;;41766:9;;;;41428:18;;41475:16;;41520:12;;41567:18;;41616:12;;41664:19;;41720;;40951:26;;41766:9;;;;;;40951:26;;41766:9;41798:28;;766:3;41798:28;;;41810:6;;;;-1:-1:-1;;;41810:6:0;;;;41798:28;41786:40;-1:-1:-1;41852:9:0;41847:130;41871:7;;;:14;41867:18;;41847:130;;;41928:37;41953:8;41963:1;41928:24;:37::i;:::-;41907:58;;;;:::i;:::-;;-1:-1:-1;41887:3:0;;41847:130;;;;42021:39;42051:8;42021:29;:39::i;:::-;41997:63;-1:-1:-1;42170:23:0;41997:63;42101:42;42121:22;42101:17;:42;:::i;:::-;:66;;;;:::i;:::-;:92;;;;:::i;:::-;42081:112;;41343:858;40871:1330;;;;;;;;;;;;;:::o;36679:810::-;-1:-1:-1;;;;;36928:15:0;;36762:25;36928:15;;;:5;:15;;;;;36968:17;;;;36762:25;;;;;;36928:15;36968:17;;36964:180;;;829:9;37002:46;;36964:180;;;37129:3;37102:1;:18;;;37123:2;37102:23;;;;:::i;:::-;37101:31;;;;:::i;:::-;37081:51;;36964:180;37183:1;:16;;;37164:35;;37241:39;37271:8;37241:29;:39::i;:::-;37220:60;-1:-1:-1;37301:27:0;37331:37;37220:60;37331:16;:37;:::i;:::-;37301:67;;37416:19;37396:17;:39;:85;;37480:1;37396:85;;;37438:39;37458:19;37438:17;:39;:::i;:::-;37379:102;;36900:589;;36679:810;;;;;:::o;19922:1096::-;-1:-1:-1;;;;;20052:15:0;;20015:7;20052:15;;;:5;:15;;;;;20095:7;;;:14;20082:27;;20078:41;;20118:1;20111:8;;;;;20078:41;20140:14;20157:1;:7;;20165:9;20157:18;;;;;;;;:::i;:::-;;;;;;;;;;;20140:35;;20190:1;:8;;;;;;;;;;;;20186:22;;;20207:1;20200:8;;;;;;20186:22;20240:8;20249:11;;;;20240:21;;20221:16;;20240:8;20249:11;;;20240:21;;;;;;:::i;:::-;;;;;;;;;20221:40;;;;;;;;20240:21;;;;;;;20221:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20221:40:0;;;;;;;;;;-1:-1:-1;20294:15:0;;20240:21;20361:38;;724:3;;20361:38;:::i;:::-;20340:11;;;;:60;;;:11;;:60;:::i;:::-;20321:79;;20411:12;20434:9;20426:17;;:5;:17;;;:37;;20454:9;20426:37;;;20446:5;20426:37;20489:13;;;;20411:52;;-1:-1:-1;20489:13:0;-1:-1:-1;;;20489:13:0;;;;;20480:22;;;;20476:36;;20511:1;20504:8;;;;;;;;;;20476:36;20558:13;;;;20525:22;;20550:21;;-1:-1:-1;;;20558:13:0;;;;20550:5;:21;:::i;:::-;20525:46;;;;20586:14;20604:1;20586:19;20582:33;;20614:1;20607:8;;;;;;;;;;;20582:33;20628:19;669:6;20662:1;:10;;;20651:21;;:1;:8;;;:21;;;;:::i;:::-;20650:29;;;;:::i;:::-;20628:51;-1:-1:-1;20690:11:0;724:3;20705:28;20719:14;20628:51;20705:28;:::i;:::-;20704:48;;;;:::i;:::-;20690:62;;20765:17;20814:3;20797:1;:13;;;20786:24;;:1;:8;;;:24;;;;:::i;:::-;20785:32;;;;:::i;:::-;20857:8;;20765:52;;-1:-1:-1;20828:14:0;;20845:20;;20765:52;20845:20;:::i;:::-;20828:37;;20900:6;20894:3;20882:1;:9;;;:15;;;;:::i;:::-;:24;20878:110;;;20939:1;:9;;;20930:6;:18;20929:47;;20975:1;20929:47;;;20962:9;;;;20953:18;;:6;:18;:::i;:::-;20923:53;;20878:110;-1:-1:-1;21007:3:0;;-1:-1:-1;;;;;;;;;;19922:1096:0;;;;;:::o;23665:994::-;-1:-1:-1;;;;;23784:15:0;;23744:7;23784:15;;;:5;:15;;;;;23824:16;;;:23;:28;;23820:42;;-1:-1:-1;23861:1:0;;23665:994;-1:-1:-1;;23665:994:0:o;23820:42::-;23883:15;23901:46;23938:8;23901:36;:46::i;:::-;23883:64;;23968:19;24024:7;23990:4;:31;;;:41;;;;:::i;:::-;23968:63;;24071:4;:21;;;24056:11;:36;24052:50;;-1:-1:-1;24101:1:0;;23665:994;-1:-1:-1;;;;23665:994:0:o;24052:50::-;24113:17;24147:4;:21;;;24133:11;:35;;;;:::i;:::-;24220:20;;;;24113:55;;-1:-1:-1;24189:16:0;;24220:20;;24216:168;;;-1:-1:-1;829:9:0;24216:168;;;24369:3;24339:4;:21;;;24363:2;24339:26;;;;:::i;:::-;24338:34;;;;:::i;:::-;24327:45;;24216:168;24431:8;24408:4;:19;;;:31;24404:45;;-1:-1:-1;24448:1:0;;23665:994;-1:-1:-1;;;;;;23665:994:0:o;24404:45::-;24470:20;24504:4;:19;;;24493:8;:30;;;;:::i;:::-;24470:53;;24550:12;24538:9;:24;24534:81;;;24591:12;24579:24;;24534:81;-1:-1:-1;24642:9:0;;23665:994;-1:-1:-1;;;;;;23665:994:0:o;37497:387::-;-1:-1:-1;;;;;37609:15:0;;37572:7;37609:15;;;:5;:15;;;;;37651:12;;;;37572:7;37684:160;37708:7;;;:14;37704:18;;37684:160;;;37753:1;:7;;37761:1;37753:10;;;;;;;;:::i;:::-;;;;;;;;;;;:18;;;37744:27;;;;;:::i;:::-;;;37795:37;37820:8;37830:1;37795:24;:37::i;:::-;37786:46;;;;:::i;:::-;;-1:-1:-1;37724:3:0;;37684:160;;;-1:-1:-1;37871:5:0;37497:387;-1:-1:-1;;;37497:387:0:o;37892:270::-;-1:-1:-1;;;;;38008:15:0;;37971:7;38008:15;;;:5;:15;;;;;37971:7;38052:46;38014:8;38052:36;:46::i;:::-;38034:64;;38147:7;38116:1;:28;;;:38;;;;:::i;:::-;38109:45;37892:270;-1:-1:-1;;;;37892:270:0:o;38170:551::-;-1:-1:-1;;;;;38288:15:0;;38251:7;38288:15;;;:5;:15;;;;;38347:12;;;;38251:7;38370:125;38394:7;;;:14;38390:18;;38370:125;;;38446:37;38471:8;38481:1;38446:24;:37::i;:::-;38430:53;;;;:::i;:::-;;-1:-1:-1;38410:3:0;;38370:125;;;-1:-1:-1;38531:12:0;38563:39;38593:8;38563:29;:39::i;:::-;38554:48;;;;:::i;:::-;;;38622:1;:19;;;38613:28;;;;;:::i;:::-;;;38661:1;:19;;;38652:28;;;;;:::i;:::-;;38170:551;-1:-1:-1;;;;;38170:551:0:o;13166:1835::-;-1:-1:-1;;;;;13265:15:0;;13222:13;13265:15;;;:5;:15;;;;;13295:7;;;:14;:19;;13291:33;;-1:-1:-1;13323:1:0;;13166:1835;-1:-1:-1;;13166:1835:0:o;13291:33::-;13367:15;13345:12;13396:1512;13420:7;;;:14;13416:18;;13396:1512;;;13456:14;13473:1;:7;;13481:1;13473:10;;;;;;;;:::i;:::-;;;;;;;;;;;13456:27;;13502:1;:8;;;;;;;;;;;;13498:22;;;13512:8;;;13498:22;13556:8;13565:11;;;;13556:21;;13537:16;;13556:8;13565:11;;;13556:21;;;;;;:::i;:::-;;;;;;;;;13537:40;;;;;;;;13556:21;;;;;;;13537:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13537:40:0;;;;;;;;;;-1:-1:-1;13632:38:0;;724:3;;13632:38;:::i;:::-;13611:11;;;;:60;;;:11;;:60;:::i;:::-;13592:79;;13686:12;13709:9;13701:17;;:5;:17;;;:37;;13729:9;13701:37;;;13721:5;13701:37;13768:13;;;;13686:52;;-1:-1:-1;13768:13:0;-1:-1:-1;;;13768:13:0;;;;;13759:22;;;;13755:129;;13815:9;13806:18;;:5;:18;;;13802:39;;13826:8;;;:15;;-1:-1:-1;;13826:15:0;;;;;13802:39;13860:8;;;;;;13755:129;13933:13;;;;13900:22;;13925:21;;-1:-1:-1;;;13933:13:0;;;;13925:5;:21;:::i;:::-;13900:46;;;;13965:14;13983:1;13965:19;13961:126;;14018:9;14009:18;;:5;:18;;;14005:39;;14029:8;;;:15;;-1:-1:-1;;14029:15:0;;;;;14005:39;14063:8;;;;;;;13961:126;14103:19;669:6;14137:1;:10;;;14126:21;;:1;:8;;;:21;;;;:::i;:::-;14125:29;;;;:::i;:::-;14103:51;-1:-1:-1;14169:11:0;724:3;14184:28;14198:14;14103:51;14184:28;:::i;:::-;14183:48;;;;:::i;:::-;14268:20;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14268:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14169:62;;-1:-1:-1;14248:17:0;;14268:20;;:17;:20::i;:::-;14332:8;;14248:40;;-1:-1:-1;14303:14:0;;14320:20;;14248:40;14320:20;:::i;:::-;14303:37;;14379:6;14373:3;14361:1;:9;;;:15;;;;:::i;:::-;:24;14357:152;;;14422:1;:9;;;14413:6;:18;14412:47;;14458:1;14412:47;;;14445:9;;;;14436:18;;:6;:18;:::i;:::-;14478:8;;;:15;;-1:-1:-1;;14478:15:0;;;;;14406:53;-1:-1:-1;14357:152:0;14529:7;;14525:244;;14572:3;14557:1;:9;;;:18;;;;;;;:::i;:::-;;;;;;;;14609:3;14594:1;:12;;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;14631:18:0;;-1:-1:-1;14646:3:0;14631:18;;:::i;:::-;;;14686:67;14719:8;14729:1;14732;:13;;;;;;;;;;;;14747:5;14686:32;:67::i;:::-;14785:13;;;:21;;;;;;-1:-1:-1;;;14785:21:0;-1:-1:-1;;14785:21:0;;;;;;;;;;14827:18;;;;;;;14823:74;;14866:8;;;:15;;-1:-1:-1;;14866:15:0;;;;;14823:74;13441:1467;;;;;;;;;13396:1512;13436:3;;13396:1512;;;-1:-1:-1;14924:9:0;;14920:74;;14966:8;-1:-1:-1;;;;;14955:27:0;;14976:5;14955:27;;;;1827:25:1;;1815:2;1800:18;;1681:177;14955:27:0;;;;;;;;14920:74;13237:1764;;13166:1835;;;:::o;21915:553::-;-1:-1:-1;;;;;22041:15:0;;22001:7;22041:15;;;:5;:15;;;;;22081:16;;;:23;:28;;22077:42;;-1:-1:-1;22118:1:0;;21915:553;-1:-1:-1;;21915:553:0:o;22077:42::-;22140:22;;22187:232;22211:17;;;:24;22207:28;;22187:232;;;22257:20;22280:4;:17;;22298:1;22280:20;;;;;;;;:::i;:::-;;;;;;;;;;:31;-1:-1:-1;;;;;22280:31:0;;-1:-1:-1;22344:63:0;22384:8;22280:31;22344:39;:63::i;:::-;22326:81;;;;:::i;:::-;;-1:-1:-1;;22237:3:0;;22187:232;;21026:881;-1:-1:-1;;;;;21126:15:0;;21106:17;21126:15;;;:5;:15;;;;;;21174;;21211:689;21235:17;;;:24;21231:28;;21211:689;;;21281:20;21304:4;:17;;21322:1;21304:20;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;-1:-1:-1;;;;;21304:31:0;21374:19;;;:5;:19;;;;;;21304:31;;-1:-1:-1;21374:19:0;21422:467;21446:14;;;:21;21442:25;;21422:467;;;21493:17;21513:8;:14;;21528:1;21513:17;;;;;;;;:::i;:::-;;;;;;;;21586:8;21513:17;;;;;21595:14;;;;21586:24;;21513:17;;-1:-1:-1;21595:14:0;;;21586:24;;;;;;:::i;:::-;;;;;;;;;21567:43;;;;;;;;21586:24;;;;;;;21567:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21567:43:0;;;;;;;;;;-1:-1:-1;21672:38:0;;724:3;;21672:38;:::i;:::-;21648:14;;;;:63;;;:14;;:63;:::i;:::-;21629:82;;21730:12;21753:9;21745:17;;:5;:17;;;:37;;21773:9;21745:37;;;21765:5;21745:37;-1:-1:-1;;;;;21819:29:0;;;;;;;:19;:29;;;;;;;;:43;;;;;;;;;;;:46;;;;;;:54;;-1:-1:-1;;21819:54:0;;;;;;;;;;;;-1:-1:-1;;;21469:3:0;;;;-1:-1:-1;21422:467:0;;-1:-1:-1;21422:467:0;;-1:-1:-1;;;21261:3:0;;21211:689;;;;21095:812;;21026:881;:::o;11081:377::-;11150:3;11157:1;11150:8;11146:21;;11081:377;:::o;11146:21::-;11177:15;363:3;11196:30;561:3;11196;:30;:::i;:::-;11195:51;;;;:::i;:::-;11177:69;-1:-1:-1;11257:12:0;11272:13;11177:69;11272:3;:13;:::i;:::-;11257:28;-1:-1:-1;11300:11:0;;11296:47;;11313:12;;:30;;-1:-1:-1;;;;;11313:12:0;;;;:30;;;;;11335:7;;11313:12;:30;:12;:30;11335:7;11313:12;:30;;;;;;;;;;;;;;;;;;;;;11296:47;11358:8;;11354:43;;11368:14;;:29;;-1:-1:-1;;;;;11368:14:0;;;;:29;;;;;11392:4;;11368:14;:29;:14;:29;11392:4;11368:14;:29;;;;;;;;;;;;;;;;;;;;;11354:43;11413:37;;;20759:25:1;;;20815:2;20800:18;;20793:34;;;11413:37:0;;20732:18:1;11413:37:0;;;;;;;;11135:323;;11081:377;:::o;10703:370::-;10770:3;10777:1;10770:8;10766:21;;10703:370;:::o;10766:21::-;10797:15;306:5;10816:28;429:3;10816;:28;:::i;:::-;10815:47;;;;:::i;:::-;10797:65;-1:-1:-1;10873:12:0;10888:13;10797:65;10888:3;:13;:::i;:::-;10873:28;-1:-1:-1;10916:11:0;;10912:47;;10929:12;;:30;;-1:-1:-1;;;;;10929:12:0;;;;:30;;;;;10951:7;;10929:12;:30;:12;:30;10951:7;10929:12;:30;;;;;;;;;;;;;;;;;;;;;10912:47;10974:8;;10970:43;;10984:14;;:29;;-1:-1:-1;;;;;10984:14:0;;;;:29;;;;;11008:4;;10984:14;:29;:14;:29;11008:4;10984:14;:29;;;;;;;;;;;;;;;;;;;;;10970:43;11029:36;;;20759:25:1;;;20815:2;20800:18;;20793:34;;;11029:36:0;;20732:18:1;11029:36:0;20585:248:1;10200:495:0;10320:12;10357:1;10379:309;-1:-1:-1;;;;;10386:27:0;;;;;;:42;;;10426:2;10417:5;:11;;;;10386:42;10379:309;;;-1:-1:-1;;;;;10445:20:0;;;;;;;:5;:20;;;;;;;;10484:97;;;;;;;;;;;;;;;;;;;;;;;10445:33;;;:137;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10445:137:0;-1:-1:-1;;;;;;10445:137:0;;;;;;;;;;;;;;;;;10627:20;;;;;;:27;;;;;10560:5;10669:7;10560:5;10669:7;:::i;:::-;;;;10379:309;;11466:1067;-1:-1:-1;;;;;11586:11:0;;;11573:10;11586:11;;;:5;:11;;;;;:18;;;;;11573:10;11685:2;11573:10;11718:15;:24;;11740:2;11718:24;;;11736:1;11718:24;11700:42;;11755:771;11768:9;11762:15;;:3;:15;;;:35;;;;-1:-1:-1;;;;;;11781:16:0;;;;11762:35;:56;;;;;11808:10;11801:17;;:4;:17;;;11762:56;11755:771;;;11835:6;;;;:::i;:::-;;;;11856:5;;;;;:::i;:::-;-1:-1:-1;;;;;11882:9:0;;11911:1;11882:9;;;:5;:9;;;;;:26;;;11856:5;;-1:-1:-1;11882:30:0;;;-1:-1:-1;11882:30:0;:59;;-1:-1:-1;;;;;;11916:9:0;;;;;;:5;:9;;;;;:25;;;;;11882:59;11878:599;;;11962:13;669:6;11992;11999:7;12005:1;11999:3;:7;:::i;:::-;11992:15;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;11979:28;;:10;:28;;;;:::i;:::-;11978:36;;;;:::i;:::-;11962:52;-1:-1:-1;12037:9:0;;12033:429;;-1:-1:-1;;;;;12071:9:0;;;;;;:5;:9;;;;;:27;;:36;;12102:5;;12071:9;:36;;12102:5;;12071:36;:::i;:::-;;;;-1:-1:-1;;;;;;;12130:9:0;;;;;;:5;:9;;;;;:26;;:36;;12161:5;;12130:9;:36;;12161:5;;12130:36;:::i;:::-;;;;-1:-1:-1;;;;;;;12189:9:0;;;;;;:5;:9;;;;;12226:5;;12189:24;;12214:7;12220:1;12214:3;:7;:::i;:::-;12189:33;;;;;;;;;:::i;:::-;;;:42;;;;;;;:::i;:::-;;;;;;;;12281:5;12254:23;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;12336:36:0;;;21379:4:1;21367:17;;21349:36;;21416:2;21401:18;;21394:34;;;-1:-1:-1;;;;;12336:36:0;;;;;;;;;;21322:18:1;12336:36:0;;;;;;;12417:25;12439:2;12417:21;:25::i;:::-;11943:534;11878:599;-1:-1:-1;;;;;12498:9:0;;;;;;;:5;:9;;;;;:16;;;;;11755:771;;;11562:971;;;;;11466:1067;;;:::o;12541:426::-;-1:-1:-1;;;;;12638:11:0;;;12625:10;12638:11;;;:5;:11;;;;;:18;;;;;12691:269;12704:2;12698:3;:8;;;:28;;;;-1:-1:-1;;;;;;12710:16:0;;;;12698:28;12691:269;;;12743:5;;;;:::i;:::-;-1:-1:-1;;;;;12763:9:0;;;;;;:5;:9;;;;;:20;;:30;;12743:5;;-1:-1:-1;12787:6:0;;-1:-1:-1;12763:20:0;:30;;12787:6;;12763:30;:::i;:::-;;;;-1:-1:-1;;;;;;;12808:9:0;;;;;;:5;:9;;;;;12848:6;;12808:27;;12836:7;12842:1;12836:3;:7;:::i;:::-;12808:36;;;;;;;;;:::i;:::-;;;:46;;;;;;;:::i;:::-;;;;-1:-1:-1;;12874:38:0;;;21379:4:1;21367:17;;21349:36;;21416:2;21401:18;;21394:34;;;-1:-1:-1;;;;;12874:38:0;;;;;;;;;;21322:18:1;12874:38:0;;;;;;;-1:-1:-1;;;;;12932:9:0;;;;;;;:5;:9;;;;;:16;;;;;12691:269;;9794:398;-1:-1:-1;;;;;9914:19:0;;;9901:10;9914:19;;;:5;:19;;;;;:26;;;;;9987:198;10002:2;9994:5;:10;;;:30;;;;-1:-1:-1;;;;;;10008:16:0;;;;9994:30;9987:198;;;10041:7;;;;:::i;:::-;-1:-1:-1;;;;;10063:23:0;;;;;;;:19;:23;;;;;;;;:37;;;;;;;;;;:48;;;;;;;;:74;;-1:-1:-1;;10063:74:0;10121:15;10063:74;;;;;10157:9;;;:5;:9;;;:16;;;;;;-1:-1:-1;9987:198:0;;-1:-1:-1;9987:198:0;12975:183;13040:7;13060:16;13079:8;13088:1;:11;;;13079:21;;;;;;;;;;:::i;:::-;;;;;;;;;;13060:40;;;;;;;;13079:21;;;;;;;13060:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;13060:40:0;;;;;;;;;;;13119:8;;13060:40;;-1:-1:-1;13147:3:0;;13119:24;;13060:40;13119:24;:::i;:::-;13118:32;;;;:::i;:::-;13111:39;12975:183;-1:-1:-1;;;12975:183:0:o;15009:605::-;-1:-1:-1;;;;;15220:19:0;;15196:21;15220:19;;;:5;:19;;;;;15270:14;;;:25;;15220:19;;15196:21;15285:9;;15270:25;;;;;;:::i;:::-;;;;;;;;15329:15;;15270:25;;;;;;-1:-1:-1;;;;;;15329:15:0;;15391:216;15406:2;15398:5;:10;;;:30;;;;-1:-1:-1;;;;;;15412:16:0;;;;15398:30;15391:216;;;15445:7;;;;:::i;:::-;;;;15467:92;15494:2;15498:12;15512:9;15523:4;15529:11;15542:9;15553:5;15467:26;:92::i;:::-;-1:-1:-1;;;;;15579:9:0;;;;;;;:5;:9;;;;;:16;;;;;15391:216;;22476:1181;-1:-1:-1;;;;;22657:19:0;;;22613:7;22657:19;;;:5;:19;;;;;;22707:15;;;;;;;22613:7;;22657:19;22613:7;22785:15;22613:7;22822:793;22846:14;;;:21;22842:25;;22822:793;;;22889:17;22909:8;:14;;22924:1;22909:17;;;;;;;;:::i;:::-;;;;;;;;;;;22889:37;;22945:4;:11;;;;;;;;;;;;22941:25;;;22958:8;;;22941:25;23014:8;23023:14;;;;23014:24;;22995:16;;23014:8;23023:14;;;23014:24;;;;;;:::i;:::-;;;;;;;;;22995:43;;;;;;;;23014:24;;;;;;;22995:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;22995:43:0;;;;;;;;;;-1:-1:-1;23096:38:0;;724:3;;23096:38;:::i;:::-;23072:14;;;;:63;;;:14;;:63;:::i;:::-;23053:82;;23150:12;23173:9;23165:17;;:5;:17;;;:37;;23193:9;23165:37;;;23185:5;23165:37;23150:52;;23231:15;23249:19;:29;23269:8;-1:-1:-1;;;;;23249:29:0;-1:-1:-1;;;;;23249:29:0;;;;;;;;;;;;:43;23279:12;-1:-1:-1;;;;;23249:43:0;-1:-1:-1;;;;;23249:43:0;;;;;;;;;;;;:46;23293:1;23249:46;;;;;;;;;;;;;;;;;;;;;23231:64;;23336:8;23328:16;;:5;:16;;;23324:280;;;23365:15;23383:168;23442:4;23469;23496:8;23527:5;23383:36;:168::i;:::-;23365:186;-1:-1:-1;23570:18:0;23365:186;23570:18;;:::i;:::-;;;23346:258;23324:280;22874:741;;;;;22822:793;22869:3;;22822:793;;27714:2324;-1:-1:-1;;;;;27800:15:0;;27783:14;27800:15;;;:5;:15;;;;;27861:14;:17;27840:18;;;;:38;27836:51;;;27880:7;27714:2324;:::o;27836:51::-;27916:9;;;;27899:14;;27916:9;;;;;:28;;766:3;27916:28;;;27928:6;;;;-1:-1:-1;;;27928:6:0;;;;27916:28;27899:45;-1:-1:-1;27955:13:0;;27995:167;28017:21;28013:1;:25;;;27995:167;;;28086:14;28101:1;28086:17;;;;;;;;;:::i;:::-;;;28064:1;:18;;;:39;28060:91;;28134:1;28124:11;;28060:91;28040:3;;;;:::i;:::-;;;;27995:167;;;-1:-1:-1;28179:9:0;;;;;;;;;28174:1857;;28218:9;;;:16;;-1:-1:-1;;28218:16:0;;;;;28249:6;;;:16;;28218;28249;;-1:-1:-1;;;28249:16:0;;-1:-1:-1;;28249:16:0;;;;;;;;;;28326:162;;;;;;;;;28374:15;28326:162;;;;;;;;;28307:13;;;;28326:162;;;;;28453:10;;:19;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;28326:162;;;28307:182;;;;;;;-1:-1:-1;28307:182:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;28307:182:0;-1:-1:-1;;28307:182:0;;;;-1:-1:-1;;;28307:182:0;-1:-1:-1;;28307:182:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28575:212:0;28598:7;28593:12;;:1;:12;;;28575:212;;28636:1;:11;;28648:1;28636:14;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;28631:141;;28692:4;28675:1;:11;;28687:1;28675:14;;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28739:10;28750:1;28739:13;;;;;;;;;:::i;:::-;;;28719:33;;;;:::i;:::-;;;28631:141;28607:3;;;;:::i;:::-;;;;28575:212;;;-1:-1:-1;28819:20:0;;28815:214;;28885:16;28860:1;:21;;;:41;;;;;;;:::i;:::-;;;;;;;;28943:16;28920:1;:19;;;:39;;;;;;;:::i;:::-;;;;;;;;28997:16;28978:15;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;28815:214:0;29050:43;;;21379:4:1;21367:17;;21349:36;;21416:2;21401:18;;21394:34;;;-1:-1:-1;;;;;29050:43:0;;;;;21322:18:1;29050:43:0;;;;;;;28190:929;28174:1857;;;29139:8;29129:18;;:7;:18;;;29125:906;;;29186:7;29177:1;:6;;;:16;;;;;;;;;;;;;;;;;;29235:1;:13;;29254:162;;;;;;;;29302:15;29254:162;;;;;;29343:7;29254:162;;;;;;29381:10;29392:7;29381:19;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;29254:162;;;29235:182;;;;;;;;-1:-1:-1;29235:182:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;29235:182:0;-1:-1:-1;;29235:182:0;;;;-1:-1:-1;;;29235:182:0;-1:-1:-1;;29235:182:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29505:12:0;;:8;;:12;:::i;:::-;29495:22;;29490:223;29524:7;29519:12;;:1;:12;;;29490:223;;29562:1;:11;;29574:1;29562:14;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;29557:141;;29618:4;29601:1;:11;;29613:1;29601:14;;;;;;;;;:::i;:::-;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29665:10;29676:1;29665:13;;;;;;;;;:::i;:::-;;;29645:33;;;;:::i;:::-;;;29557:141;29533:3;;;;:::i;:::-;;;;29490:223;;;-1:-1:-1;29745:20:0;;29741:214;;29811:16;29786:1;:21;;;:41;;;;;;;:::i;:::-;;;;;;;;29869:16;29846:1;:19;;;:39;;;;;;;:::i;:::-;;;;;;;;29923:16;29904:15;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;29741:214:0;29976:43;;;21379:4:1;21367:17;;21349:36;;21416:2;21401:18;;21394:34;;;-1:-1:-1;;;;;29976:43:0;;;;;21322:18:1;29976:43:0;;;;;;;29149:882;27772:2266;;;27714:2324;:::o;15622:1277::-;-1:-1:-1;;;;;15905:17:0;;;15879:23;15905:17;;;:5;:17;;;;;;;;15961:19;:31;;;;;:45;;;;;;;;;;;:56;;;;;;;;;;;;;;15879:23;16047:22;;;;:47;;16083:11;16047:47;;;16072:8;16047:47;16028:66;;16132:9;16119:22;;:9;:22;;;16115:61;;16158:7;;;;;16115:61;16196:20;16219:139;16270:10;16295:4;16314:9;16338;16219:36;:139::i;:::-;16196:162;-1:-1:-1;16383:16:0;;16379:424;;16457:12;16416:10;:37;;;:53;;;;;;;:::i;:::-;;;;-1:-1:-1;16524:12:0;;-1:-1:-1;16484:25:0;;;16510:9;16518:1;16510:5;:9;:::i;:::-;16484:36;;;;;;;;;:::i;:::-;;;:52;;;;;;;:::i;:::-;;;;;;;;16641:12;-1:-1:-1;;;;;16570:221:0;16611:10;-1:-1:-1;;;;;16570:221:0;;16673:12;16705:5;16730:10;:18;;;;;;;;;;;;:46;;766:3;16730:46;;;16751:15;;;;-1:-1:-1;;;16751:15:0;;;;16730:46;16570:221;;;21633:25:1;;;21706:4;21694:17;;;21689:2;21674:18;;21667:45;21748:17;;21728:18;;;21721:45;21621:2;21606:18;16570:221:0;;;;;;;16379:424;-1:-1:-1;;;;;;;;;16823:31:0;;;;;;;:19;:31;;;;;;;;:45;;;;;;;;;;;:56;;;;;;:68;;-1:-1:-1;;16823:68:0;;;;;;;15622:1277;;;;;;;;:::o;16907:2523::-;17121:22;;;:29;17097:7;;17121:34;;17117:75;;-1:-1:-1;17179:1:0;17172:8;;17117:75;17212:20;17275:9;17212:20;17305:1642;17329:22;;;:29;17325:33;;17305:1642;;;17380:28;17411:10;:22;;17434:1;17411:25;;;;;;;;:::i;:::-;;;;;;;;;;17380:56;;;;;;;;17411:25;;;;17380:56;;;;;;;;-1:-1:-1;;;17380:56:0;;;;;;;;;;;-1:-1:-1;;;17380:56:0;;;;;;;;;;;;;;-1:-1:-1;17469:33:0;;-1:-1:-1;17465:82:0;;17523:8;;;17465:82;17579:20;;:31;;;;;;;17575:519;;17639:1;17635;:5;:37;;;;;17665:7;17644:28;;:18;:28;;;17635:37;17631:424;;;17697:26;17726:22;;;17749:5;17753:1;17749;:5;:::i;:::-;17726:29;;;;;;;;:::i;:::-;;;;;;;;;17697:58;;;;;;;;17726:29;;;;17697:58;;;;;;-1:-1:-1;;;17697:58:0;;;;;;;;;;;-1:-1:-1;;;17697:58:0;;;;;;;;;;-1:-1:-1;17802:181:0;17855:4;17886:28;17896:18;17886:7;:28;:::i;:::-;17802:181;;17941:8;:19;;;17802:26;:181::i;:::-;17778:205;-1:-1:-1;18006:29:0;17778:205;18006:29;;:::i;:::-;;;17674:381;;17631:424;18073:5;;;17575:519;18130:1;18126;:5;:50;;;;;18156:10;:20;;;18135:41;;:18;:41;;;18126:50;18122:744;;;18197:26;18226:22;;;18249:5;18253:1;18249;:5;:::i;:::-;18226:29;;;;;;;;:::i;:::-;;;;;;;;;18197:58;;;;;;;;18226:29;;;;18197:58;;;;;;-1:-1:-1;;;18197:58:0;;;;;;;;;;;-1:-1:-1;;;18197:58:0;;;;;;;;;18374:20;;18197:58;;-1:-1:-1;18298:178:0;;18347:4;;18374:41;;18397:18;;18374:41;:::i;18298:178::-;18274:202;-1:-1:-1;18495:29:0;18274:202;18495:29;;:::i;:::-;;;18178:362;;18122:744;;;18550:6;;:51;;;;;18581:10;:20;;;18560:41;;:18;:41;;;18550:51;18546:320;;18915:20;;-1:-1:-1;17305:1642:0;17360:3;;17305:1642;;;;18992:7;18971:28;;:18;:28;;;:65;;;;-1:-1:-1;19003:22:0;;;:29;:33;;18971:65;18967:416;;;19082:22;;;19105:29;;19053:26;;19082:22;19105:33;;19137:1;;19105:33;:::i;:::-;19082:57;;;;;;;;:::i;:::-;;;;;;;;;19053:86;;;;;;;;19082:57;;;;19053:86;;;;;;-1:-1:-1;;;19053:86:0;;;;;;;;;;;-1:-1:-1;;;19053:86:0;;;;;;;;;;-1:-1:-1;19178:149:0;19223:4;19246:28;19256:18;19246:7;:28;:::i;19178:149::-;19154:173;-1:-1:-1;19342:29:0;19154:173;19342:29;;:::i;:::-;;;19038:345;;18967:416;-1:-1:-1;19410:12:0;16907:2523;-1:-1:-1;;;;;16907:2523:0:o;19438:476::-;19586:7;19610:19;;;:31;;-1:-1:-1;19633:8:0;;;;19610:31;19606:45;;;-1:-1:-1;19650:1:0;19643:8;;19606:45;19691:8;19700:14;;;;19691:24;;19672:16;;19691:8;19700:14;;;19691:24;;;;;;:::i;:::-;;;;;;;;;19672:43;;;;;;;;19691:24;;;;;;;19672:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;19672:43:0;;;;;;;;;;19749:11;;19672:43;;-1:-1:-1;669:6:0;;19749:24;;19672:43;19749:24;:::i;:::-;19748:32;;;;:::i;:::-;19726:54;-1:-1:-1;19791:20:0;724:3;19815:28;19829:14;19726:54;19815:28;:::i;:::-;19814:48;;;;:::i;:::-;19791:71;-1:-1:-1;669:6:0;19881:18;;;;19791:71;19881:18;:::i;:::-;19880:26;;;;:::i;:::-;19873:33;19438:476;-1:-1:-1;;;;;;;19438:476:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;2503:180::-;2562:6;2615:2;2603:9;2594:7;2590:23;2586:32;2583:52;;;2631:1;2628;2621:12;2583:52;-1:-1:-1;2654:23:1;;2503:180;-1:-1:-1;2503:180:1:o;3073:1027::-;3303:2;3315:21;;;3385:13;;3288:18;;;3407:22;;;3255:4;;3486:15;;;3460:2;3445:18;;;3255:4;3529:545;3543:6;3540:1;3537:13;3529:545;;;3608:6;3602:13;3646:2;3640:9;3635:3;3628:22;3708:12;3702:2;3698;3694:11;3688:18;3684:37;3679:2;3674:3;3670:12;3663:59;3780:12;3774:2;3770;3766:11;3760:18;3756:37;3751:2;3746:3;3742:12;3735:59;3844:4;3840:2;3836:13;3830:20;3823:4;3818:3;3814:14;3807:44;3913:4;3905;3901:2;3897:13;3891:20;3887:31;3880:4;3875:3;3871:14;3864:55;3983:4;3979:2;3975:13;3969:20;3962:28;3955:36;3948:4;3943:3;3939:14;3932:60;;4021:4;4016:3;4012:14;4005:21;;4061:2;4053:6;4049:15;4039:25;;3565:1;3562;3558:9;3553:14;;3529:545;;;-1:-1:-1;4091:3:1;;3073:1027;-1:-1:-1;;;;;3073:1027:1:o;4329:303::-;4422:5;4445:1;4455:171;4469:4;4466:1;4463:11;4455:171;;;4528:13;;4516:26;;4571:4;4562:14;;;;4599:17;;;;4489:1;4482:9;4455:171;;4637:755;4969:3;4954:19;;4982:43;4958:9;5007:6;4982:43;:::i;:::-;5034:53;5082:3;5071:9;5067:19;5059:6;5034:53;:::i;:::-;5122:3;5111:9;5107:19;5168:6;5192:1;5202:184;5216:4;5213:1;5210:11;5202:184;;;5279:13;;5294:6;5275:26;5263:39;;5331:4;5322:14;;;;5359:17;;;;5236:1;5229:9;5202:184;;;5206:3;;;4637:755;;;;;;:::o;6009:913::-;6388:25;;;6444:2;6429:18;;6422:34;;;6504:6;6492:19;;6487:2;6472:18;;6465:47;6543:2;6528:18;;6521:34;;;6375:3;6360:19;;6590:3;6575:19;;6636:6;6333:4;6670:184;6684:4;6681:1;6678:11;6670:184;;;6747:13;;6762:10;6743:30;6731:43;;6803:2;6794:12;;;;6829:15;;;;6704:1;6697:9;6670:184;;;6674:3;;;6863:53;6911:3;6900:9;6896:19;6888:6;6863:53;:::i;6927:950::-;7163:2;7175:21;;;7245:13;;7148:18;;;7267:22;;;7115:4;;7346:15;;;7320:2;7305:18;;;7115:4;7389:462;7403:6;7400:1;7397:13;7389:462;;;7468:6;7462:13;7506:2;7500:9;7495:3;7488:22;7558:2;7554;7550:11;7544:18;7539:2;7534:3;7530:12;7523:40;7621:6;7615:2;7611;7607:11;7601:18;7597:31;7592:2;7587:3;7583:12;7576:53;7691:6;7683:4;7679:2;7675:13;7669:20;7665:33;7658:4;7653:3;7649:14;7642:57;7761:6;7753:4;7749:2;7745:13;7739:20;7735:33;7728:4;7723:3;7719:14;7712:57;;7798:4;7793:3;7789:14;7782:21;;7838:2;7830:6;7826:15;7816:25;;7425:1;7422;7418:9;7413:14;;7389:462;;7882:156;7948:20;;8008:4;7997:16;;7987:27;;7977:55;;8028:1;8025;8018:12;8043:256;8109:6;8117;8170:2;8158:9;8149:7;8145:23;8141:32;8138:52;;;8186:1;8183;8176:12;8138:52;8209:29;8228:9;8209:29;:::i;:::-;8199:39;;8257:36;8289:2;8278:9;8274:18;8257:36;:::i;:::-;8247:46;;8043:256;;;;;:::o;8304:955::-;8554:4;8602:3;8591:9;8587:19;8645:10;8637:6;8633:23;8622:9;8615:42;8705:10;8697:6;8693:23;8688:2;8677:9;8673:18;8666:51;8753:6;8748:2;8737:9;8733:18;8726:34;8796:6;8791:2;8780:9;8776:18;8769:34;8840:3;8834;8823:9;8819:19;8812:32;8864:6;8899;8893:13;8930:6;8922;8915:22;8968:3;8957:9;8953:19;8946:26;;9007:2;8999:6;8995:15;8981:29;;9028:1;9038:195;9052:6;9049:1;9046:13;9038:195;;;9117:13;;-1:-1:-1;;;;;9113:39:1;9101:52;;9182:2;9208:15;;;;9173:12;;;;9149:1;9067:9;9038:195;;;-1:-1:-1;9250:3:1;;8304:955;-1:-1:-1;;;;;;;;;8304:955:1:o;10760:920::-;11052:4;11094:3;11083:9;11079:19;11071:27;;11139:6;11132:14;11125:22;11114:9;11107:41;11196:4;11188:6;11184:17;11179:2;11168:9;11164:18;11157:45;11238:6;11233:2;11222:9;11218:18;11211:34;11281:6;11276:2;11265:9;11261:18;11254:34;11325:6;11319:3;11308:9;11304:19;11297:35;11369:6;11363:3;11352:9;11348:19;11341:35;11411:3;11400:9;11396:19;11457:6;11481:1;11491:183;11505:4;11502:1;11499:11;11491:183;;;11578:13;;11571:21;11564:29;11552:42;;11623:2;11614:12;;;;11649:15;;;;11525:1;11518:9;11491:183;;;11495:3;;;10760:920;;;;;;;;;;:::o;11685:386::-;11936:25;;;11992:2;11977:18;;11970:34;;;11923:3;11908:19;;12013:52;12061:2;12046:18;;12038:6;12013:52;:::i;12076:256::-;12142:6;12150;12203:2;12191:9;12182:7;12178:23;12174:32;12171:52;;;12219:1;12216;12209:12;12171:52;12242:27;12259:9;12242:27;:::i;:::-;12232:37;;12288:38;12322:2;12311:9;12307:18;12288:38;:::i;13946:127::-;14007:10;14002:3;13998:20;13995:1;13988:31;14038:4;14035:1;14028:15;14062:4;14059:1;14052:15;14078:125;14143:9;;;14164:10;;;14161:36;;;14177:18;;:::i;14208:127::-;14269:10;14264:3;14260:20;14257:1;14250:31;14300:4;14297:1;14290:15;14324:4;14321:1;14314:15;14340:148;14428:4;14407:12;;;14421;;;14403:31;;14446:13;;14443:39;;;14462:18;;:::i;14493:334::-;14695:2;14677:21;;;14734:2;14714:18;;;14707:30;-1:-1:-1;;;14768:2:1;14753:18;;14746:40;14818:2;14803:18;;14493:334::o;15177:168::-;15250:9;;;15281;;15298:15;;;15292:22;;15278:37;15268:71;;15319:18;;:::i;15350:217::-;15390:1;15416;15406:132;;15460:10;15455:3;15451:20;15448:1;15441:31;15495:4;15492:1;15485:15;15523:4;15520:1;15513:15;15406:132;-1:-1:-1;15552:9:1;;15350:217::o;15572:128::-;15639:9;;;15660:11;;;15657:37;;;15674:18;;:::i;16722:135::-;16761:3;16782:17;;;16779:43;;16802:18;;:::i;:::-;-1:-1:-1;16849:1:1;16838:13;;16722:135::o;16862:127::-;16923:10;16918:3;16914:20;16911:1;16904:31;16954:4;16951:1;16944:15;16978:4;16975:1;16968:15;19383:155;19474:6;19451:14;;;19467;;;19447:35;;19494:15;;19491:41;;;19512:18;;:::i;19543:167::-;19638:10;19611:18;;;19631;;;19607:43;;19662:19;;19659:45;;;19684:18;;:::i;19715:175::-;19752:3;19796:4;19789:5;19785:16;19825:4;19816:7;19813:17;19810:43;;19833:18;;:::i;:::-;19882:1;19869:15;;19715:175;-1:-1:-1;;19715:175:1:o;20226:173::-;20323:12;20294:20;;;20316;;;20290:47;;20349:21;;20346:47;;;20373:18;;:::i;20404:176::-;20503:12;20496:20;;;20474;;;20470:47;;20529:22;;20526:48;;;20554:18;;:::i;20838:180::-;20876:3;20920:6;20913:5;20909:18;20951:6;20942:7;20939:19;20936:45;;20961:18;;:::i;21023:151::-;21113:4;21106:12;;;21092;;;21088:31;;21131:14;;21128:40;;;21148:18;;:::i

Swarm Source

ipfs://d59c0d6ee9f4eb4c5f286db25c759bced152e696a000282a9507a8502ca63a46

Block Transaction Gas Used Reward
view all blocks ##produced##

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0xe41Bc081f8929a0c4bC57934Cc45B9C072c3Fa08
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.