doortts doortts 2017-01-11
attachment: Show user's all attachment files
Now, user can see their all attachment files
in My File menu.

Now, user can see their own attachment files.
It is experimental feature.

Icons files are derived from https://github.com/file-icons/atom

Caveat:
Mobile view isn't refined yet.
@7b48ed3d78c7765e35c30620612c4f35e22a09c5
 
app/assets/stylesheets/filetype.less (added)
+++ app/assets/stylesheets/filetype.less
@@ -0,0 +1,3 @@
+@import "less/font/colours.less";
+@import "less/font/fonts.less";
+@import "less/font/icons.less";
app/assets/stylesheets/less/_page.less
--- app/assets/stylesheets/less/_page.less
+++ app/assets/stylesheets/less/_page.less
@@ -6525,3 +6525,75 @@
         }
     }
 }
+
+.attachment-files {
+    .attachment-files-header {
+        font-size: 16px;
+        font-weight: bold;
+        text-align: center;
+        padding: 10px 5px;
+        background-color: #f1f1f1;
+        border-radius: 5px;
+        margin-bottom: 10px;
+        margin-left: auto !important;
+        .header-preview {
+            margin-left: auto;
+        }
+        .header-file-name {
+            text-align: center;
+        }
+        .header-size {
+            text-align: right;
+        }
+        .header-location {
+            text-align: center;
+        }
+    }
+    .attachment-file-detail {
+        padding: 5px;
+        font-family: @fixed-font-family;
+        line-height: 30px;
+        border-bottom: 1px solid #eee;
+        margin-left: auto !important;
+        .file-preview {
+            max-height: 80px;
+            overflow: hidden;
+            margin-left: auto;
+            img {
+                border: 1px solid #333;
+                max-width: 140px;
+                box-sizing: border-box;
+            }
+        }
+        .file-name {
+            font-size: 14px;
+            .icon:before {
+                padding-right: 5px;
+            }
+        }
+        .file-size {
+            text-align: right;
+        }
+        .file-download {
+            font-size: 16px;
+            text-align: center;
+        }
+        .file-date {
+            text-align: right;
+        }
+
+        .file-location {
+            text-align: center;
+        }
+    }
+    .hover {
+        background-color: #f1f1f1;
+    }
+}
+
+.user-file-search {
+    margin-bottom: 10px;
+    input {
+        width: 100% !important;
+    }
+}
app/assets/stylesheets/less/_reponsive.less
--- app/assets/stylesheets/less/_reponsive.less
+++ app/assets/stylesheets/less/_reponsive.less
@@ -393,6 +393,26 @@
 }
 
 @media all and (max-width:1199px){
+    .attachment-files {
+        .attachment-files-header {
+            .header-file-name {
+                max-width: 200px;
+            }
+            .header-size {
+                max-width: 80px;
+            }
+        }
+        .attachment-file-detail {
+            .file-name {
+                max-width: 200px;
+                font-size: 12px;
+                word-break: break-all;
+            }
+            .file-size {
+                max-width: 80px;
+            }
+        }
+    }
     .unsupported {
         width: 100%;
         max-width: 1199px;
 
app/assets/stylesheets/less/font/colours.less (added)
+++ app/assets/stylesheets/less/font/colours.less
@@ -0,0 +1,135 @@
+/*============================================================================*
+	PALETTE	
+	Base16 colours from https://github.com/chriskempson/base16
+/*============================================================================*/
+
+@adjust-tone: 15%;
+
+@red:     #ac4142;
+@green:   #90a959;
+@yellow:  #f4bf75;
+@blue:    #6a9fb5;
+@maroon:  #8f5536;
+@purple:  #aa759f;
+@orange:  #d28445;
+@cyan:    #75b5aa;
+@pink:    #ff00cc;
+
+
+// Red
+@medium-red: @red;
+@light-red: lighten(@red, @adjust-tone);
+@dark-red:   darken(@red, @adjust-tone);
+
+// Green
+@medium-green: @green;
+@light-green: lighten(@green, @adjust-tone);
+@dark-green:   darken(@green, @adjust-tone);
+
+// Yellow
+@medium-yellow: @yellow;
+@light-yellow: lighten(@yellow, @adjust-tone);
+@dark-yellow:   darken(@yellow, @adjust-tone);
+
+// Blue
+@medium-blue: @blue;
+@light-blue: lighten(@blue, @adjust-tone);
+@dark-blue:   darken(@blue, @adjust-tone);
+
+// Maroon
+@medium-maroon: @maroon;
+@light-maroon: lighten(@maroon, @adjust-tone);
+@dark-maroon:   darken(@maroon, @adjust-tone);
+
+// Purple
+@medium-purple: @purple;
+@light-purple: lighten(@purple, @adjust-tone);
+@dark-purple:   darken(@purple, @adjust-tone);
+
+// Orange
+@medium-orange: @orange;
+@light-orange: lighten(@orange, @adjust-tone);
+@dark-orange:   darken(@orange, @adjust-tone);
+
+// Cyan
+@medium-cyan: @cyan;
+@light-cyan: lighten(@cyan, @adjust-tone);
+@dark-cyan:   darken(@cyan, @adjust-tone);
+
+// Pink
+@medium-pink: @pink;
+@light-pink: lighten(@pink, @adjust-tone);
+@dark-pink:   darken(@pink, @adjust-tone);
+
+
+
+/*============================================================================*
+	CSS CLASSES
+/*============================================================================*/
+@theme-colour: #FFF;
+
+
+// Darken certain shades that're too bright in light-coloured themes
+.darken-if-needed(@colour, @amount: 25%)
+	when (lightness(@theme-colour) >= 50%) {
+		color: darken(@colour, @amount);
+	}
+
+.darken-if-needed(@colour, @amount: 25%)
+	when (lightness(@theme-colour) < 50%) {
+		color: @colour;
+	}
+
+
+// Same as above, except consider all logic inverted
+.brighten-if-needed(@colour, @amount: 25%)
+	when (lightness(@theme-colour) < 50%) {
+		color: saturate(lighten(@colour, @amount), @amount);
+	}
+.brighten-if-needed(@colour, @amount: 25%)
+	when (lightness(@theme-colour) >= 50%) {
+		color: @colour;
+	}
+
+
+.light-red:before     { color: @light-red; }
+.medium-red:before    { color: @medium-red; }
+.dark-red:before      { .brighten-if-needed(@dark-red, 15%); }
+
+.light-green:before   { .darken-if-needed(@light-green, 5%); }
+.medium-green:before  { color: @medium-green; }
+.dark-green:before    { color: @dark-green; }
+
+.light-yellow:before  { color: @light-yellow; }
+.medium-yellow:before { .darken-if-needed(@medium-yellow, 15%); }
+.dark-yellow:before   { .darken-if-needed(@dark-yellow, 10%); }
+
+.light-blue:before    { .darken-if-needed(@light-blue, 18%); }
+.medium-blue:before   { color: @medium-blue; }
+.dark-blue:before     { color: @dark-blue; }
+
+.light-maroon:before  { color: @light-maroon; }
+.medium-maroon:before { color: @medium-maroon; }
+.dark-maroon:before   { .brighten-if-needed(@dark-maroon, 8%); }
+
+.light-purple:before  { color: @light-purple; }
+.medium-purple:before { color: @medium-purple; }
+.dark-purple:before   { color: @dark-purple; }
+
+.light-orange:before  { .darken-if-needed(@light-orange, 8%); }
+.medium-orange:before { color: @medium-orange; }
+.dark-orange:before   { color: @dark-orange; }
+
+.light-cyan:before    { .darken-if-needed(@light-cyan, 18%); }
+.medium-cyan:before   { color: @medium-cyan; }
+.dark-cyan:before     { color: @dark-cyan; }
+
+.light-pink:before    { color: @light-pink; }
+.medium-pink:before   { color: @medium-pink; }
+.dark-pink:before     { .brighten-if-needed(@dark-pink, 5%); }
+
+
+// Utility class to provide JavaScript with a reliable brightness indicator
+.theme-colour-check{
+	background: @theme-colour;
+}
 
app/assets/stylesheets/less/font/fonts.less (added)
+++ app/assets/stylesheets/less/font/fonts.less
@@ -0,0 +1,38 @@
+@font-face {
+	font-family: FontAwesome;
+	font-weight: normal;
+	font-style: normal;
+	src: url("filetype/fontawesome.woff2");
+}
+
+@font-face {
+	font-family: Octicons Regular;
+	font-weight: normal;
+	font-style: normal;
+	src: url("filetype/octicons.woff2");
+}
+
+@font-face {
+	font-family: Mfizz;
+	src: url("filetype/mfixx.woff2");
+	font-weight: normal;
+	font-style: normal;
+}
+
+@font-face {
+	font-family: Devicons;
+	src: url("filetype/devopicons.woff2");
+	font-weight: normal;
+	font-style: normal;
+}
+
+
+// Package-specific font for custom icon additions
+@custom-font-path: "filetype/file-icons.woff2";
+
+@font-face {
+	font-family: file-icons;
+	src: url(@custom-font-path);
+	font-weight: normal;
+	font-style: normal;
+}
 
app/assets/stylesheets/less/font/icons.less (added)
+++ app/assets/stylesheets/less/font/icons.less
@@ -0,0 +1,534 @@
+/*============================================================================*
+  This file is borrowed from https://github.com/file-icons/atom
+/*============================================================================*/
+.icon:before{
+	font-weight: normal;
+	font-style: normal;
+	text-align: center;
+	width: 16px;
+	line-height: 1;
+	position: relative;
+	display: inline-block;
+	-webkit-font-smoothing: antialiased;
+}
+
+// Tweak Atom's default icon classes
+.header > .icon-repo:before            { top: 1px; text-align: left; }
+.header > .icon-file-directory:before  { top: 1px }
+
+// Avoid enforcing fixed-width icons in tabs
+.tab > .icon:before { width: auto; }
+
+// Turn off antialiasing for Mac OS
+.thicken{
+	-webkit-font-smoothing: subpixel-antialiased;
+}
+
+// Accentuate an icon's edges
+.sharpen{
+	text-shadow: 0 0 0;
+}
+
+
+
+/*============================================================================*
+  Octicons
+  https://github.com/github/octicons
+  https://gist.github.com/Riske/6d4f84c1402b7f15942e
+/*============================================================================*/
+.octicons { font-family: "Octicons Regular"; font-size: 18px; top: 1px; }
+
+.binary-icon:before       { .octicons; content: "\f094"; }
+.book-icon:before         { .octicons; content: "\f007"; }
+.brew-icon:before         { .octicons; content: "\f069"; font-size: 15px; left: 1px; }
+.checklist-icon:before    { .octicons; content: "\f076"; font-size: 17px; left: 1px; }
+.code-icon:before         { .octicons; content: "\f05f"; }
+.database-icon:before     { .octicons; content: "\f096"; }
+.gear-icon:before         { .octicons; content: "\f02f"; }
+.git-commit-icon:before   { .octicons; content: "\f01f"; }
+.git-merge-icon:before    { .octicons; content: "\f023"; }
+.github-icon:before       { .octicons; content: "\f00a"; }
+.graph-icon:before        { .octicons; content: "\f043"; }
+.image-icon:before        { .octicons; content: "\f012"; }
+.key-icon:before          { .octicons; content: "\f049"; }
+.link-icon:before         { .octicons; content: "\f0b0"; }
+.markdown-icon:before     { .octicons; content: "\f0c9"; }
+.package-icon:before      { .octicons; content: "\f0c4"; }
+.ruby-icon:before         { .octicons; content: "\f047"; }
+.secret-icon:before       { .octicons; content: "\f08c"; }
+.squirrel-icon:before     { .octicons; content: "\f0b2"; font-size: 15px; }
+.text-icon:before         { .octicons; content: "\f011"; }
+.video-icon:before        { .octicons; content: "\f057"; font-size: 14px;}
+.zip-icon:before          { .octicons; content: "\f013"; }
+
+
+
+
+/*============================================================================*
+  FontAwesome
+  http://fortawesome.github.io/Font-Awesome/cheatsheet
+/*============================================================================*/
+.fa { font-family: FontAwesome; font-size: 13px; }
+
+.android-icon:before      { .fa; content: "\f17b"; font-size: 16px; top: 1px; }
+.at-icon:before           { .fa; content: "\f1fa"; font-size: 15px; top: 1px; }
+.audio-icon:before        { .fa; content: "\f028"; font-size: 15px; top: 1px; }
+.bullhorn-icon:before     { .fa; content: "\f0a1"; font-size: 16px; top: 2px; }
+.calc-icon:before         { .fa; content: "\f1ec"; font-size: 14px; }
+.coffee-icon:before       { .fa; content: "\f0f4"; font-size: 14px; top: 1px; }
+.css3-icon:before         { .fa; content: "\f13c"; top: 0; }
+.circle-icon:before       { .fa; content: "\f111"; font-size: 16px; top: 1px; }
+.earth-icon:before        { .fa; content: "\f0ac"; font-size: 15px; }
+.gears-icon:before        { .fa; content: "\f085"; font-size: 15px; }
+.html5-icon:before        { .fa; content: "\f13b"; font-size: 15px; top: 1px; }
+.mobile-icon:before       { .fa; content: "\f10b"; font-size: 20px; top: 2px; }
+.moon-icon:before         { .fa; content: "\f186"; font-size: 16px; top: 1px; }
+.music-icon:before        { .fa; content: "\f001"; font-size: 15px; }
+.print-icon:before        { .fa; content: "\f02f"; font-size: 15px; top: 2px; }
+.recycle-icon:before      { .fa; content: "\f1b8"; font-size: 15px; top: 2px; }
+.rss-icon:before          { .fa; content: "\f143"; font-size: 16px; top: 2px; }
+.smarty-icon:before       { .fa; content: "\f0eb"; font-size: 15px; }
+.sourcemap-icon:before    { .fa; content: "\f279"; font-size: 14px; }
+.sun-icon:before          { .fa; content: "\f185"; font-size: 14px; .thicken; }
+.toc-icon:before          { .fa; content: "\f03a"; font-size: 15px; top: 2px; }
+.twig-icon:before         { .fa; content: "\f1bb"; font-size: 14px; }
+.pdf-icon:before 		  { .fa; content: "\f1c1"; font-size: 16px; left: -1px; }
+
+
+
+/*============================================================================*
+  Mfizz
+  http://mfizz.com/oss/font-mfizz
+/*============================================================================*/
+.mf { font-family: Mfizz; font-size: 14px; }
+
+.apache-icon:before       { .mf; content: "\f102"; top: 3px; font-size: 15px; }
+.archlinux-icon:before    { .mf; content: "A";     top: 1px; font-size: 15px; }
+.c-icon:before            { .mf; content: "\f106"; top: 1px; font-size: 13px; }
+.cpp-icon:before          { .mf; content: "\f10b"; top: 1px; }
+.csharp-icon:before       { .mf; content: "\f10c"; top: 1px; }
+.debian-icon:before       { .mf; content: "\f111"; top: 1px; }
+.elixir-icon:before       { .mf; content: "\f113"; top: 1px; }
+.gnome-icon:before        { .mf; content: "\f119"; top: 1px; }
+.haskell-icon:before      { .mf; content: "\f121"; top: 2px; font-size: 16px; }
+.js-icon:before           { .mf; content: "\f129"; top: 1px; font-size: 14px; }
+.msql-icon:before         { .mf; content: "\f136"; top: 2px; font-size: 15px; .sharpen; }
+.objc-icon:before         { .mf; content: "\f13e"; top: 2px; font-size: 16px; }
+.osx-icon:before          { .mf; content: "\f141"; top: 1px; }
+.perl-icon:before         { .mf; content: "\f142"; top: 1px; }
+.python-icon:before       { .mf; content: "\f14c"; top: 1px; }
+.red-hat-icon:before      { .mf; content: "\f14e"; top: 2px; }
+.scala-icon:before        { .mf; content: "\f154"; top: 1px; }
+.sql-icon:before          { .mf; content: "\f10e"; top: 1px; }
+.svg-icon:before          { .mf; content: "\f15c"; top: 1px; }
+.tt-icon:before           { .mf; content: "TT";    }
+.x11-icon:before          { .mf; content: "\f16e"; top: 1px; font-size: 13px; }
+
+
+
+/*============================================================================*
+  Devicons
+  http://vorillaz.github.io/devicons
+/*============================================================================*/
+.devicons { font-family: Devicons; font-size: 16px; top: 3px; }
+
+.angular-icon:before      { .devicons; content: "\e653"; }
+.appcelerator-icon:before { .devicons; content: "\e6ab"; }
+.appstore-icon:before     { .devicons; content: "\e613"; }
+.asp-icon:before          { .devicons; content: "\e67f"; }
+.atom-icon:before         { .devicons; content: "\e664"; .thicken; }
+.backbone-icon:before     { .devicons; content: "\e652"; }
+.bootstrap-icon:before    { .devicons; content: "\e647"; font-size: 15px; top: 2px; }
+.bower-icon:before        { .devicons; content: "\e64d"; .sharpen; }
+.chrome-icon:before       { .devicons; content: "\e643"; }
+.clojure-icon:before      { .devicons; content: "\e668"; .thicken; }
+.compass-icon:before      { .devicons; content: "\e661"; font-size: 14px; top: 2px; }
+.dart-icon:before         { .devicons; content: "\e698"; font-size: 15px; top: 2px; }
+.dlang-icon:before        { .devicons; content: "\e6af"; }
+.dojo-icon:before         { .devicons; content: "\e61c"; font-size: 16px; top: 4px; transform: scale(1.2); .thicken; }
+.dropbox-icon:before      { .devicons; content: "\e607"; }
+.eclipse-icon:before      { .devicons; content: "\e69e"; }
+.erlang-icon:before       { .devicons; content: "\e6b1"; }
+.extjs-icon:before        { .devicons; content: "\e68e"; }
+.fsharp-icon:before       { .devicons; content: "\e6a7"; left: 1px; top: 2px; }
+.git-icon:before          { .devicons; content: "\e602"; font-size: 15px; top: 2px; }
+.heroku-icon:before       { .devicons; content: "\e67b"; }
+.jquery-icon:before       { .devicons; content: "\e650"; font-size: 15px; top: 2px; }
+.jqueryui-icon:before     { .devicons; content: "\e654"; font-size: 15px; top: 2px; }
+.laravel-icon:before      { .devicons; content: "\e63f"; .thicken; }
+.materialize-icon:before  { .devicons; content: "\e6b6"; transform: scale(1.2); .thicken; }
+.modernizr-icon:before    { .devicons; content: "\e620"; }
+.mootools-icon:before     { .devicons; content: "\e68f"; .sharpen; }
+.node-icon:before         { .devicons; content: "\e618"; }
+.pod-icon:before          { .devicons; content: "\e669"; font-size: 15px; top: 2px; }
+.prolog-icon:before       { .devicons; content: "\e6a1"; }
+.rails-icon:before        { .devicons; content: "\e63b"; }
+.raphael-icon:before      { .devicons; content: "\e65f"; font-size: 15px; }
+.requirejs-icon:before    { .devicons; content: "\e670"; }
+.rust-icon:before         { .devicons; content: "\e6a8"; }
+.sass-icon:before         { .devicons; content: "\e64b"; }
+.sencha-icon:before       { .devicons; content: "\e68c"; }
+.snapsvg-icon:before      { .devicons; content: "\e65e"; }
+.swift-icon:before        { .devicons; content: "\e655"; left: -1px; }
+.travis-icon:before       { .devicons; content: "\e67e"; font-size: 15px; top: 2px; }
+.uikit-icon:before        { .devicons; content: "\e673"; font-size: 15px; top: 2px; }
+.unity3d-icon:before      { .devicons; content: "\e621"; }
+.vim-icon:before          { .devicons; content: "\e6c5"; }
+.vs-icon:before           { .devicons; content: "\e60c"; font-size: 14px; top: 2px; }
+.windows-icon:before      { .devicons; content: "\e60f"; font-size: 14px; top: 2px; }
+.yeoman-icon:before       { .devicons; content: "\e67a"; }
+
+
+
+
+/*============================================================================*
+  Custom file icons
+  See https://github.com/file-icons/source/#adding-new-icons
+/*============================================================================*/
+.fi { font-family: file-icons; font-size: 15px; }
+
+._1c-icon:before           { .fi; content: "\a5ea"; top: 3px; font-size: 16px; }
+._1c-alt-icon:before       { .fi; content: "\ea28"; top: 3px; font-size: 16px; }
+.abap-icon:before          { .fi; content: "\e92b"; top: 2px; }
+.access-icon:before        { .fi; content: "\e9ea"; top: 2px; }
+.ada-icon:before           { .fi; content: "\e90b"; top: 3px; font-size: 17px; }
+.ae-icon:before            { .fi; content: "\e9f3"; top: 2px; }
+.ahk-icon:before           { .fi; content: "\e932"; top: 2px; }
+.ai-icon:before            { .fi; content: "\e6b4"; top: 2px; }
+.alloy-icon:before         { .fi; content: "\e935"; top: 2px; }
+.alpine-icon:before        { .fi; content: "\e9ff"; top: 2px; font-size: 16px; }
+.ampl-icon:before          { .fi; content: "\e94e"; top: 3px; font-size: 16px; left: 1px; }
+.amx-icon:before           { .fi; content: "\e99b"; top: 3px; font-size: 16px; }
+.ant-icon:before           { .fi; content: "\e93e"; top: 4px; font-size: 18px; transform: scale(1.1); }
+.antlr-icon:before         { .fi; content: "\e92c"; top: 3px; }
+.api-icon:before           { .fi; content: "\e92d"; top: 2px; }
+.apl-icon:before           { .fi; content: "\234b"; top: 2px; }
+.apple-icon:before         { .fi; content: "\e925"; top: 1px; }
+.appveyor-icon:before      { .fi; content: "\e923"; top: 2px; }
+.arc-icon:before           { .fi; content: "\e92f"; top: 2px; }
+.arduino-icon:before       { .fi; content: "\e930"; top: 3px; font-size: 16px; }
+.arttext-icon:before       { .fi; content: "\24d0"; top: 2px; }
+.as-icon:before            { .fi; content: "\e92e"; top: 1px; font-size: 14px; }
+.asciidoc-icon:before      { .fi; content: "\e918"; top: 1px; font-size: 14px; }
+.ats-icon:before           { .fi; content: "\e934"; top: 2px; }
+.audacity-icon:before      { .fi; content: "\e9f9"; top: 2px; }
+.augeas-icon:before        { .fi; content: "\e931"; top: 2px; }
+.autoit-icon:before        { .fi; content: "\e933"; top: 2px; font-size: 16px; }
+.babel-icon:before         { .fi; content: "\e91f"; top: 2px; left: 1px; }
+.bibtex-icon:before        { .fi; content: "\e601"; top: 2px; font-size: 16px; .thicken; }
+.blender-icon:before       { .fi; content: "\e9fa"; top: 2px; }
+.bluespec-icon:before      { .fi; content: "\e93c"; top: 1px; font-size: 13px; left: 1px; }
+.boo-icon:before           { .fi; content: "\e939"; top: 2px; }
+.boot-icon:before          { .fi; content: "\f103"; top: 2px; font-size: 16px; }
+.brain-icon:before         { .fi; content: "\e93a"; top: 2px; }
+.brakeman-icon:before      { .fi; content: "\e9d6"; top: 2px; }
+.bro-icon:before           { .fi; content: "\e93b"; top: 3px; font-size: 16px; }
+.broccoli-icon:before      { .fi; content: "\e922"; top: 1px; font-size: 14px; }
+.byond-icon:before         { .fi; content: "\e962"; top: 2px; }
+.cabal-icon:before         { .fi; content: "\e9c2"; top: 2px; }
+.cake-icon:before          { .fi; content: "\e9e3"; top: 2px; }
+.cakefile-icon:before      { .fi; content: "\e924"; top: 2px; }
+.cakephp-icon:before       { .fi; content: "\e9d3"; top: 1px; font-size: 14px; }
+.cc-icon:before            { .fi; content: "\e9d5"; top: 2px; font-size: 16px; }
+.ceylon-icon:before        { .fi; content: "\e94f"; top: 2px; }
+.cf-icon:before            { .fi; content: "\e929"; top: 2px; }
+.chai-icon:before          { .fi; content: "c";     top: 3px; font-size: 16px; }
+.chapel-icon:before        { .fi; content: "\e950"; top: 2px; }
+.chartjs-icon:before       { .fi; content: "\ea0b"; top: 2px; }
+.chuck-icon:before         { .fi; content: "\e943"; top: 2px; }
+.circleci-icon:before      { .fi; content: "\ea12"; top: 2px; font-size: 14px; }
+.cirru-icon:before         { .fi; content: "\e951"; top: 2px; .sharpen; }
+.cl-icon:before            { .fi; content: "\e972"; top: 2px; .sharpen; }
+.clarion-icon:before       { .fi; content: "\e952"; top: 1px; font-size: 14px; left: 1px; }
+.clean-icon:before         { .fi; content: "\e95b"; top: 2px; font-size: 16px; }
+.click-icon:before         { .fi; content: "\e95c"; top: 2px; }
+.clips-icon:before         { .fi; content: "\e940"; top: 3px; font-size: 18px; }
+.cljs-icon:before          { .fi; content: "\f104"; top: 2px; }
+.cmake-icon:before         { .fi; content: "\e93f"; top: 1px; font-size: 14px; }
+.codecov-icon:before       { .fi; content: "\2602"; top: 2px; }
+.composer-icon:before      { .fi; content: "\e683"; top: 3px; font-size: 17px; }
+.config-icon:before        { .fi; content: "\f07c"; top: 2px; font-size: 14px; }
+.cordova-icon:before       { .fi; content: "\ea11"; top: 2px; }
+.coq-icon:before           { .fi; content: "\e95f"; top: 2px; font-size: 16px; left: 1px; }
+.cp-icon:before            { .fi; content: "\e942"; top: 3px; font-size: 17px; }
+.creole-icon:before        { .fi; content: "\e95e"; top: 2px; }
+.crystal-icon:before       { .fi; content: "\e902"; top: 2px; left: 1px; }
+.csound-icon:before        { .fi; content: "\e9f0"; top: 2px; }
+.csscript-icon:before      { .fi; content: "\e9e2"; top: 2px; }
+.cucumber-icon:before      { .fi; content: "\f02b"; top: 3px; }
+.cython-icon:before        { .fi; content: "\e963"; top: 2px; }
+.d3-icon:before            { .fi; content: "\ea10"; top: 2px; }
+.darcs-icon:before         { .fi; content: "\e964"; top: 2px; }
+.dashboard-icon:before     { .fi; content: "\f07d"; top: 2px; font-size: 13px; }
+.dbase-icon:before         { .fi; content: "\e9f1"; top: 2px; }
+.default-icon:before       { .fi; content: "\1f5cc";top: 2px; font-size: 14px; }
+.diff-icon:before          { .fi; content: "\e960"; top: 2px; }
+.docker-icon:before        { .fi; content: "\f106"; top: 3px; font-size: 18px; }
+.doxygen-icon:before       { .fi; content: "\e928"; top: 1px; font-size: 13px; }
+.doge-icon:before          { .fi; content: "\e946"; top: 2px; }
+.dyalog-icon:before        { .fi; content: "\e90c"; top: 1px; font-size: 14px; left: 1px; }
+.dylib-icon:before         { .fi; content: "\ea15"; top: 2px; }
+.e-icon:before             { .fi; content: "E";     top: 1px; font-size: 14px; }
+.eagle-icon:before         { .fi; content: "\e965"; top: 2px; }
+.ec-icon:before            { .fi; content: "\e9c9"; top: 2px; }
+.ecere-icon:before         { .fi; content: "\e966"; top: 3px; font-size: 16px; }
+.editorconfig-icon:before  { .fi; content: "\ea1b"; top: 3px; }
+.eiffel-icon:before        { .fi; content: "\e967"; top: 2px; font-size: 16px; }
+.electron-icon:before      { .fi; content: "\ea27"; top: 3px; font-size: 16px; .sharpen; }
+.elm-icon:before           { .fi; content: "\f102"; top: 2px; }
+.em-icon:before            { .fi; content: "\e968"; top: 3px; font-size: 16px; }
+.ember-icon:before         { .fi; content: "\e61b"; top: 2px; font-size: 14px; }
+.emacs-icon:before         { .fi; content: "\e926"; top: 2px; }
+.eq-icon:before            { .fi; content: "\ea0a"; top: 5px; }
+.eslint-icon:before        { .fi; content: "\ea0f"; top: 3px; font-size: 16px; }
+.excel-icon:before         { .fi; content: "\e9ee"; top: 2px; }
+.fabfile-icon:before       { .fi; content: "\e94b"; top: 2px; font-size: 16px; }
+.factor-icon:before        { .fi; content: "\e96a"; top: 3px; font-size: 18px; left: -2px; transform: scale(1.2); }
+.fancy-icon:before         { .fi; content: "\e96b"; top: 2px; font-size: 16px; }
+.fantom-icon:before        { .fi; content: "\e96f"; top: 2px; left: 1px; }
+.fbx-icon:before           { .fi; content: "\e9fc"; top: 2px; }
+.ff-icon:before            { .fi; content: "\fb00"; top: 3px; }
+.finder-icon:before        { .fi; content: "\e9e9"; top: 3px; font-size: 16px; }
+.flow-icon:before          { .fi; content: "\e921"; top: 1px; }
+.flux-icon:before          { .fi; content: "\e969"; top: 2px; }
+.font-icon:before          { .fi; content: "\e90f"; top: 1px; font-size: 14px; left: 1px; }
+.fortran-icon:before       { .fi; content: "\e90a"; top: 1px; font-size: 14px; left: 1px; }
+.freemarker-icon:before    { .fi; content: "\e970"; top: 2px; font-size: 16px; left: 1px; }
+.frege-icon:before         { .fi; content: "\e96e"; top: 2px; font-size: 16px; left: 1px; }
+.fuelux-icon:before        { .fi; content: "\ea09"; top: 3px; font-size: 16px; left: 2px; transform: scale(1.15); .sharpen; }
+.gams-icon:before          { .fi; content: "\e973"; top: 2px; left: 1px; }
+.gap-icon:before           { .fi; content: "\e971"; top: 3px; font-size: 16px; left: 1px; }
+.gdb-icon:before           { .fi; content: "\ea08"; top: 3px; font-size: 16px; transform: scale(1.15); .sharpen; }
+.genshi-icon:before        { .fi; content: "\e976"; top: 3px; }
+.gentoo-icon:before        { .fi; content: "\e96d"; top: 1px; font-size: 14px; left: 1px; }
+.gf-icon:before            { .fi; content: "\e978"; top: 2px; }
+.glade-icon:before         { .fi; content: "\e938"; top: 2px; }
+.glyphs-icon:before        { .fi; content: "G";     top: 3px; }
+.gml-icon:before           { .fi; content: "\e975"; top: 3px; font-size: 16px; }
+.gn-icon:before            { .fi; content: "\ea25"; top: 2px; }
+.gnu-icon:before           { .fi; content: "\e679"; top: 2px; font-size: 16px; .sharpen; }
+.go-icon:before            { .fi; content: "\e624"; top: 3px; }
+.godot-icon:before         { .fi; content: "\e974"; top: 2px; }
+.golo-icon:before          { .fi; content: "\e979"; top: 2px; }
+.gosu-icon:before          { .fi; content: "\e97a"; top: 2px; }
+.gradle-icon:before        { .fi; content: "\e903"; top: 3px; font-size: 16px; left: 1px; }
+.graphql-icon:before       { .fi; content: "\e97c"; top: 2px; }
+.graphviz-icon:before      { .fi; content: "\e97d"; top: 4px; font-size: 17px; left:  1px; }
+.groovy-icon:before        { .fi; content: "\e904"; top: 4px; font-size: 17px; left: -1px; }
+.grunt-icon:before         { .fi; content: "\e611"; top: 1px; font-size: 14px; }
+.gulp-icon:before          { .fi; content: "\e610"; top: 2px; font-size: 16px; }
+.hack-icon:before          { .fi; content: "\e9ce"; top: 2px; }
+.haml-icon:before          { .fi; content: "\f15b"; top: 2px; }
+.harbour-icon:before       { .fi; content: "\e97b"; top: 2px; font-size: 16px; .sharpen; }
+.hashicorp-icon:before     { .fi; content: "\e97e"; top: 2px; }
+.haxe-icon:before          { .fi; content: "\e907"; top: 2px; }
+.hy-icon:before            { .fi; content: "\e97f"; top: 2px; }
+.idl-icon:before           { .fi; content: "\e947"; top: 3px; font-size: 18px; }
+.idris-icon:before         { .fi; content: "\e983"; top: 2px; font-size: 16px; .thicken; }
+.igorpro-icon:before       { .fi; content: "\e980"; top: 2px; font-size: 16px; .thicken; }
+.indesign-icon:before      { .fi; content: "\e9f4"; top: 2px; }
+.inform7-icon:before       { .fi; content: "\e984"; top: 2px; font-size: 16px; .sharpen; }
+.inno-icon:before          { .fi; content: "\e985"; top: 2px; }
+.io-icon:before            { .fi; content: "\e981"; top: 1px; font-size: 13px; .thicken; }
+.ioke-icon:before          { .fi; content: "\e982"; top: 2px; }
+.ionic-icon:before         { .fi; content: "\f14b"; top: 2px; }
+.isabelle-icon:before      { .fi; content: "\e945"; top: 2px; font-size: 16px; }
+.java-icon:before             { .fi; content: "\e937"; top: 1px; font-size: 13px; }
+.j-icon:before             { .fi; content: "\e937"; top: 1px; font-size: 13px; }
+.jade-icon:before          { .fi; content: "\e90d"; top: 1px; font-size: 14px; }
+.jake-icon:before          { .fi; content: "\e948"; top: 3px; font-size: 16px; }
+.jenkins-icon:before       { .fi; content: "\e667"; top: 3px; font-size: 18px; .sharpen; }
+.jinja-icon:before         { .fi; content: "\e944"; top: 2px; }
+.jsonld-icon:before        { .fi; content: "\e958"; top: 3px; font-size: 17px; }
+.jsx-icon:before           { .fi; content: "\e9e6"; top: 1px; font-size: 14px; }
+.julia-icon:before         { .fi; content: "\26ec"; top: 1px; font-size: 14px; }
+.jupyter-icon:before       { .fi; content: "\e987"; top: 3px; font-size: 16px; }
+.karma-icon:before         { .fi; content: "\e9cd"; top: 2px; }
+.keynote-icon:before       { .fi; content: "\e9e5"; top: 2px; }
+.khronos-icon:before       { .fi; content: "\e9f8"; top: 2px; }
+.kivy-icon:before          { .fi; content: "\e901"; top: 2px; }
+.knockout-icon:before      { .fi; content: "\4B";   top: 2px; }
+.kotlin-icon:before        { .fi; content: "\e989"; top: 1px; font-size: 14px; }
+.krl-icon:before           { .fi; content: "\e988"; top: 1px; font-size: 14px; }
+.labview-icon:before       { .fi; content: "\e98a"; top: 2px; font-size: 16px; }
+.lasso-icon:before         { .fi; content: "\e98c"; top: 2px; left: 1px; }
+.leaflet-icon:before       { .fi; content: "\ea07"; top: 2px; }
+.lean-icon:before          { .fi; content: "L";     top: 1px; font-size: 13px; }
+.lein-icon:before          { .fi; content: "\f105"; top: 3px; font-size: 16px; .sharpen; transform: scale(1.15); }
+.lfe-icon:before           { .fi; content: "\e94c"; top: 2px; font-size: 16px; }
+.lightwave-icon:before     { .fi; content: "\e9fb"; top: 2px; }
+.lisp-icon:before          { .fi; content: "\e908"; top: 3px; font-size: 17px; }
+.llvm-icon:before          { .fi; content: "\e91d"; top: 3px; font-size: 17px; }
+.logtalk-icon:before       { .fi; content: "\e98d"; top: 2px; .sharpen; }
+.lookml-icon:before        { .fi; content: "\e98e"; top: 2px; font-size: 16px; .sharpen; }
+.ls-icon:before            { .fi; content: "\e914"; top: 2px; font-size: 14px; }
+.lsl-icon:before           { .fi; content: "\e98b"; top: 1px; }
+.lua-icon:before           { .fi; content: "\e91b"; top: 2px; font-size: 14px; }
+.mako-icon:before          { .fi; content: "\e98f"; top: 4px; font-size: 16px; }
+.mapbox-icon:before        { .fi; content: "\e941"; top: 1px; font-size: 13px; }
+.marko-icon:before         { .fi; content: "\e920"; top: 4px; font-size: 18px; left: -1px; transform: scale(1.05); }
+.mathematica-icon:before   { .fi; content: "\e990"; top: 2px; font-size: 16px; }
+.mathjax-icon:before       { .fi; content: "\ea06"; top: 2px; }
+.matlab-icon:before        { .fi; content: "\e991"; top: 2px; }
+.max-icon:before           { .fi; content: "\e993"; top: 2px; }
+.maxscript-icon:before     { .fi; content: "\e900"; top: 2px; }
+.maya-icon:before          { .fi; content: "\e9f6"; top: 2px; font-size: 16px; }
+.manpage-icon:before       { .fi; content: "\e936"; top: 3px; }
+.mediawiki-icon:before     { .fi; content: "\e954"; top: 2px; font-size: 16px; }
+.mercury-icon:before       { .fi; content: "\e994"; top: 3px; font-size: 16px; transform: scale(1.2); }
+.metal-icon:before         { .fi; content: "M";     top: 1px; left: 1px; }
+.meteor-icon:before        { .fi; content: "\e6a5"; top: 1px; }
+.minecraft-icon:before     { .fi; content: "\e9dc"; top: 2px; }
+.mirah-icon:before         { .fi; content: "\e995"; top: 2px; }
+.mocha-icon:before         { .fi; content: "\26fe"; top: 2px; font-size: 17px; }
+.model-icon:before         { .fi; content: "\e9e8"; top: 2px; font-size: 16px; }
+.modula2-icon:before       { .fi; content: "\e996"; top: 2px; }
+.monkey-icon:before        { .fi; content: "\e997"; top: 3px; font-size: 18px; left: -1px; }
+.mruby-icon:before         { .fi; content: "\ea18"; top: 2px; }
+.mupad-icon:before         { .fi; content: "\e9ca"; top: 3px; font-size: 16px; }
+.mustache-icon:before      { .fi; content: "\e60f"; top: 2px; font-size: 16px; }
+.nant-icon:before          { .fi; content: "\e9e1"; top: 3px; transform: scale(1.2); }
+.neko-icon:before          { .fi; content: "\ea05"; top: 2px; }
+.netlogo-icon:before       { .fi; content: "\e99c"; top: 2px; left: 1px; }
+.newrelic-icon:before      { .fi; content: "\e9d7"; top: 2px; }
+.nginx-icon:before         { .fi; content:"\f146b"; top: 2px; }
+.nib-icon:before           { .fi; content: "\2712"; top: 2px; }
+.nimrod-icon:before        { .fi; content: "\e998"; top: 2px; }
+.nit-icon:before           { .fi; content: "\e999"; top: 2px; }
+.nix-icon:before           { .fi; content: "\e99a"; top: 3px; font-size: 16px; }
+.nmap-icon:before          { .fi; content: "\e94d"; top: 3px; font-size: 16px; transform: scale(1.1); }
+.nodemon-icon:before       { .fi; content: "\ea26"; top: 2px; }
+.normalize-icon:before     { .fi; content: "\ea04"; top: 3px; font-size: 16px; }
+.npm-icon:before           { .fi; content: "\e91c"; top: 3px; font-size: 17px; }
+.nsis-icon:before          { .fi; content: "\ea1e"; top: 3px; font-size: 16px; }
+.numpy-icon:before         { .fi; content: "\e99d"; top: 2px; font-size: 14px; }
+.nuget-icon:before         { .fi; content: "\e9d9"; top: 2px; }
+.nunjucks-icon:before      { .fi; content: "\e953"; top: 2px; font-size: 16px; }
+.nvidia-icon:before        { .fi; content: "\e95d"; top: 2px; }
+.objj-icon:before          { .fi; content: "\e99e"; top: 2px; }
+.ocaml-icon:before         { .fi; content: "\e91a"; top: 1px; font-size: 14px; }
+.onenote-icon:before       { .fi; content: "\e9eb"; top: 2px; }
+.ooc-icon:before           { .fi; content: "\e9cb"; top: 2px; }
+.opa-icon:before           { .fi; content: "\2601"; top: 2px; }
+.opencl-icon:before        { .fi; content: "\e99f"; top: 2px; font-size: 16px; }
+.openoffice-icon:before    { .fi; content: "\e9e4"; top: 2px; }
+.org-icon:before           { .fi; content: "\e917"; top: 1px; font-size: 14px; left: 1px; }
+.owl-icon:before           { .fi; content: "\e957"; top: 2px; }
+.ox-icon:before            { .fi; content: "\e9a1"; top: 3px; font-size: 16px; .sharpen; }
+.oxygene-icon:before       { .fi; content: "\e9bf"; top: 2px; }
+.oz-icon:before            { .fi; content: "\e9be"; top: 2px; }
+.pan-icon:before           { .fi; content: "\e9bd"; top: 2px; }
+.papyrus-icon:before       { .fi; content: "\e9bc"; top: 2px; }
+.parrot-icon:before        { .fi; content: "\e9bb"; top: 3px; font-size: 16px; }
+.pascal-icon:before        { .fi; content: "\e92a"; top: 2px; }
+.patch-icon:before         { .fi; content: "\e961"; top: 2px; }
+.pawn-icon:before          { .fi; content: "\265f"; top: 1px; font-size: 14px; }
+.perl6-icon:before         { .fi; content: "\e96c"; top: 2px; }
+.phalcon-icon:before       { .fi; content: "\e94a"; top: 2px; }
+.php-icon:before           { .fi; content: "\f147"; top: 1px; font-size: 14px; left: 1px; }
+.pickle-icon:before        { .fi; content: "\e9c4"; top: 2px; }
+.pike-icon:before          { .fi; content: "\e9b9"; top: 4px; font-size: 16px; .thicken; transform: scale(1.15); }
+.pogo-icon:before          { .fi; content: "\e9b8"; top: 3px; font-size: 14px; .thicken; }
+.pony-icon:before          { .fi; content: "\e9b7"; top: 3px; font-size: 16px; }
+.pointwise-icon:before     { .fi; content: "\e977"; top: 2px; }
+.postcss-icon:before       { .fi; content: "\e910"; top: 2px; font-size: 14px; }
+.postscript-icon:before    { .fi; content: "\e955"; top: 2px; left: 1px; }
+.povray-icon:before        { .fi; content: "P";     top: 2px; left: 1px; }
+.powerbuilder-icon:before  { .fi; content: "\ea14"; }
+.powerpoint-icon:before    { .fi; content: "\e9ec"; top: 2px; }
+.powershell-icon:before    { .fi; content: "\e9da"; top: 2px; font-size: 16px; }
+.premiere-icon:before      { .fi; content: "\e9f5"; top: 2px; }
+.processing-icon:before    { .fi; content: "\e9a0"; top: 2px; }
+.progress-icon:before      { .fi; content: "\e9c0"; top: 2px; font-size: 16px; transform: scale(1.2); }
+.propeller-icon:before     { .fi; content: "\e9b5"; top: 3px; font-size: 16px; }
+.protractor-icon:before    { .fi; content: "\e9de"; top: 3px; }
+.psd-icon:before           { .fi; content: "\e6b8"; top: 2px; }
+.pug-icon:before           { .fi; content: "\ea13"; top: 3px; font-size: 16px; }
+.pug-alt-icon:before       { .fi; content: "\e9d0"; top: 3px; font-size: 16px; }
+.puppet-icon:before        { .fi; content: "\f0c3"; top: 2px; left: 1px; }
+.purebasic-icon:before     { .fi; content: "\01b5"; top: 2px; }
+.purescript-icon:before    { .fi; content: "\e9b2"; top: 3px; }
+.r-icon:before             { .fi; content: "\e905"; top: 3px; font-size: 17px; }
+.racket-icon:before        { .fi; content: "\e9b1"; top: 2px; left: 1px; }
+.raml-icon:before          { .fi; content: "\e913"; top: 1px; font-size: 14px; }
+.rascal-icon:before        { .fi; content: "\ea24"; top: 2px; }
+.rdoc-icon:before          { .fi; content: "\e9b0"; top: 2px; left: 1px; }
+.react-icon:before         { .fi; content: "\f100"; top: 2px; }
+.rebol-icon:before         { .fi; content: "\e9ae"; top: 1px; font-size: 13px; }
+.reason-icon:before        { .fi; content: "\ea1d"; top: 3px; }
+.red-icon:before           { .fi; content: "\e9ad"; top: 3px; font-size: 16px; }
+.regex-icon:before         { .fi; content: "*";     top: 1px; font-size: 12px; left: 1px; }
+.rexx-icon:before          { .fi; content: "\ea16"; top: 2px; font-size: 14px; left: 1px; }
+.riot-icon:before          { .fi; content: "\e919"; top: 4px; font-size: 18px; }
+.robot-icon:before         { .fi; content: "\e9ac"; top: 2px; font-size: 14px; }
+.rollup-icon:before        { .fi; content: "\ea20"; top: 2px; }
+.rst-icon:before           { .fi; content: "\e9cc"; top: 3px; font-size: 16px; }
+.sage-icon:before          { .fi; content: "\e9ab"; top: 3px; font-size: 16px; .thicken; }
+.saltstack-icon:before     { .fi; content: "\e915"; top: 2px; font-size: 14px; }
+.sas-icon:before           { .fi; content: "\e95a"; top: 2px; }
+.sbt-icon:before           { .fi; content: "\e9d2"; top: 2px; font-size: 14px; }
+.scd-icon:before           { .fi; content: "\e9a2"; top: 2px; }
+.scad-icon:before          { .fi; content: "\e911"; top: 2px; font-size: 14px; }
+.scheme-icon:before        { .fi; content: "\03bb"; top: 2px; }
+.scilab-icon:before        { .fi; content: "\e9a9"; top: 3px; font-size: 18px; left: -1px; .thicken; }
+.scrutinizer-icon:before   { .fi; content: "\e9d4"; top: 2px; font-size: 14px; }
+.self-icon:before          { .fi; content: "\e9a8"; top: 3px; font-size: 16px; .sharpen; transform: scale(1.2); }
+.sf-icon:before            { .fi; content: "\e9db"; top: 2px; }
+.shen-icon:before          { .fi; content: "\e9a7"; top: 2px; font-size: 16px; }
+.shopify-icon:before       { .fi; content: "\e9cf"; top: 2px; }
+.shuriken-icon:before      { .fi; content: "\272b"; top: 2px; font-size: 14px; }
+.sigils-icon:before        { .fi; content: "\1f764";top: 3px; font-size: 16px; .sharpen; }
+.silverstripe-icon:before  { .fi; content: "\e800"; top: 2px; }
+.sketch-icon:before        { .fi; content: "\e927"; top: 2px; }
+.slash-icon:before         { .fi; content: "\e9a6"; top: 2px; }
+.snyk-icon:before          { .fi; content: "\ea1c"; top: 2px; font-size: 16px; }
+.sparql-icon:before        { .fi; content: "\e959"; top: 2px; }
+.sqf-icon:before           { .fi; content: "\e9a5"; top: 1px; .sharpen; }
+.sqlite-icon:before        { .fi; content: "\e9dd"; top: 3px; }
+.stan-icon:before          { .fi; content: "\e9a4"; top: 2px; }
+.stata-icon:before         { .fi; content: "\e9a3"; top: 2px; }
+.storyist-icon:before      { .fi; content: "\e9ef"; top: 2px; font-size: 16px; }
+.strings-icon:before       { .fi; content: "\e9e0"; top: 2px; }
+.stylelint-icon:before     { .fi; content: "\e93d"; top: 2px; }
+.stylus-icon:before        { .fi; content: "s";     top: 2px; left: 1px; }
+.sublime-icon:before       { .fi; content: "\e986"; top: 2px; }
+.svn-icon:before           { .fi; content: "\ea17"; top: 2px; }
+.sysverilog-icon:before    { .fi; content: "\e9c3"; top: 2px; }
+.tag-icon:before           { .fi; content: "\f015"; top: 2px; font-size: 14px; }
+.tcl-icon:before           { .fi; content: "\e956"; top: 2px; font-size: 16px; }
+.terminal-icon:before      { .fi; content: "\f0c8"; top: 2px; font-size: 14px; }
+.tern-icon:before          { .fi; content: "\1f54a";top: 4px; font-size: 16px; }
+.terraform-icon:before     { .fi; content: "\e916"; top: 1px; font-size: 14px; }
+.tex-icon:before           { .fi; content: "\e600"; top: 4px; font-size: 16px; .thicken; }
+.textile-icon:before       { .fi; content: "t";     top: 2px; }
+.textmate-icon:before      { .fi; content: "\2122"; top: 2px; font-size: 16px; }
+.thor-icon:before          { .fi; content: "\e9d8"; top: 2px; }
+.ts-icon:before            { .fi; content: "\2a6";  top: 1px; font-size: 14px; }
+.tsx-icon:before           { .fi; content: "\e9e7"; top: 1px; font-size: 14px; }
+.turing-icon:before        { .fi; content: "\e9b6"; top: 2px; }
+.txl-icon:before           { .fi; content: "\e9c1"; top: 2px; }
+.typedoc-icon:before       { .fi; content: "\e9fe"; top: 2px; }
+.typings-icon:before       { .fi; content: "\e9df"; top: 2px; }
+.uno-icon:before           { .fi; content: "\e9b3"; top: 2px; }
+.unreal-icon:before        { .fi; content: "u";     top: 2px; }
+.urweb-icon:before         { .fi; content: "\e9ba"; top: 4px; font-size: 18px; left: -1px; .sharpen; }
+.webpack-icon:before       { .fi; content: "\e91e"; top: 3px; }
+.wercker-icon:before       { .fi; content: "\ea19"; top: 2px; }
+.word-icon:before          { .fi; content: "\e9ed"; top: 2px; }
+.v8-icon:before            { .fi; content: "\ea1f"; top: 3px; font-size: 16px; }
+.vagrant-icon:before       { .fi; content: "V";     top: 2px; font-size: 14px; }
+.varnish-icon:before       { .fi; content: "\e9b4"; top: 1px; font-size: 14px; }
+.verilog-icon:before       { .fi; content: "\e949"; top: 2px; }
+.vhdl-icon:before          { .fi; content: "\e9aa"; top: 2px; }
+.vue-icon:before           { .fi; content: "\e906"; top: 3px; }
+.x10-icon:before           { .fi; content: "\2169"; top: 2px; }
+.xmos-icon:before          { .fi; content: "X";     top: 1px; font-size: 14px; }
+.xojo-icon:before          { .fi; content: "\e9af"; top: 2px; }
+.xpages-icon:before        { .fi; content: "\e9c5"; top: 2px; }
+.xtend-icon:before         { .fi; content: "\e9c6"; top: 2px; }
+.yang-icon:before          { .fi; content: "\262f"; top: 2px; }
+.yarn-icon:before          { .fi; content: "\ea1a"; top: 2px; font-size: 16px; }
+.yui-icon:before           { .fi; content: "\ea00"; top: 2px; }
+.zbrush-icon:before        { .fi; content: "\e9f2"; top: 2px; font-size: 16px; }
+.zephir-icon:before        { .fi; content: "\e9c7"; top: 2px; .thicken; }
+.zimpl-icon:before         { .fi; content: "\e9c8"; top: 2px; font-size: 16px; left: 1px; }
app/controllers/AbstractPostingApp.java
--- app/controllers/AbstractPostingApp.java
+++ app/controllers/AbstractPostingApp.java
@@ -22,10 +22,7 @@
 
 import com.fasterxml.jackson.databind.JsonNode;
 import controllers.annotation.AnonymousCheck;
-import models.AbstractPosting;
-import models.Attachment;
-import models.Comment;
-import models.IssueLabel;
+import models.*;
 import models.enumeration.Direction;
 import models.enumeration.Operation;
 import models.resource.Resource;
app/controllers/BoardApp.java
--- app/controllers/BoardApp.java
+++ app/controllers/BoardApp.java
@@ -21,7 +21,6 @@
 import play.db.ebean.Transactional;
 import play.libs.Json;
 import play.mvc.Call;
-import play.mvc.Http;
 import play.mvc.Result;
 import play.mvc.With;
 import playRepository.BareCommit;
@@ -39,9 +38,7 @@
 import java.util.*;
 
 import static com.avaje.ebean.Expr.icontains;
-import static controllers.MigrationApp.composeCommentsJson;
 import static controllers.MigrationApp.composePlainCommentsJson;
-import static controllers.MigrationApp.exportPosts;
 import static play.libs.Json.toJson;
 
 public class BoardApp extends AbstractPostingApp {
@@ -356,14 +353,20 @@
         }
 
         final PostingComment comment = commentForm.get();
-        PostingComment existingComment = PostingComment.find.where().eq("id", comment.id).findUnique();
 
         if (commentForm.hasErrors()) {
             flash(Constants.WARNING, "common.comment.empty");
             return redirect(routes.BoardApp.post(project.owner, project.name, number));
         }
 
+        Comment savedComment = saveComment(project, posting, comment);
+
+        return redirect(RouteUtil.getUrl(savedComment));
+    }
+
+    private static Comment saveComment(Project project, Posting posting, PostingComment comment) {
         Comment savedComment;
+        PostingComment existingComment = PostingComment.find.where().eq("id", comment.id).findUnique();
         if (existingComment != null) {
             existingComment.contents = comment.contents;
             savedComment = saveComment(existingComment, getContainerUpdater(posting, comment));
@@ -371,11 +374,11 @@
                 NotificationEvent.afterCommentUpdated(savedComment);
             }
         } else {
+            comment.projectId = project.id;
             savedComment = saveComment(comment, getContainerUpdater(posting, comment));
             NotificationEvent.afterNewComment(savedComment);
         }
-
-        return redirect(RouteUtil.getUrl(savedComment));
+        return savedComment;
     }
 
     private static Runnable getContainerUpdater(final Posting posting, final PostingComment comment) {
app/controllers/IssueApp.java
--- app/controllers/IssueApp.java
+++ app/controllers/IssueApp.java
@@ -616,24 +616,13 @@
 
         final IssueComment comment = commentForm.get();
 
-        IssueComment existingComment = IssueComment.find.where().eq("id", comment.id).findUnique();
 
         if (commentForm.hasErrors()) {
             flash(Constants.WARNING, "common.comment.empty");
             return redirect(routes.IssueApp.issue(project.owner, project.name, number));
         }
 
-        Comment savedComment;
-        if (existingComment != null) {
-            existingComment.contents = comment.contents;
-            savedComment = saveComment(existingComment, getContainerUpdater(issue, comment));
-            if(isSelectedToSendNotificationMail() || !existingComment.isAuthoredBy(UserApp.currentUser())){
-                NotificationEvent.afterCommentUpdated(savedComment);
-            }
-        } else {
-            savedComment = saveComment(comment, getContainerUpdater(issue, comment));
-            NotificationEvent.afterNewComment(savedComment);
-        }
+        Comment savedComment = saveComment(project, issue, comment);
 
         if( containsStateTransitionRequest() ){
             toNextState(number, project);
@@ -645,6 +634,23 @@
         return redirect(RouteUtil.getUrl(savedComment));
     }
 
+    private static Comment saveComment(Project project, Issue issue, IssueComment comment) {
+        Comment savedComment;
+        IssueComment existingComment = IssueComment.find.where().eq("id", comment.id).findUnique();
+        if (existingComment != null) {
+            existingComment.contents = comment.contents;
+            savedComment = saveComment(existingComment, getContainerUpdater(issue, comment));
+            if(isSelectedToSendNotificationMail() || !existingComment.isAuthoredBy(UserApp.currentUser())){
+                NotificationEvent.afterCommentUpdated(savedComment);
+            }
+        } else {
+            comment.projectId = project.id;
+            savedComment = saveComment(comment, getContainerUpdater(issue, comment));
+            NotificationEvent.afterNewComment(savedComment);
+        }
+        return savedComment;
+    }
+
     private static Runnable getContainerUpdater(final Issue issue, final IssueComment comment) {
         return new Runnable() {
             @Override
app/controllers/UserApp.java
--- app/controllers/UserApp.java
+++ app/controllers/UserApp.java
@@ -20,6 +20,7 @@
 package controllers;
 
 import com.avaje.ebean.ExpressionList;
+import com.avaje.ebean.Page;
 import com.avaje.ebean.annotation.Transactional;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import controllers.annotation.AnonymousCheck;
@@ -32,18 +33,20 @@
 import org.apache.shiro.crypto.SecureRandomNumberGenerator;
 import org.apache.shiro.crypto.hash.Sha256Hash;
 import org.apache.shiro.util.ByteSource;
-import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.joda.time.LocalDateTime;
 import play.Configuration;
 import play.Logger;
 import play.Play;
 import play.data.Form;
 import play.i18n.Messages;
 import play.libs.Json;
-import play.mvc.*;
+import play.mvc.BodyParser;
+import play.mvc.Controller;
+import play.mvc.Http;
 import play.mvc.Http.Cookie;
+import play.mvc.Result;
 import utils.*;
 import views.html.user.*;
-import org.joda.time.LocalDateTime;
 
 import java.util.*;
 
@@ -444,6 +447,20 @@
     }
 
     @AnonymousCheck
+    public static Result userFiles(){
+        final int USER_FILES_COUNT_PER_PAGE = 50;
+        String pageNumString = request().getQueryString("pageNum");
+        int pageNum = 1;
+
+        if (StringUtils.isNotEmpty(pageNumString)){
+            pageNum = Integer.parseInt(pageNumString);
+        }
+
+        Page<Attachment> page = Attachment.findByUser(currentUser(), USER_FILES_COUNT_PER_PAGE, pageNum);
+        return ok(userFiles.render("User Files", page));
+    }
+
+    @AnonymousCheck
     public static Result userInfo(String loginId, String groups, int daysAgo, String selected) {
         Organization org = Organization.findByName(loginId);
         if(org != null) {
app/models/Attachment.java
--- app/models/Attachment.java
+++ app/models/Attachment.java
@@ -5,8 +5,10 @@
  */
 package models;
 
+import com.avaje.ebean.Page;
 import com.fasterxml.jackson.annotation.JsonIgnore;
 import controllers.AttachmentApp;
+import controllers.UserApp;
 import models.enumeration.ResourceType;
 import models.resource.GlobalResource;
 import models.resource.Resource;
@@ -57,7 +59,8 @@
     public Long size;
     public String containerId;
 
-    private Date createdDate;
+    public Date createdDate;
+    public String ownerLoginId;
 
     /**
      * Finds an attachment which matches the given one.
@@ -517,6 +520,9 @@
         return save(moveFileIntoUploadDirectory(tmpFile, tempFileHash), fileName, container);
     }
 
+    public static Page<Attachment> findByUser(User user, int pageSize, int pageNo){
+        return Attachment.find.where().eq("owner_login_id", user.loginId).order("created_date desc").findPagingList(pageSize).getPage(pageNo - 1);
+    }
     /**
      * Save this attachment with metadata from the given arguments.
      *
@@ -536,6 +542,7 @@
         this.createdDate = JodaDateUtil.now();
         this.hash = file.getName();
         this.size = file.length();
+        this.ownerLoginId = UserApp.currentUser().loginId;
         if (this.mimeType == null) {
             this.mimeType = FileUtil.detectMediaType(file, name).toString();
         }
@@ -583,5 +590,4 @@
         }
         return uploads;
     }
-
 }
app/utils/FileUtil.java
--- app/utils/FileUtil.java
+++ app/utils/FileUtil.java
@@ -167,4 +167,15 @@
 
         return subpath.normalize().startsWith(path.normalize());
     }
+
+    /**
+     * It is borrowed from http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
+     */
+    public static String humanReadableByteCount(long bytes, boolean si) {
+        int unit = si ? 1000 : 1024;
+        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("%.1f %sB", bytes / Math.pow(unit, exp), pre);
+    }
 }
app/utils/JodaDateUtil.java
--- app/utils/JodaDateUtil.java
+++ app/utils/JodaDateUtil.java
@@ -1,30 +1,17 @@
 /**
- * Yobi, Project Hosting SW
- *
- * Copyright 2012 NAVER Corp.
- * http://yobi.io
- *
- * @author Sangcheol Hwang
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
+ *  Yona, 21st Century Project Hosting SW
+ *  <p>
+ *  Copyright Yona & Yobi Authors & NAVER Corp.
+ *  https://yona.io
+ **/
 package utils;
 
 import org.apache.commons.lang3.StringUtils;
 import org.joda.time.*;
 
 import java.text.SimpleDateFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.Locale;
 
 public class JodaDateUtil {
     public static String getDateString(Date date) {
@@ -99,4 +86,21 @@
                 .withField(DateTimeFieldType.minuteOfHour(), 59)
                 .withField(DateTimeFieldType.secondOfMinute(), 59).toDate();
     }
+
+    /**
+     * Show date string by two stage
+     * which in a day and over a day
+     */
+    public static String socialDate(Date date){
+        if (date == null) {
+            return "";
+        }
+        DateTime dateTime = new DateTime(date);
+        boolean isBeforeYesterday = dateTime.isBefore(DateTime.now().minusDays(1) );
+        if(isBeforeYesterday){
+            return dateTime.toString("yyyy-MM-dd h:mm a", Locale.getDefault());
+        }
+
+        return momentFromNow(date, Locale.getDefault().getLanguage());
+    }
 }
app/utils/MenuType.java
--- app/utils/MenuType.java
+++ app/utils/MenuType.java
@@ -22,7 +22,7 @@
 
 public enum MenuType {
     SITE_HOME(1), NEW_PROJECT(2), PROJECTS(3), HELP(4), SITE_SETTING(5), USER(6),
-    PROJECT_HOME(100), BOARD(101), CODE(102), ISSUE(103), TASK(104), PROJECT_SETTING(105), MILESTONE(106), PULL_REQUEST(107), PROJECT_REVIEW(108), NONE(0);
+    PROJECT_HOME(100), BOARD(101), CODE(102), ISSUE(103), TASK(104), PROJECT_SETTING(105), MILESTONE(106), PULL_REQUEST(107), PROJECT_REVIEW(108), TAB_NOTI(201), TAB_MY_ISSUES(202), TAB_MY_FILES(203), NONE(0);
 
     private int type;
 
 
app/views/common/mySeriesMenuTab.scala.html (added)
+++ app/views/common/mySeriesMenuTab.scala.html
@@ -0,0 +1,20 @@
+@**
+* Yona, 21st Century Project Hosting SW
+*
+* Copyright Yona & Yobi Authors & NAVER Corp.
+* https://yona.io
+**@
+@(viewType:utils.MenuType)
+@import utils.MenuType._
+@isActive(current:utils.MenuType, target:utils.MenuType) = @{
+    var active = ""
+    if(current == target) {
+        active = " class=active "
+    }
+    active
+}
+<ul class="nav nav-tabs">
+    <li @isActive(viewType, TAB_NOTI)><a href="@routes.Application.index()">@Messages("notification")</a></li>
+    <li @isActive(viewType, TAB_MY_ISSUES)><a href="@routes.IssueApp.userIssues()">@Messages("issue.myIssue")</a></li>
+    <li @isActive(viewType, TAB_MY_FILES)><a href="@routes.UserApp.userFiles()">@Messages("user.files")</a></li>
+</ul>
app/views/index/index.scala.html
--- app/views/index/index.scala.html
+++ app/views/index/index.scala.html
@@ -1,27 +1,14 @@
 @**
-* Yobi, Project Hosting SW
+* Yona, 21st Century Project Hosting SW
 *
-* Copyright 2012 NAVER Corp.
-* http://yobi.io
-*
-* @author Sangcheol Hwang
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
+* Copyright Yona & Yobi Authors & NAVER Corp.
+* https://yona.io
 **@
 @(currentUser:models.User)
 
 @import utils.TemplateHelper._
 @import utils.JodaDateUtil
+@import utils.MenuType._
 
 @siteLayout(utils.Config.getSiteName, utils.MenuType.SITE_HOME) {
     @if(currentUser == User.anonymous){
@@ -66,14 +53,7 @@
             <div class="page on-fold-intro">
                 <div class="row-fluid content-container">
                     <div class="span8 main-stream hide-in-mobile">
-                         <ul class="nav nav-tabs">
-                            <li class="active">
-                                <a href="@routes.Application.index()">@Messages("notification")</a>
-                            </li>
-                            <li>
-                                <a href="@routes.IssueApp.userIssues()">@Messages("issue.myIssue")</a>
-                            </li>
-                        </ul>
+                        @views.html.common.mySeriesMenuTab(TAB_NOTI)
                         <ul class="activity-streams notification-wrap unstyled">
                             @partial_notifications(0, 20)
                         </ul>
app/views/issue/my_list.scala.html
--- app/views/issue/my_list.scala.html
+++ app/views/issue/my_list.scala.html
@@ -1,36 +1,20 @@
 @**
-* Yobi, Project Hosting SW
+* Yona, 21st Century Project Hosting SW
 *
-* Copyright 2014 NAVER Corp.
-* http://yobi.io
-*
-* @author Suwon Chae
-*
-* Licensed under the Apache License, Version 2.0 (the "License");
-* you may not use this file except in compliance with the License.
-* You may obtain a copy of the License at
-*
-*   http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
+* Copyright Yona & Yobi Authors & NAVER Corp.
+* https://yona.io
 **@
 @(title: String, currentPage: com.avaje.ebean.Page[Issue], param:
 models.support.SearchCondition, project:Project)
 
+@import utils.MenuType._
 @siteLayout(utils.Config.getSiteName, utils.MenuType.SITE_HOME) {
     <div>
         <button class="btn-transparent" id="toggleIntro"></button>
     </div>
     <div class="page-wrap-outer">
         <div class="page-wrap">
-            <ul class="nav nav-tabs">
-                <li><a href="@routes.Application.index()">@Messages("notification")</a></li>
-                <li class="active"><a href="@routes.IssueApp.userIssues()">@Messages("issue.myIssue")</a></li>
-            </ul>
+            @views.html.common.mySeriesMenuTab(TAB_MY_ISSUES)
 
             @views.html.issue.my_partial_search(title, currentPage, param, project)
         </div>
 
app/views/user/userFiles.scala.html (added)
+++ app/views/user/userFiles.scala.html
@@ -0,0 +1,80 @@
+@**
+* Yona, 21st Century Project Hosting SW
+*
+* Copyright Yona & Yobi Authors & NAVER Corp.
+* https://yona.io
+**@
+@import utils.MenuType._
+@(title: String, currentPage: com.avaje.ebean.Page[Attachment])
+
+@import utils.JodaDateUtil._
+@import utils.FileUtil._
+
+@preview(attachment: Attachment) = @{
+    var previewFile = ""
+    if(attachment.mimeType.startsWith("image/")){
+        previewFile = "<img src='" + routes.AttachmentApp.getFile(attachment.id).toString + "'>";
+    }
+    Html(previewFile)
+}
+
+@siteLayout(utils.Config.getSiteName, SITE_HOME) {
+    <link rel="stylesheet" type="text/css" media="all" href="@routes.Assets.at("stylesheets/filetype.css")">
+    <div>
+        <button class="btn-transparent" id="toggleIntro"></button>
+    </div>
+    <div class="page-wrap-outer">
+        <div class="page-wrap">
+            @views.html.common.mySeriesMenuTab(TAB_MY_FILES)
+            <div class="user-file-search search search-bar">
+                <input name="filter" class="textbox" type="text" placeholder="@Messages("search.title")" value="">
+                <button type="submit" class="search-btn"><i class="yobicon-search"></i></button>
+            </div>
+            <div class="attachment-files">
+                <div class="attachment-files-header row">
+                    <div class="span2 header-preview">Preview</div>
+                    <div class="span4 header-file-name">Filename</div>
+                    <div class="span2 header-size">Size</div>
+                    <div class="span2">Download</div>
+                    <div class="span2 file-date">Date</div>
+                    <div class="span1 header-location">Location</div>
+                </div>
+                @for(attachment <- currentPage.getList){
+                    <div class="attachment-file-detail row">
+                        <div class="file-preview span2"><a href="@routes.AttachmentApp.getFile(attachment.id)" target="_blank">@preview(attachment)</a></div>
+                        <div class="span4 file-name"><a href="@routes.AttachmentApp.getFile(attachment.id)" target="_blank"><i class="icon text-icon"></i>@attachment.name</a></div>
+                        <div class="span2 file-size">@humanReadableByteCount(attachment.size, true)</div>
+                        <div class="span2 file-download"><a href="@routes.AttachmentApp.getFile(attachment.id)?action=download"><button type="button" class="ybtn"><i class="yobicon-cloud-download"></i></button> </a></div>
+                        <div class="span2 file-date">@socialDate(attachment.createdDate)</div>
+                        <div class="span1 file-location">location</div>
+                    </div>
+                }
+            </div>
+        </div>
+        <!-- pagination.js will fill here. -->
+        <div id="pagination"></div>
+    </div>
+    <script type="text/javascript" src="@routes.Assets.at("javascripts/lib/filetype.js")"></script>
+    <script type="text/javascript">
+        $(document).ready(function(){
+            $(".attachment-file-detail").hover(
+                    function() {
+                        $(this).addClass('hover');
+                    }, function () {
+                        $(this).removeClass("hover");
+                    }
+            );
+            $('.file-name').each(function(){
+                var that = $(this);
+                fileType.some(function(item){
+                    if( item[0].test(that.text()) ) {
+                        that.find('i').removeClass('text-icon').addClass(item[1] + " font-larger");
+                        return true;
+                    }
+                });
+            });
+
+            yobi.Pagination.update($("#pagination"), @currentPage.getTotalPageCount);
+        });
+    </script>
+}
 
conf/evolutions/default/10.sql (added)
+++ conf/evolutions/default/10.sql
@@ -0,0 +1,33 @@
+# --- !Ups
+ALTER TABLE attachment ADD COLUMN owner_login_id VARCHAR(255);
+CREATE INDEX ix_attachment_owner_login_id ON attachment (owner_login_id);
+CREATE INDEX ix_attachment_created_date ON attachment (created_date);
+
+ALTER TABLE attachment MODIFY container_id BIGINT NOT NULL;
+
+UPDATE attachment a
+SET owner_login_id = (SELECT author_login_id FROM posting b WHERE b.id = a.container_id)
+WHERE container_type = 'BOARD_POST';
+
+UPDATE attachment a
+SET owner_login_id = (SELECT author_login_id FROM issue b WHERE b.id = a.container_id)
+WHERE container_type = 'ISSUE_POST';
+
+UPDATE attachment a
+SET owner_login_id = (SELECT author_login_id FROM issue_comment b WHERE b.id = a.container_id)
+WHERE container_type = 'ISSUE_COMMENT';
+
+UPDATE attachment a
+SET owner_login_id = (SELECT author_login_id FROM posting_comment b WHERE b.id = a.container_id)
+WHERE container_type = 'NONISSUE_COMMENT';
+
+UPDATE attachment a
+SET owner_login_id = (SELECT login_id FROM n4user b WHERE a.id = b.id)
+WHERE container_type in ('USER', 'USER_AVATAR');
+
+
+# --- !Downs
+DROP INDEX ix_attachment_owner_login_id ON attachment;
+DROP INDEX ix_attachment_created_date ON attachment;
+ALTER TABLE attachment DROP COLUMN owner_login_id;
+
conf/messages
--- conf/messages
+++ conf/messages
@@ -926,6 +926,7 @@
 user.enroll.failed.client = Failed to Sign-up. The request is invalid.\nPlease ask site admin.
 user.enroll.failed.network = Failed to Sign-up because network trouble.\nPlease ask site admin.
 user.enroll.failed.server = Failed to Sign-up because server error has occurred.\nPlease ask site admin.
+user.files = My files
 user.isAlreadySignupUser = Already signed up?
 user.isLocked = Is the user account locked out?
 user.locked = This user account is locked
conf/messages.ko-KR
--- conf/messages.ko-KR
+++ conf/messages.ko-KR
@@ -919,6 +919,7 @@
 user.enroll.failed.client = 멤버 등록 요청에 실패하였습니다. 올바른 요청이 아닙니다.\n관리자에게 문의해주세요.
 user.enroll.failed.network = 네트워크 문제로 인해 멤버 등록 요청에 실패하였습니다.\n관리자에게 문의해주세요.
 user.enroll.failed.server = 서버의 문제로 인해 멤버 등록 요청에 실패하였습니다.\n관리자에게 문의해주세요.
+user.files = 내 파일
 user.isAlreadySignupUser = 이미 가입하셨나요?
 user.isLocked = 잠김여부
 user.locked = 잠긴 사용자 계정입니다.
conf/routes
--- conf/routes
+++ conf/routes
@@ -72,6 +72,7 @@
 # User
 GET            /users                                                                 controllers.UserApp.users(query: String ?= "")
 GET            /user/issues                                                           controllers.IssueApp.userIssues(state:String ?= "", format:String ?= "html", pageNum: Int ?= 1)
+GET            /user/files                                                            controllers.UserApp.userFiles()
 GET            /users/loginform                                                       controllers.UserApp.loginForm()
 POST           /users/login                                                           controllers.UserApp.login()
 GET            /users/logout                                                          controllers.UserApp.logout()
 
public/javascripts/lib/filetype.js (added)
+++ public/javascripts/lib/filetype.js
@@ -0,0 +1,1078 @@
+/**
+ *  Yona, 21st Century Project Hosting SW
+ *  <p>
+ *  Copyright Yona & Yobi Authors & NAVER Corp.
+ *  https://yona.io
+ **/
+/**
+ * It is modified and derived from https://github.com/file-icons/atom/blob/master/lib/icons/.icondb.js
+ * @type {[*]}
+ */
+var fileType = [
+    [new RegExp(/\.app$/i), 'apple-icon'],
+    [new RegExp(/\.swp$/i), 'binary-icon dark-green'],
+    [new RegExp(/\.lnk$/i), 'link-icon medium-blue'],
+    [new RegExp(/^angular[^.]*\.js$/i), 'angular-icon medium-red'],
+    [new RegExp(/^ant\.xml$|\.ant$/i), 'ant-icon dark-pink'],
+    [new RegExp(/^(?:apache2?|httpd).conf$/i), 'apache-icon medium-red'],
+    [new RegExp(/\.vhost$/i), 'apache-icon dark-green'],
+    [new RegExp(/\.thrift$/i), 'apache-icon medium-green'],
+    [new RegExp(/^appcelerator\.js$/i), 'appcelerator-icon medium-red'],
+    [new RegExp(/^appveyor\.yml$/i), 'appveyor-icon medium-blue'],
+    [new RegExp(/^\.install$/), 'archlinux-icon dark-purple'],
+    [new RegExp(/^\.SRCINFO$/), 'archlinux-icon dark-maroon'],
+    [new RegExp(/^pacman\.conf$/), 'archlinux-icon dark-yellow'],
+    [new RegExp(/^pamac\.conf$/), 'archlinux-icon light-yellow'],
+    [new RegExp(/^PKGBUILD$/), 'archlinux-icon dark-cyan'],
+    [new RegExp(/yaourtrc$/i), 'archlinux-icon light-yellow'],
+    [new RegExp(/^backbone(?:[-.]min|dev)?\.js$/i), 'backbone-icon dark-blue'],
+    [new RegExp(/^Makefile\.boot$/i), 'boot-icon medium-green'],
+    [new RegExp(/^(?:custom\.)?bootstrap\S*\.js$/i), 'bootstrap-icon medium-yellow'],
+    [new RegExp(/^(?:custom\.)?bootstrap\S*\.css$/i), 'bootstrap-icon medium-blue'],
+    [new RegExp(/^(?:custom\.)?bootstrap\S*\.less$/i), 'bootstrap-icon dark-blue'],
+    [new RegExp(/^(?:custom\.)?bootstrap\S*\.scss$/i), 'bootstrap-icon light-pink'],
+    [new RegExp(/^(?:custom\.)?bootstrap\S*\.styl$/i), 'bootstrap-icon medium-green'],
+    [new RegExp(/^(?:\.bowerrc|bower\.json|Bowerfile)$/i), 'bower-icon medium-yellow'],
+    [new RegExp(/brakeman\.yml$/i), 'brakeman-icon medium-red'],
+    [new RegExp(/^brakeman\.ignore$/i), 'brakeman-icon dark-red'],
+    [new RegExp(/^Brocfile\./i), 'broccoli-icon medium-green'],
+    [new RegExp(/Cargo\.toml$/i), 'package-icon light-orange'],
+    [new RegExp(/Cargo\.lock$/i), 'package-icon dark-orange'],
+    [new RegExp(/^chai\.(?:[jt]sx?|es6?|coffee)$/i), 'chai-icon medium-red'],
+    [new RegExp(/^Chart\.js$/i), 'chartjs-icon dark-pink'],
+    [new RegExp(/^circle\.yml$/i), 'circleci-icon medium-green'],
+    [new RegExp(/\.codeclimate\.yml$/i), 'cc-icon medium-green'],
+    [new RegExp(/^codecov\.ya?ml$/i), 'codecov-icon dark-pink'],
+    [new RegExp(/\.coffee\.ecr$/i), 'coffee-icon medium-cyan'],
+    [new RegExp(/\.coffee\.erb$/i), 'coffee-icon medium-red'],
+    [new RegExp(/^_?(?:compass|lemonade)\.scss$/i), 'compass-icon medium-red'],
+    [new RegExp(/^composer\.(?:json|lock)$/i), 'composer-icon medium-yellow'],
+    [new RegExp(/^composer\.phar$/i), 'composer-icon dark-blue'],
+    [new RegExp(/^cordova(?:[^.]*\.|-(?:\d\.)+)js$/i), 'cordova-icon light-blue'],
+    [new RegExp(/^d3(?:\.v\d+)?[^.]*\.js$/i), 'd3-icon medium-orange'],
+    [new RegExp(/^METADATA\.pb$/), 'database-icon medium-red'],
+    [new RegExp(/^(?:Dockerfile|docker-compose)|\.docker(?:file|ignore)$/i), 'docker-icon dark-blue'],
+    [new RegExp(/^docker-sync\.yml$/i), 'docker-icon dark-orange'],
+    [new RegExp(/^dojo\.js$/i), 'dojo-icon light-red'],
+    [new RegExp(/^ember(?:\.|(?:-[^.]+)?-(?:\d+\.)+(?:debug\.)?)js$/i), 'ember-icon medium-red'],
+    [new RegExp(/\.eslint(?:cache|ignore)$/i), 'eslint-icon medium-purple'],
+    [new RegExp(/\.eslintrc(?:\.(?:js|json|ya?ml))?$/i), 'eslint-icon light-purple'],
+    [new RegExp(/\bExtjs(?:-ext)?\.js$/i), 'extjs-icon light-green'],
+    [new RegExp(/^fabfile\.py$/i), 'fabfile-icon medium-blue'],
+    [new RegExp(/^fuelux(?:\.min)?\.(?:css|js)$/i), 'fuelux-icon medium-orange'],
+    [new RegExp(/\.indent\.pro$/i), 'gear-icon medium-blue'],
+    [new RegExp(/gruntfile\.js$/i), 'grunt-icon medium-yellow'],
+    [new RegExp(/gruntfile\.coffee$/i), 'grunt-icon medium-maroon'],
+    [new RegExp(/gulpfile\.js$|gulpfile\.babel\.js$/i), 'gulp-icon medium-red'],
+    [new RegExp(/gulpfile\.coffee$/i), 'gulp-icon medium-maroon'],
+    [new RegExp(/\.html?\.ecr$/i), 'html5-icon medium-cyan'],
+    [new RegExp(/\.(?:html?\.erb|rhtml)$/i), 'html5-icon medium-red'],
+    [new RegExp(/^ionic\.project$/), 'ionic-icon medium-blue'],
+    [new RegExp(/\.js\.ecr$/i), 'js-icon medium-cyan'],
+    [new RegExp(/\.js\.erb$/i), 'js-icon medium-red'],
+    [new RegExp(/^jquery(?:[-.](?:min|latest|\d\.\d+(?:\.\d+)?))*\.(?:[jt]sx?|es6?|coffee|map)$/i), 'jquery-icon dark-blue'],
+    [new RegExp(/^jquery(?:[-_.](?:ui[-_.](?:custom|dialog-?\w*)|effects)(?:\.[^.]*)?|[-.]?ui(?:-\d\.\d+(?:\.\d+)?)?(?:\.\w+)?)(?:[-_.]?min|dev)?\.(?:[jt]sx?|es6?|coffee|map|s?css|less|styl)$/i), 'jqueryui-icon dark-blue'],
+    [new RegExp(/^karma\.conf\.js$/i), 'karma-icon medium-cyan'],
+    [new RegExp(/^karma\.conf\.coffee$/i), 'karma-icon medium-maroon'],
+    [new RegExp(/^knockout[-.](?:\d+\.){3}(?:debug\.)?js$/i), 'knockout-icon medium-red'],
+    [new RegExp(/^leaflet\.(?:draw-src|draw|spin|coordinates-(?:\d+\.)\d+\.\d+\.src)\.(?:js|css)$|^wicket-leaflet\.js$/i), 'leaflet-icon medium-green'],
+    [new RegExp(/project\.clj$/i), 'lein-icon null'],
+    [new RegExp(/^tmac\.|^(?:mmn|mmt)$/i), 'manpage-icon dark-green'],
+    [new RegExp(/\.marko$/i), 'marko-icon medium-blue'],
+    [new RegExp(/\.marko\.js$/i), 'marko-icon medium-maroon'],
+    [new RegExp(/^materialize(?:\.min)?\.(?:js|css)$/i), 'materialize-icon light-red'],
+    [new RegExp(/^MathJax[^.]*\.js$/i), 'mathjax-icon dark-green'],
+    [new RegExp(/^mocha\.(?:[jt]sx?|es6?|coffee)$/i), 'mocha-icon medium-maroon'],
+    [new RegExp(/^mocha\.(?:s?css|less|styl)$/i), 'mocha-icon medium-red'],
+    [new RegExp(/mocha\.opts$/i), 'mocha-icon light-maroon'],
+    [new RegExp(/^modernizr(?:[-\.]custom|-\d\.\d+)(?:\.\d+)?\.js$/i), 'modernizr-icon medium-red'],
+    [new RegExp(/^mootools[^.]*\d+\.\d+(?:.\d+)?[^.]*\.js$/i), 'mootools-icon medium-purple'],
+    [new RegExp(/^run\.n$/), 'neko-icon dark-orange'],
+    [new RegExp(/^newrelic\.yml/i), 'newrelic-icon medium-cyan'],
+    [new RegExp(/^nginx\.conf$/i), 'nginx-icon dark-green'],
+    [new RegExp(/\.ninja\.d$/i), 'shuriken-icon dark-cyan'],
+    [new RegExp(/^nodemon\.json$|^\.nodemonignore$/i), 'nodemon-icon medium-green'],
+    [new RegExp(/^normalize\.(?:css|less|scss|styl)$/i), 'normalize-icon medium-red'],
+    [new RegExp(/^(?:package\.json|\.npmignore|\.?npmrc|npm-debug\.log|npm-shrinkwrap\.json)$/i), 'npm-icon medium-red'],
+    [new RegExp(/\bpostcss\.config\.js$/i), 'postcss-icon medium-yellow'],
+    [new RegExp(/^protractor\.conf\./i), 'protractor-icon medium-red'],
+    [new RegExp(/^\.pug-lintrc/i), 'pug-icon medium-orange'],
+    [new RegExp(/^raphael(?:\.min|\.no-deps)*\.js$/i), 'raphael-icon medium-orange'],
+    [new RegExp(/^react(?:-[^.]*)?\.js$/i), 'react-icon dark-blue'],
+    [new RegExp(/\.react\.js$/i), 'react-icon medium-blue'],
+    [new RegExp(/^README(?:\b|_)|^(?:licen[sc]es?|(?:read|readme|click|delete|keep|test)\.me)$|\.(?:readme|1st)$/i), 'book-icon medium-blue'],
+    [new RegExp(/^(?:notice|bugs|changes|change[-_]?log(?:[-._]?\d+)?|contribute|contributing|contributors|copying|hacking|history|install|maintainers|manifest|more\.stuff|projects|revision|terms|thanks)$/i), 'book-icon dark-blue'],
+    [new RegExp(/^require(?:[-.]min|dev)?\.js$/i), 'requirejs-icon medium-blue'],
+    [new RegExp(/^riemann\.config$/i), 'clojure-icon medium-maroon'],
+    [new RegExp(/^rollup\.config\./i), 'rollup-icon medium-red'],
+    [new RegExp(/_spec\.rb$/i), 'ruby-icon light-green'],
+    [new RegExp(/\.scrutinizer\.yml$/i), 'scrutinizer-icon dark-blue'],
+    [new RegExp(/^sencha(?:\.min)?\.js$/i), 'sencha-icon light-green'],
+    [new RegExp(/^snap\.svg(?:[-.]min)?\.js$/i), 'snapsvg-icon medium-cyan'],
+    [new RegExp(/\.css\.map$/i), 'sourcemap-icon medium-blue'],
+    [new RegExp(/\.js\.map$/i), 'sourcemap-icon medium-yellow'],
+    [new RegExp(/^\.stylelintrc(?:\.|$)/i), 'stylelint-icon medium-purple'],
+    [new RegExp(/^stylelint\.config\.js$/i), 'stylelint-icon medium-yellow'],
+    [new RegExp(/\.stylelintignore$/i), 'stylelint-icon dark-blue'],
+    [new RegExp(/\.toc$/i), 'toc-icon medium-cyan'],
+    [new RegExp(/\.8x[pk](?:\.txt)?$/i), 'calc-icon medium-maroon'],
+    [new RegExp(/^\.travis/i), 'travis-icon medium-red'],
+    [new RegExp(/^typedoc\.json$/i), 'typedoc-icon dark-purple'],
+    [new RegExp(/^typings\.json$/i), 'typings-icon medium-maroon'],
+    [new RegExp(/^uikit(?:\.min)?\.js$/i), 'uikit-icon medium-blue'],
+    [new RegExp(/webpack\.config\.|^webpackfile\.js$/i), 'webpack-icon medium-blue'],
+    [new RegExp(/^wercker\.ya?ml$/i), 'wercker-icon medium-purple'],
+    [new RegExp(/^yarn\.lock$/i), 'yarn-icon medium-blue'],
+    [new RegExp(/\.yo-rc\.json$/i), 'yeoman-icon medium-cyan'],
+    [new RegExp(/^(?:yahoo-|yui)[^.]*\.js$/i), 'yui-icon dark-blue'],
+    [new RegExp(/\.gnus$/i), 'emacs-icon medium-red'],
+    [new RegExp(/\.viper$/i), 'emacs-icon dark-green'],
+    [new RegExp(/^Cask$/), 'emacs-icon dark-blue'],
+    [new RegExp(/^Project\.ede$/i), 'emacs-icon medium-blue'],
+    [new RegExp(/\.bsl$/i), '_1c-icon medium-red'],
+    [new RegExp(/\.sdbl$/i), '_1c-icon dark-orange'],
+    [new RegExp(/\.os$/i), '_1c-icon dark-red'],
+    [new RegExp(/\.mdo$/i), '_1c-alt-icon medium-red'],
+    [new RegExp(/\.abap$/i), 'abap-icon medium-orange'],
+    [new RegExp(/\.swf$/i), 'as-icon medium-blue'],
+    [new RegExp(/\.as$/i), 'as-icon medium-red'],
+    [new RegExp(/\.jsfl$/i), 'as-icon medium-yellow'],
+    [new RegExp(/\.swc$/i), 'as-icon dark-red'],
+    [new RegExp(/\.(?:ada|adb|ads)$/i), 'ada-icon medium-blue'],
+    [new RegExp(/\.aep$/i), 'ae-icon dark-pink'],
+    [new RegExp(/\.aet$/i), 'ae-icon dark-purple'],
+    [new RegExp(/\.ai$/i), 'ai-icon medium-orange'],
+    [new RegExp(/\.ait$/i), 'ai-icon dark-orange'],
+    [new RegExp(/\.indd$|\.idml$/i), 'indesign-icon dark-pink'],
+    [new RegExp(/\.indl$/i), 'indesign-icon medium-purple'],
+    [new RegExp(/\.indt$|\.inx$/i), 'indesign-icon dark-purple'],
+    [new RegExp(/\.indb$/i), 'indesign-icon dark-blue'],
+    [new RegExp(/\.psd$/i), 'psd-icon medium-blue'],
+    [new RegExp(/\.psb$/i), 'psd-icon dark-purple'],
+    [new RegExp(/\.prproj$/i), 'premiere-icon dark-purple'],
+    [new RegExp(/\.prel$/i), 'premiere-icon medium-maroon'],
+    [new RegExp(/\.psq$/i), 'premiere-icon medium-purple'],
+    [new RegExp(/\.als$/i), 'alloy-icon medium-red'],
+    [new RegExp(/(?:\.|^)APKBUILD$/), 'alpine-icon dark-blue'],
+    [new RegExp(/\.ampl$/i), 'ampl-icon dark-maroon'],
+    [new RegExp(/\.ansiweatherrc$/i), 'sun-icon medium-yellow'],
+    [new RegExp(/\.g$/i), 'antlr-icon medium-red'],
+    [new RegExp(/\.g4$/i), 'antlr-icon medium-orange'],
+    [new RegExp(/\.apacheconf$/i), 'apache-icon dark-red'],
+    [new RegExp(/apache2[\\\/]magic$/i), 'apache-icon medium-purple'],
+    [new RegExp(/\.apib$/i), 'api-icon medium-blue'],
+    [new RegExp(/\.apl$/i), 'apl-icon dark-cyan'],
+    [new RegExp(/\.apl\.history$/i), 'apl-icon medium-maroon'],
+    [new RegExp(/\.(?:applescript|scpt)$/i), 'apple-icon medium-purple'],
+    [new RegExp(/\.arc$/i), 'arc-icon medium-blue'],
+    [new RegExp(/\.ino$/i), 'arduino-icon dark-cyan'],
+    [new RegExp(/\.(?:ad|adoc|asc|asciidoc)$/i), 'asciidoc-icon medium-blue'],
+    [new RegExp(/\.asp$/i), 'asp-icon dark-blue'],
+    [new RegExp(/\.asax$/i), 'asp-icon medium-maroon'],
+    [new RegExp(/\.ascx$/i), 'asp-icon dark-green'],
+    [new RegExp(/\.ashx$/i), 'asp-icon medium-green'],
+    [new RegExp(/\.asmx$/i), 'asp-icon dark-cyan'],
+    [new RegExp(/\.aspx$/i), 'asp-icon medium-purple'],
+    [new RegExp(/\.axd$/i), 'asp-icon medium-cyan'],
+    [new RegExp(/\.aj$/i), 'eclipse-icon medium-maroon'],
+    [new RegExp(/\.(?:l?a|[ls]?o|out|s|a51|n?asm|axf|elf|prx|puff|was[mt]|z80)$|\.rpy[bc]$/i), 'binary-icon medium-red'],
+    [new RegExp(/\.agc$|\.d-objdump$/i), 'binary-icon dark-blue'],
+    [new RegExp(/\.ko$/i), 'binary-icon dark-green'],
+    [new RegExp(/\.lst$/i), 'binary-icon medium-blue'],
+    [new RegExp(/\.(?:(?:c(?:[+px]{2}?)?-?)?objdump|bsdiff|bin|dat|pak|pdb)$/i), 'binary-icon dark-orange'],
+    [new RegExp(/\.gcode|\.gco/i), 'binary-icon medium-orange'],
+    [new RegExp(/\.py[co]$/i), 'binary-icon dark-purple'],
+    [new RegExp(/\.DS_Store$/i), 'binary-icon null'],
+    [new RegExp(/\.dats$/i), 'ats-icon medium-red'],
+    [new RegExp(/\.hats$/i), 'ats-icon medium-blue'],
+    [new RegExp(/\.sats$/i), 'ats-icon dark-yellow'],
+    [new RegExp(/\.aup$/i), 'audacity-icon medium-yellow'],
+    [new RegExp(/\.mp3$/i), 'audio-icon medium-red'],
+    [new RegExp(/\.wav$/i), 'audio-icon dark-yellow'],
+    [new RegExp(/\.(?:aac|ac3|m4p)$/i), 'audio-icon dark-cyan'],
+    [new RegExp(/\.aif[fc]?$/i), 'audio-icon medium-purple'],
+    [new RegExp(/\.au$/i), 'audio-icon medium-cyan'],
+    [new RegExp(/\.flac$/i), 'audio-icon dark-red'],
+    [new RegExp(/\.f4[ab]$/i), 'audio-icon medium-red'],
+    [new RegExp(/\.m4a$/i), 'audio-icon medium-cyan'],
+    [new RegExp(/\.(?:mpc|mp\+)$/i), 'audio-icon dark-green'],
+    [new RegExp(/\.oga$/i), 'audio-icon dark-orange'],
+    [new RegExp(/\.opus$/i), 'audio-icon dark-maroon'],
+    [new RegExp(/\.r[am]$/i), 'audio-icon dark-blue'],
+    [new RegExp(/\.wma$/i), 'audio-icon medium-blue'],
+    [new RegExp(/\.aug$/i), 'augeas-icon dark-orange'],
+    [new RegExp(/\.ahk$/i), 'ahk-icon dark-blue'],
+    [new RegExp(/\.ahkl$/i), 'ahk-icon dark-purple'],
+    [new RegExp(/\.au3$/i), 'autoit-icon medium-purple'],
+    [new RegExp(/\.awk$/i), 'terminal-icon medium-blue'],
+    [new RegExp(/\.gawk$/i), 'terminal-icon medium-red'],
+    [new RegExp(/\.mawk$/i), 'terminal-icon medium-maroon'],
+    [new RegExp(/\.nawk$/i), 'terminal-icon dark-green'],
+    [new RegExp(/\.auk$/i), 'terminal-icon dark-cyan'],
+    [new RegExp(/\.(?:babelrc|languagebabel|babel)$/i), 'babel-icon medium-yellow'],
+    [new RegExp(/\.babelignore$/i), 'babel-icon dark-yellow'],
+    [new RegExp(/\.cbx$/i), 'bibtex-icon medium-red'],
+    [new RegExp(/\.bbx$/i), 'bibtex-icon medium-orange'],
+    [new RegExp(/\.bib$/i), 'bibtex-icon medium-yellow'],
+    [new RegExp(/\.bst$/i), 'bibtex-icon medium-green'],
+    [new RegExp(/\.bison$/i), 'gnu-icon medium-red'],
+    [new RegExp(/\.blend$/i), 'blender-icon medium-orange'],
+    [new RegExp(/\.blend\d+$/i), 'blender-icon dark-orange'],
+    [new RegExp(/\.bphys$/i), 'blender-icon dark-blue'],
+    [new RegExp(/\.bsv$/i), 'bluespec-icon dark-blue'],
+    [new RegExp(/\.boo$/i), 'boo-icon medium-green'],
+    [new RegExp(/\.boot$/i), 'boot-icon null'],
+    [new RegExp(/\.bf?$/i), 'brain-icon dark-pink'],
+    [new RegExp(/^Brewfile$/), 'brew-icon medium-orange'],
+    [new RegExp(/\.bro$/i), 'bro-icon dark-cyan'],
+    [new RegExp(/\.dm$/i), 'byond-icon medium-blue'],
+    [new RegExp(/\.c$/i), 'c-icon medium-blue'],
+    [new RegExp(/\.h$|\.cats$/i), 'c-icon medium-purple'],
+    [new RegExp(/\.idc$/i), 'c-icon medium-green'],
+    [new RegExp(/\.w$/i), 'c-icon medium-maroon'],
+    [new RegExp(/\.nc$/i), 'c-icon dark-blue'],
+    [new RegExp(/\.upc$/i), 'c-icon medium-cyan'],
+    [new RegExp(/\.cs$/i), 'csharp-icon medium-blue'],
+    [new RegExp(/\.csx$/i), 'csscript-icon dark-green'],
+    [new RegExp(/\.c[+px]{2}$|\.cc$/i), 'cpp-icon medium-blue'],
+    [new RegExp(/\.h[+px]{2}$/i), 'cpp-icon medium-purple'],
+    [new RegExp(/\.[it]pp$/i), 'cpp-icon medium-orange'],
+    [new RegExp(/\.(?:tcc|inl)$/i), 'cpp-icon medium-red'],
+    [new RegExp(/\.cabal$/i), 'cabal-icon medium-cyan'],
+    [new RegExp(/\.cake$/i), 'cake-icon medium-yellow'],
+    [new RegExp(/^Cakefile$/), 'cakefile-icon medium-red'],
+    [new RegExp(/\.ctp$/i), 'cakephp-icon medium-red'],
+    [new RegExp(/\.ceylon$/i), 'ceylon-icon medium-orange'],
+    [new RegExp(/\.chpl$/i), 'chapel-icon medium-green'],
+    [new RegExp(/\.crx$/i), 'chrome-icon medium-red'],
+    [new RegExp(/\.ck$/i), 'chuck-icon medium-green'],
+    [new RegExp(/\.cirru$/i), 'cirru-icon medium-pink'],
+    [new RegExp(/\.clw$/i), 'clarion-icon medium-orange'],
+    [new RegExp(/\.icl$/i), 'clean-icon dark-cyan'],
+    [new RegExp(/\.dcl$/i), 'clean-icon medium-cyan'],
+    [new RegExp(/\.abc$/i), 'clean-icon medium-blue'],
+    [new RegExp(/\.click$/i), 'click-icon medium-yellow'],
+    [new RegExp(/\.clp$/i), 'clips-icon dark-green'],
+    [new RegExp(/\.clj$/i), 'clojure-icon medium-blue'],
+    [new RegExp(/\.cl2$/i), 'clojure-icon medium-purple'],
+    [new RegExp(/\.cljc$/i), 'clojure-icon medium-green'],
+    [new RegExp(/\.cljx$|\.hic$/i), 'clojure-icon medium-red'],
+    [new RegExp(/\.cljs(?:\.hl|cm)?$/i), 'cljs-icon medium-blue'],
+    [new RegExp(/\.cmake$/i), 'cmake-icon medium-green'],
+    [new RegExp(/^CMakeLists\.txt$/), 'cmake-icon medium-red'],
+    [new RegExp(/\.coffee$/i), 'coffee-icon medium-maroon'],
+    [new RegExp(/\.cjsx$/i), 'coffee-icon dark-maroon'],
+    [new RegExp(/\.litcoffee$/i), 'coffee-icon light-maroon'],
+    [new RegExp(/\.iced$/i), 'coffee-icon medium-blue'],
+    [new RegExp(/\.cfc$/i), 'cf-icon light-cyan'],
+    [new RegExp(/\.cfml?$/i), 'cf-icon medium-cyan'],
+    [new RegExp(/\.dae$/i), 'khronos-icon medium-orange'],
+    [new RegExp(/\.cl$/i), 'cl-icon medium-orange'],
+    [new RegExp(/\.cp$/i), 'cp-icon medium-maroon'],
+    [new RegExp(/\.cps$/i), 'cp-icon dark-red'],
+    [new RegExp(/\.(?:zip|z|xz)$/i), 'zip-icon null'],
+    [new RegExp(/\.rar$/i), 'zip-icon medium-blue'],
+    [new RegExp(/\.t?gz$|\.tar$|\.whl$/i), 'zip-icon dark-blue'],
+    [new RegExp(/\.(?:lzo?|lzma|tlz|tar\.lzma)$/i), 'zip-icon medium-maroon'],
+    [new RegExp(/\.7z$/i), 'zip-icon medium-maroon'],
+    [new RegExp(/\.apk$|\.gem$/i), 'zip-icon medium-red'],
+    [new RegExp(/\.bz2$/i), 'zip-icon dark-cyan'],
+    [new RegExp(/\.iso$/i), 'zip-icon medium-blue'],
+    [new RegExp(/\.xpi$/i), 'zip-icon medium-orange'],
+    [new RegExp(/\.epub$/i), 'zip-icon medium-green'],
+    [new RegExp(/\.jar$/i), 'zip-icon dark-pink'],
+    [new RegExp(/\.war$/i), 'zip-icon medium-purple'],
+    [new RegExp(/\.xar$/i), 'zip-icon dark-orange'],
+    [new RegExp(/\.egg$/i), 'zip-icon light-orange'],
+    [new RegExp(/\.(?:ini|desktop|directory|cfg|conf|prefs)$/i), 'config-icon medium-yellow'],
+    [new RegExp(/\.properties$/i), 'config-icon medium-purple'],
+    [new RegExp(/\.toml$|\.opts$/i), 'config-icon medium-green'],
+    [new RegExp(/\.ld$/i), 'config-icon dark-red'],
+    [new RegExp(/\.lds$|\.reek$/i), 'config-icon medium-red'],
+    [new RegExp(/\.terminal$/i), 'config-icon dark-blue'],
+    [new RegExp(/^ld\.script$/i), 'config-icon medium-orange'],
+    [new RegExp(/^\/(?:private\/)?etc\/(?:[^\/]+\/)*[^\/]*\.(?:cf|conf|ini)(?:\.default)?$/i), 'config-icon dark-orange'],
+    [new RegExp(/^\/(?:private\/)?etc\/(?:aliases|auto_(?:home|master)|ftpusers|group|gettytab|hosts(?:\.equiv)?|manpaths|networks|paths|protocols|services|shells|sudoers|ttys)$/i), 'config-icon medium-maroon'],
+    [new RegExp(/\.coq$/i), 'coq-icon medium-maroon'],
+    [new RegExp(/\.creole$/i), 'creole-icon medium-blue'],
+    [new RegExp(/\.e?cr$/i), 'crystal-icon medium-cyan'],
+    [new RegExp(/\.orc$/i), 'csound-icon medium-maroon'],
+    [new RegExp(/\.udo$/i), 'csound-icon dark-orange'],
+    [new RegExp(/\.csd$/i), 'csound-icon dark-maroon'],
+    [new RegExp(/\.sco$/i), 'csound-icon dark-blue'],
+    [new RegExp(/\.css$/i), 'css3-icon medium-blue'],
+    [new RegExp(/\.less$/i), 'css3-icon dark-blue'],
+    [new RegExp(/\.feature$/i), 'cucumber-icon medium-green'],
+    [new RegExp(/\.cu$/i), 'nvidia-icon medium-green'],
+    [new RegExp(/\.cuh$/i), 'nvidia-icon dark-green'],
+    [new RegExp(/\.pyx$/i), 'cython-icon medium-orange'],
+    [new RegExp(/\.pxd$/i), 'cython-icon medium-blue'],
+    [new RegExp(/\.pxi$/i), 'cython-icon dark-blue'],
+    [new RegExp(/\.di?$/i), 'dlang-icon medium-red'],
+    [new RegExp(/\.dnh$/i), 'yang-icon medium-red'],
+    [new RegExp(/\.d(?:arcs)?patch$/i), 'darcs-icon medium-green'],
+    [new RegExp(/\.dart$/i), 'dart-icon medium-cyan'],
+    [new RegExp(/\.s[kl]im$/i), 'dashboard-icon medium-orange'],
+    [new RegExp(/\.cpuprofile$/i), 'dashboard-icon medium-green'],
+    [new RegExp(/\.(?:h|geo|topo)?json$/i), 'database-icon medium-yellow'],
+    [new RegExp(/\.ya?ml$/i), 'database-icon light-red'],
+    [new RegExp(/\.cson$|\.ston$|^mime\.types$/i), 'database-icon medium-maroon'],
+    [new RegExp(/\.json5$/i), 'database-icon dark-yellow'],
+    [new RegExp(/\.http$|\.pot?$/i), 'database-icon medium-red'],
+    [new RegExp(/\.ndjson$|\.pytb$/i), 'database-icon medium-orange'],
+    [new RegExp(/\.fea$/i), 'database-icon light-blue'],
+    [new RegExp(/\.json\.eex$|\.edn$/i), 'database-icon medium-purple'],
+    [new RegExp(/\.proto$/i), 'database-icon dark-cyan'],
+    [new RegExp(/\.pydeps$|\.rviz$/i), 'database-icon dark-blue'],
+    [new RegExp(/\.eam\.fs$/i), 'database-icon dark-purple'],
+    [new RegExp(/\.qml$/i), 'database-icon medium-pink'],
+    [new RegExp(/\.qbs$/i), 'database-icon dark-pink'],
+    [new RegExp(/\.ttl$/i), 'database-icon medium-cyan'],
+    [new RegExp(/\.syntax$/i), 'database-icon medium-blue'],
+    [new RegExp(/\.dbf$/i), 'dbase-icon medium-red'],
+    [new RegExp(/\.deb$/i), 'debian-icon medium-red'],
+    [new RegExp(/^control$/), 'debian-icon dark-cyan'],
+    [new RegExp(/^rules$/), 'debian-icon medium-cyan'],
+    [new RegExp(/\.diff$/i), 'diff-icon medium-orange'],
+    [new RegExp(/\.zone$/i), 'earth-icon medium-blue'],
+    [new RegExp(/\.arpa$/i), 'earth-icon medium-green'],
+    [new RegExp(/^CNAME$/), 'earth-icon dark-blue'],
+    [new RegExp(/^Doxyfile$/), 'doxygen-icon medium-blue'],
+    [new RegExp(/\.dyalog$/i), 'dyalog-icon medium-orange'],
+    [new RegExp(/\.(?:dylib|bundle)$/i), 'dylib-icon medium-cyan'],
+    [new RegExp(/\.E$/), 'e-icon medium-green'],
+    [new RegExp(/\.sch$/i), 'eagle-icon medium-red'],
+    [new RegExp(/\.brd$/i), 'eagle-icon dark-red'],
+    [new RegExp(/\.ec$/i), 'ec-icon dark-blue'],
+    [new RegExp(/\.eh$/i), 'ec-icon dark-purple'],
+    [new RegExp(/\.epj$/i), 'ecere-icon medium-blue'],
+    [new RegExp(/\.c?project$/), 'eclipse-icon dark-blue'],
+    [new RegExp(/\.classpath$/i), 'eclipse-icon medium-red'],
+    [new RegExp(/\.editorconfig$/i), 'editorconfig-icon medium-orange'],
+    [new RegExp(/\.e$/), 'eiffel-icon medium-cyan'],
+    [new RegExp(/\.ex$/i), 'elixir-icon dark-purple'],
+    [new RegExp(/\.(?:exs|eex)$/i), 'elixir-icon medium-purple'],
+    [new RegExp(/mix\.exs?$/i), 'elixir-icon light-purple'],
+    [new RegExp(/\.elm$/i), 'elm-icon medium-blue'],
+    [new RegExp(/(?:^|\.)(?:el|_?emacs|spacemacs|emacs\.desktop|abbrev[-_]defs)$/i), 'emacs-icon medium-purple'],
+    [new RegExp(/(?:^|\.)(?:elc|eld)$/i), 'emacs-icon dark-purple'],
+    [new RegExp(/^(?:authors|owners)$/i), 'at-icon medium-red'],
+    [new RegExp(/\.emberscript$/i), 'em-icon medium-red'],
+    [new RegExp(/\.em(?:blem)?$/i), 'mustache-icon medium-blue'],
+    [new RegExp(/\.eq$/i), 'eq-icon medium-orange'],
+    [new RegExp(/\.erl$/i), 'erlang-icon medium-red'],
+    [new RegExp(/\.beam$/i), 'erlang-icon dark-red'],
+    [new RegExp(/\.hrl$/i), 'erlang-icon medium-maroon'],
+    [new RegExp(/\.xrl$/i), 'erlang-icon medium-green'],
+    [new RegExp(/\.yrl$/i), 'erlang-icon dark-green'],
+    [new RegExp(/\.app\.src$/i), 'erlang-icon dark-maroon'],
+    [new RegExp(/\.factor$/i), 'factor-icon medium-orange'],
+    [new RegExp(/\.factor-rc$/i), 'factor-icon dark-orange'],
+    [new RegExp(/\.factor-boot-rc$/i), 'factor-icon medium-red'],
+    [new RegExp(/\.fy$/i), 'fancy-icon dark-blue'],
+    [new RegExp(/\.fancypack$/i), 'fancy-icon medium-blue'],
+    [new RegExp(/^Fakefile$/), 'fancy-icon medium-green'],
+    [new RegExp(/\.fan$/i), 'fantom-icon medium-blue'],
+    [new RegExp(/\.fbx$/i), 'fbx-icon medium-maroon'],
+    [new RegExp(/^Icon\r$/), 'finder-icon medium-blue'],
+    [new RegExp(/\.rsrc$/i), 'finder-icon dark-blue'],
+    [new RegExp(/\.(?:flowconfig|js\.flow)$/i), 'flow-icon medium-orange'],
+    [new RegExp(/\.fx$/i), 'flux-icon medium-blue'],
+    [new RegExp(/\.flux$/i), 'flux-icon dark-blue'],
+    [new RegExp(/\.woff2$/i), 'font-icon dark-blue'],
+    [new RegExp(/\.woff$/i), 'font-icon medium-blue'],
+    [new RegExp(/\.eot$/i), 'font-icon light-green'],
+    [new RegExp(/\.ttc$/i), 'font-icon dark-green'],
+    [new RegExp(/\.ttf$/i), 'font-icon medium-green'],
+    [new RegExp(/\.otf$/i), 'font-icon dark-yellow'],
+    [new RegExp(/\.pfb$/i), 'font-icon dark-red'],
+    [new RegExp(/\.pfm$/i), 'font-icon medium-red'],
+    [new RegExp(/\.pe$/i), 'ff-icon medium-orange'],
+    [new RegExp(/\.sfd$/i), 'ff-icon dark-blue'],
+    [new RegExp(/\.f$/i), 'fortran-icon medium-maroon'],
+    [new RegExp(/\.f90$/i), 'fortran-icon medium-green'],
+    [new RegExp(/\.f03$/i), 'fortran-icon medium-red'],
+    [new RegExp(/\.f08$/i), 'fortran-icon medium-blue'],
+    [new RegExp(/\.f77$/i), 'fortran-icon medium-maroon'],
+    [new RegExp(/\.f95$/i), 'fortran-icon dark-pink'],
+    [new RegExp(/\.for$/i), 'fortran-icon dark-cyan'],
+    [new RegExp(/\.fpp$/i), 'fortran-icon dark-yellow'],
+    [new RegExp(/\.ftl$/i), 'freemarker-icon medium-blue'],
+    [new RegExp(/\.fr$/i), 'frege-icon dark-red'],
+    [new RegExp(/\.fs[xi]?$/i), 'fsharp-icon medium-blue'],
+    [new RegExp(/\.gml$/i), 'gml-icon medium-green'],
+    [new RegExp(/\.gms$/i), 'gams-icon dark-red'],
+    [new RegExp(/\.gap$/i), 'gap-icon medium-yellow'],
+    [new RegExp(/\.gi$/i), 'gap-icon dark-blue'],
+    [new RegExp(/\.tst$/i), 'gap-icon medium-orange'],
+    [new RegExp(/\.gdb$/i), 'gdb-icon medium-green'],
+    [new RegExp(/gdbinit$/i), 'gdb-icon medium-cyan'],
+    [new RegExp(/\.gd$/i), 'godot-icon medium-blue'],
+    [new RegExp(/^\.htaccess$|\.yardopts$/i), 'gear-icon medium-red'],
+    [new RegExp(/^\.htpasswd$/i), 'gear-icon medium-orange'],
+    [new RegExp(/^\.env\.|\.pairs$/i), 'gear-icon dark-green'],
+    [new RegExp(/^\.lesshintrc$/i), 'gear-icon dark-yellow'],
+    [new RegExp(/^\.csscomb\.json$|\.csslintrc$|\.jsbeautifyrc$|\.jshintrc$|\.jscsrc$/i), 'gear-icon medium-yellow'],
+    [new RegExp(/\.coffeelintignore$|\.codoopts$/i), 'gear-icon medium-maroon'],
+    [new RegExp(/\.module$/i), 'gear-icon medium-blue'],
+    [new RegExp(/\.arcconfig$|\.python-version$/i), 'gear-icon dark-blue'],
+    [new RegExp(/\.lintstagedrc$/i), 'gear-icon dark-orange'],
+    [new RegExp(/\.dll$/i), 'gears-icon dark-orange'],
+    [new RegExp(/\.xml$|\.config$|\.4th$|\.cocci$|\.dyl$|\.dylan$|\.ecl$|\.forth$|\.launch$|\.manifest$|\.menu$|\.srdf$|\.st$|\.ui$|\.wsf$|\.x3d$|\.xaml$/i), 'code-icon medium-blue'],
+    [new RegExp(/\.rdf$|\.capnp$|\.dotsettings$|\.flex$|\.fsh$|\.fsproj$|\.prw$|\.xproj$/i), 'code-icon dark-red'],
+    [new RegExp(/^_service$/), 'code-icon medium-blue'],
+    [new RegExp(/^configure\.ac$|\.ML$/), 'code-icon medium-red'],
+    [new RegExp(/^Settings\.StyleCop$/), 'code-icon medium-green'],
+    [new RegExp(/\.abnf$|\.ditaval$|\.storyboard$|\.xmi$|\.yacc$/i), 'code-icon medium-green'],
+    [new RegExp(/\.aepx$|\.dita$|\.grace$|\.lid$|\.nproj$/i), 'code-icon medium-purple'],
+    [new RegExp(/\.agda$|\.plist$|\.wisp$|\.xlf$|\.xslt$/i), 'code-icon dark-cyan'],
+    [new RegExp(/\.appxmanifest$|\.befunge$|\.fun$|\.muf$|\.xul$/i), 'code-icon medium-orange'],
+    [new RegExp(/\.ash$|\.asn1?$|\.lagda$|\.lex$|\.props$|\.resx$|\.smt2$|\.vsh$|\.xsl$|\.yy$/i), 'code-icon medium-cyan'],
+    [new RegExp(/\.axml$|\.bmx$|\.brs$|\.ccxml$|\.clixml$|\.fth$|\.intr$|\.mdpolicy$|\.mtml$|\.myt$|\.xsd$/i), 'code-icon dark-blue'],
+    [new RegExp(/\.bnf$|\.cbl$|\.cob$|\.cobol$|\.fxml$/i), 'code-icon medium-maroon'],
+    [new RegExp(/\.ccp$|\.cpy$|\.mxml$/i), 'code-icon dark-maroon'],
+    [new RegExp(/\.ch$|\.cw$|\.ebnf$|\.iml$|\.jflex$|\.m4$|\.mask$|\.mumps$|\.prg$|\.pt$|\.rl$|\.sml$|\.targets$|\.webidl$|\.wsdl$|\.xacro$|\.xliff$/i), 'code-icon medium-red'],
+    [new RegExp(/\.ct$|\.zcml$/i), 'code-icon dark-pink'],
+    [new RegExp(/\.cy$|\.eclxml$|\.ivy$|\.sed$|\.tml$|\.y$/i), 'code-icon dark-green'],
+    [new RegExp(/\.ditamap$|\.frt$|\.lp$|\.omgrofl$|\.osm$|\.wxs$|\.xib$/i), 'code-icon dark-purple'],
+    [new RegExp(/\.filters$|\.lol$|\.pig$/i), 'code-icon medium-pink'],
+    [new RegExp(/\.grxml$|\.urdf$/i), 'code-icon dark-orange'],
+    [new RegExp(/\.jelly$/i), 'code-icon medium-yellow'],
+    [new RegExp(/\.jsproj$|\.ohm$|\.sgml?$/i), 'code-icon dark-yellow'],
+    [new RegExp(/\.mq[45h]$/i), 'code-icon dark-blue'],
+    [new RegExp(/\.odd$/i), 'code-icon light-green'],
+    [new RegExp(/\.psc1$|\.smt$/i), 'code-icon light-blue'],
+    [new RegExp(/\.scxml$/i), 'code-icon light-cyan'],
+    [new RegExp(/\.sig$|\.wxl$/i), 'code-icon light-maroon'],
+    [new RegExp(/\.ux$|\.wxi$/i), 'code-icon light-orange'],
+    [new RegExp(/\.vxml$/i), 'code-icon light-purple'],
+    [new RegExp(/\.kid$/i), 'genshi-icon medium-red'],
+    [new RegExp(/\.ebuild$/i), 'gentoo-icon dark-cyan'],
+    [new RegExp(/\.eclass$/i), 'gentoo-icon medium-blue'],
+    [new RegExp(/^COMMIT_EDITMSG$/), 'git-commit-icon medium-red'],
+    [new RegExp(/^MERGE_(?:HEAD|MODE|MSG)$/), 'git-merge-icon medium-red'],
+    [new RegExp(/\.glade$/i), 'glade-icon medium-green'],
+    [new RegExp(/\.glf$/i), 'pointwise-icon medium-blue'],
+    [new RegExp(/\.glyphs$/i), 'glyphs-icon medium-green'],
+    [new RegExp(/\.gn$/i), 'gn-icon dark-blue'],
+    [new RegExp(/\.gni$/i), 'gn-icon medium-blue'],
+    [new RegExp(/\.(?:gnu|gplv[23])$/i), 'gnu-icon medium-red'],
+    [new RegExp(/\.(?:gp|plo?t|gnuplot)$/i), 'graph-icon medium-red'],
+    [new RegExp(/\.go$/i), 'go-icon medium-blue'],
+    [new RegExp(/\.golo$/i), 'golo-icon medium-orange'],
+    [new RegExp(/\.gs$/i), 'gosu-icon medium-blue'],
+    [new RegExp(/\.gst$/i), 'gosu-icon medium-green'],
+    [new RegExp(/\.gsx$/i), 'gosu-icon dark-green'],
+    [new RegExp(/\.vark$/i), 'gosu-icon dark-blue'],
+    [new RegExp(/\.gradle$/i), 'gradle-icon medium-blue'],
+    [new RegExp(/gradlew$/i), 'gradle-icon dark-purple'],
+    [new RegExp(/\.gf$/i), 'gf-icon medium-red'],
+    [new RegExp(/\.graphql$/i), 'graphql-icon medium-pink'],
+    [new RegExp(/\.gql$/i), 'graphql-icon medium-purple'],
+    [new RegExp(/\.gv$/i), 'graphviz-icon medium-blue'],
+    [new RegExp(/\.dot$/i), 'graphviz-icon dark-cyan'],
+    [new RegExp(/\.(?:groovy|grt|gtpl|gsp|gvy)$/i), 'groovy-icon light-blue'],
+    [new RegExp(/\.hh$/i), 'hack-icon medium-orange'],
+    [new RegExp(/\.haml$/i), 'haml-icon medium-yellow'],
+    [new RegExp(/\.hamlc$/i), 'haml-icon medium-maroon'],
+    [new RegExp(/\.hb$/i), 'harbour-icon dark-blue'],
+    [new RegExp(/\.hcl$/i), 'hashicorp-icon dark-purple'],
+    [new RegExp(/\.hs$/i), 'haskell-icon medium-purple'],
+    [new RegExp(/\.hsc$/i), 'haskell-icon medium-blue'],
+    [new RegExp(/\.c2hs$/i), 'haskell-icon dark-purple'],
+    [new RegExp(/\.lhs$/i), 'haskell-icon dark-blue'],
+    [new RegExp(/\.hx(?:[sm]l|)?$/), 'haxe-icon medium-orange'],
+    [new RegExp(/^Procfile$/), 'heroku-icon medium-purple'],
+    [new RegExp(/\.buildpacks$/i), 'heroku-icon light-purple'],
+    [new RegExp(/^\.vendor_urls$/), 'heroku-icon dark-purple'],
+    [new RegExp(/\.x?html?$/i), 'html5-icon medium-orange'],
+    [new RegExp(/\.cshtml$|\.latte$/i), 'html5-icon medium-red'],
+    [new RegExp(/\.ejs$|\.kit$|\.swig$/i), 'html5-icon medium-green'],
+    [new RegExp(/\.gohtml$|\.phtml$/i), 'html5-icon dark-blue'],
+    [new RegExp(/\.html\.eex$|\.jsp$/i), 'html5-icon medium-purple'],
+    [new RegExp(/\.shtml$/i), 'html5-icon medium-cyan'],
+    [new RegExp(/\.scaml$/i), 'html5-icon dark-red'],
+    [new RegExp(/\.vash$/i), 'html5-icon medium-red'],
+    [new RegExp(/\.dtml$/i), 'html5-icon medium-blue'],
+    [new RegExp(/\.hy$/i), 'hy-icon dark-blue'],
+    [new RegExp(/\.dlm$/i), 'idl-icon medium-blue'],
+    [new RegExp(/\.idr$/i), 'idris-icon dark-red'],
+    [new RegExp(/\.lidr$/i), 'idris-icon medium-maroon'],
+    [new RegExp(/\.ipf$/i), 'igorpro-icon dark-red'],
+    [new RegExp(/\.a?png$|\.svgz$/i), 'image-icon light-orange'],
+    [new RegExp(/\.gif$|\.ora$|\.sgi$/i), 'image-icon medium-yellow'],
+    [new RegExp(/\.jpe?g$/i), 'image-icon medium-green'],
+    [new RegExp(/\.ico$/i), 'image-icon medium-blue'],
+    [new RegExp(/\.webp$|\.iff$|\.lbm$|\.liff$|\.nrrd$|\.pcx$|\.vsdx?$/i), 'image-icon dark-blue'],
+    [new RegExp(/\.bmp$/i), 'image-icon medium-red'],
+    [new RegExp(/\.bpg$/i), 'image-icon medium-red'],
+    [new RegExp(/\.cin$/i), 'image-icon medium-orange'],
+    [new RegExp(/\.cd5$/i), 'image-icon dark-green'],
+    [new RegExp(/\.cpc$/i), 'image-icon light-yellow'],
+    [new RegExp(/\.cr2$/i), 'image-icon medium-orange'],
+    [new RegExp(/\.dcm$|\.mpo$|\.pbm$/i), 'image-icon medium-pink'],
+    [new RegExp(/\.dds$/i), 'image-icon dark-green'],
+    [new RegExp(/\.djvu?$|\.pxr$/i), 'image-icon medium-purple'],
+    [new RegExp(/\.dpx$|\.raw$/i), 'image-icon dark-orange'],
+    [new RegExp(/\.ecw$|\.sct$/i), 'image-icon light-blue'],
+    [new RegExp(/\.exr$/i), 'image-icon dark-yellow'],
+    [new RegExp(/\.fits?$|\.fts$/i), 'image-icon medium-cyan'],
+    [new RegExp(/\.flif$|\.hdp$|\.heic$|\.heif$|\.jxr$|\.wdp$/i), 'image-icon dark-red'],
+    [new RegExp(/\.hdr$/i), 'image-icon medium-blue'],
+    [new RegExp(/\.icns$/i), 'image-icon medium-pink'],
+    [new RegExp(/\.(?:jp[f2xm]|j2c|mj2)$/i), 'image-icon dark-green'],
+    [new RegExp(/\.jps$/i), 'image-icon dark-cyan'],
+    [new RegExp(/\.mng$/i), 'image-icon medium-orange'],
+    [new RegExp(/\.pgf$/i), 'image-icon light-red'],
+    [new RegExp(/\.pict$/i), 'image-icon light-purple'],
+    [new RegExp(/\.tga$/i), 'image-icon dark-orange'],
+    [new RegExp(/\.tiff?$/i), 'image-icon medium-red'],
+    [new RegExp(/\.wbm$/i), 'image-icon dark-maroon'],
+    [new RegExp(/\.ni$/i), 'inform7-icon medium-blue'],
+    [new RegExp(/\.i7x$/i), 'inform7-icon dark-blue'],
+    [new RegExp(/\.iss$/i), 'inno-icon dark-blue'],
+    [new RegExp(/\.io$/i), 'io-icon dark-purple'],
+    [new RegExp(/\.ik$/i), 'ioke-icon medium-red'],
+    [new RegExp(/\.thy$/i), 'isabelle-icon dark-red'],
+    [new RegExp(/^ROOT$/), 'isabelle-icon dark-blue'],
+    [new RegExp(/\.ijs$/i), 'j-icon light-blue'],
+    [new RegExp(/\.jade$/i), 'jade-icon medium-red'],
+    [new RegExp(/^Jakefile$/), 'jake-icon medium-maroon'],
+    [new RegExp(/\.jake$/i), 'jake-icon medium-yellow'],
+    [new RegExp(/\.java$/i), 'java-icon medium-purple'],
+    [new RegExp(/\.js$|\.es6$|\.es$/i), 'js-icon medium-yellow'],
+    [new RegExp(/\._js$/i), 'js-icon medium-orange'],
+    [new RegExp(/\.jsb$|\.dust$/i), 'js-icon medium-maroon'],
+    [new RegExp(/\.jsm$|\.mjs$|\.xsjslib$/i), 'js-icon medium-blue'],
+    [new RegExp(/\.jss$/i), 'js-icon medium-green'],
+    [new RegExp(/\.sjs$/i), 'js-icon medium-pink'],
+    [new RegExp(/\.ssjs$/i), 'js-icon medium-red'],
+    [new RegExp(/\.xsjs$/i), 'js-icon medium-purple'],
+    [new RegExp(/^Jenkinsfile$/), 'jenkins-icon medium-red'],
+    [new RegExp(/\.jinja$/i), 'jinja-icon dark-red'],
+    [new RegExp(/\.jinja2$/i), 'jinja-icon medium-red'],
+    [new RegExp(/\.jsonld$/i), 'jsonld-icon medium-blue'],
+    [new RegExp(/\.jq$/i), 'sql-icon medium-blue'],
+    [new RegExp(/\.jsx$/i), 'jsx-icon medium-blue'],
+    [new RegExp(/\.jl$/i), 'julia-icon medium-purple'],
+    [new RegExp(/\.ipynb$/i), 'jupyter-icon dark-orange'],
+    [new RegExp(/^Notebook$/), 'jupyter-icon dark-cyan'],
+    [new RegExp(/\.keynote$/i), 'keynote-icon medium-blue'],
+    [new RegExp(/\.knt$/i), 'keynote-icon dark-blue'],
+    [new RegExp(/\.kv$/i), 'kivy-icon dark-maroon'],
+    [new RegExp(/\.kml$/i), 'earth-icon medium-green'],
+    [new RegExp(/\.kt$/i), 'kotlin-icon dark-blue'],
+    [new RegExp(/\.ktm$/i), 'kotlin-icon medium-blue'],
+    [new RegExp(/\.kts$/i), 'kotlin-icon medium-orange'],
+    [new RegExp(/\.krl$/i), 'krl-icon medium-blue'],
+    [new RegExp(/\.lvproj$/i), 'labview-icon dark-blue'],
+    [new RegExp(/\.blade\.php$/i), 'laravel-icon medium-orange'],
+    [new RegExp(/\.lasso$|\.las$/i), 'lasso-icon dark-blue'],
+    [new RegExp(/\.lasso8$/i), 'lasso-icon medium-blue'],
+    [new RegExp(/\.lasso9$/i), 'lasso-icon medium-purple'],
+    [new RegExp(/\.ldml$/i), 'lasso-icon medium-red'],
+    [new RegExp(/\.lean$/i), 'lean-icon dark-purple'],
+    [new RegExp(/\.hlean$/i), 'lean-icon dark-red'],
+    [new RegExp(/\.lfe$/i), 'lfe-icon dark-red'],
+    [new RegExp(/\.lwo$/i), 'lightwave-icon medium-red'],
+    [new RegExp(/\.lws$/i), 'lightwave-icon medium-blue'],
+    [new RegExp(/\.lsp$/i), 'lisp-icon medium-red'],
+    [new RegExp(/\.lisp$/i), 'lisp-icon dark-red'],
+    [new RegExp(/\.l$|\.nl$/i), 'lisp-icon medium-maroon'],
+    [new RegExp(/\.ny$|\.sexp$/i), 'lisp-icon medium-blue'],
+    [new RegExp(/\.podsl$/i), 'lisp-icon medium-purple'],
+    [new RegExp(/\.ls$/i), 'ls-icon medium-blue'],
+    [new RegExp(/\._ls$/i), 'ls-icon dark-blue'],
+    [new RegExp(/^Slakefile$/), 'ls-icon medium-green'],
+    [new RegExp(/\.ll$/i), 'llvm-icon dark-green'],
+    [new RegExp(/\.clang-format$/i), 'llvm-icon medium-yellow'],
+    [new RegExp(/\.xm$/i), 'mobile-icon dark-blue'],
+    [new RegExp(/\.xi$/i), 'mobile-icon dark-red'],
+    [new RegExp(/\.(?:logtalk|lgt)$/i), 'logtalk-icon medium-red'],
+    [new RegExp(/\.lookml$/i), 'lookml-icon medium-purple'],
+    [new RegExp(/\.lsl$/i), 'lsl-icon medium-cyan'],
+    [new RegExp(/\.lslp$/i), 'lsl-icon dark-cyan'],
+    [new RegExp(/\.lua$/i), 'lua-icon medium-blue'],
+    [new RegExp(/\.pd_lua$/i), 'lua-icon dark-blue'],
+    [new RegExp(/\.rbxs$/i), 'lua-icon dark-purple'],
+    [new RegExp(/\.wlua$/i), 'lua-icon dark-red'],
+    [new RegExp(/^Makefile|^makefile$/), 'checklist-icon medium-yellow'],
+    [new RegExp(/\.(?:mk|mak|make)$|^mkfile$/i), 'checklist-icon medium-yellow'],
+    [new RegExp(/^BSDmakefile$|\.am$/i), 'checklist-icon medium-red'],
+    [new RegExp(/^GNUmakefile$/i), 'checklist-icon medium-green'],
+    [new RegExp(/^Kbuild$/), 'checklist-icon medium-blue'],
+    [new RegExp(/\.bb$/i), 'checklist-icon dark-blue'],
+    [new RegExp(/^DEPS$/), 'checklist-icon dark-blue'],
+    [new RegExp(/\.mms$/i), 'checklist-icon medium-blue'],
+    [new RegExp(/\.mmk$/i), 'checklist-icon light-blue'],
+    [new RegExp(/\.pri$/i), 'checklist-icon dark-purple'],
+    [new RegExp(/\.mak?o$/i), 'mako-icon dark-blue'],
+    [new RegExp(/\.(?:1(?:[bcmsx]|has|in)?|[24568]|3(?:avl|bsm|3c|in|m|qt|x)?|7(?:d|fs|i|ipp|m|p)?|9[efps]?|chem|eqn|groff|man|mandoc|mdoc|me|mom|n|nroff|pic|tmac|tmac-u|tr|troff)$/i), 'manpage-icon dark-green'],
+    [new RegExp(/\.(?:rnh|rno|roff|run|runoff)$/i), 'manpage-icon dark-maroon'],
+    [new RegExp(/\.mss$/i), 'mapbox-icon medium-cyan'],
+    [new RegExp(/\.(?:md|mdown|markdown|mkd|mkdown|mkdn|rmd|ron)$/i), 'markdown-icon'],
+    [new RegExp(/\.mathematica$|\.nbp$/i), 'mathematica-icon dark-red'],
+    [new RegExp(/\.cdf$/i), 'mathematica-icon medium-red'],
+    [new RegExp(/\.ma$/i), 'mathematica-icon medium-orange'],
+    [new RegExp(/\.mt$/i), 'mathematica-icon medium-maroon'],
+    [new RegExp(/\.nb$/i), 'mathematica-icon dark-orange'],
+    [new RegExp(/\.wl$/i), 'mathematica-icon medium-yellow'],
+    [new RegExp(/\.wlt$/i), 'mathematica-icon dark-yellow'],
+    [new RegExp(/\.matlab$/i), 'matlab-icon medium-yellow'],
+    [new RegExp(/\.maxpat$/i), 'max-icon dark-purple'],
+    [new RegExp(/\.maxhelp$/i), 'max-icon medium-red'],
+    [new RegExp(/\.maxproj$/i), 'max-icon medium-blue'],
+    [new RegExp(/\.mxt$/i), 'max-icon medium-purple'],
+    [new RegExp(/\.pat$/i), 'max-icon medium-green'],
+    [new RegExp(/\.ms$/i), 'maxscript-icon dark-blue'],
+    [new RegExp(/\.mcr$/i), 'maxscript-icon dark-purple'],
+    [new RegExp(/\.mce$/i), 'maxscript-icon medium-red'],
+    [new RegExp(/\.max$/i), 'maxscript-icon dark-cyan'],
+    [new RegExp(/\.3ds$/i), 'maxscript-icon medium-cyan'],
+    [new RegExp(/\.mb$/i), 'maya-icon dark-cyan'],
+    [new RegExp(/\.mel$/i), 'maya-icon dark-blue'],
+    [new RegExp(/\.mcf[ip]$/i), 'maya-icon dark-purple'],
+    [new RegExp(/\.mediawiki$/i), 'mediawiki-icon medium-yellow'],
+    [new RegExp(/\.wiki$/i), 'mediawiki-icon medium-orange'],
+    [new RegExp(/^\.mention-bot$/i), 'bullhorn-icon medium-orange'],
+    [new RegExp(/\.moo$/i), 'mercury-icon medium-cyan'],
+    [new RegExp(/\.metal$/i), 'metal-icon dark-cyan'],
+    [new RegExp(/\.accda$/i), 'access-icon dark-maroon'],
+    [new RegExp(/\.accdb$/i), 'access-icon medium-maroon'],
+    [new RegExp(/\.accde$/i), 'access-icon medium-green'],
+    [new RegExp(/\.accdr$/i), 'access-icon medium-red'],
+    [new RegExp(/\.accdt$/i), 'access-icon dark-red'],
+    [new RegExp(/\.adn$|\.laccdb$/i), 'access-icon light-maroon'],
+    [new RegExp(/\.mdw$/i), 'access-icon dark-purple'],
+    [new RegExp(/\.xls$/i), 'excel-icon dark-orange'],
+    [new RegExp(/\.xlsx$/i), 'excel-icon dark-green'],
+    [new RegExp(/\.xlsm$/i), 'excel-icon medium-green'],
+    [new RegExp(/\.xlsb$/i), 'excel-icon medium-red'],
+    [new RegExp(/\.xlt$/i), 'excel-icon dark-cyan'],
+    [new RegExp(/\.one$/i), 'onenote-icon dark-purple'],
+    [new RegExp(/\.pps$/i), 'powerpoint-icon dark-red'],
+    [new RegExp(/\.ppsx$/i), 'powerpoint-icon medium-orange'],
+    [new RegExp(/\.ppt$/i), 'powerpoint-icon dark-orange'],
+    [new RegExp(/\.pptx$/i), 'powerpoint-icon medium-red'],
+    [new RegExp(/\.potm$/i), 'powerpoint-icon medium-maroon'],
+    [new RegExp(/\.mpp$/i), 'powerpoint-icon dark-green'],
+    [new RegExp(/\.doc$/i), 'word-icon medium-blue'],
+    [new RegExp(/\.docx$/i), 'word-icon dark-blue'],
+    [new RegExp(/\.docm$/i), 'word-icon medium-maroon'],
+    [new RegExp(/\.docxml$/i), 'word-icon dark-cyan'],
+    [new RegExp(/\.dotm$/i), 'word-icon dark-maroon'],
+    [new RegExp(/\.dotx$/i), 'word-icon medium-cyan'],
+    [new RegExp(/\.wri$/i), 'word-icon medium-orange'],
+    [new RegExp(/^mcmod\.info$/i), 'minecraft-icon dark-green'],
+    [new RegExp(/\.dr?uby$/g), 'mirah-icon medium-blue'],
+    [new RegExp(/\.mir(?:ah)?$/g), 'mirah-icon light-blue'],
+    [new RegExp(/\.obj$/i), 'model-icon medium-red'],
+    [new RegExp(/\.mtl$/i), 'model-icon dark-blue'],
+    [new RegExp(/\.stl$/i), 'model-icon dark-green'],
+    [new RegExp(/\.u3d$/i), 'model-icon medium-orange'],
+    [new RegExp(/\.mo$/i), 'circle-icon light-red'],
+    [new RegExp(/\.mod$/i), 'modula2-icon medium-blue'],
+    [new RegExp(/\.def$/i), 'modula2-icon medium-green'],
+    [new RegExp(/\.m2$/i), 'modula2-icon medium-red'],
+    [new RegExp(/\.monkey$/i), 'monkey-icon medium-maroon'],
+    [new RegExp(/\.moon$/i), 'moon-icon medium-yellow'],
+    [new RegExp(/\.mrb$/i), 'mruby-icon medium-red'],
+    [new RegExp(/\.dsql$/i), 'msql-icon medium-purple'],
+    [new RegExp(/\.mu$/i), 'mupad-icon medium-red'],
+    [new RegExp(/\.chord$/i), 'music-icon medium-orange'],
+    [new RegExp(/\.midi?$/i), 'music-icon dark-blue'],
+    [new RegExp(/\.ly$/i), 'music-icon medium-green'],
+    [new RegExp(/\.ily$/i), 'music-icon dark-green'],
+    [new RegExp(/\.pd$/i), 'music-icon dark-red'],
+    [new RegExp(/\.(?:hbs|handlebars|mustache)$/i), 'mustache-icon medium-orange'],
+    [new RegExp(/\.build$/i), 'nant-icon medium-orange'],
+    [new RegExp(/\.ncl$/i), 'earth-icon medium-green'],
+    [new RegExp(/\.neko$/i), 'neko-icon medium-orange'],
+    [new RegExp(/\.axs$/i), 'amx-icon medium-blue'],
+    [new RegExp(/\.axi$/i), 'amx-icon dark-blue'],
+    [new RegExp(/\.nlogo$/i), 'netlogo-icon medium-red'],
+    [new RegExp(/\.nginxconf$/i), 'nginx-icon medium-green'],
+    [new RegExp(/\.nib$/i), 'nib-icon dark-orange'],
+    [new RegExp(/\.nim(?:rod)?$/i), 'nimrod-icon medium-green'],
+    [new RegExp(/\.ninja$/i), 'shuriken-icon medium-blue'],
+    [new RegExp(/\.nit$/i), 'nit-icon dark-green'],
+    [new RegExp(/\.nix$/i), 'nix-icon medium-cyan'],
+    [new RegExp(/\.nse$/i), 'nmap-icon dark-blue'],
+    [new RegExp(/\.njs$|\.nvmrc$/i), 'node-icon medium-green'],
+    [new RegExp(/\.node-version$/i), 'node-icon dark-green'],
+    [new RegExp(/\.nsi$/i), 'nsis-icon medium-purple'],
+    [new RegExp(/\.nsh$/i), 'nsis-icon dark-cyan'],
+    [new RegExp(/\.nu$/i), 'recycle-icon light-green'],
+    [new RegExp(/^Nukefile$/), 'recycle-icon dark-green'],
+    [new RegExp(/\.nuspec$/i), 'nuget-icon medium-blue'],
+    [new RegExp(/\.pkgproj$/i), 'nuget-icon dark-purple'],
+    [new RegExp(/\.numpy$/i), 'numpy-icon dark-blue'],
+    [new RegExp(/\.numpyw$/i), 'numpy-icon medium-blue'],
+    [new RegExp(/\.numsc$/i), 'numpy-icon medium-orange'],
+    [new RegExp(/\.(?:nunjucks|njk)$/i), 'nunjucks-icon dark-green'],
+    [new RegExp(/\.mm?$/i), 'objc-icon medium-blue'],
+    [new RegExp(/\.pch$/i), 'objc-icon dark-red'],
+    [new RegExp(/\.x$/i), 'objc-icon dark-green'],
+    [new RegExp(/\.j$/i), 'objj-icon dark-orange'],
+    [new RegExp(/\.sj$/i), 'objj-icon dark-red'],
+    [new RegExp(/\.ml$/i), 'ocaml-icon medium-orange'],
+    [new RegExp(/\.mli$/i), 'ocaml-icon dark-orange'],
+    [new RegExp(/\.eliom$/i), 'ocaml-icon medium-red'],
+    [new RegExp(/\.eliomi$/i), 'ocaml-icon dark-red'],
+    [new RegExp(/\.ml4$/i), 'ocaml-icon medium-green'],
+    [new RegExp(/\.mll$/i), 'ocaml-icon dark-green'],
+    [new RegExp(/\.mly$/i), 'ocaml-icon dark-yellow'],
+    [new RegExp(/\.ooc$/i), 'ooc-icon medium-green'],
+    [new RegExp(/\.opa$/i), 'opa-icon medium-blue'],
+    [new RegExp(/\.opencl$/i), 'opencl-icon medium-red'],
+    [new RegExp(/\.p$/i), 'progress-icon medium-red'],
+    [new RegExp(/\.odt$/i), 'openoffice-icon medium-blue'],
+    [new RegExp(/\.ott$/i), 'openoffice-icon dark-blue'],
+    [new RegExp(/\.fodt$/i), 'openoffice-icon dark-purple'],
+    [new RegExp(/\.ods$/i), 'openoffice-icon medium-green'],
+    [new RegExp(/\.ots$/i), 'openoffice-icon dark-green'],
+    [new RegExp(/\.fods$/i), 'openoffice-icon dark-cyan'],
+    [new RegExp(/\.odp$/i), 'openoffice-icon medium-purple'],
+    [new RegExp(/\.otp$/i), 'openoffice-icon dark-pink'],
+    [new RegExp(/\.fodp$/i), 'openoffice-icon medium-pink'],
+    [new RegExp(/\.odg$/i), 'openoffice-icon medium-red'],
+    [new RegExp(/\.otg$/i), 'openoffice-icon dark-red'],
+    [new RegExp(/\.fodg$/i), 'openoffice-icon dark-orange'],
+    [new RegExp(/\.odf$/i), 'openoffice-icon medium-maroon'],
+    [new RegExp(/\.odb$/i), 'openoffice-icon light-pink'],
+    [new RegExp(/\.scad$/i), 'scad-icon medium-orange'],
+    [new RegExp(/\.jscad$/i), 'scad-icon medium-yellow'],
+    [new RegExp(/\.org$/i), 'org-icon dark-green'],
+    [new RegExp(/\.dmg$/i), 'osx-icon medium-red'],
+    [new RegExp(/\.ox$/i), 'ox-icon medium-cyan'],
+    [new RegExp(/\.oxh$/i), 'ox-icon medium-green'],
+    [new RegExp(/\.oxo$/i), 'ox-icon medium-blue'],
+    [new RegExp(/\.oxygene$/i), 'oxygene-icon medium-cyan'],
+    [new RegExp(/\.oz$/i), 'oz-icon medium-yellow'],
+    [new RegExp(/\.pan$/i), 'pan-icon medium-red'],
+    [new RegExp(/\.psc$/i), 'papyrus-icon medium-green'],
+    [new RegExp(/\.parrot$/i), 'parrot-icon medium-green'],
+    [new RegExp(/\.pasm$/i), 'parrot-icon dark-green'],
+    [new RegExp(/\.pir$/i), 'parrot-icon dark-blue'],
+    [new RegExp(/\.pas(?:cal)?$/i), 'pascal-icon medium-purple'],
+    [new RegExp(/\.dfm$/i), 'pascal-icon medium-blue'],
+    [new RegExp(/\.dpr$/i), 'pascal-icon dark-blue'],
+    [new RegExp(/\.lpr$/i), 'pascal-icon dark-purple'],
+    [new RegExp(/\.patch$/i), 'patch-icon medium-green'],
+    [new RegExp(/\.pwn$/i), 'pawn-icon medium-orange'],
+    [new RegExp(/\.pdf$/i), 'pdf-icon medium-red'],
+    [new RegExp(/\.p(?:er)?l$|\.t$/i), 'perl-icon medium-blue'],
+    [new RegExp(/\.ph$/i), 'perl-icon dark-purple'],
+    [new RegExp(/\.plx$/i), 'perl-icon medium-purple'],
+    [new RegExp(/\.pm$/i), 'perl-icon dark-blue'],
+    [new RegExp(/\.(?:psgi|xs)$/i), 'perl-icon medium-red'],
+    [new RegExp(/\.pl6$/i), 'perl6-icon medium-purple'],
+    [new RegExp(/\.[tp]6$|\.6pl$/i), 'perl6-icon light-blue'],
+    [new RegExp(/\.(?:pm6|p6m)$/i), 'perl6-icon dark-pink'],
+    [new RegExp(/\.6pm$/i), 'perl6-icon dark-cyan'],
+    [new RegExp(/\.nqp$/i), 'perl6-icon dark-purple'],
+    [new RegExp(/\.p6l$/i), 'perl6-icon medium-blue'],
+    [new RegExp(/\.pod6$/i), 'perl6-icon dark-green'],
+    [new RegExp(/^Rexfile$/), 'perl6-icon medium-green'],
+    [new RegExp(/\.volt$/i), 'phalcon-icon medium-cyan'],
+    [new RegExp(/\.php(?:[st\d]|_cs)?$/i), 'php-icon dark-blue'],
+    [new RegExp(/^Phakefile/), 'php-icon dark-green'],
+    [new RegExp(/\.pkl$/i), 'pickle-icon dark-cyan'],
+    [new RegExp(/\.pike$/i), 'pike-icon dark-cyan'],
+    [new RegExp(/\.pmod$/i), 'pike-icon medium-blue'],
+    [new RegExp(/\.(?:pls|pck|pks|plb|plsql|pkb)$/i), 'sql-icon medium-red'],
+    [new RegExp(/\.pod$/i), 'pod-icon dark-blue'],
+    [new RegExp(/\.pogo$/i), 'pogo-icon medium-orange'],
+    [new RegExp(/\.pony$/i), 'pony-icon light-maroon'],
+    [new RegExp(/\.p(?:ost)?css$/i), 'postcss-icon dark-red'],
+    [new RegExp(/\.sss$/i), 'postcss-icon dark-pink'],
+    [new RegExp(/\.postcssrc$/i), 'postcss-icon medium-orange'],
+    [new RegExp(/\.ps$/i), 'postscript-icon medium-red'],
+    [new RegExp(/\.eps$/i), 'postscript-icon medium-orange'],
+    [new RegExp(/\.pfa$/i), 'postscript-icon dark-blue'],
+    [new RegExp(/\.afm$/i), 'postscript-icon medium-green'],
+    [new RegExp(/\.pov$/i), 'povray-icon dark-blue'],
+    [new RegExp(/\.pbl$|\.sra$/i), 'powerbuilder-icon medium-blue'],
+    [new RegExp(/\.pbt$/i), 'powerbuilder-icon dark-blue'],
+    [new RegExp(/\.srw$/i), 'powerbuilder-icon medium-red'],
+    [new RegExp(/\.sru$/i), 'powerbuilder-icon medium-orange'],
+    [new RegExp(/\.srp$/i), 'powerbuilder-icon medium-maroon'],
+    [new RegExp(/\.srj$/i), 'powerbuilder-icon medium-purple'],
+    [new RegExp(/\.ps1$/i), 'powershell-icon medium-blue'],
+    [new RegExp(/\.psd1$/i), 'powershell-icon dark-blue'],
+    [new RegExp(/\.psm1$/i), 'powershell-icon medium-purple'],
+    [new RegExp(/\.ps1xml$/i), 'powershell-icon dark-purple'],
+    [new RegExp(/\.ppd$/i), 'print-icon dark-cyan'],
+    [new RegExp(/\.pde$/i), 'processing-icon dark-blue'],
+    [new RegExp(/\.pro$/i), 'prolog-icon medium-blue'],
+    [new RegExp(/\.prolog$/i), 'prolog-icon medium-cyan'],
+    [new RegExp(/\.yap$/i), 'prolog-icon medium-purple'],
+    [new RegExp(/\.spin$/i), 'propeller-icon medium-orange'],
+    [new RegExp(/\.pug$/i), 'pug-icon medium-red'],
+    [new RegExp(/\.pp$/i), 'puppet-icon medium-purple'],
+    [new RegExp(/Modulefile$/i), 'puppet-icon dark-blue'],
+    [new RegExp(/\.pb$/i), 'purebasic-icon medium-red'],
+    [new RegExp(/\.pbi$/i), 'purebasic-icon dark-orange'],
+    [new RegExp(/\.purs$/i), 'purescript-icon dark-purple'],
+    [new RegExp(/\.py$|\.bzl$|\.py3$|\.?(?:pypirc|pythonrc|python-venv)$/i), 'python-icon dark-blue'],
+    [new RegExp(/\.ipy$/i), 'python-icon medium-blue'],
+    [new RegExp(/\.isolate$|\.gypi$|\.pyt$/i), 'python-icon dark-green'],
+    [new RegExp(/\.pep$|\.pyde$/i), 'python-icon medium-orange'],
+    [new RegExp(/\.gyp$/i), 'python-icon medium-green'],
+    [new RegExp(/\.pyp$/i), 'python-icon dark-purple'],
+    [new RegExp(/\.pyw$/i), 'python-icon medium-maroon'],
+    [new RegExp(/\.tac$/i), 'python-icon dark-pink'],
+    [new RegExp(/\.wsgi$/i), 'python-icon dark-red'],
+    [new RegExp(/\.xpy$/i), 'python-icon medium-yellow'],
+    [new RegExp(/\.rpy$/i), 'python-icon medium-pink'],
+    [new RegExp(/^(?:BUCK|BUILD|SConstruct|SConscript)$/), 'python-icon dark-green'],
+    [new RegExp(/^(?:Snakefile|WATCHLISTS)$/), 'python-icon medium-green'],
+    [new RegExp(/^wscript$/), 'python-icon dark-maroon'],
+    [new RegExp(/\.(?:r|Rprofile|rsx|rd)$/i), 'r-icon medium-blue'],
+    [new RegExp(/\.rkt$/i), 'racket-icon medium-red'],
+    [new RegExp(/\.rktd$/i), 'racket-icon medium-blue'],
+    [new RegExp(/\.rktl$/i), 'racket-icon light-red'],
+    [new RegExp(/\.scrbl$/i), 'racket-icon dark-blue'],
+    [new RegExp(/\.raml$/i), 'raml-icon medium-cyan'],
+    [new RegExp(/\.rsc$/i), 'rascal-icon medium-yellow'],
+    [new RegExp(/\.rdoc$/i), 'rdoc-icon medium-red'],
+    [new RegExp(/\.rbbas$/i), 'xojo-icon medium-green'],
+    [new RegExp(/\.rbfrm$/i), 'xojo-icon dark-green'],
+    [new RegExp(/\.rbmnu$/i), 'xojo-icon dark-cyan'],
+    [new RegExp(/\.rbres$/i), 'xojo-icon medium-cyan'],
+    [new RegExp(/\.rbtbar$/i), 'xojo-icon medium-blue'],
+    [new RegExp(/\.rbuistate$/i), 'xojo-icon dark-blue'],
+    [new RegExp(/\.re$/i), 'reason-icon medium-red'],
+    [new RegExp(/\.rei$/i), 'reason-icon medium-orange'],
+    [new RegExp(/\.reb(?:ol)?$/i), 'rebol-icon dark-green'],
+    [new RegExp(/\.r2$/i), 'rebol-icon dark-red'],
+    [new RegExp(/\.r3$/i), 'rebol-icon dark-blue'],
+    [new RegExp(/\.red$/i), 'red-icon medium-red'],
+    [new RegExp(/\.reds$/i), 'red-icon light-red'],
+    [new RegExp(/\.rpm$/i), 'red-hat-icon medium-red'],
+    [new RegExp(/\.spec$/i), 'red-hat-icon dark-red'],
+    [new RegExp(/\.regexp?$/i), 'regex-icon medium-green'],
+    [new RegExp(/\.rsh$/i), 'android-icon dark-maroon'],
+    [new RegExp(/\.re?st(?:\.txt)?$/i), 'rst-icon dark-blue'],
+    [new RegExp(/\.rexx?$/i), 'rexx-icon medium-red'],
+    [new RegExp(/\.pprx$/i), 'rexx-icon medium-blue'],
+    [new RegExp(/\.tag$/i), 'riot-icon medium-red'],
+    [new RegExp(/\.robot$/i), 'robot-icon medium-purple'],
+    [new RegExp(/\.rg$/i), 'clojure-icon medium-red'],
+    [new RegExp(/\.rss$/i), 'rss-icon medium-orange'],
+    [new RegExp(/\.(?:rb|ru|ruby|erb|gemspec|god|mspec|pluginspec|podspec|rabl|rake|opal)$|^\.?(?:irbrc|gemrc|pryrc|rspec|ruby-(?:gemset|version))$/i), 'ruby-icon medium-red'],
+    [new RegExp(/^(?:Appraisals|(?:Rake|Gem|[bB]uild|Berks|Cap|Danger|Deliver|Fast|Guard|Jar|Maven|Pod|Puppet|Snap)file(?:\.lock)?)$|^rails$/), 'ruby-icon medium-red'],
+    [new RegExp(/\.(?:jbuilder|rbuild|rb[wx]|builder)$/i), 'ruby-icon dark-red'],
+    [new RegExp(/\.watchr$/i), 'ruby-icon dark-yellow'],
+    [new RegExp(/\.rs$/i), 'rust-icon medium-maroon'],
+    [new RegExp(/\.rlib$/i), 'rust-icon light-maroon'],
+    [new RegExp(/\.sage$/i), 'sage-icon medium-blue'],
+    [new RegExp(/\.sagews$/i), 'sage-icon dark-blue'],
+    [new RegExp(/\.sls$/i), 'saltstack-icon medium-blue'],
+    [new RegExp(/\.sas$/i), 'sas-icon medium-blue'],
+    [new RegExp(/\.scss$/i), 'sass-icon light-pink'],
+    [new RegExp(/\.sass$/i), 'sass-icon dark-pink'],
+    [new RegExp(/\.sbt$/i), 'sbt-icon dark-purple'],
+    [new RegExp(/\.(?:sc|scala)$/i), 'scala-icon medium-red'],
+    [new RegExp(/\.scm$/i), 'scheme-icon medium-red'],
+    [new RegExp(/\.sld$/i), 'scheme-icon medium-blue'],
+    [new RegExp(/\.sps$/i), 'scheme-icon medium-purple'],
+    [new RegExp(/\.sci$/i), 'scilab-icon dark-purple'],
+    [new RegExp(/\.sce$/i), 'scilab-icon dark-blue'],
+    [new RegExp(/\.tst$/i), 'scilab-icon dark-cyan'],
+    [new RegExp(/\.secret$/i), 'secret-icon null'],
+    [new RegExp(/\.self$/i), 'self-icon dark-blue'],
+    [new RegExp(/\.csv$/i), 'graph-icon light-red'],
+    [new RegExp(/\.(?:tab|tsv)$/i), 'graph-icon light-green'],
+    [new RegExp(/\.dif$/i), 'graph-icon medium-green'],
+    [new RegExp(/\.slk$/i), 'graph-icon medium-cyan'],
+    [new RegExp(/\.sfproj$/i), 'sf-icon light-orange'],
+    [new RegExp(/\.(?:sh|rc|bats|bash|tool|install|command)$/i), 'terminal-icon medium-purple'],
+    [new RegExp(/^(?:\.?bash(?:rc|[-_]?(?:profile|login|logout|history|prompt))|_osc|config|install-sh|PKGBUILD)$/i), 'terminal-icon dark-purple'],
+    [new RegExp(/\.ksh$/i), 'terminal-icon dark-yellow'],
+    [new RegExp(/\.sh-session$/i), 'terminal-icon medium-yellow'],
+    [new RegExp(/\.zsh(?:-theme|_history)?$|^\.?(?:antigen|zpreztorc|zlogin|zlogout|zprofile|zshenv|zshrc)$|\.tmux$/i), 'terminal-icon medium-blue'],
+    [new RegExp(/\.fish$|^\.fishrc$|\.tcsh$/i), 'terminal-icon medium-green'],
+    [new RegExp(/\.inputrc$/i), 'terminal-icon medium-red'],
+    [new RegExp(/^(?:configure|config\.(?:guess|rpath|status|sub)|depcomp|libtool|compile)$/), 'terminal-icon medium-red'],
+    [new RegExp(/^\/(?:private\/)?etc\/(?:[^\/]+\/)*(?:profile$|nanorc$|rc\.|csh\.)/i), 'terminal-icon dark-purple'],
+    [new RegExp(/\.csh$/i), 'terminal-icon medium-yellow'],
+    [new RegExp(/\.shen$/i), 'shen-icon dark-cyan'],
+    [new RegExp(/\.liquid$/i), 'shopify-icon medium-green'],
+    [new RegExp(/\.sigils$/i), 'sigils-icon dark-red'],
+    [new RegExp(/\.ss$/i), 'silverstripe-icon medium-blue'],
+    [new RegExp(/\.sketch$/i), 'sketch-icon medium-orange'],
+    [new RegExp(/\.sl$/i), 'slash-icon dark-blue'],
+    [new RegExp(/\.smali$/i), 'android-icon medium-green'],
+    [new RegExp(/\.tpl$/i), 'smarty-icon medium-yellow'],
+    [new RegExp(/\.snyk$/i), 'snyk-icon dark-purple'],
+    [new RegExp(/\.(?:sma|sp)$/i), 'clojure-icon medium-yellow'],
+    [new RegExp(/\.sparql$/i), 'sparql-icon medium-blue'],
+    [new RegExp(/\.rq$/i), 'sparql-icon dark-blue'],
+    [new RegExp(/\.sqf$/i), 'sqf-icon dark-maroon'],
+    [new RegExp(/\.hqf$/i), 'sqf-icon dark-red'],
+    [new RegExp(/\.(?:my)?sql$/i), 'sql-icon medium-orange'],
+    [new RegExp(/\.ddl$/i), 'sql-icon medium-blue'],
+    [new RegExp(/\.udf$/i), 'sql-icon medium-green'],
+    [new RegExp(/\.viw$/i), 'sql-icon dark-cyan'],
+    [new RegExp(/\.prc$/i), 'sql-icon dark-blue'],
+    [new RegExp(/\.db2$/i), 'sql-icon medium-purple'],
+    [new RegExp(/\.sqlite$/i), 'sqlite-icon medium-blue'],
+    [new RegExp(/\.sqlite3$/i), 'sqlite-icon dark-blue'],
+    [new RegExp(/\.db$/i), 'sqlite-icon medium-purple'],
+    [new RegExp(/\.db3$/i), 'sqlite-icon dark-purple'],
+    [new RegExp(/\.nut$/i), 'squirrel-icon medium-maroon'],
+    [new RegExp(/\.pub$/i), 'key-icon medium-yellow'],
+    [new RegExp(/\.pem$/i), 'key-icon medium-orange'],
+    [new RegExp(/\.key$|\.crt$/i), 'key-icon medium-blue'],
+    [new RegExp(/\.der$/i), 'key-icon medium-purple'],
+    [new RegExp(/^id_rsa/), 'key-icon medium-red'],
+    [new RegExp(/\.glyphs\d*License$|^git-credential-osxkeychain$/i), 'key-icon medium-green'],
+    [new RegExp(/^(?:master\.)?passwd$/i), 'key-icon dark-green'],
+    [new RegExp(/\.stan$/i), 'stan-icon medium-red'],
+    [new RegExp(/\.do$/i), 'stata-icon medium-blue'],
+    [new RegExp(/\.ado$/i), 'stata-icon dark-blue'],
+    [new RegExp(/\.doh$/i), 'stata-icon light-blue'],
+    [new RegExp(/\.ihlp$/i), 'stata-icon medium-cyan'],
+    [new RegExp(/\.mata$/i), 'stata-icon dark-cyan'],
+    [new RegExp(/\.matah$/i), 'stata-icon light-cyan'],
+    [new RegExp(/\.sthlp$/i), 'stata-icon medium-purple'],
+    [new RegExp(/\.story$/i), 'storyist-icon medium-blue'],
+    [new RegExp(/\.strings$/i), 'strings-icon medium-red'],
+    [new RegExp(/\.styl$/i), 'stylus-icon medium-green'],
+    [new RegExp(/\.(?:stTheme|sublime[-_](?:build|commands|completions|keymap|macro|menu|mousemap|project|settings|theme|workspace|metrics|session|snippet))$/i), 'sublime-icon medium-orange'],
+    [new RegExp(/\.sublime-syntax$/i), 'sublime-icon dark-orange'],
+    [new RegExp(/\.scd$/i), 'scd-icon medium-red'],
+    [new RegExp(/\.svg$/i), 'svg-icon dark-yellow'],
+    [new RegExp(/\.swift$/i), 'swift-icon medium-green'],
+    [new RegExp(/\.sv$/i), 'sysverilog-icon medium-blue'],
+    [new RegExp(/\.svh$/i), 'sysverilog-icon medium-green'],
+    [new RegExp(/\.vh$/i), 'sysverilog-icon medium-cyan'],
+    [new RegExp(/\.?c?tags$/i), 'tag-icon medium-blue'],
+    [new RegExp(/\.gemtags/i), 'tag-icon medium-red'],
+    [new RegExp(/\.tcl$/i), 'tcl-icon dark-orange'],
+    [new RegExp(/\.adp$/i), 'tcl-icon medium-orange'],
+    [new RegExp(/\.tm$/i), 'tcl-icon medium-red'],
+    [new RegExp(/\.tea$/i), 'coffee-icon medium-orange'],
+    [new RegExp(/\.tt2?$/i), 'tt-icon medium-blue'],
+    [new RegExp(/\.tt3$/i), 'tt-icon medium-purple'],
+    [new RegExp(/\.tern-project$/i), 'tern-icon medium-blue'],
+    [new RegExp(/\.tf(?:vars)?$/i), 'terraform-icon dark-purple'],
+    [new RegExp(/\.tex$|\.ltx$|\.lbx$/i), 'tex-icon medium-blue'],
+    [new RegExp(/\.aux$|\.ins$/i), 'tex-icon medium-green'],
+    [new RegExp(/\.sty$|\.texi$/i), 'tex-icon medium-red'],
+    [new RegExp(/\.dtx$/i), 'tex-icon medium-maroon'],
+    [new RegExp(/\.cls$|\.mkiv$|\.mkvi$|\.mkii$/i), 'tex-icon medium-orange'],
+    [new RegExp(/\.te?xt$|\.irclog$|\.uot$/i), 'text-icon medium-blue'],
+    [new RegExp(/\.log$|^Terminal[-_\s]Saved[-_\s]Output$|\.brf$/i), 'text-icon medium-maroon'],
+    [new RegExp(/\.err$|\.no$|^(?:bug-report|fdl|for-release|tests)$/i), 'text-icon medium-red'],
+    [new RegExp(/\.rtf$|\.uof$/i), 'text-icon dark-red'],
+    [new RegExp(/\.i?nfo$/i), 'text-icon dark-blue'],
+    [new RegExp(/\.abt$|\.sub$/i), 'text-icon dark-purple'],
+    [new RegExp(/\.ans$/i), 'text-icon dark-orange'],
+    [new RegExp(/\.etx$/i), 'text-icon medium-yellow'],
+    [new RegExp(/\.msg$/i), 'text-icon medium-orange'],
+    [new RegExp(/\.srt$|\.uop$/i), 'text-icon medium-purple'],
+    [new RegExp(/\.(?:utxt|utf8)$/i), 'text-icon medium-cyan'],
+    [new RegExp(/\.weechatlog$|\.uos$/i), 'text-icon medium-green'],
+    [new RegExp(/\.textile$/i), 'textile-icon medium-orange'],
+    [new RegExp(/\.tmcg$/i), 'textmate-icon dark-green'],
+    [new RegExp(/\.tmLanguage$/i), 'textmate-icon dark-purple'],
+    [new RegExp(/\.tmCommand$/i), 'textmate-icon medium-blue'],
+    [new RegExp(/\.tmPreferences$/i), 'textmate-icon dark-blue'],
+    [new RegExp(/\.tmSnippet$/i), 'textmate-icon dark-orange'],
+    [new RegExp(/\.tmTheme$/i), 'textmate-icon medium-pink'],
+    [new RegExp(/\.tmMacro$/i), 'textmate-icon medium-maroon'],
+    [new RegExp(/\.yaml-tmlanguage$/i), 'textmate-icon medium-orange'],
+    [new RegExp(/\.JSON-tmLanguage$/i), 'textmate-icon medium-purple'],
+    [new RegExp(/\.thor$/i), 'thor-icon medium-orange'],
+    [new RegExp(/^Thorfile$/i), 'thor-icon dark-orange'],
+    [new RegExp(/\.tsx$/i), 'tsx-icon light-blue'],
+    [new RegExp(/\.tu$/i), 'turing-icon medium-red'],
+    [new RegExp(/\.twig$/i), 'twig-icon medium-green'],
+    [new RegExp(/\.txl$/i), 'txl-icon medium-orange'],
+    [new RegExp(/\.ts$/i), 'ts-icon medium-blue'],
+    [new RegExp(/\.anim$/i), 'unity3d-icon dark-blue'],
+    [new RegExp(/\.asset$/i), 'unity3d-icon dark-green'],
+    [new RegExp(/\.mat$/i), 'unity3d-icon medium-red'],
+    [new RegExp(/\.meta$/i), 'unity3d-icon dark-red'],
+    [new RegExp(/\.prefab$/i), 'unity3d-icon dark-cyan'],
+    [new RegExp(/\.unity$/i), 'unity3d-icon medium-blue'],
+    [new RegExp(/\.unityproj$/i), 'unity3d-icon medium-maroon'],
+    [new RegExp(/\.uno$/i), 'uno-icon dark-blue'],
+    [new RegExp(/\.uc$/i), 'unreal-icon null'],
+    [new RegExp(/\.url$/i), 'link-icon dark-blue'],
+    [new RegExp(/\.ur$/i), 'urweb-icon medium-maroon'],
+    [new RegExp(/\.urs$/i), 'urweb-icon dark-blue'],
+    [new RegExp(/^Vagrantfile$/i), 'vagrant-icon medium-cyan'],
+    [new RegExp(/\.vala$/i), 'gnome-icon medium-purple'],
+    [new RegExp(/\.vapi$/i), 'gnome-icon dark-purple'],
+    [new RegExp(/\.vcl$/i), 'varnish-icon dark-blue'],
+    [new RegExp(/\.v$/i), 'verilog-icon dark-green'],
+    [new RegExp(/\.veo$/i), 'verilog-icon medium-red'],
+    [new RegExp(/\.vhdl$/i), 'vhdl-icon dark-green'],
+    [new RegExp(/\.vhd$/i), 'vhdl-icon medium-green'],
+    [new RegExp(/\.vhf$/i), 'vhdl-icon dark-blue'],
+    [new RegExp(/\.vhi$/i), 'vhdl-icon medium-blue'],
+    [new RegExp(/\.vho$/i), 'vhdl-icon dark-purple'],
+    [new RegExp(/\.vhs$/i), 'vhdl-icon medium-purple'],
+    [new RegExp(/\.vht$/i), 'vhdl-icon dark-red'],
+    [new RegExp(/\.vhw$/i), 'vhdl-icon dark-orange'],
+    [new RegExp(/\.3gpp?$/i), 'video-icon medium-blue'],
+    [new RegExp(/\.(?:mp4|m4v|h264)$/i), 'video-icon dark-blue'],
+    [new RegExp(/\.avi$/i), 'video-icon medium-blue'],
+    [new RegExp(/\.mov$/i), 'video-icon medium-cyan'],
+    [new RegExp(/\.mkv$/i), 'video-icon medium-purple'],
+    [new RegExp(/\.flv$/i), 'video-icon medium-red'],
+    [new RegExp(/\.webm$/i), 'video-icon dark-blue'],
+    [new RegExp(/\.mpe?g$/i), 'video-icon medium-red'],
+    [new RegExp(/\.(?:asf|wmv)$/i), 'video-icon dark-purple'],
+    [new RegExp(/\.(?:ogm|og[gv])$/i), 'video-icon medium-orange'],
+    [new RegExp(/\.(?:vim|n?vimrc)$/i), 'vim-icon medium-green'],
+    [new RegExp(/^[gn_]?vim(?:rc|info)$/i), 'vim-icon dark-green'],
+    [new RegExp(/\.(?:vba?|fr[mx]|bas)$/i), 'vs-icon medium-blue'],
+    [new RegExp(/\.vbhtml$/i), 'vs-icon medium-red'],
+    [new RegExp(/\.vbs$/i), 'vs-icon medium-green'],
+    [new RegExp(/\.csproj$/i), 'vs-icon dark-blue'],
+    [new RegExp(/\.vbproj$/i), 'vs-icon dark-red'],
+    [new RegExp(/\.vcx?proj$/i), 'vs-icon dark-purple'],
+    [new RegExp(/\.vssettings$/i), 'vs-icon dark-green'],
+    [new RegExp(/\.builds$/i), 'vs-icon medium-maroon'],
+    [new RegExp(/\.sln$/i), 'vs-icon medium-orange'],
+    [new RegExp(/\.vue$/i), 'vue-icon light-green'],
+    [new RegExp(/\.owl$/i), 'owl-icon dark-blue'],
+    [new RegExp(/\.bat$|\.cmd$/i), 'windows-icon medium-purple'],
+    [new RegExp(/\.(?:exe|com|msi)$/i), 'windows-icon null'],
+    [new RegExp(/\.reg$/i), 'windows-icon medium-blue'],
+    [new RegExp(/\.x10$/i), 'x10-icon light-maroon'],
+    [new RegExp(/\.X(?:authority|clients|initrc|profile|resources|session-errors|screensaver)$/i), 'x11-icon medium-orange'],
+    [new RegExp(/\.xc$/i), 'xmos-icon medium-orange'],
+    [new RegExp(/\.(?:pbxproj|pbxuser|mode\dv\3|xcplugindata|xcrequiredplugins)$/i), 'appstore-icon medium-blue'],
+    [new RegExp(/\.xojo_code$/i), 'xojo-icon medium-green'],
+    [new RegExp(/\.xojo_menu$/i), 'xojo-icon medium-blue'],
+    [new RegExp(/\.xojo_report$/i), 'xojo-icon medium-red'],
+    [new RegExp(/\.xojo_script$/i), 'xojo-icon dark-green'],
+    [new RegExp(/\.xojo_toolbar$/i), 'xojo-icon dark-purple'],
+    [new RegExp(/\.xojo_window$/i), 'xojo-icon dark-cyan'],
+    [new RegExp(/\.xsp-config$/i), 'xpages-icon medium-blue'],
+    [new RegExp(/\.xsp\.metadata$/i), 'xpages-icon dark-blue'],
+    [new RegExp(/\.xpl$/i), 'xmos-icon dark-blue'],
+    [new RegExp(/\.xproc$/i), 'xmos-icon medium-purple'],
+    [new RegExp(/\.(?:xquery|xq|xql|xqm|xqy)$/i), 'sql-icon dark-red'],
+    [new RegExp(/\.xtend$/i), 'xtend-icon dark-purple'],
+    [new RegExp(/\.yang$/i), 'yang-icon medium-yellow'],
+    [new RegExp(/\.zpr$/i), 'zbrush-icon dark-purple'],
+    [new RegExp(/\.zep$/i), 'zephir-icon medium-pink'],
+    [new RegExp(/\.(?:zimpl|zmpl|zpl)$/i), 'zimpl-icon medium-orange'],
+    [new RegExp(/^com\.apple\./), 'apple-icon medium-blue'],
+    [new RegExp(/^httpd\.conf/i), 'apache-icon medium-red'],
+    [new RegExp(/TODO/), 'checklist-icon medium-yellow'],
+    [new RegExp(/config|settings|option|pref/i), 'config-icon null'],
+    [new RegExp(/\.djs$/i), 'doge-icon medium-yellow'],
+    [new RegExp(/^\./), 'gear-icon null'],
+    [new RegExp(/\b(?:changelog|copying(?:v?\d)?|install|read[-_]?me)\b|^licen[sc]es?[-._]/i), 'book-icon medium-blue'],
+    [new RegExp(/^news(?:[-_.]?[-\d]+)?$/i), 'book-icon dark-blue'],
+    [new RegExp(/^(?:[dv]8|v8[-_.][^.]*|mksnapshot|mkpeephole)$/i), 'v8-icon medium-blue'],