private final void passivesRequest() {
   while (true) {
     if (immediateRequestsSent != 0) {
       break;
     }
     if (passiveRequestsSent >= 10) {
       break;
     }
     if (highestPriority == 0) {
       break;
     }
     OnDemandNode onDemandNode;
     synchronized (passiveRequests) {
       onDemandNode = (OnDemandNode) passiveRequests.popTail();
     }
     while (onDemandNode != null) {
       if (filePriorities[onDemandNode.type][onDemandNode.id] != 0) {
         filePriorities[onDemandNode.type][onDemandNode.id] = (byte) 0;
         sentRequests.insertBack(onDemandNode);
         sendRequest(onDemandNode);
         expectData = true;
         if (extrasLoaded < extrasTotal) {
           extrasLoaded++;
         }
         message = "Loading extra files - " + ((extrasLoaded * 100) / extrasTotal) + "%";
         passiveRequestsSent++;
         if (passiveRequestsSent == 10) {
           return;
         }
       }
       synchronized (passiveRequests) {
         onDemandNode = (OnDemandNode) passiveRequests.popTail();
       }
     }
     for (int type = 0; type < 4; type++) {
       byte[] priority = filePriorities[type];
       for (int id = 0; id < priority.length; id++) {
         if (priority[id] == highestPriority) {
           priority[id] = (byte) 0;
           onDemandNode = new OnDemandNode();
           onDemandNode.type = type;
           onDemandNode.id = id;
           onDemandNode.immediate = false;
           sentRequests.insertBack(onDemandNode);
           sendRequest(onDemandNode);
           expectData = true;
           if (extrasLoaded < extrasTotal) {
             extrasLoaded++;
           }
           message = "Loading extra files - " + ((extrasLoaded * 100) / extrasTotal) + "%";
           passiveRequestsSent++;
           if (passiveRequestsSent == 10) {
             return;
           }
         }
       }
     }
     highestPriority--;
   }
 }
 private final void localComplete() {
   OnDemandNode onDemandNode;
   synchronized (wanted) {
     onDemandNode = (OnDemandNode) wanted.popTail();
   }
   while (onDemandNode != null) {
     expectData = true;
     byte[] buffer = null;
     if (client.stores[0] != null) {
       buffer = client.stores[onDemandNode.type + 1].get(onDemandNode.id);
     }
     if (!verify(
         fileVersions[onDemandNode.type][onDemandNode.id],
         fileCrc[onDemandNode.type][onDemandNode.id],
         buffer)) {
       buffer = null;
     }
     synchronized (wanted) {
       if (buffer == null) {
         toRequest.insertBack(onDemandNode);
       } else {
         onDemandNode.buffer = buffer;
         synchronized (completed) {
           completed.insertBack(onDemandNode);
         }
       }
       onDemandNode = (OnDemandNode) wanted.popTail();
     }
   }
 }
 private final void remainingRequest() {
   immediateRequestsSent = 0;
   passiveRequestsSent = 0;
   for (OnDemandNode onDemandNode = (OnDemandNode) sentRequests.getBack();
       onDemandNode != null;
       onDemandNode = (OnDemandNode) sentRequests.getPrevious()) {
     if (onDemandNode.immediate) {
       immediateRequestsSent++;
     } else {
       passiveRequestsSent++;
     }
   }
   while (immediateRequestsSent < 10) {
     OnDemandNode onDemandNode = (OnDemandNode) toRequest.popTail();
     if (onDemandNode == null) {
       break;
     }
     if (filePriorities[onDemandNode.type][onDemandNode.id] != 0) {
       extrasLoaded++;
     }
     filePriorities[onDemandNode.type][onDemandNode.id] = (byte) 0;
     sentRequests.insertBack(onDemandNode);
     immediateRequestsSent++;
     sendRequest(onDemandNode);
     expectData = true;
   }
 }
 public final OnDemandNode next() {
   OnDemandNode onDemandNode;
   synchronized (completed) {
     onDemandNode = (OnDemandNode) completed.popTail();
   }
   if (onDemandNode == null) {
     return null;
   }
   synchronized (immediateRequests) {
     onDemandNode.clear();
   }
   if (onDemandNode.buffer == null) {
     return onDemandNode;
   }
   int offset = 0;
   try {
     GZIPInputStream gzipinputstream =
         new GZIPInputStream(new ByteArrayInputStream(onDemandNode.buffer));
     while (true) {
       if (offset == deflateOut.length) {
         throw new RuntimeException("buffer overflow!");
       }
       int readByte = gzipinputstream.read(deflateOut, offset, deflateOut.length - offset);
       if (readByte == -1) {
         break;
       }
       offset += readByte;
     }
   } catch (IOException ioexception) {
     throw new RuntimeException("error unzipping");
   }
   onDemandNode.buffer = new byte[offset];
   for (int position = 0; position < offset; position++) {
     onDemandNode.buffer[position] = deflateOut[position];
   }
   return onDemandNode;
 }