function jumpIn() private {
        
        
		uint dValue = 100 finney;
		if (msg.value > 50 ether) {
		    
		    if (this.balance >= balance + collectedFees + msg.value)
			    msg.sender.send(msg.value - 50 ether);	
			dValue = 50 ether;
		}
		else { dValue = msg.value; }

        
        addNewUser(msg.sender);
        
        
        uint tokensToUse = users[msg.sender].rescueTokens >= 5 ? 5 : users[msg.sender].rescueTokens;
        uint tokensUsed = 0;
        
        
        uint randMultiplier = rand(50);
        uint currentEntries = entries.length - payoutOrder;
        randMultiplier = currentEntries > 15 ? (randMultiplier / 2) : randMultiplier;
        randMultiplier = currentEntries > 25 ? 0 : randMultiplier;
        
        randMultiplier = currentEntries <= 5 && dValue <= 20 ? randMultiplier * 3 / 2 : randMultiplier;
        
        
        while (tokensToUse > 0 && (baseMultiplier + randMultiplier + tokensUsed*10) < maxMultiplier)
        {
            tokensToUse--;
            tokensUsed++;
        }
        
        uint finalMultiplier = (baseMultiplier + randMultiplier + tokensUsed*10);
        
        if (finalMultiplier > maxMultiplier)
            finalMultiplier = maxMultiplier;
            
        
        if (msg.value < 50 ether)
            entries.push(Entry(msg.sender, msg.value, (msg.value * (finalMultiplier) / 100), tokensUsed));
        else
            entries.push(Entry(msg.sender, 50 ether,((50 ether) * (finalMultiplier) / 100), tokensUsed));

        
        if (msg.value < 50 ether)
            Jump(msg.sender, msg.value, (msg.value * (finalMultiplier) / 100));
        else
            Jump(msg.sender, 50 ether, ((50 ether) * (finalMultiplier) / 100));

        users[msg.sender].rescueTokens -= tokensUsed;
        
        
        balance += (dValue * (100 - jumpFee)) / 100;
        collectedFees += (dValue * jumpFee) / 100;
        
        bool saviour = false;
        
        
        while (balance > entries[payoutOrder].payout) {
            
            saviour = false;
            
            uint entryPayout = entries[payoutOrder].payout;
            uint entryDeposit = entries[payoutOrder].deposit;
            uint profit = entryPayout - entryDeposit;
            uint saviourShare = 0;
            
            
            if (users[msg.sender].addr != entries[payoutOrder].entryAddress)
            {
                users[msg.sender].rescueCount++;
                
                if (entryDeposit >= 1 ether) {
                    users[msg.sender].rescueTokens += dValue < 20 || currentEntries < 15 ? 1 : 2;
                    users[msg.sender].rescueTokens += dValue < 40 || currentEntries < 25 ? 0 : 1;
                }
                saviour = true;
            }
            
            bool isHero = false;
            
            isHero = entries[payoutOrder].entryAddress == hero;
            
            
            if (saviour && !isHero && profit > 20 * entryDeposit / 100 && profit > 100 finney && dValue >= 5 ether)
            {
                if (dValue < 10 ether)
                   saviourShare = 3 + rand(5);
                else if (dValue >= 10 ether && dValue < 25 ether)
                  saviourShare = 7 + rand(8);
                else if (dValue >= 25 ether && dValue < 40 ether)
                   saviourShare = 12 + rand(13);
                else if (dValue >= 40 ether)
                   saviourShare = rand(50);
                   
                saviourShare *= profit / 100;
                   
                msg.sender.send(saviourShare);
            }
            
            uint payout = entryPayout - saviourShare;
            entries[payoutOrder].entryAddress.send(payout);
            
            
            Rescue(entries[payoutOrder].entryAddress, msg.sender, payout);

            balance -= entryPayout;
            usersProfits += entryPayout;
            
            rescues++;
            payoutOrder++;
        }
        
        
        if (saviour && users[msg.sender].rescueCount > rescueRecord)
        {
            rescueRecord = users[msg.sender].rescueCount;
            hero = msg.sender;
            
            NewHero(msg.sender);
        }
    }