Get the real SD Card available free space - java
Any idea of how I can read/get the real amount of free space on a sd card? I'm running on Android 4.3. I have tried all possible things to read it correctly, however I'm getting something a bit over twice the real free space.
Now I've tried the classic
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
using the API 18 getAvailableBlocksLong and other getBlockSizeLong and still the same result.
The only thing that works (but it's not what I need) is the shell command df. I also tried the get usable free space functions with the same result. And this thing doesn't happen on my device only, but on all devices that I try the code.
Use this:-
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2)
{
#SuppressWarnings("deprecation")
long sdAvailSize = (long)stat.getAvailableBlocksLong() * (long)stat.getBlockSizeLong();
} else
{
#SuppressWarnings("deprecation")
double sdAvailSize = (double)stat.getAvailableBlocks() * (double)stat.getBlockSize();
}
try doing this:-
double gigaAvailable = sdAvailSize / 1073741824;
If this didn't worked then change getAvailableBlocks() to getBlockCount().
you can also try this:-
/**
* #return Number of gega bytes available on External storage
*/
public static long getAvailableSpaceInGB(){
final long SIZE_KB = 1024L;
final long SIZE_GB = SIZE_KB * SIZE_KB * SIZE_KB;
long availableSpace = -1L;
StatFs stat = new StatFs(Environment.getExternalStorageDirectory().getPath());
availableSpace = (long) stat.getAvailableBlocks() * (long) stat.getBlockSize();
return availableSpace/SIZE_GB;
}
Copied from here :)
Hope it helps.
Related
How to scan/load all the files from Internal and External storage in android 10 and android 11
In android 10 and in android 11 how to load all files from internal and external storage. Actually I want to load a specific extension files (i.e.pdf, txt) within my app, either the specific extension file is saved in internal or external storage. I have used the following code which is working fine upto android 8.1 API Level 26 I have taken the StorageUtil class from internet, which will load all the possible physical path public class StorageUtil { // Primary physical SD-CARD (not emulated) private static final String EXTERNAL_STORAGE = System.getenv("EXTERNAL_STORAGE"); // All Secondary SD-CARDs (all exclude primary) separated by File.pathSeparator, i.e: ":", ";" private static final String SECONDARY_STORAGES = System.getenv("SECONDARY_STORAGE"); // Primary emulated SD-CARD private static final String EMULATED_STORAGE_TARGET = System.getenv("EMULATED_STORAGE_TARGET"); // PhysicalPaths based on phone model #SuppressLint("SdCardPath") #SuppressWarnings("SpellCheckingInspection") private static final String[] KNOWN_PHYSICAL_PATHS = new String[]{ "/storage/sdcard0", "/storage/sdcard1", //Motorola Xoom "/storage/extsdcard", //Samsung SGS3 "/storage/sdcard0/external_sdcard", //User request "/mnt/extsdcard", "/mnt/sdcard/external_sd", //Samsung galaxy family "/mnt/sdcard/ext_sd", "/mnt/external_sd", "/mnt/media_rw/sdcard1", //4.4.2 on CyanogenMod S3 "/removable/microsd", //Asus transformer prime "/mnt/emmc", "/storage/external_SD", //LG "/storage/ext_sd", //HTC One Max "/storage/removable/sdcard1", //Sony Xperia Z1 "/data/sdext", "/data/sdext2", "/data/sdext3", "/data/sdext4", "/sdcard1", //Sony Xperia Z "/sdcard2", //HTC One M8s "/storage/microsd" //ASUS ZenFone 2 }; /** * Returns all available storages in the system (include emulated) * <p/> * Warning: Hack! Based on Android source code of version 4.3 (API 18) * Because there is no standard way to get it. * * #return paths to all available storages in the system (include emulated) */ public static String[] getStorageDirectories(Context context) { // Final set of paths final Set<String> availableDirectoriesSet = new HashSet<>(); if (!TextUtils.isEmpty(EMULATED_STORAGE_TARGET)) { // Device has an emulated storage availableDirectoriesSet.add(getEmulatedStorageTarget()); } else { // Device doesn't have an emulated storage availableDirectoriesSet.addAll(getExternalStorage(context)); } // Add all secondary storages Collections.addAll(availableDirectoriesSet, getAllSecondaryStorages()); String[] storagesArray = new String[availableDirectoriesSet.size()]; return availableDirectoriesSet.toArray(storagesArray); } private static Set<String> getExternalStorage(Context context) { final Set<String> availableDirectoriesSet = new HashSet<>(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { // Solution of empty raw emulated storage for android version >= marshmallow // because the EXTERNAL_STORAGE become something like: "/Storage/A5F9-15F4", // so we can't access it directly File[] files = getExternalFilesDirs(context, null); for (File file : files) { if (file != null) { String applicationSpecificAbsolutePath = file.getAbsolutePath(); String rootPath = applicationSpecificAbsolutePath.substring( 0, applicationSpecificAbsolutePath.indexOf("Android/data") ); availableDirectoriesSet.add(rootPath); } } } else { if (TextUtils.isEmpty(EXTERNAL_STORAGE)) { availableDirectoriesSet.addAll(getAvailablePhysicalPaths()); } else { // Device has physical external storage; use plain paths. availableDirectoriesSet.add(EXTERNAL_STORAGE); } } return availableDirectoriesSet; } private static String getEmulatedStorageTarget() { String rawStorageId = ""; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { // External storage paths should have storageId in the last segment // i.e: "/storage/emulated/storageId" where storageId is 0, 1, 2, ... final String path = Environment.getExternalStorageDirectory().getAbsolutePath(); final String[] folders = path.split(File.separator); final String lastSegment = folders[folders.length - 1]; if (!TextUtils.isEmpty(lastSegment) && TextUtils.isDigitsOnly(lastSegment)) { rawStorageId = lastSegment; } } if (TextUtils.isEmpty(rawStorageId)) { return EMULATED_STORAGE_TARGET; } else { return EMULATED_STORAGE_TARGET + File.separator + rawStorageId; } } private static String[] getAllSecondaryStorages() { if (!TextUtils.isEmpty(SECONDARY_STORAGES)) { // All Secondary SD-CARDs split into array return SECONDARY_STORAGES.split(File.pathSeparator); } return new String[0]; } /** * Filter available physical paths from known physical paths * * #return List of available physical paths from current device */ private static List<String> getAvailablePhysicalPaths() { List<String> availablePhysicalPaths = new ArrayList<>(); for (String physicalPath : KNOWN_PHYSICAL_PATHS) { File file = new File(physicalPath); if (file.exists()) { availablePhysicalPaths.add(physicalPath); } } return availablePhysicalPaths; } /** * Returns absolute paths to application-specific directories on all * external storage devices where the application can place persistent files * it owns. These files are internal to the application, and not typically * visible to the user as media. * <p> * This is like {#link Context#getFilesDir()} in that these files will be * deleted when the application is uninstalled, however there are some * important differences: * <ul> * <li>External files are not always available: they will disappear if the * user mounts the external storage on a computer or removes it. * <li>There is no security enforced with these files. * </ul> * <p> * External storage devices returned here are considered a permanent part of * the device, including both emulated external storage and physical media * slots, such as SD cards in a battery compartment. The returned paths do * not include transient devices, such as USB flash drives. * <p> * An application may store data on any or all of the returned devices. For * example, an app may choose to store large files on the device with the * most available space, as measured by {#link android.os.StatFs}. * <p> * Starting in {#link Build.VERSION_CODES#KITKAT}, no permissions * are required to write to the returned paths; they're always accessible to * the calling app. Before then, * {#link android.Manifest.permission#WRITE_EXTERNAL_STORAGE} is required to * write. Write access outside of these paths on secondary external storage * devices is not available. To request external storage access in a * backwards compatible way, consider using {#code android:maxSdkVersion} * like this: * * <pre class="prettyprint"><uses-permission * android:name="android.permission.WRITE_EXTERNAL_STORAGE" * android:maxSdkVersion="18" /></pre> * <p> * The first path returned is the same as * {#link Context#getExternalFilesDir(String)}. Returned paths may be * {#code null} if a storage device is unavailable. * * #see Context#getExternalFilesDir(String) */ private static File[] getExternalFilesDirs(Context context, String type) { if (Build.VERSION.SDK_INT >= 19) { return context.getExternalFilesDirs(type); } else { return new File[]{context.getExternalFilesDir(type)}; } } And loadDirectoryFiles function which will load all the files within specific directory object LoadDirectory { fun loadDirectoryFiles(directory: File) { try { val fileList: Array<File> = directory.listFiles() if (fileList.isNotEmpty()) { for (i in fileList.indices) { if (fileList[i].isDirectory) { loadDirectoryFiles(fileList[i]) } else { val name: String = fileList[i].name.toLowerCase(Locale.getDefault()) //Now look for desired extension if (name.endsWith(Constants.PDF_EXTENSION)) { Constants.allFileList.add(fileList[i]) } } } } } catch (e : Exception){ Log.d("TAG","Error: ${e.message} and directory: ${directory.absoluteFile}") } } } and here its usage val storagePaths = StorageUtil.getStorageDirectories(this) for (path in storagePaths) { val storageFile = File(path) LoadDirectory.loadDirectoryFiles(storageFile) } The above code is working fine upto android 8.1 but is not working on above android 8.1, Now how to achieve this by loading a specific extension (i.e. pdf) files from internal and external storage Thanks in advance for helping me
Sigar ProcCpu gather method always returns 0 for percentage value
I'm using Sigar to try and get the CPU and memory usage of individual processes (under Windows). I am able to get these stats correctly for the system as a whole with the below code : Sigar sigar = new Sigar(); long totalMemory = sigar.getMem().getTotal() / 1024 /1024; model.addAttribute("totalMemory", totalMemory); double usedPercentage = sigar.getMem().getUsedPercent(); model.addAttribute("usedPercentage", String.format( "%.2f", usedPercentage)); double freePercentage = sigar.getMem().getFreePercent(); model.addAttribute("freePercentage", String.format( "%.2f", freePercentage)); double cpuUsedPercentage = sigar.getCpuPerc().getCombined() * 100; model.addAttribute("cpuUsedPercentage", String.format( "%.2f", cpuUsedPercentage)); This displays the following quite nicely in my web page : Total System Memory : 16289 MB Used Memory Percentage : 66.81 % Free Memory Percentage : 33.19 % CPU Usage : 30.44 % Now I'm trying to get info from individual processes such as Java and SQL Server and, while the memory is correctly gathered, the CPU usage for both processes is ALWAYS 0. Below is the code I'm using : Sigar sigar = new Sigar(); List<ProcessInfo> processes = new ArrayList<>(); ProcessFinder processFinder = new ProcessFinder(sigar); long[] javaPIDs = null; Long sqlPID = null; try { javaPIDs = processFinder.find("Exe.Name.ct=" + "java.exe"); sqlPID = processFinder.find("Exe.Name.ct=" + "sqlservr.exe")[0]; } catch (Exception ex) {} int i = 0; while (i < javaPIDs.length) { Long javaPID = javaPIDs[i]; ProcessInfo javaProcess = new ProcessInfo(); javaProcess.setPid(javaPID); javaProcess.setName("Java"); ProcMem javaMem = new ProcMem(); javaMem.gather(sigar, javaPID); javaProcess.setMemoryUsage(javaMem.getResident() / 1024 / 1024); MultiProcCpu javaCpu = new MultiProcCpu(); javaCpu.gather(sigar, javaPID); javaProcess.setCpuUsage(String.format("%.2f", javaCpu.getPercent() * 100)); processes.add(javaProcess); i++; } if (sqlPID != null) { ProcessInfo sqlProcess = new ProcessInfo(); sqlProcess.setPid(sqlPID); sqlProcess.setName("SQL Server"); ProcMem sqlMem = new ProcMem(); sqlMem.gather(sigar, sqlPID); sqlProcess.setMemoryUsage(sqlMem.getResident() / 1024 / 1024); ProcCpu sqlCpu = new MultiProcCpu(); sqlCpu.gather(sigar, sqlPID); sqlProcess.setCpuUsage(String.format( "%.2f", sqlCpu.getPercent())); processes.add(sqlProcess); } model.addAttribute("processes", processes); I have tried both ProcCpu and MultiProcCpu and both of them always return 0.0 even if I can see Java using 15% CPU in task manager. The documentation on the Sigar library is virtually non existent but the research i did tells me that i appear to be doing this correctly. Does anyone know what I'm doing wrong? Thanks!
I found the issue while continuing to search online. Basically, the sigar library can only retrieve the correct CPU values after a certain time. My issue is that i was initializing a new Sigar instance every time the page was displayed. I made my Sigar instance global to my Spring controller and now it returns correct percentages.
How to get the actual values of Total Available space and storage of external SD card in Android Studio?
I am Using Android Studio, I want to find the actual size of Sd card external storage at my phone by code.I have used Environment.getExternalStorageDirectory option but it return 1.7 GB but mine is 8 GB. My Code: StatFs statFs2 = new Stats(Environment.getExternalStorageDirectory().getAbsolutePath()); long blockSize2 = statFs2.getBlockSize(); final long totalSize2 = statFs2.getBlockCount() * blockSize2; final long availableSize2 = statFs2.getAvailableBlocks() * blockSize2; final long freeSize2 = statFs2.getFreeBlocks() * blockSize; Please Help! Thanks.
How do I get OS properties in java program?
Hi I need to get the details about operating system Physical memory and cpu usage and other details. I cannot pay any amount for already available APIs. I can use any free APIs or I can write my own API. I need all the details in the below image. In the above picture I have to get the following values Total Cached Available Free like this all values I need. For this I have searched a lot and got some hint. I got first value Total physical memory value using the below code. public class MBeanServerDemo { public MBeanServerDemo() { super(); } public static void main(String... a) throws Exception { MBeanServer mBeanServer = ManagementFactory.getPlatformMBeanServer(); Object attribute = mBeanServer.getAttribute(new ObjectName("java.lang", "type", "OperatingSystem"), "TotalPhysicalMemorySize"); long l = Long.parseLong(attribute.toString()); System.out.println("Total memory: " + (l / (1024*1024))); } } The below is the output for the above program Total memory: 3293 Please help me . How do I achieve this. Edit: I have searched a lot on google for solution and I found a lot of posts in stackoverflow.com. But in all these posts people discussed about only memory details. I need all details about Kernal(Paged and Non-Paged) etc. Please refer this post... My Requirement Thanks A lot.
can you please look at below API: SIGAR API - System Information Gatherer And Reporter https://support.hyperic.com/display/SIGAR/Home Some examples Usage : http://www.programcreek.com/java-api-examples/index.php?api=org.hyperic.sigar.Sigar
You can use JNA which offers a lot of access to platform specific apis such like win32.dll JNA on Github
Consider using jInterop for this task on Windows. To get the total amount of RAM in MB: public int getRAMSizeMB() throws JIException { String query = "Select * From Win32_ComputerSystem"; long size = 0; Object[] params = new Object[] { new JIString(query), JIVariant.OPTIONAL_PARAM() }; JIVariant[] res = super.callMethodA("ExecQuery", params); JIVariant[][] resSet = Utils.enumToJIVariantArray(res); for (JIVariant[] resSet1 : resSet) { IJIDispatch ramVal = (IJIDispatch) JIObjectFactory.narrowObject(resSet1[0].getObjectAsComObject() .queryInterface(IJIDispatch.IID)); size = ramVal.get("TotalPhysicalMemory").getObjectAsLong(); break; } return Math.round((size / 1024) / 1024); To get the total amount of CPUs: public int getCpuCount() throws JIException { String query = "Select NumberOfLogicalProcessors From Win32_Processor"; Object[] params = new Object[] { new JIString(query), JIVariant.OPTIONAL_PARAM() }; JIVariant[] res = super.callMethodA("ExecQuery", params); JIVariant[][] resSet = Utils.enumToJIVariantArray(res); for (JIVariant[] resSet1 : resSet) { IJIDispatch procVal = (IJIDispatch) JIObjectFactory.narrowObject(resSet1[0].getObjectAsComObject() .queryInterface(IJIDispatch.IID)); return procVal.get("NumberOfLogicalProcessors").getObjectAsInt(); } return -1; } Using these functions as a template, you can look up the other properties/functions via the MSDN website to query other values.
MongoDB ACKNOWLEDGED write concern faster than UNACKNOWLEDGED?
I've got a very simple test program that performs faster with ACKNOWLEDGED bulk inserts than with UNACKNOWLEDGED. And it's not just a little faster - I'm seeing a factor of nearly 100! My understanding of the difference between these two write concerns is solely that with ACKNOWLEDGED the client waits for confirmation from the server that the operation has been executed (but not necessarily made durable), while with UNACKNOWLEDGED the client only knows that the request made it out onto the wire. So it would seem preposterous that the former could actually perform at a higher speed, yet that's what I'm seeing. I'm using the Java driver (v2.12.0) with Oracle's Java JDK v1.7.0_71, and mongo version 3.0.0 on 64-bit Windows 7. I'm running mongod, completely out-of-the-box (fresh install), no sharding or anything. And before each test I ensure that the collection is empty and has no non-default indexes. I would appreciate any insight into why I'm consistently seeing the opposite of what I'd expect. Thanks. Here's my code: package test; import com.mongodb.BasicDBObject; import com.mongodb.BulkWriteOperation; import com.mongodb.BulkWriteResult; import com.mongodb.DBCollection; import com.mongodb.DBObject; import com.mongodb.MongoClient; import com.mongodb.ServerAddress; import com.mongodb.WriteConcern; import java.util.Arrays; public class Test { private static final int BATCHES = 100; private static final int BATCH_SIZE = 1000; private static final int COUNT = BATCHES * BATCH_SIZE; public static void main(String[] argv) throws Exception { DBCollection coll = new MongoClient(new ServerAddress()).getDB("test").getCollection("test"); for (String wcName : Arrays.asList("UNACKNOWLEDGED", "ACKNOWLEDGED")) { WriteConcern wc = (WriteConcern) WriteConcern.class.getField(wcName).get(null); coll.dropIndexes(); coll.remove(new BasicDBObject()); long start = System.currentTimeMillis(); BulkWriteOperation bulkOp = coll.initializeUnorderedBulkOperation(); for (int i = 1; i < COUNT; i++) { DBObject doc = new BasicDBObject().append("int", i).append("string", Integer.toString(i)); bulkOp.insert(doc); if (i % BATCH_SIZE == 0) { BulkWriteResult results = bulkOp.execute(wc); if (wc == WriteConcern.ACKNOWLEDGED && results.getInsertedCount() != 1000) { throw new RuntimeException("Bogus insert count: " + results.getInsertedCount()); } bulkOp = coll.initializeUnorderedBulkOperation(); } } long time = System.currentTimeMillis() - start; double rate = COUNT / (time / 1000.0); System.out.printf("%s[w=%s,j=%s]: Inserted %d documents in %s # %f/sec\n", wcName, wc.getW(), wc.getJ(), COUNT, duration(time), rate); } } private static String duration(long msec) { return String.format("%d:%02d:%02d.%03d", msec / (60 * 60 * 1000), (msec % (60 * 60 * 1000)) / (60 * 1000), (msec % (60 * 1000)) / 1000, msec % 1000); } } And here's typical output: UNACKNOWLEDGED[w=0,j=false]: Inserted 100000 documents in 0:01:27.025 # 1149.095088/sec ACKNOWLEDGED[w=1,j=false]: Inserted 100000 documents in 0:00:00.927 # 107874.865156/sec EDIT Ran more extensive tests, per request from Markus W. Mahlberg. For these tests, I ran the code with four write concerns: UNACKNOWLEDGED, ACKNOWLEDGED, JOURNALED, and FSYNCED. (I would expect this order to show decreasing speed.) I ran 112 repetitions, each of which performed 100 batches of 1000 inserts under each of the four write concerns, each time into an empty collection with no indexes. Code was identical to original post but with two additional write concerns, and with output to CSV format for easy analysis. Results summary: UNACKNOWLEDGED: 1147.105004 docs/sec avg, std dev 27.88577035 ACKNOWLEDGED: 77539.27653 docs/sec avg, std dev 1567.520303 JOURNALED: 29574.45243 docs/sec avg, std dev 123.9927554 FSYNCED: 29567.02467 docs/sec avg, std dev 147.6150994 The huge inverted performance difference between UNACKNOWLEDGED and ACKNOWLEDGED is what's got me baffled. Here's the raw data if anyone cares for it ("time" is elapsed msec for 100*1000 insertions; "rate" is docs/second): "UNACK time","UNACK rate","ACK time","ACK rate","JRNL time","JRNL rate","FSYNC time","FSYNC rate" 92815,1077.4120562409094,1348,74183.9762611276,3380,29585.798816568047,3378,29603.31557134399 90209,1108.5368422219512,1303,76745.97083653108,3377,29612.081729345577,3375,29629.62962962963 91089,1097.8273995762386,1319,75815.01137225171,3382,29568.30277942046,3413,29299.73630237328 90159,1109.1516099335618,1320,75757.57575757576,3375,29629.62962962963,3377,29612.081729345577 89922,1112.0749093658949,1315,76045.62737642587,3380,29585.798816568047,3376,29620.853080568722 89997,1111.1481493827573,1306,76569.67840735069,3381,29577.048210588586,3379,29594.55460195324 90141,1109.373093264996,1319,75815.01137225171,3386,29533.372711163614,3378,29603.31557134399 89771,1113.9454835080371,1325,75471.69811320755,3387,29524.65308532625,3521,28401.022436807725 89716,1114.6283828971423,1325,75471.69811320755,3379,29594.55460195324,3379,29594.55460195324 90205,1108.5859985588381,1323,75585.78987150417,3377,29612.081729345577,3376,29620.853080568722 90092,1109.976468498868,1328,75301.2048192771,3382,29568.30277942046,3379,29594.55460195324 89822,1113.3129968159249,1322,75642.965204236,3385,29542.097488921714,3383,29559.562518474726 89821,1113.3253916122064,1310,76335.87786259541,3380,29585.798816568047,3383,29559.562518474726 89945,1111.7905386625162,1318,75872.53414264036,3379,29594.55460195324,3379,29594.55460195324 89917,1112.1367483345753,1352,73964.49704142011,3381,29577.048210588586,3377,29612.081729345577 90358,1106.7088691648773,1303,76745.97083653108,3377,29612.081729345577,3380,29585.798816568047 90187,1108.8072560346836,1348,74183.9762611276,3387,29524.65308532625,3395,29455.081001472754 90634,1103.3387029150208,1322,75642.965204236,3384,29550.827423167848,3381,29577.048210588586 90148,1109.2869503483162,1331,75131.48009015778,3389,29507.22927117144,3381,29577.048210588586 89767,1113.9951207013714,1321,75700.22710068131,3380,29585.798816568047,3382,29568.30277942046 89910,1112.2233344455567,1321,75700.22710068131,3381,29577.048210588586,3385,29542.097488921714 89852,1112.9412812180028,1316,75987.84194528875,3381,29577.048210588586,3401,29403.116730373422 89537,1116.8567184515898,1319,75815.01137225171,3380,29585.798816568047,3380,29585.798816568047 89763,1114.0447623185498,1331,75131.48009015778,3380,29585.798816568047,3382,29568.30277942046 90070,1110.2475852115022,1325,75471.69811320755,3383,29559.562518474726,3378,29603.31557134399 89771,1113.9454835080371,1302,76804.91551459293,3389,29507.22927117144,3378,29603.31557134399 90518,1104.7526458825869,1325,75471.69811320755,3383,29559.562518474726,3380,29585.798816568047 90314,1107.2480457071995,1322,75642.965204236,3380,29585.798816568047,3384,29550.827423167848 89874,1112.6688474976079,1329,75244.54477050414,3386,29533.372711163614,3379,29594.55460195324 89954,1111.6793027547415,1318,75872.53414264036,3381,29577.048210588586,3381,29577.048210588586 89903,1112.3099340400208,1325,75471.69811320755,3379,29594.55460195324,3388,29515.9386068477 89842,1113.0651588343983,1314,76103.500761035,3382,29568.30277942046,3377,29612.081729345577 89746,1114.2557885588217,1325,75471.69811320755,3378,29603.31557134399,3385,29542.097488921714 93249,1072.3975592231552,1327,75357.95026375283,3381,29577.048210588586,3377,29612.081729345577 93638,1067.9425019756936,1331,75131.48009015778,3377,29612.081729345577,3392,29481.132075471698 87775,1139.2765593847905,1340,74626.86567164179,3379,29594.55460195324,3378,29603.31557134399 86495,1156.136192843517,1271,78678.20613690009,3375,29629.62962962963,3376,29620.853080568722 85584,1168.442699570013,1276,78369.90595611285,3432,29137.529137529138,3376,29620.853080568722 86648,1154.094728095282,1278,78247.2613458529,3382,29568.30277942046,3411,29316.91586045148 85745,1166.2487608606916,1274,78492.93563579278,3380,29585.798816568047,3363,29735.355337496283 85813,1165.3246011676551,1279,78186.08287724786,3375,29629.62962962963,3376,29620.853080568722 85831,1165.0802157728558,1288,77639.75155279503,3376,29620.853080568722,3377,29612.081729345577 85807,1165.4060857505797,1259,79428.11755361399,3466,28851.702250432772,3375,29629.62962962963 85964,1163.2776511097668,1258,79491.2559618442,3378,29603.31557134399,3378,29603.31557134399 85854,1164.7680946723508,1257,79554.49482895785,3382,29568.30277942046,3375,29629.62962962963 85787,1165.6777833471272,1257,79554.49482895785,3377,29612.081729345577,3377,29612.081729345577 85537,1169.084723569917,1272,78616.35220125786,3377,29612.081729345577,3377,29612.081729345577 85408,1170.8505058074186,1271,78678.20613690009,3375,29629.62962962963,3425,29197.080291970804 85577,1168.5382754712132,1261,79302.14115781126,3378,29603.31557134399,3375,29629.62962962963 85663,1167.365140142185,1261,79302.14115781126,3377,29612.081729345577,3378,29603.31557134399 85812,1165.3381811401669,1273,78554.59544383347,3377,29612.081729345577,3378,29603.31557134399 85783,1165.7321380693145,1273,78554.59544383347,3377,29612.081729345577,3376,29620.853080568722 85682,1167.106276697556,1280,78125.0,3381,29577.048210588586,3376,29620.853080568722 85753,1166.1399601180133,1260,79365.07936507936,3379,29594.55460195324,3377,29612.081729345577 85573,1168.5928972923703,1332,75075.07507507507,3377,29612.081729345577,3377,29612.081729345577 86206,1160.0120641254668,1263,79176.56373713381,3376,29620.853080568722,3383,29559.562518474726 85593,1168.31983923919,1264,79113.92405063291,3380,29585.798816568047,3378,29603.31557134399 85903,1164.1036983574495,1261,79302.14115781126,3378,29603.31557134399,3377,29612.081729345577 85516,1169.3718134618082,1277,78308.53563038372,3375,29629.62962962963,3376,29620.853080568722 85553,1168.8660830128692,1291,77459.3338497289,3490,28653.295128939826,3377,29612.081729345577 85550,1168.907071887785,1293,77339.52049497294,3379,29594.55460195324,3379,29594.55460195324 85610,1168.0878402055835,1298,77041.60246533128,3384,29550.827423167848,3378,29603.31557134399 85522,1169.2897733916418,1267,78926.59826361484,3379,29594.55460195324,3379,29594.55460195324 85595,1168.2925404521293,1276,78369.90595611285,3379,29594.55460195324,3376,29620.853080568722 85451,1170.2613193526115,1286,77760.49766718507,3376,29620.853080568722,3391,29489.82601002654 85792,1165.609847071988,1252,79872.20447284346,3382,29568.30277942046,3376,29620.853080568722 86501,1156.0559993526085,1255,79681.2749003984,3379,29594.55460195324,3379,29594.55460195324 85718,1166.616113301757,1269,78802.20646178094,3382,29568.30277942046,3376,29620.853080568722 85605,1168.156065650371,1265,79051.38339920949,3378,29603.31557134399,3380,29585.798816568047 85398,1170.9876109510762,1274,78492.93563579278,3377,29612.081729345577,3395,29455.081001472754 86370,1157.809424568716,1273,78554.59544383347,3376,29620.853080568722,3376,29620.853080568722 85905,1164.0765962400326,1280,78125.0,3379,29594.55460195324,3379,29594.55460195324 86020,1162.5203441060219,1285,77821.01167315176,3375,29629.62962962963,3376,29620.853080568722 85726,1166.5072440099852,1272,78616.35220125786,3380,29585.798816568047,3380,29585.798816568047 85628,1167.8422945765403,1270,78740.15748031496,3379,29594.55460195324,3376,29620.853080568722 85989,1162.93944574306,1258,79491.2559618442,3376,29620.853080568722,3378,29603.31557134399 85981,1163.047650062223,1276,78369.90595611285,3376,29620.853080568722,3376,29620.853080568722 86558,1155.2947156819703,1269,78802.20646178094,3385,29542.097488921714,3378,29603.31557134399 85745,1166.2487608606916,1293,77339.52049497294,3378,29603.31557134399,3375,29629.62962962963 85544,1168.9890582624148,1266,78988.94154818325,3376,29620.853080568722,3377,29612.081729345577 85536,1169.0983913206135,1268,78864.35331230283,3380,29585.798816568047,3380,29585.798816568047 85477,1169.9053546568082,1278,78247.2613458529,3388,29515.9386068477,3377,29612.081729345577 85434,1170.4941826439124,1253,79808.45969672786,3378,29603.31557134399,3375,29629.62962962963 85609,1168.1014846569872,1276,78369.90595611285,3364,29726.516052318668,3376,29620.853080568722 85740,1166.316771635176,1258,79491.2559618442,3377,29612.081729345577,3377,29612.081729345577 85640,1167.6786548341897,1266,78988.94154818325,3378,29603.31557134399,3377,29612.081729345577 85648,1167.569587147394,1281,78064.012490242,3378,29603.31557134399,3376,29620.853080568722 85697,1166.9019919017,1287,77700.0777000777,3377,29612.081729345577,3378,29603.31557134399 85696,1166.9156086631815,1256,79617.83439490446,3379,29594.55460195324,3376,29620.853080568722 85782,1165.7457275419085,1258,79491.2559618442,3379,29594.55460195324,3379,29594.55460195324 85837,1164.9987767512844,1264,79113.92405063291,3379,29594.55460195324,3376,29620.853080568722 85632,1167.7877428998504,1278,78247.2613458529,3380,29585.798816568047,3459,28910.089621277824 85517,1169.3581393173288,1256,79617.83439490446,3379,29594.55460195324,3380,29585.798816568047 85990,1162.925921618793,1302,76804.91551459293,3380,29585.798816568047,3377,29612.081729345577 86690,1153.535586572846,1281,78064.012490242,3375,29629.62962962963,3381,29577.048210588586 86045,1162.1825788831425,1274,78492.93563579278,3380,29585.798816568047,3383,29559.562518474726 86146,1160.820003250296,1274,78492.93563579278,3382,29568.30277942046,3418,29256.87536571094 86027,1162.4257500552153,1280,78125.0,3382,29568.30277942046,3381,29577.048210588586 85992,1162.8988743138896,1281,78064.012490242,3376,29620.853080568722,3380,29585.798816568047 85857,1164.727395553071,1288,77639.75155279503,3382,29568.30277942046,3376,29620.853080568722 85853,1164.7816616775185,1284,77881.6199376947,3375,29629.62962962963,3374,29638.41138114997 86069,1161.8585088707896,1295,77220.07722007722,3378,29603.31557134399,3378,29603.31557134399 85842,1164.930919596468,1296,77160.49382716049,3378,29603.31557134399,3376,29620.853080568722 86195,1160.160102094089,1301,76863.95080707148,3376,29620.853080568722,3379,29594.55460195324 85523,1169.2761011657683,1305,76628.35249042146,3376,29620.853080568722,3378,29603.31557134399 85752,1166.1535591006625,1275,78431.37254901961,3374,29638.41138114997,3377,29612.081729345577 85441,1170.3982865369085,1286,77760.49766718507,3377,29612.081729345577,3380,29585.798816568047 85566,1168.6884977678048,1265,79051.38339920949,3377,29612.081729345577,3380,29585.798816568047 85523,1169.2761011657683,1267,78926.59826361484,3377,29612.081729345577,3376,29620.853080568722 86152,1160.7391586962578,1285,77821.01167315176,3374,29638.41138114997,3378,29603.31557134399 85684,1167.0790345922226,1272,78616.35220125786,3378,29603.31557134399,3384,29550.827423167848 86252,1159.3934053703103,1271,78678.20613690009,3376,29620.853080568722,3377,29612.081729345577