docs: private void addFiles(ZipOutputStream jarOut, String basePackage, String baseUrl) throws IOException, MalformedURLException {
          if (baseUrl.startsWith("jar:")) {
              int n = baseUrl.lastIndexOf("!");
              if (n < 0) {
                  throw new IllegalArgumentException("Unexpected classpath URL: " + baseUrl);
              }
              String fileUrl = baseUrl.substring(4, n);
              InputStream is = new URL(fileUrl).openStream();
              ZipInputStream zis = new ZipInputStream(is);
              while(true) {
                  ZipEntry ze = zis.getNextEntry();
                  if (ze != null) {
                      if (matchPath(ze.getName(), basePackage)) {
                          ZipEntry entry = new ZipEntry(ze.getName());
                          entry.setTime(0); // this is to facilitate content cache
                          if (!pathEntries.contains(entry.getName())) {
                              pathEntries.add(entry.getName());
                              jarOut.putNextEntry(entry);
                              copyStreamNoClose(zis, jarOut);
                              jarOut.closeEntry();                            
                          }
                      }
                      zis.closeEntry();
                  }
                  else {
                      break;
                  }               
              }
          }
          else {
              InputStream is = new URL(baseUrl).openStream();
              for(String line: toLines(is)) {
                  String fpath = baseUrl + "/" + line;
                  String jpath = basePackage + "/" + line;
                  ZipEntry entry = new ZipEntry(jpath);
                  entry.setTime(0); // this is to facilitate content cache            
                  if (!pathEntries.contains(entry.getName())) {
                      jarOut.closeEntry();                            
                      jarOut.putNextEntry(entry);
                      copyStream(new URL(fpath).openStream(), jarOut);
                      jarOut.closeEntry();
                  }
              }
          }
      }