// Path: src/main/java/pl/sdadas/fsbrowser/utils/FileSystemUtils.java
// public class FileSystemUtils {
// 
//     public static boolean isSameFileSystem(FsConnection first, FsConnection second) {
//         String firstName = getDefaultFs(first);
//         String secondName = getDefaultFs(second);
//         return StringUtils.equals(firstName, secondName);
//     }
// 
//     public static String getDefaultFs(FsConnection connection) {
//         Configuration config = connection.getConfig();
//         return ObjectUtils.firstNonNull(config.get("fs.defaultFS"), config.get("fs.default.name"));
//     }
// 
//     public static String formatByteCount(long bytes) {
//         return formatByteCount(bytes, false);
//     }
// 
//     public static String formatByteCount(long bytes, boolean si) {
//         int unit = getMetricUnit(si);
//         if (bytes < unit) return bytes + " B";
//         int exp = (int) (Math.log(bytes) / Math.log(unit));
//         String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "i" : "");
//         return String.format("%.2f %sB", bytes / Math.pow(unit, exp), pre);
//     }
// 
//     public static boolean checkNativeLibraries() {
//         if(Shell.WINDOWS && StringUtils.isBlank(Shell.WINUTILS)) {
//             return false;
//         }
//         return true;
//     }
// 
//     public static boolean isParentPath(Path parent, Path child) {
//         String parentPath = parent.toUri().getPath();
//         String childPath = child.toUri().getPath();
//         return childPath.startsWith(parentPath);
//     }
// 
//     public static String[] pathsToStrings(Path... paths) {
//         return Arrays.stream(paths).map(path -> path.toUri().getPath()).toArray(String[]::new);
//     }
// 
//     private static int getMetricUnit(boolean si) {
//         return si ? 1000 : 1024;
//     }
// 
//     private FileSystemUtils() {
//     }
// }
// 
// Path: src/main/java/pl/sdadas/fsbrowser/utils/IconFactory.java
// public final class IconFactory {
// 
//     private final static Map<String, Icon> ICONS = new HashMap<String, Icon>();
// 
//     public static Icon getIcon(String name) {
//         Icon icon = ICONS.get(name);
//         if(icon == null) {
//             Image image = getImageResource(String.format("icons/%s.png", name));
//             icon = new ImageIcon(image);
//             ICONS.put(name, icon);
//         }
//         return icon;
//     }
// 
//     public static Image getImageResource(String classpath) {
//         InputStream is = IconFactory.class.getClassLoader().getResourceAsStream(classpath);
//         try {
//             byte[] bytes = IOUtils.toByteArray(is);
//             Toolkit toolkit = Toolkit.getDefaultToolkit();
//             return toolkit.createImage(bytes);
//         } catch (IOException e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     private IconFactory() {
//     }
// }


import com.google.common.primitives.Longs;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import pl.sdadas.fsbrowser.utils.FileSystemUtils;
import pl.sdadas.fsbrowser.utils.IconFactory;
import javax.swing.*;
        }

        public long getTimestamp() {
            return timestamp;
        }

        @Override
        public String toString() {
            return DateFormatUtils.format(timestamp, "dd-MM-yyyy HH:mm:ss");
        }

        @Override
        public int compareTo(FileTimestamp other) {
            return Longs.compare(this.timestamp, other.timestamp);
        }
    }

    public static class FileSize implements Comparable<FileSize> {

        private final long size;

        public FileSize(long size) {
            this.size = size;
        }

        public long getSize() {
            return size;
        }

        @Override
// Path: src/main/java/pl/sdadas/fsbrowser/utils/FileSystemUtils.java
// public class FileSystemUtils {
// 
//     public static boolean isSameFileSystem(FsConnection first, FsConnection second) {
//         String firstName = getDefaultFs(first);
//         String secondName = getDefaultFs(second);
//         return StringUtils.equals(firstName, secondName);
//     }
// 
//     public static String getDefaultFs(FsConnection connection) {
//         Configuration config = connection.getConfig();
//         return ObjectUtils.firstNonNull(config.get("fs.defaultFS"), config.get("fs.default.name"));
//     }
// 
//     public static String formatByteCount(long bytes) {
//         return formatByteCount(bytes, false);
//     }
// 
//     public static String formatByteCount(long bytes, boolean si) {
//         int unit = getMetricUnit(si);
//         if (bytes < unit) return bytes + " B";
//         int exp = (int) (Math.log(bytes) / Math.log(unit));
//         String pre = (si ? "kMGTPE" : "KMGTPE").charAt(exp - 1) + (si ? "i" : "");
//         return String.format("%.2f %sB", bytes / Math.pow(unit, exp), pre);
//     }
// 
//     public static boolean checkNativeLibraries() {
//         if(Shell.WINDOWS && StringUtils.isBlank(Shell.WINUTILS)) {
//             return false;
//         }
//         return true;
//     }
// 
//     public static boolean isParentPath(Path parent, Path child) {
//         String parentPath = parent.toUri().getPath();
//         String childPath = child.toUri().getPath();
//         return childPath.startsWith(parentPath);
//     }
// 
//     public static String[] pathsToStrings(Path... paths) {
//         return Arrays.stream(paths).map(path -> path.toUri().getPath()).toArray(String[]::new);
//     }
// 
//     private static int getMetricUnit(boolean si) {
//         return si ? 1000 : 1024;
//     }
// 
//     private FileSystemUtils() {
//     }
// }
// 
// Path: src/main/java/pl/sdadas/fsbrowser/utils/IconFactory.java
// public final class IconFactory {
// 
//     private final static Map<String, Icon> ICONS = new HashMap<String, Icon>();
// 
//     public static Icon getIcon(String name) {
//         Icon icon = ICONS.get(name);
//         if(icon == null) {
//             Image image = getImageResource(String.format("icons/%s.png", name));
//             icon = new ImageIcon(image);
//             ICONS.put(name, icon);
//         }
//         return icon;
//     }
// 
//     public static Image getImageResource(String classpath) {
//         InputStream is = IconFactory.class.getClassLoader().getResourceAsStream(classpath);
//         try {
//             byte[] bytes = IOUtils.toByteArray(is);
//             Toolkit toolkit = Toolkit.getDefaultToolkit();
//             return toolkit.createImage(bytes);
//         } catch (IOException e) {
//             throw new IllegalStateException(e);
//         }
//     }
// 
//     private IconFactory() {
//     }
// }


// Path: src/main/java/pl/sdadas/fsbrowser/view/filebrowser/FileItem.java
import com.google.common.primitives.Longs;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.builder.CompareToBuilder;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.hadoop.fs.FileStatus;
import org.apache.hadoop.fs.Path;
import pl.sdadas.fsbrowser.utils.FileSystemUtils;
import pl.sdadas.fsbrowser.utils.IconFactory;
import javax.swing.*;

        }

        public long getTimestamp() {
            return timestamp;
        }

        @Override
        public String toString() {
            return DateFormatUtils.format(timestamp, "dd-MM-yyyy HH:mm:ss");
        }

        @Override
        public int compareTo(FileTimestamp other) {
            return Longs.compare(this.timestamp, other.timestamp);
        }
    }

    public static class FileSize implements Comparable<FileSize> {

        private final long size;

        public FileSize(long size) {
            this.size = size;
        }

        public long getSize() {
            return size;
        }

        @Override
        public String toString() {