pax_global_header00006660000000000000000000000064131633453370014522gustar00rootroot0000000000000052 comment=a399faa1801f02ee1885e5664ed21a9c7990b63a serve-index-1.9.1/000077500000000000000000000000001316334533700137635ustar00rootroot00000000000000serve-index-1.9.1/.gitignore000066400000000000000000000000661316334533700157550ustar00rootroot00000000000000coverage node_modules npm-debug.log package-lock.json serve-index-1.9.1/.travis.yml000066400000000000000000000014521316334533700160760ustar00rootroot00000000000000language: node_js node_js: - "0.8" - "0.10" - "0.12" - "1.8" - "2.5" - "3.3" - "4.8" - "5.12" - "6.11" - "7.10" - "8.3" sudo: false cache: directories: - node_modules before_install: # Skip updating shrinkwrap / lock - "npm config set shrinkwrap false" # Setup Node.js version-specific dependencies - "test $TRAVIS_NODE_VERSION != '0.8' || npm rm --save-dev istanbul" # Update Node.js modules - "test ! -d node_modules || npm prune" - "test ! -d node_modules || npm rebuild" script: # Run test script, depending on istanbul install - "test ! -z $(npm -ps ls istanbul) || npm test" - "test -z $(npm -ps ls istanbul) || npm run-script test-ci" after_script: - "test -e ./coverage/lcov.info && npm install coveralls@2 && cat ./coverage/lcov.info | coveralls" serve-index-1.9.1/HISTORY.md000066400000000000000000000154731316334533700154600ustar00rootroot000000000000001.9.1 / 2017-09-28 ================== * deps: accepts@~1.3.4 - deps: mime-types@~2.1.16 * deps: debug@2.6.9 * deps: http-errors@~1.6.2 - deps: depd@1.1.1 * deps: mime-types@~2.1.17 - Add new mime types - deps: mime-db@~1.30.0 * deps: parseurl@~1.3.2 - perf: reduce overhead for full URLs - perf: unroll the "fast-path" `RegExp` 1.9.0 / 2017-05-25 ================== * Set `X-Content-Type-Options: nosniff` header * deps: batch@0.6.1 * deps: debug@2.6.8 - Allow colors in workers - Deprecated `DEBUG_FD` environment variable set to `3` or higher - Fix `DEBUG_MAX_ARRAY_LENGTH` - Fix error when running under React Native - Use same color for same namespace - deps: ms@2.0.0 * deps: http-errors@~1.6.1 - Make `message` property enumerable for `HttpError`s - deps: inherits@2.0.3 - deps: setprototypeof@1.0.3 - deps: statuses@'>= 1.3.1 < 2' * deps: mime-types@~2.1.15 - Add new mime types - Add `audio/mp3` 1.8.0 / 2016-06-17 ================== * Make inline file search case-insensitive * deps: accepts@~1.3.3 - deps: mime-types@~2.1.11 - deps: negotiator@0.6.1 - perf: improve header parsing speed * deps: http-errors@~1.5.0 - Use `setprototypeof` module to replace `__proto__` setting - deps: inherits@2.0.1 - deps: statuses@'>= 1.3.0 < 2' - perf: enable strict mode * deps: mime-types@~2.1.11 - Add new mime types - Update primary extension for `audio/mp4` - deps: mime-db@~1.23.0 1.7.3 / 2016-01-24 ================== * deps: accepts@~1.2.13 - deps: mime-types@~2.1.6 * deps: batch@0.5.3 - Fix invalid dependency for browserify * deps: escape-html@~1.0.3 - perf: enable strict mode - perf: optimize string replacement - perf: use faster string coercion * deps: mime-types@~2.1.9 - Add new mime types * deps: parseurl@~1.3.1 - perf: enable strict mode 1.7.2 / 2015-07-30 ================== * deps: accepts@~1.2.12 - deps: mime-types@~2.1.4 * deps: mime-types@~2.1.4 - Add new mime types 1.7.1 / 2015-07-05 ================== * deps: accepts@~1.2.10 - deps: mime-types@~2.1.2 * deps: mime-types@~2.1.2 - Add new mime types 1.7.0 / 2015-06-15 ================== * Accept `function` value for `template` option * Send non-chunked response for `OPTIONS` * Stat parent directory when necessary * Use `Date.prototype.toLocaleDateString` to format date * deps: accepts@~1.2.9 - deps: mime-types@~2.1.1 - deps: negotiator@0.5.3 - perf: avoid argument reassignment & argument slice - perf: avoid negotiator recursive construction - perf: enable strict mode - perf: remove unnecessary bitwise operator * deps: escape-html@1.0.2 * deps: mime-types@~2.1.1 - Add new mime types * perf: enable strict mode * perf: remove argument reassignment 1.6.4 / 2015-05-12 ================== * deps: accepts@~1.2.7 - deps: mime-types@~2.0.11 - deps: negotiator@0.5.3 * deps: debug@~2.2.0 - deps: ms@0.7.1 * deps: mime-types@~2.0.11 - Add new mime types 1.6.3 / 2015-03-13 ================== * Properly escape file names in HTML * deps: accepts@~1.2.5 - deps: mime-types@~2.0.10 * deps: debug@~2.1.3 - Fix high intensity foreground color for bold - deps: ms@0.7.0 * deps: escape-html@1.0.1 * deps: mime-types@~2.0.10 - Add new mime types 1.6.2 / 2015-02-16 ================== * deps: accepts@~1.2.4 - deps: mime-types@~2.0.9 - deps: negotiator@0.5.1 * deps: http-errors@~1.3.1 - Construct errors using defined constructors from `createError` - Fix error names that are not identifiers - Set a meaningful `name` property on constructed errors * deps: mime-types@~2.0.9 - Add new mime types - deps: mime-db@~1.7.0 1.6.1 / 2015-01-31 ================== * deps: accepts@~1.2.3 - deps: mime-types@~2.0.8 * deps: mime-types@~2.0.8 - Add new mime types - deps: mime-db@~1.6.0 1.6.0 / 2015-01-01 ================== * Add link to root directory * deps: accepts@~1.2.2 - deps: mime-types@~2.0.7 - deps: negotiator@0.5.0 * deps: batch@0.5.2 * deps: debug@~2.1.1 * deps: mime-types@~2.0.7 - Add new mime types - Fix missing extensions - Fix various invalid MIME type entries - Remove example template MIME types - deps: mime-db@~1.5.0 1.5.3 / 2014-12-10 ================== * deps: accepts@~1.1.4 - deps: mime-types@~2.0.4 * deps: http-errors@~1.2.8 - Fix stack trace from exported function * deps: mime-types@~2.0.4 - Add new mime types - deps: mime-db@~1.3.0 1.5.2 / 2014-12-03 ================== * Fix icon name background alignment on mobile view 1.5.1 / 2014-11-22 ================== * deps: accepts@~1.1.3 - deps: mime-types@~2.0.3 * deps: mime-types@~2.0.3 - Add new mime types - deps: mime-db@~1.2.0 1.5.0 / 2014-10-16 ================== * Create errors with `http-errors` * deps: debug@~2.1.0 - Implement `DEBUG_FD` env variable support * deps: mime-types@~2.0.2 - deps: mime-db@~1.1.0 1.4.1 / 2014-10-15 ================== * deps: accepts@~1.1.2 - Fix error when media type has invalid parameter - deps: negotiator@0.4.9 1.4.0 / 2014-10-03 ================== * Add `dir` argument to `filter` function * Support using tokens multiple times 1.3.1 / 2014-10-01 ================== * Fix incorrect 403 on Windows and Node.js 0.11 * deps: accepts@~1.1.1 - deps: mime-types@~2.0.2 - deps: negotiator@0.4.8 1.3.0 / 2014-09-20 ================== * Add icon for mkv files * Lookup icon by mime type for greater icon support 1.2.1 / 2014-09-05 ================== * deps: accepts@~1.1.0 * deps: debug@~2.0.0 1.2.0 / 2014-08-25 ================== * Add `debug` messages * Resolve relative paths at middleware setup 1.1.6 / 2014-08-10 ================== * Fix URL parsing * deps: parseurl@~1.3.0 1.1.5 / 2014-07-27 ================== * Fix Content-Length calculation for multi-byte file names * deps: accepts@~1.0.7 - deps: negotiator@0.4.7 1.1.4 / 2014-06-20 ================== * deps: accepts@~1.0.5 1.1.3 / 2014-06-20 ================== * deps: accepts@~1.0.4 - use `mime-types` 1.1.2 / 2014-06-19 ================== * deps: batch@0.5.1 1.1.1 / 2014-06-11 ================== * deps: accepts@1.0.3 1.1.0 / 2014-05-29 ================== * Fix content negotiation when no `Accept` header * Properly support all HTTP methods * Support vanilla node.js http servers * Treat `ENAMETOOLONG` as code 414 * Use accepts for negotiation 1.0.3 / 2014-05-20 ================== * Fix error from non-statable files in HTML view 1.0.2 / 2014-04-28 ================== * Add `stylesheet` option * deps: negotiator@0.4.3 1.0.1 / 2014-03-05 ================== * deps: negotiator@0.4.2 1.0.0 / 2014-03-05 ================== * Genesis from connect serve-index-1.9.1/LICENSE000066400000000000000000000022451316334533700147730ustar00rootroot00000000000000(The MIT License) Copyright (c) 2010 Sencha Inc. Copyright (c) 2011 LearnBoost Copyright (c) 2011 TJ Holowaychuk Copyright (c) 2014-2015 Douglas Christopher Wilson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. serve-index-1.9.1/README.md000066400000000000000000000120061316334533700152410ustar00rootroot00000000000000# serve-index [![NPM Version][npm-image]][npm-url] [![NPM Downloads][downloads-image]][downloads-url] [![Linux Build][travis-image]][travis-url] [![Windows Build][appveyor-image]][appveyor-url] [![Test Coverage][coveralls-image]][coveralls-url] [![Gratipay][gratipay-image]][gratipay-url] Serves pages that contain directory listings for a given path. ## Install This is a [Node.js](https://nodejs.org/en/) module available through the [npm registry](https://www.npmjs.com/). Installation is done using the [`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally): ```sh $ npm install serve-index ``` ## API ```js var serveIndex = require('serve-index') ``` ### serveIndex(path, options) Returns middlware that serves an index of the directory in the given `path`. The `path` is based off the `req.url` value, so a `req.url` of `'/some/dir` with a `path` of `'public'` will look at `'public/some/dir'`. If you are using something like `express`, you can change the URL "base" with `app.use` (see the express example). #### Options Serve index accepts these properties in the options object. ##### filter Apply this filter function to files. Defaults to `false`. The `filter` function is called for each file, with the signature `filter(filename, index, files, dir)` where `filename` is the name of the file, `index` is the array index, `files` is the array of files and `dir` is the absolute path the file is located (and thus, the directory the listing is for). ##### hidden Display hidden (dot) files. Defaults to `false`. ##### icons Display icons. Defaults to `false`. ##### stylesheet Optional path to a CSS stylesheet. Defaults to a built-in stylesheet. ##### template Optional path to an HTML template or a function that will render a HTML string. Defaults to a built-in template. When given a string, the string is used as a file path to load and then the following tokens are replaced in templates: * `{directory}` with the name of the directory. * `{files}` with the HTML of an unordered list of file links. * `{linked-path}` with the HTML of a link to the directory. * `{style}` with the specified stylesheet and embedded images. When given as a function, the function is called as `template(locals, callback)` and it needs to invoke `callback(error, htmlString)`. The following are the provided locals: * `directory` is the directory being displayed (where `/` is the root). * `displayIcons` is a Boolean for if icons should be rendered or not. * `fileList` is a sorted array of files in the directory. The array contains objects with the following properties: - `name` is the relative name for the file. - `stat` is a `fs.Stats` object for the file. * `path` is the full filesystem path to `directory`. * `style` is the default stylesheet or the contents of the `stylesheet` option. * `viewName` is the view name provided by the `view` option. ##### view Display mode. `tiles` and `details` are available. Defaults to `tiles`. ## Examples ### Serve directory indexes with vanilla node.js http server ```js var finalhandler = require('finalhandler') var http = require('http') var serveIndex = require('serve-index') var serveStatic = require('serve-static') // Serve directory indexes for public/ftp folder (with icons) var index = serveIndex('public/ftp', {'icons': true}) // Serve up public/ftp folder files var serve = serveStatic('public/ftp') // Create server var server = http.createServer(function onRequest(req, res){ var done = finalhandler(req, res) serve(req, res, function onNext(err) { if (err) return done(err) index(req, res, done) }) }) // Listen server.listen(3000) ``` ### Serve directory indexes with express ```js var express = require('express') var serveIndex = require('serve-index') var app = express() // Serve URLs like /ftp/thing as public/ftp/thing // The express.static serves the file contents // The serveIndex is this module serving the directory app.use('/ftp', express.static('public/ftp'), serveIndex('public/ftp', {'icons': true})) // Listen app.listen(3000) ``` ## License [MIT](LICENSE). The [Silk](http://www.famfamfam.com/lab/icons/silk/) icons are created by/copyright of [FAMFAMFAM](http://www.famfamfam.com/). [npm-image]: https://img.shields.io/npm/v/serve-index.svg [npm-url]: https://npmjs.org/package/serve-index [travis-image]: https://img.shields.io/travis/expressjs/serve-index/master.svg?label=linux [travis-url]: https://travis-ci.org/expressjs/serve-index [appveyor-image]: https://img.shields.io/appveyor/ci/dougwilson/serve-index/master.svg?label=windows [appveyor-url]: https://ci.appveyor.com/project/dougwilson/serve-index [coveralls-image]: https://img.shields.io/coveralls/expressjs/serve-index/master.svg [coveralls-url]: https://coveralls.io/r/expressjs/serve-index?branch=master [downloads-image]: https://img.shields.io/npm/dm/serve-index.svg [downloads-url]: https://npmjs.org/package/serve-index [gratipay-image]: https://img.shields.io/gratipay/dougwilson.svg [gratipay-url]: https://www.gratipay.com/dougwilson/ serve-index-1.9.1/appveyor.yml000066400000000000000000000014661316334533700163620ustar00rootroot00000000000000environment: matrix: - nodejs_version: "0.8" - nodejs_version: "0.10" - nodejs_version: "0.12" - nodejs_version: "1.8" - nodejs_version: "2.5" - nodejs_version: "3.3" - nodejs_version: "4.8" - nodejs_version: "5.12" - nodejs_version: "6.11" - nodejs_version: "7.10" - nodejs_version: "8.3" cache: - node_modules install: - ps: Install-Product node $env:nodejs_version - npm config set shrinkwrap false - if "%nodejs_version%" equ "0.8" npm rm --save-dev istanbul - if exist node_modules npm prune - if exist node_modules npm rebuild - npm install build: off test_script: - node --version - npm --version - set npm_test_command=test - for /f %%l in ('npm -ps ls istanbul') do set npm_test_command=test-ci - npm run %npm_test_command% version: "{build}" serve-index-1.9.1/index.js000066400000000000000000000365271316334533700154450ustar00rootroot00000000000000/*! * serve-index * Copyright(c) 2011 Sencha Inc. * Copyright(c) 2011 TJ Holowaychuk * Copyright(c) 2014-2015 Douglas Christopher Wilson * MIT Licensed */ 'use strict'; /** * Module dependencies. * @private */ var accepts = require('accepts'); var createError = require('http-errors'); var debug = require('debug')('serve-index'); var escapeHtml = require('escape-html'); var fs = require('fs') , path = require('path') , normalize = path.normalize , sep = path.sep , extname = path.extname , join = path.join; var Batch = require('batch'); var mime = require('mime-types'); var parseUrl = require('parseurl'); var resolve = require('path').resolve; /** * Module exports. * @public */ module.exports = serveIndex; /*! * Icon cache. */ var cache = {}; /*! * Default template. */ var defaultTemplate = join(__dirname, 'public', 'directory.html'); /*! * Stylesheet. */ var defaultStylesheet = join(__dirname, 'public', 'style.css'); /** * Media types and the map for content negotiation. */ var mediaTypes = [ 'text/html', 'text/plain', 'application/json' ]; var mediaType = { 'text/html': 'html', 'text/plain': 'plain', 'application/json': 'json' }; /** * Serve directory listings with the given `root` path. * * See Readme.md for documentation of options. * * @param {String} root * @param {Object} options * @return {Function} middleware * @public */ function serveIndex(root, options) { var opts = options || {}; // root required if (!root) { throw new TypeError('serveIndex() root path required'); } // resolve root to absolute and normalize var rootPath = normalize(resolve(root) + sep); var filter = opts.filter; var hidden = opts.hidden; var icons = opts.icons; var stylesheet = opts.stylesheet || defaultStylesheet; var template = opts.template || defaultTemplate; var view = opts.view || 'tiles'; return function (req, res, next) { if (req.method !== 'GET' && req.method !== 'HEAD') { res.statusCode = 'OPTIONS' === req.method ? 200 : 405; res.setHeader('Allow', 'GET, HEAD, OPTIONS'); res.setHeader('Content-Length', '0'); res.end(); return; } // parse URLs var url = parseUrl(req); var originalUrl = parseUrl.original(req); var dir = decodeURIComponent(url.pathname); var originalDir = decodeURIComponent(originalUrl.pathname); // join / normalize from root dir var path = normalize(join(rootPath, dir)); // null byte(s), bad request if (~path.indexOf('\0')) return next(createError(400)); // malicious path if ((path + sep).substr(0, rootPath.length) !== rootPath) { debug('malicious path "%s"', path); return next(createError(403)); } // determine ".." display var showUp = normalize(resolve(path) + sep) !== rootPath; // check if we have a directory debug('stat "%s"', path); fs.stat(path, function(err, stat){ if (err && err.code === 'ENOENT') { return next(); } if (err) { err.status = err.code === 'ENAMETOOLONG' ? 414 : 500; return next(err); } if (!stat.isDirectory()) return next(); // fetch files debug('readdir "%s"', path); fs.readdir(path, function(err, files){ if (err) return next(err); if (!hidden) files = removeHidden(files); if (filter) files = files.filter(function(filename, index, list) { return filter(filename, index, list, path); }); files.sort(); // content-negotiation var accept = accepts(req); var type = accept.type(mediaTypes); // not acceptable if (!type) return next(createError(406)); serveIndex[mediaType[type]](req, res, files, next, originalDir, showUp, icons, path, view, template, stylesheet); }); }); }; }; /** * Respond with text/html. */ serveIndex.html = function _html(req, res, files, next, dir, showUp, icons, path, view, template, stylesheet) { var render = typeof template !== 'function' ? createHtmlRender(template) : template if (showUp) { files.unshift('..'); } // stat all files stat(path, files, function (err, stats) { if (err) return next(err); // combine the stats into the file list var fileList = files.map(function (file, i) { return { name: file, stat: stats[i] }; }); // sort file list fileList.sort(fileSort); // read stylesheet fs.readFile(stylesheet, 'utf8', function (err, style) { if (err) return next(err); // create locals for rendering var locals = { directory: dir, displayIcons: Boolean(icons), fileList: fileList, path: path, style: style, viewName: view }; // render html render(locals, function (err, body) { if (err) return next(err); send(res, 'text/html', body) }); }); }); }; /** * Respond with application/json. */ serveIndex.json = function _json(req, res, files) { send(res, 'application/json', JSON.stringify(files)) }; /** * Respond with text/plain. */ serveIndex.plain = function _plain(req, res, files) { send(res, 'text/plain', (files.join('\n') + '\n')) }; /** * Map html `files`, returning an html unordered list. * @private */ function createHtmlFileList(files, dir, useIcons, view) { var html = ''; return html; } /** * Create function to render html. */ function createHtmlRender(template) { return function render(locals, callback) { // read template fs.readFile(template, 'utf8', function (err, str) { if (err) return callback(err); var body = str .replace(/\{style\}/g, locals.style.concat(iconStyle(locals.fileList, locals.displayIcons))) .replace(/\{files\}/g, createHtmlFileList(locals.fileList, locals.directory, locals.displayIcons, locals.viewName)) .replace(/\{directory\}/g, escapeHtml(locals.directory)) .replace(/\{linked-path\}/g, htmlPath(locals.directory)); callback(null, body); }); }; } /** * Sort function for with directories first. */ function fileSort(a, b) { // sort ".." to the top if (a.name === '..' || b.name === '..') { return a.name === b.name ? 0 : a.name === '..' ? -1 : 1; } return Number(b.stat && b.stat.isDirectory()) - Number(a.stat && a.stat.isDirectory()) || String(a.name).toLocaleLowerCase().localeCompare(String(b.name).toLocaleLowerCase()); } /** * Map html `dir`, returning a linked path. */ function htmlPath(dir) { var parts = dir.split('/'); var crumb = new Array(parts.length); for (var i = 0; i < parts.length; i++) { var part = parts[i]; if (part) { parts[i] = encodeURIComponent(part); crumb[i] = '' + escapeHtml(part) + ''; } } return crumb.join(' / '); } /** * Get the icon data for the file name. */ function iconLookup(filename) { var ext = extname(filename); // try by extension if (icons[ext]) { return { className: 'icon-' + ext.substring(1), fileName: icons[ext] }; } var mimetype = mime.lookup(ext); // default if no mime type if (mimetype === false) { return { className: 'icon-default', fileName: icons.default }; } // try by mime type if (icons[mimetype]) { return { className: 'icon-' + mimetype.replace('/', '-'), fileName: icons[mimetype] }; } var suffix = mimetype.split('+')[1]; if (suffix && icons['+' + suffix]) { return { className: 'icon-' + suffix, fileName: icons['+' + suffix] }; } var type = mimetype.split('/')[0]; // try by type only if (icons[type]) { return { className: 'icon-' + type, fileName: icons[type] }; } return { className: 'icon-default', fileName: icons.default }; } /** * Load icon images, return css string. */ function iconStyle(files, useIcons) { if (!useIcons) return ''; var i; var list = []; var rules = {}; var selector; var selectors = {}; var style = ''; for (i = 0; i < files.length; i++) { var file = files[i]; var isDir = file.stat && file.stat.isDirectory(); var icon = isDir ? { className: 'icon-directory', fileName: icons.folder } : iconLookup(file.name); var iconName = icon.fileName; selector = '#files .' + icon.className + ' .name'; if (!rules[iconName]) { rules[iconName] = 'background-image: url(data:image/png;base64,' + load(iconName) + ');' selectors[iconName] = []; list.push(iconName); } if (selectors[iconName].indexOf(selector) === -1) { selectors[iconName].push(selector); } } for (i = 0; i < list.length; i++) { iconName = list[i]; style += selectors[iconName].join(',\n') + ' {\n ' + rules[iconName] + '\n}\n'; } return style; } /** * Load and cache the given `icon`. * * @param {String} icon * @return {String} * @api private */ function load(icon) { if (cache[icon]) return cache[icon]; return cache[icon] = fs.readFileSync(__dirname + '/public/icons/' + icon, 'base64'); } /** * Normalizes the path separator from system separator * to URL separator, aka `/`. * * @param {String} path * @return {String} * @api private */ function normalizeSlashes(path) { return path.split(sep).join('/'); }; /** * Filter "hidden" `files`, aka files * beginning with a `.`. * * @param {Array} files * @return {Array} * @api private */ function removeHidden(files) { return files.filter(function(file){ return '.' != file[0]; }); } /** * Send a response. * @private */ function send (res, type, body) { // security header for content sniffing res.setHeader('X-Content-Type-Options', 'nosniff') // standard headers res.setHeader('Content-Type', type + '; charset=utf-8') res.setHeader('Content-Length', Buffer.byteLength(body, 'utf8')) // body res.end(body, 'utf8') } /** * Stat all files and return array of stat * in same order. */ function stat(dir, files, cb) { var batch = new Batch(); batch.concurrency(10); files.forEach(function(file){ batch.push(function(done){ fs.stat(join(dir, file), function(err, stat){ if (err && err.code !== 'ENOENT') return done(err); // pass ENOENT as null stat, not error done(null, stat || null); }); }); }); batch.end(cb); } /** * Icon map. */ var icons = { // base icons 'default': 'page_white.png', 'folder': 'folder.png', // generic mime type icons 'image': 'image.png', 'text': 'page_white_text.png', 'video': 'film.png', // generic mime suffix icons '+json': 'page_white_code.png', '+xml': 'page_white_code.png', '+zip': 'box.png', // specific mime type icons 'application/font-woff': 'font.png', 'application/javascript': 'page_white_code_red.png', 'application/json': 'page_white_code.png', 'application/msword': 'page_white_word.png', 'application/pdf': 'page_white_acrobat.png', 'application/postscript': 'page_white_vector.png', 'application/rtf': 'page_white_word.png', 'application/vnd.ms-excel': 'page_white_excel.png', 'application/vnd.ms-powerpoint': 'page_white_powerpoint.png', 'application/vnd.oasis.opendocument.presentation': 'page_white_powerpoint.png', 'application/vnd.oasis.opendocument.spreadsheet': 'page_white_excel.png', 'application/vnd.oasis.opendocument.text': 'page_white_word.png', 'application/x-7z-compressed': 'box.png', 'application/x-sh': 'application_xp_terminal.png', 'application/x-font-ttf': 'font.png', 'application/x-msaccess': 'page_white_database.png', 'application/x-shockwave-flash': 'page_white_flash.png', 'application/x-sql': 'page_white_database.png', 'application/x-tar': 'box.png', 'application/x-xz': 'box.png', 'application/xml': 'page_white_code.png', 'application/zip': 'box.png', 'image/svg+xml': 'page_white_vector.png', 'text/css': 'page_white_code.png', 'text/html': 'page_white_code.png', 'text/less': 'page_white_code.png', // other, extension-specific icons '.accdb': 'page_white_database.png', '.apk': 'box.png', '.app': 'application_xp.png', '.as': 'page_white_actionscript.png', '.asp': 'page_white_code.png', '.aspx': 'page_white_code.png', '.bat': 'application_xp_terminal.png', '.bz2': 'box.png', '.c': 'page_white_c.png', '.cab': 'box.png', '.cfm': 'page_white_coldfusion.png', '.clj': 'page_white_code.png', '.cc': 'page_white_cplusplus.png', '.cgi': 'application_xp_terminal.png', '.cpp': 'page_white_cplusplus.png', '.cs': 'page_white_csharp.png', '.db': 'page_white_database.png', '.dbf': 'page_white_database.png', '.deb': 'box.png', '.dll': 'page_white_gear.png', '.dmg': 'drive.png', '.docx': 'page_white_word.png', '.erb': 'page_white_ruby.png', '.exe': 'application_xp.png', '.fnt': 'font.png', '.gam': 'controller.png', '.gz': 'box.png', '.h': 'page_white_h.png', '.ini': 'page_white_gear.png', '.iso': 'cd.png', '.jar': 'box.png', '.java': 'page_white_cup.png', '.jsp': 'page_white_cup.png', '.lua': 'page_white_code.png', '.lz': 'box.png', '.lzma': 'box.png', '.m': 'page_white_code.png', '.map': 'map.png', '.msi': 'box.png', '.mv4': 'film.png', '.otf': 'font.png', '.pdb': 'page_white_database.png', '.php': 'page_white_php.png', '.pl': 'page_white_code.png', '.pkg': 'box.png', '.pptx': 'page_white_powerpoint.png', '.psd': 'page_white_picture.png', '.py': 'page_white_code.png', '.rar': 'box.png', '.rb': 'page_white_ruby.png', '.rm': 'film.png', '.rom': 'controller.png', '.rpm': 'box.png', '.sass': 'page_white_code.png', '.sav': 'controller.png', '.scss': 'page_white_code.png', '.srt': 'page_white_text.png', '.tbz2': 'box.png', '.tgz': 'box.png', '.tlz': 'box.png', '.vb': 'page_white_code.png', '.vbs': 'page_white_code.png', '.xcf': 'page_white_picture.png', '.xlsx': 'page_white_excel.png', '.yaws': 'page_white_code.png' }; serve-index-1.9.1/package.json000066400000000000000000000017241316334533700162550ustar00rootroot00000000000000{ "name": "serve-index", "description": "Serve directory listings", "version": "1.9.1", "author": "Douglas Christopher Wilson ", "license": "MIT", "repository": "expressjs/serve-index", "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", "escape-html": "~1.0.3", "http-errors": "~1.6.2", "mime-types": "~2.1.17", "parseurl": "~1.3.2" }, "devDependencies": { "after": "0.8.2", "istanbul": "0.4.5", "mocha": "2.5.3", "supertest": "1.1.0" }, "files": [ "public/", "LICENSE", "HISTORY.md", "index.js" ], "engines": { "node": ">= 0.8.0" }, "scripts": { "test": "mocha --reporter spec --bail --check-leaks test/", "test-ci": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/", "test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/" } } serve-index-1.9.1/public/000077500000000000000000000000001316334533700152415ustar00rootroot00000000000000serve-index-1.9.1/public/directory.html000066400000000000000000000043171316334533700201400ustar00rootroot00000000000000 listing directory {directory}

~{linked-path}

{files}
serve-index-1.9.1/public/icons/000077500000000000000000000000001316334533700163545ustar00rootroot00000000000000serve-index-1.9.1/public/icons/application_xp.png000066400000000000000000000006521316334533700220770ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<Q -wB&)I l d.IVDM!Դ65f*FA 'ղ= #P$9,a97p 58+ɄQ\ՊQ9]}BP9lMqg&!8r@kVk3c:<$ρU+a/Q߄01IENDB`serve-index-1.9.1/public/icons/cd.png000066400000000000000000000012411316334533700174460ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<3IDAT8˅[nPԍtG2J*H\BC1` 4BLű wTEϜlZ[Gd l "J-Mu9"mٖ>/у I |O1&'`6|W"+4$K h\F¾<z!oc/.N1g*CxϤLa1IAK PIי?d)0آ& G&#q3.#l6eS}3{ ҈NKHa2cxSM2GQG.;wEo/ !^̀裰&? w WU, $,!Kr+xEC4 B*:3r#l2&$^D6F \@>ἅo oAR]$(8Vs)f@Z_Q 9 ^#R\~$.Y)ۛGy2etS*e:+wߦu .IENDB`serve-index-1.9.1/public/icons/controller.png000066400000000000000000000012321316334533700212430ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<,IDAT8˝͋Ra*Z Zh) ~`~;~P &FG*";)o: 3^x.ܗ=T p@"=tgvA|YVdk4 -Z}P(b\T*GRirL&C'ɧ +Htp821_P ߏŶHDjeƯZ-0a,<[oOs  ͦr'‹ŷ0z`>rh`l?s X,`ZqB85;gi{u: UdQ锫nRJ%R=`2@6t: d1_Z,^g$ Px\Yhr1TUHRy F wVT4Bh4zG#z{2lh)JS:rmS@0N*F"NH&fP(̕`^()0 6oOqn6|Zm0ŧIENDB`serve-index-1.9.1/public/icons/drive.png000066400000000000000000000005321316334533700201730ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(ϥ=JA^{@3o0x O  dFSeнVPI׌}`XkD #5a5ϑɓym;w+CSf5|8#Z{Y_Ԇ`%ܦ^So>1JH$sABY"Dő fEIܐH`Nٿ]?0!HgZ/6LIENDB`serve-index-1.9.1/public/icons/film.png000066400000000000000000000012151316334533700200100ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˥OhAn RK%JzQAP4 KOyd^*DQT4"RKmNZIcgotד ?v7aZ`|j8q\yR И}>9[TbۢY3CG:1AN0]efB8pA'/h|GWMa:h(⋐R.{!2I{ =p?q4Ot\"M'gS m9?hubָnlÁ1ҫ Rb=`g\9niܦ5ZFͦ7~ynHt*s)^d+Gt?`_A`Sw37Sk#`ƿ#Sk؅逅%Q~9Nf X Y5ͳASdhhJ ܻPjbKq[myzkd@lhZpwIΚbX(d>_M2hYVhrЂIENDB`serve-index-1.9.1/public/icons/folder.png000066400000000000000000000011721316334533700203360ustar00rootroot00000000000000PNG  IHDR(-SgAMA akPLTE\ڮ4ڤ5ګ6ژ5ڟ5Dhگ6ڳ6ڦ7ޔڪ6گ5ګ5ڡ6Ԕ0Orvtvښ6yzٴ4ܓ;]&Ҁ؆,Έޑ^ӅՁIi.llksl9j۶cq%iAȔhu@%Ґ ]H Bv̓ڈ_S%Ґ;69Host wEƄx ]*f"".\00CLoF]W-Hh^Y{we0Ewa8V IENDB`serve-index-1.9.1/public/icons/map.png000066400000000000000000000014441316334533700176420ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATˏuיve jWMhbċ79jz'AjD1&#cT δ3/;ƙգQ ?9%4r>@jdA]7ZQKl|R_\L?skk[vw{(Ficfi ۆODvoIr[$BqA1dcIb2Iy*983oY߳WgvŤ<7iE q%r!@0%h4_:٬HdԬyjZdBA S ˆ=cm+{ L5-#V8bDAy^Hp44^ILT&TA@w9_^ͷସ:`_F֖䚨8THyǍYî'O]y<+F1`ma5n~JצMNw^;`_bנ;q}AKn*ubڹW]ؼ\S "9J7j[mdeji:}y1]yݾ[Vvv{ҴALBCϲIȴе=͉/QL|f,+UUU!Z 8B4-DH5U%yw;^1l:?k6IENDB`serve-index-1.9.1/public/icons/page.png000066400000000000000000000011731316334533700200000ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe< IDATs>{SG3;1Ј.bc#61lIAKD"$X$ TDyUIޥwO69DBכY}o*>'o{t:& ﱋoGgpfS=3Og~jUiִe[ǫ;kҏxOT$4ls1 w}؝>``ʨ2*c*u˽=v̝* D)ke{Oy,0CB0(4;.ݓ3*J 4 PC%# 0C/$4 I2O!E6k3tGBT%`YCam)6Ӱl0C/щ*ER4\g ˲ZW7{谆$$|ṵu/ٮ+Jt(ʅt% }6q2=V}.vDžw}z᷶/ bPfvf`džY:LI@A JD(JΜ#w o^7=  BFh}RBdq\ֆX=)jCL5QB ZBP!AD6&:@ч,!dLP Z]ABP$)H ~bԜ/G&FdHВ:}soUkZq7+qj^a(d4'?/g:x#m;+ǽgvf}7->hgߞ1+qkKENݯ_4K'S5 XcZ*JJ#~0[@jӲ^~18--&;T߶řlw^~p=,+2tD] "(669]f߅I@A JD(JwɆ^߹V7=  BFh}RBd4jcS1Xe }O$hɍ#N}ྦྷ3K?}bB8L A##=}-`xU6o_ qu]ђ>郖[6༮ akrԋoZ%Wλ1G_4\::]*,/_w4E+;}V IL}oG)g$[?/`/} -%nQP`IENDB`serve-index-1.9.1/public/icons/page_edit.png000066400000000000000000000014471316334533700210110ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATOhuyw9ge&"2&A:uVt.AA]9롢H낆 Ҋ?/}_'֏ jC E#m*Ưi)LYUھ}ظxq`u#RkRJj4$! dD!iOn9C/im&N{ A DJD)u\~'ו:nһaK A I"%wyĖU־zRWO؄wRD(SHIF^5{/rYAib`=vVS"eնizu[{s^?y׳-g Dlb BDPA6[P ((AP"%Bi_^ݙ:Z4|^D㻏N3',_fGf}'rs(3Ǐl'(sw|i|0"6\ښ)kZeMYk5Kmdw+ROIENDB`serve-index-1.9.1/public/icons/page_excel.png000066400000000000000000000014611316334533700211600ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATMUU{ S# r -MRTڄK EaBD!ѢH!jM dI ecyw9}_9[,G?ȁ)v|8\|؞!w&}%1YB g.^w⊿Mw{OA b19䤮N™VQ:.xWv!9碯H("E dp36(>ԎgS5Be㏻|o~+UФںeKZUݝ齓WU%N[;?~S'S۲njvG2j|ӎ4mm-5Dl yаEwSA^nw\[ּoxhD_EBM'{_Ld`ݢ kwZ2+ 2Jn.]Mq璻M&㐲*2e5&7nzZjrGGTW?VK&y p!mo~r`@Tß_C*Rd uuzp;0V'"cfkD@@x 8Ԛ{yшˡܪowFw_w./,7_t?=S ϋ)fʊE~jήO::5I`.;þX;\fY])V.T (xg8`O­ U|v *`hwLs; k'M}9CP ^ (( 08 w\OE5 BIp>Yt@#tDBK,b+[ޅ*Ϝk"򤢭((((”4LIENDB`serve-index-1.9.1/public/icons/page_gear.png000066400000000000000000000015011316334533700207710ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATMhe~|ϗHF!E^ "<:tAt)."#{@"R+Tmn9=>`E^t!HD.XN7owtY^_amiqP " \5qCoOuLO߆r謫rJ$Dn3-_˵(K|v҂:#S'LH,X=0^4+$ȉ\%WOku}ɛO.UuT/C A]$9+:#g,̖RfmgT6ANY(DM]s A H@ы&G.XQ]:Zȡ6-J 0qի4}VeŊç ܫ՞={zj(%DA=}588ۺuLMMͫOv:)4ABS8eRrYvo+˖-޽{%‡JBI옘PU~VG)ZI.]ry5ۍa[Y /|!k֬oKfJcccҪ}v)1H\nB+]khh133… z{{UanYݱƗ:por 6=94,76)"luhW{.v FFFz}r"s/0Wjk;vUIENDB`serve-index-1.9.1/public/icons/page_go.png000066400000000000000000000014131316334533700204620ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATKVeΙGm$d7fe"EIѢUPmMv"ڹ+6.v]2»68fޞ'2Ӷw>>1J 1d+y M}xώ@d>8z77-%' 䍡'tfȞsBiѶYۿA>K3n:9?SϾ?|~@D,f)F m "P㩕lX $%(JD(Mߌ{=4|vH2 !d'% YSc-I"DJ6QJ 6R! (D(J0҄8ώn6@ڑIE"3JDh溡UJ_jMIv+Π\\}A }OR]kګ֭҅`O{hvfz灐j:}/а6w1?Gf[^߳rbĆEM\;&^3.\٣y:gZZsЋc{5ҭnc l7fZOGd|rS??p`Yκ,/`x ^{(&Orv<-Doz)"H9@HsS_]}rm aS/IENDB`serve-index-1.9.1/public/icons/page_green.png000066400000000000000000000011551316334533700211600ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT?s~~TI!!bF ,H8b1a5l NQB b`^8MA~y*޿\)(0kJiΆIH q~{СMкOgԪ(2X2s,}O>};x3o}~Wtܠ$SjbjLEMa8y޿ww>JҪ*m*u=g6=W|vjz :@B(%UZ4\1mfj"jAƚ6hT*J VZJZ $@10PHZ(} )Be  @)zcԊe 02FHd#W?9Wi!Gc{sގl6IENDB`serve-index-1.9.1/public/icons/page_key.png000066400000000000000000000014411316334533700206460ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT_swΙ2-!I(vaŅ\p"nȕ;qjf$!q眝>NYoN=0|i\ZsЉo:5c>~'k ?~K=ܷsp;,{,F4SybFoݓ^~~ЍmqCʅmy}#sthno?N#=ƙ?IENDB`serve-index-1.9.1/public/icons/page_lightning.png000066400000000000000000000015071316334533700220440ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATKhU9ߙ[&IzPR5 Ġ.Z+fƅFp!" BwݹЅp!`ml%hSm &:|3}' 'Zr;&*pȈf }붷޺xf$.~63ynH!ڝٟ[,vtf|!};dd("qbk}^zW84-Ɗd(%,D8rljrR\4l&LJ}/}ݨ^N5Xe7˛9cR`##\<赬Tv|KN/~rḲ6R >GJ8a .[&07|Y?K6F+Qtp}Χ[|U{ @_W#2Qt"`Πk!9!&p;9Bp\}ѫK $aNі$N? =;"@]0?c|5$#IENDB`serve-index-1.9.1/public/icons/page_link.png000066400000000000000000000014761316334533700210230ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT_he}o;ͣ-cZFTV$D"QWfPB$hn $`EA $DНT7e )ѝMIlsyRD/ 6vd-@ [?7Ǐ鿙wܱ"rڇsN˂JlW4u}믳'hC Jjٹ(vNϓ,ڢ(͌OigH)-2uTv[`ddDNINININI֍V-xd8y;U} PDPW$I}=,Rl!չ 5DSB $! Qe%)2))$@*@R/ "J "䌒U $B5"`}۹?x!SW[NK;|]C~14;X۬W#ֈY/mnn˗6UוVj(P"1]Ҟ]sN{ ZWu))ׯ7iK.l^o~c׮]6l`۶mnV7K6jKytuth\z5M077'bʕ+5t{jk_|v4O|ԋci .h4VZeddDĉSɩao'X^^},KF3s;ݴ(,?)n/Vkz̖0F[v`IENDB`serve-index-1.9.1/public/icons/page_paintbrush.png000066400000000000000000000014551316334533700222420ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATKeZYL ( Z).$"ZDTAD(Tavݴ215o3x9?ĝ>d%lBdUWSqڱm}OG/%% ҉v~wg/ohKkGfٯ5% +ì.] ݾb^Xuԛ/޼vX2{rr2i^ BDP%#~ v$(RJD dS]y6>?KGO̵ο,.W1޶;d"]wWEuVei-Cp-^}1[|nm{hg?67[1 ila}>:2΍鏍uivC;?Ҥ[6OD:ƹM/&}8\vN^|b:bq.k-RX$bq\7My| CgsQAT}%E$;z+ &M&j#EdLE)E&ԱjcDKCGW:.0a@f UM&kHТb(\ޞNOڷ*kNT x/?ݍp,2JQ Pwwrnܢ AQJdYZ?5I83IENDB`serve-index-1.9.1/public/icons/page_red.png000066400000000000000000000012011316334533700206220ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATs>מ*v"6iD @"DLb5Dh2HDDIY$⥪ ;ހ:dNf0`* Աrvc€P00QeTUF1鞣9Q^}NfzfyT52Ol3t5{ѽy,0CB0(4[FI jFA֒$` t"DY# !@R*̃ 0ڬ!M6AiX0C/щo"W*Ҁ |` ˲ZWw{4*% *qpk3,{Kw׍o -*5bG/k/0t_od }g ;Jow]W*?!y!!IENDB`serve-index-1.9.1/public/icons/page_refresh.png000066400000000000000000000015321316334533700215150ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATmheu?9|b*VI+R$he!A!AeSB?D-!}r$sJZf6u;<}]~ǽoJu۝X)Au|;3SyrѝuN  cL^UYR>^.>i|ĉ)DSB0Yx3S<{Zp"̒|9D@(Jy+gmsK#@N'%¿U,̘N&%x3 Ѹ1\0 ia5Y~ /0`6︯~ /mGMQT*n/\ifo" `Y &%KMWCdJg0 03\bN-gN{)nMW GX𪆙aXw3Pポl[+9'9ȹOW|TAS_q:v\O `/ #!M |4Yxi-۷ȟ!DbU; {K6-X:E"W+_!T-{! ,BW׵݋7dپִhfmwܙ+"h!E}ȓ``&19ky&w%ńevqIENDB`serve-index-1.9.1/public/icons/page_save.png000066400000000000000000000014061316334533700210150ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATMVe78bDfai*QT@h妍P;]B@hQTP6Rd%XAT(T0sxM(a6/AV]-_cgNʞ| #[/?_8s|qmibGm)%deUץOl]z^té̦m "PmYܻٶ'׵s3@I JD(J.][s} ÷h&L8)me4ZkR6DE'.X?갳a+k>+4;uʚ/~{=ov:_ >rIqԎL*2V#nt+"֜LI)IFءjMFn VnaG5^n(#e?y?Wu\%2dzjnl-[6әF:;=2?9oՑUXU/F/ˮIENDB`serve-index-1.9.1/public/icons/page_white.png000066400000000000000000000004461316334533700212020ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(u[ E&}O(@_֖9a.і?v9\ bBWҴJ/\Y+DIO)n,T(pbeF8D`ñ_9υN8s]蔊d!4i/&~b%BB *t!ЕBiU| Qd&d+3D iνs9U0Oƨq es]>G99|>BIuE  ÀT $q( &]05wLӄiHӈb\d:X`6߸TUE</)X@;mknD"3}@3GH(,˕+!::? C=!QE8/0/a fyHBؒP/HvAmn)+/ 8ĿB"nƆ@Z[)j~Uh^N3QOR6]n^SݑI1Oc c4esKxCA fw5>VD{; XL" uS 2dƻ07>,D<G6iBFYUs0uOcR dB8V(}X u WmY$Hn1) t|?>76'@XG"r9-y8]"L?y[ӿحYQIENDB`serve-index-1.9.1/public/icons/page_white_add.png000066400000000000000000000010001316334533700217750ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˕KP[8V"Apj[JS,889U`(ZRǜKSӷpr/wk`PkRYeUѣ+J^7 >,4E(R.C&A<X,I ,#P.QVJ dY$ (JKthD |dkf&6:Fk96J*Ȳ)=0t:q A#Z&r!.Bo8 ذwٛ4_q`ST»ʼn-_Z?^D(z }=~H@ a\a0m4e5eE0<#̕"&`AGya{4)l}O/!&RIENDB`serve-index-1.9.1/public/icons/page_white_c.png000066400000000000000000000011131316334533700214740ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍKK` I]t^RYU8LV7*ځʠ0^tJEQT*RIS&~S/\'+PBaTA9㣓s TUEP/OJ%b18N8DQ P5GnGXD B(_-W|@لjE\bt<(~|}ܝBXqVx!! R<eɡf÷.0f9.D.d,]]@r4v邛S=P4 zO48J ܢZJ!'rrg}鬪;2QTh4Ղs^WV# K@NSj3^f<H5sƎ *'麾1]PsVY9]<@IENDB`serve-index-1.9.1/public/icons/page_white_cd.png000066400000000000000000000012321316334533700216420ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<,IDAT8ˍ_kPg?dGJ:bE/du@ .ZA7 ԭеf]6iҦi=?9ڬ <9yw ^)p rC q4^D"sÒa$ 4:6$Izh4H $f6V>O+xiB(vidY˲6b%;v#B6}T$HeEZfyH'4<ֈnI@&px}Y7QEᕈx*TEviPCՃf#:"]y?TU=,+|BbGEbro5 ӱ 0Q Xxߨ~ٚWPu&O3<r #̭EG"|g.6\l-x2 V/H@5tFGs5^[.>O/@86-*:/E@0  ~+g"n-dqc3s̝GqFnC9A?\l.]D\cn?/ 8FNq$ɷAIP0Hɦi²,0iDQdAJ|mTU&2t]$ILPT@IMIP[5AJ(Je%6O(~0[dāa(*yUtOлM̾_ ^I P%4UUoVNcc_E{v_B|NuXתA"*kfB"_0-K?6љc.oal7.`Z:g|)bbܬ*āG å2Da.a2A$tCʘ?IENDB`serve-index-1.9.1/public/icons/page_white_code_red.png000066400000000000000000000011131316334533700230160ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍOkAk//9ւG/"!GE Ԇ4M[ҮD!@??='%n6I97&.<,̻ggޙ0GdER%: 6Gf!h6@ }xn$ijiIC "qބ1X~v=dCp (9mSKR=I AuA@z)㨙t:INjSX h@ fBp]yKo$*&K*h/C=!5_=Fo8ܶo'^޼W+a %!v泈{pMW?33eJG\:=8+˝ U$58j{$QPxJ@|~z_U_SEw8\2%Hҿ9n3ւ?lPHۄBތ`$)t~{Ff:IENDB`serve-index-1.9.1/public/icons/page_white_coldfusion.png000066400000000000000000000011201316334533700234150ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍ_OPo?}"Je&^xO h ?WqdR0BvvsԕnM~iӞwz `E +Cr!eY8=G<7 Pՠ*J $@V%ό4 rY &xd2Kn(K^cIn-#׊jUV`x~ nO+'.+ GZLf?}Y(y,{0?h3}㹋b^_ ~n7/!0 V&4|.:&dɔ[#B?X%N5[å@gTP|{±FL۶%ea(Y1*xFU7 vqs4hʳ)YG)ZE}/ܣ ~p0 Xr܆?V^֫TIENDB`serve-index-1.9.1/public/icons/page_white_compressed.png000066400000000000000000000013241316334533700234220ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<fIDAT8˅MKQ̼3NNba`TB65M_jS֢HD~V̌;眧699p澹g""a r8r$9'8edd hiMWUjT*R*d~~^s2;;+ gP<(ӛf拉Š5@ZMkn) B`ll5ޑ:_Z $hBCC(MfXk\>*tv33G͓/39v >!2eB8\($Yazeӵ @&JQ`ZceEl\&- 81hQJ67f7wn  u[^?1֓5BPJ`iVP+~|&V:͙k1sK]>#JXm\_MeKsf\O?Ż:|5K*DMrp{*KQkΉxzɗxiWz/M0YYZZTٜbN: Τ#6 /ֵH^0dA#~9NXF~{TB|v9IENDB`serve-index-1.9.1/public/icons/page_white_copy.png000066400000000000000000000004651316334533700222350ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(uMn0E9GBꂫtP kBH$4]8&瑟J&ѨF%@ds3W$q&гݨyFz\MMIENDB`serve-index-1.9.1/public/icons/page_white_cplusplus.png000066400000000000000000000011551316334533700233120ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍkQū]w%R.ZV (HWJەJQqFnHSBmPA7 EII$wdFځüown0vAq\ j6[V !$$ Zbٶ 4*Ȳ QcHt}a$uaY4MzH6 !C2s*2s fjq8]wX59q}=5QP  RqZ^}GV T*6(峋]z?.h}۩QVۀY7YCƓ ʴ3\7xMR x!copBpcrWIvpTJ3@ɼsX^sxC"K1ѫ+8s|)0S7q^˫6Yu6^;Xlv:lWW{sE[10+G{ fg]> @/A0Αh{=ҧIENDB`serve-index-1.9.1/public/icons/page_white_csharp.png000066400000000000000000000012741316334533700225420ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<NIDAT8ˍkAƫ@"G_,>X, 5Rx Mچ4i4!RTkђ ňmsivlS?g6&3f9sQHE4%)ZVh6ۭV DaXLJ0@͒$\.wU,!2 I` wQ=PVQ噪T*P(8PT@/Zm nyL9re5QwWQ ,[99nn=79ؗ1琀20¸8_#m6c,j|zo ZgcOMGqv23Lȳr8xb2M#Mϲ08&0j p.[0"CLa!L0V>m; ,JOG#:dgfqн98zcC3Õ5&A(a%f,f0\,' e<j/LEQW Wmm,Hɼ N# U\&f5F!@#_/bH -e/~A/\;1%{~ A;wD['V~.mIENDB`serve-index-1.9.1/public/icons/page_white_cup.png000066400000000000000000000011771316334533700220530ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍkSQk .Wq:΍݋\!X%Ym7A.B"Đ@@9y!SyϱyMb|ws{{7l.lrݚ`k:rEyh4wu6cH$3 h4XRՠje  jM4E$A8F0d4" & hNGb2|l6zjKU*q\..}-_?o3 >,i6Vgшp>G.çOm5~}Byt:3f9'L\ەinh4eIRÁrZ.C"q*b(Db/N~ /J铠nl6|6q@RŽL& ڥHB$z=*>'5RyWb1hZ, Bp:Z! NOBKXVgd h >=Yp*%h2#kM\:{F`kIENDB`serve-index-1.9.1/public/icons/page_white_database.png000066400000000000000000000011031316334533700230150ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍj"AMbV 22/bP$jlu!q'FkN.\ qƺd]GSUg\Vvv;LNNb\xXrTN4 RnqT$e2u!sL&` [zш5 )h4H$`6`0Izŵ ojPi&(p'N|'mjZT(  Є  kal6eR0l4!ptipgj*R$*ff<Fc:fsyx^ :߱Q%Xr,!@(>Oqf tׇ|p;*Ji vqD"sNh:x/xO_OW7On )sy9 xΦ_K<IENDB`serve-index-1.9.1/public/icons/page_white_delete.png000066400000000000000000000010301316334533700225120ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˕;KBaգnBCMMBh("Zڂ38PC.(8TK 4u∷=^#~y Qa$CCUM`$)Y**r`rZ%Hl6 QR)$ aY |!ϣP(O" L"Ȃ\.:v˒6H@t:h4Rm&&kީoX,&W"BwA+/hP;4 $ Ţ< ['^f2~^PH!9Ǜ݄)^׻lV|fN_: iCϾ4fmQP6qd/*2[|VG sl"2}ݜ 9 GdO 56mkIz]˥a T _#>U)ےIENDB`serve-index-1.9.1/public/icons/page_white_dvd.png000066400000000000000000000011761316334533700220400ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍn@EKJCQo<%A  U%R0uT!DI\mdlǹ߯f΀ME~g:X!6tk=.9[Z,1 \u:Z-TU1M>υ8[|T*!N#L"Buz=mضTr9O&yJfo$Sр$It:婜.m$N80,3|!Db( Fa78vcq5jױ_ %D?(z{/=xq\B.Ç!d-@ 6#^8rΏ`6 ,48݃kt~AZۻX% #?y"CupXIENDB`serve-index-1.9.1/public/icons/page_white_edit.png000066400000000000000000000011521316334533700222020ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍKSaWEDBԅЍ}a? P3B ]t +$aA IX^ns\[sKp;;gɦps6qt w`԰U]|^)JrL+:Nsb&\.u,Ld2iIYBӗ)v>)iR(D4E!J߰EYyZ,ǽM!a*?fH>>ƧG9Q7&h޳|}+ n $jcM}w+U;}92XͶ$jxw?Y=“g~Z\-32L>vEdi/ e{;^D tT߈]v5Jh.Az{G߀WN_}$GbBpIij&{-aI?@>L'n "$>Z ?zL^IENDB`serve-index-1.9.1/public/icons/page_white_excel.png000066400000000000000000000012271316334533700223600ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<)IDAT8ˍOHTQ;D:L&DD)-7AQZb3c8o޻6T|;)@)H>WP E5ȿv4QR$rY^^E1‚!jpWֲ9'u8'8+Xpaq$a#ˍ epW6R) d\/-$4E%Ȥq"91R)֎&-JC4cyZZʋ~>|4¼Мf5W Š}hb0|3Y=jK<~ ~TT$՚F021LW'$d0(}m+gHliZÞ>Ͼ珄Q "(p5 }iap!i|gVSMƘbsrZ^P8kmp֮VV]:{L`/G*_>IENDB`serve-index-1.9.1/public/icons/page_white_find.png000066400000000000000000000012441316334533700221770ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<6IDAT8ˍkaW@%t\# &jPɉlkhkE$XZl:2X#0Z/v]=zgh/\/sx$d3I]L_ @\VFcl9^VH+@JbR$(! sH, pzZG5e~`px CKT*( fH$P.AEo3nqϺf@s?AΈsx4y$FLL[alb #ZLҚ`w=[h0J*,//$CS:枾qt!4?eB 2.qKLp,Fl<NzZCH`U}mCx lo?&Hԍ0Xyu8䪣_ nö;: /@RQ5 !+L&AN4a6oamPP,%0 Pl6{i>8vn* r T*If paμ_[13 \.Nr=am'HBPJ==9z/bBk&AmO #a͔7826Qe sX@]Ȁ|ės4}"UDOށ~y-BW {iJlx&U@?oqQ6>ǘ]MnMGsSv/IENDB`serve-index-1.9.1/public/icons/page_white_freehand.png000066400000000000000000000011771316334533700230400ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍkSaƛ8bAcJE':tp!KEpiC6iC6چބ4779Mz sxbM,v}`aY:<;' sلiuj5e)JzH|'T*5IX<l7([X E'y4x-ɣZh%>r_s wG]C@d0hLKW1x@ӠD9"N49pd< )M+$EY5Y;_!oƐ\HIENDB`serve-index-1.9.1/public/icons/page_white_get.png000066400000000000000000000010041316334533700220300ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˕MKQM!Z M [.PladdFqѢ@ ms5?0ssaka`0%0Xl4f# %Hj ۔J% iYJ :$$ Z $ORX,"A@D"Y# (P.f{ZjD!`m7;JdA7j UB jfB z.υ$ĿT C] (@Np>]P8c6 #֍+ޥ/>?>/'nqgջ7lQ+LGՂAsXzߋkf껰Ȇij}/bg<7G!Z#ɠlrs`%Co4tQЛ1IENDB`serve-index-1.9.1/public/icons/page_white_go.png000066400000000000000000000011441316334533700216630ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˕KQ(RJ}B.FSkJ7-"RQUPFQHP4UĂTJqBJB^s֯ h1so0|ܠTXPD"o<?J$(9z,T !I|><vl6 S-!#WJ P(zhsB~8s-%8@w%jFI{Hj-8Pb\kD="#XrѿK:-?JǗs+zڍ>viQ|,;-=|z;֚1s[x w߱DZeoqoq5fnC}RX <-A.ӷQ5W @Y2dU,OiI1v M(5y@( lYPR49T}vsIENDB`serve-index-1.9.1/public/icons/page_white_h.png000066400000000000000000000011331316334533700215030ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍKKPǵ|R7B7nD0BR:  tDG) υ}hT&1ɤyg{n%H =w9pid41!ȋJUVk`$i(* y|ض 4*(L&#$ar= (X,\.7.,˂i\l6W ZRRj- /$8t]I(xb$5i1Ëxa+BW"m}m= s;&fs&L,$T 0x_Y /iZ+@ZE%̈́DF_yW*>S{'.,VH/H/t&5.}fް/ "P%<";8ZZ$#L>hn2 ˲4 JBT*AmOa`T*9ht:CvduryW;hzAUUȲЬ0D~fzyx2q쾑_s(e'`kPx|~qQp8$X64Z联07?a篃ub? KХ!S7aaw\Wl9N4ogcXI˽~޽͗!ayj <׏}Ƚk0V#O Gg cLkpXyݳ^=t$\ݹ[SG'b'n5UMu+IENDB`serve-index-1.9.1/public/icons/page_white_lightning.png000066400000000000000000000012351316334533700232420ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe</IDAT8ˍkQ;tWh+A[>t& 5*&BPEiAX-Z[-i4iiLf&yf?zijZ}s.@|[U mΕJr %Ղ&6 i: EQ <`0H*u;ڳӐ8/>>B XZ$ PA _\OD'd P (O BMKl&Tɳq6c 9?i/f(>Idqܒ@߿13v}h0~v!jr^Qil,/ Q+qhs~wM0?8q awqDr3L> =#[P^ߜ@jG!N"o(lGwurT 74r|6Z) Ҳ!gbyǐxh R"Wڐ|qT= WS#_1eo]Ku)K#+Edҋɿ:*A=a+կ _ZMHyBIENDB`serve-index-1.9.1/public/icons/page_white_link.png000066400000000000000000000011461316334533700222150ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˕;bA Y5DQl3ED1QEM|  тo~gl8v%$l|`zdz>1IFr:+l6p8~T*uqGڰn\.!Fl6O2 X`X`<ߴԷd2'z%NB~L\B@  AH˕Jh\HN{ k2 ,8.:_CfczVp8 łD"AnpbB@kZTUZ-4  pp:Vh`4hN1&jo3syz|lhP.Q,NrxbR]vJ_d2Wv̞l8T*\.wbt?JOB >IENDB`serve-index-1.9.1/public/icons/page_white_magnify.png000066400000000000000000000010521316334533700227060ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍIK@C7/= ŋIm\ E*q[A\jU64S:_4U1 dg2..1TR!gi n{\b ):cr9d2qK( <7 0P('i,%E^%! (*JgRM j|NwmWIRNdY[PW #N;fP 5&1_/L}~`7 ]cVi3$QA4)°+E8! _j8C=L=pUU^X}Lwr }u=RY8yƂ8]cw!6iMwֶwA}LL6xG)>_o$qp-7Z7ZIENDB`serve-index-1.9.1/public/icons/page_white_medal.png000066400000000000000000000013021316334533700223340ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<TIDAT8˅KTQ?8O3J@Z[7]HX B~mF A@EBE.*(yj8E{| O (z{"z7u8H=­fx qG^(6pΑ)B-VVV/ 2~rF8)t^BJ!a233sssKk*1G:HbMR7uR,J)-L&C.cvvv֘Q9x!ω>iVRA҃U5u")ym}/.::;fdit8[uwZ[)R T3@f"sÏOoɏ^myhY0XE\w)]:z ]m|R ΋6N$IZ)>tZ6.0ܨ~XXҡ3IENDB`serve-index-1.9.1/public/icons/page_white_office.png000066400000000000000000000014131316334533700225100ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍKSQGg$TCaYQhEHY eIŌ( !)Ji~1  _p]~1uv{wv݋~;^.|~:rPr)y`+eS.Mi8=dJlgKy1WuĦ,!# BEx^&yIa2s;O*~ PU@$B!ߒoDzr\>~! ^FZD#D72gcV~YB B|ܢe/.Yf@;'&:m<»+*#ƽx NȓbȽ-PF:y_pCSDIfȲ(-ㅙwi!QcBd&"|ªBI 4q: b(0Ua-y OU- >RJ4ȟaoKd5 J;y2zo{ h WDa.u6FfP`ea7W؝.@&w<:OjntuN~a(=+h  D@?5&H[}4~eJ/wi ]@__ 8O pIENDB`serve-index-1.9.1/public/icons/page_white_paint.png000066400000000000000000000012601316334533700223700ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<BIDAT8ˍOA/8&b&('ś1$41PK($DiP)VmR i~l62s=3ym6mAA8`t]VTB5}8NG5 ]4,2EE<#JrLnopon MӐ硨E$It zþ٫11YApBNXde\.L&c `>{(Qc~S0'[BnDy iF}]uLKxCSQ "肞}ԗ xҾPg5,Xj,p")W$@&K :0D$ OayW.M;' bDp8ES~|8$a0/*mav_C_Yx ӈ=)Hcxn=\[L"ŮP(Pn?@k.u>CK(ZlfZ_ [4S9 G_Ѝ턍JA#lco, ~Nč3IENDB`serve-index-1.9.1/public/icons/page_white_paintbrush.png000066400000000000000000000011521316334533700234340ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍkQ.qEǪuƝ+7Ս.,؅E[(XhUS@P/DH(}aEJؚF8ɴ${.$1sf F?cTՔdb|P(lvVJBdhh4 EQDe8.&Z+Ёt:l6˯D"@,C8T*z.iÊn (l@ qD"Oъ:xWk3 SF)"t q٨؁:tO])b*02GsPī޳;OME`!;E\p˝(8TAZоfMkD8 ˞)x>*vo_֗n,@(q5f]=(;^Ĩg&}>y(r5<Ρ7@׃%{}SxߧIlX@~!/\bfIENDB`serve-index-1.9.1/public/icons/page_white_paste.png000066400000000000000000000011541316334533700223730ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8u;hTQ{qF%ш ]*k_r]!IJ+!A X)6.I@Hv̙#Ks3qf7ƣhpBnrzGkt۟'xl-71u4W̌`f,^g7ocKi~ *47`m85{!1Hs 94`"L̜E`hwvZ=ι`40UT=V{k!h<[YY;vscDqADޓ)Je5cjZ}"T<&  isEQ I*0cA1QT EQ?ONNt!`YUE%`jX#w"2}D1 -d3!A=zgPXυ-NτBɷozxa{{;K'B]89pd0sa,IENDB`serve-index-1.9.1/public/icons/page_white_php.png000066400000000000000000000010321316334533700220410ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍKKQ [զ}mJ"&zl4EiE$nfԔytϭwsO8\?:FjRh5MP(d%Ś,(P(DÖ,C&TU0 IE*T*?8Gl qRe4d)5!I n,@<&ѫ'< v3DW8/P.m;>%X߸ w(6A6&f2Ek*lƳ 0A |{-XV0Jpl$|=HD7A=@J&ֱb(:w~⭞)IENDB`serve-index-1.9.1/public/icons/page_white_picture.png000066400000000000000000000012121316334533700227250ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍOSasZbMJPAqh$?p1ͅفфEcTĄE +h^n8Pj$7ssDUPUz&4mcVSU26ƸvNVFCժZku{{[&2ëRxNFb8xMq2Ygeek^,uq ˟^AVBP(ʏ]>mDzM;7,!a03i&"a= q_R xa`_|~vM,|NIENDB`serve-index-1.9.1/public/icons/page_white_put.png000066400000000000000000000010131316334533700220610ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˕KKaE"!hQAIe1- J \ jBA Rh-\HhA(::ۜ309g822P h0,0@ YU8.U**rv%@C\.eki$ID"Qx$tI@ Ţx',RѨ(0 #JZ 2 bXKKՙBL}KqP(YL*y$jfB\HB-*vױ}o9 ӭBT%h (L<ѧǨvdx:ٿ {Њ7'\;TS;s`ۄ#\0?vaV2+:.ŷw - ZeR:ؕߓֱ+(\ҴphIENDB`serve-index-1.9.1/public/icons/page_white_ruby.png000066400000000000000000000011621316334533700222370ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍOOABHV&&$$ Hmr3 "'. I?v f~̼N0*#bVB  6Y%qA?7MضaժT* H_u]x'FeYuZMDQ.jɝ(} KK/ZX;SwO\IԄdQgo_A?mVh<\y0:|+PUDkk@ vI`cf&ߒj:ss('S݇iA9|a :8}d{,# _0M#hdd.ghf*E9 ctn"rN .'׽B~F'!pXXqw>k%Q"42&ۙ}\MvlwqI)Yz;B I|"a7& <6vjIENDB`serve-index-1.9.1/public/icons/page_white_stack.png000066400000000000000000000004751316334533700223710ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(uM 0FG=RP3:E#qC("ڟ9i y0x4! TBA}LkZ݉6G 7(L{P  أoX#bxG @)yxp0—X,X <4i0Hȧ<.m{b4O:a"נJF@zt 7uNxx?,?X.YwIENDB`serve-index-1.9.1/public/icons/page_white_star.png000066400000000000000000000010651316334533700222310ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍKQX?Tpib$Kq.JEMQ .J7dMq)n}7""hq E|5{ofDt0y7瞙;`$R | 97}߿ $#|!: If۶8NnNz Z l6aN, ih(뺠rw l:v#QZJRVon.,;O{74ώA( nurNZ/w8vX:! 8Ovy|<\c /qW,1-`Nc&6Yo4*D#1z N#h!D@B `@'F6~'z*B DF25bd@%|<[SYu(1hp 4M6.V3u]T \ n1| I P35}te}(U\;r̶12Qka& }\Ž^h]cCrkު6eŦTěnePB*z*,H;s=v7m|rx΁ ~P%S!ӂIENDB`serve-index-1.9.1/public/icons/page_white_text.png000066400000000000000000000005261316334533700222450ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT1nSAǞ4A(ISp.KPp"QA7%1Ӣ;+Z######DWk=C?|Xj9昇SekMs9NNVG@kD)4hn.Q@nJ)1]:;1@ T:ti:I$fM-+g]^LvIENDB`serve-index-1.9.1/public/icons/page_white_text_width.png000066400000000000000000000004731316334533700234450ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(υM 0'ZqJ[A=q/ ܺtc+Z[t|I[l?pF\ 5n`˸X(C»˻zoÛV})&vl'Ɖ@Xz{{`aJ8ސwxqˌl43-yK7w0;#v Cx͏ڍO9I Rhoˤ/&wl{u:oѤbuIENDB`serve-index-1.9.1/public/icons/page_white_vector.png000066400000000000000000000012041316334533700225550ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8˅OoQšF.ąw5{;w~ao 1!EBZ W@iպP Q a@0Ϳz|wZȔ:ټ{\I|ׄVVBK3bȶ#qHh4BU2O&Vh@efO9i`P(@4u(hI&ǐy骥R MlUl6ϴf2, Jw-s#7$i1@d`0Ϟ#!ˑ,Z֚-@U kraeSDode0=XzZ,f_G|Zq-3,h!S٫YO$WZlv-`s^5-*f⼙8 p-Bҩ bNL^y/]04q `IENDB`serve-index-1.9.1/public/icons/page_white_visualstudio.png000066400000000000000000000012761316334533700240170ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<PIDAT8ˍoHqǗ8 -7FDhBȔJ0ތeь\zFQ"‘V ^ LbcsMvw]Om~Щ(IQj*"Ac:$If2C9yT,)p*˲y$HD,$A%U<A 0( x\p!>$'ޖ = kneTM,nɒOz 㗏D\d V\o|gܣx$S6YT?@ s7v"nFZch a$D xg%zEL@R²D6,3a{O邠g̹z xxK`/a20AUAxGf5@.y}4N A cV0m +m/{ʊ<Ď!Wǝ>ؚ0T  f`J).]*Pか?? ^~V Z!Z03 ^`!F 7HLgYkAy~eX`=aѶH`V%XyIENDB`serve-index-1.9.1/public/icons/page_white_width.png000066400000000000000000000004651316334533700224020ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(υA0E֕n\xqob♼ Rw(gIu2U5S6VXʲJ6YhlOe<Ƥj56S&5n2 ,be %,r[;zֳ X`<ƐdzB7|!A/n2=VY ro vZdIENDB`serve-index-1.9.1/public/icons/page_white_word.png000066400000000000000000000012131316334533700222260ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT8ˍkQ}ɢ7.ĤScR+SY`+"6_F,]fǽ3Y7Q[̜{cTci`p7UTȅ,˺eY,tii50XUC`,˸~^NG[lH{B7zuNB ACZ(VVV,..y2ȡln !qo?"7L$qڗ]biJED!P\IИ ',hTiJ$Vb{+k]Bh|^p6(9xId_ {,s.Fi$*Zs# `sJr$S1ڃ ™On,q [1Ts?> ,ܨx)} y6>ۘAT5# 3fK!Up4J19Jsq@8#:/nyIENDB`serve-index-1.9.1/public/icons/page_white_world.png000066400000000000000000000013361316334533700224100ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<pIDAT8ˍORaǭ#+/ڢ2+u6SQHeUV"5LKsa ž=)>;}{+PB!B%xV> P*/(kkkd2dx+++$CpB'W3N: Ӌɻz,,H$DXA6V)ZD+ ި`O`<{+:quLI[鐨nW )^}[)GcAt[1مh4$  `FaгKv/jlq{>OIRl=bضdF؀$O?9 q * v~L#:fE|w}@og!qی:>Q!1r+l-<ǘPy͎C*;Ιpz+T@ M?a_p C/zNWfƀ 6wAEܠ c|y5FNԡ2Hw'(AFle7>ųI\H"^LiEn5ۙ`t;'%G ;-?|f'(XtK2,B*t:!.2 èT*pݐ$ @Xl%4B`0EQx`ۑH$`Xx%'#NS'IXVޞIN[CȲh4ʳ*l65M4'v/O!c{+d2FdʇB$M,mߟuD~؊kXyLFD03o/] ]ǧ_Unk0py*tw<~kFUT,m@_"g7J%\_^q9c!6 S4BsY@mZm5rqF OźXIENDB`serve-index-1.9.1/public/icons/page_white_zip.png000066400000000000000000000006021316334533700220560ustar00rootroot00000000000000PNG  IHDR7gAMA7tEXtSoftwareAdobe ImageReadyqe<IDAT(]MJ+"/$BׂQBT)"Vt D*ǦI% $117 tAȎ&鰲Or/7"olܐ_jPCMU5(M_Ǚr L[nIENDB`serve-index-1.9.1/public/icons/page_word.png000066400000000000000000000014111316334533700210260ustar00rootroot00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATMUeιuqIWh"(²l6Ԧ(Eh]dlآEhSZQ34%-glc{9_O^n!HDєk]މ# Co~ 4TGz?+gO[ÑԐ[WgrJ$F4Ψn,kl_~ͯg} CJi""nu2uTɮ=s6mϠE3}ܱ3Ӷ̮sDשmzxֱz/fL9~i0(4WPM,4zMꇕp׮O^J~'9W8}Z3t7;)PFՌl0ݫg.yn|nsTlrb1xɵHwg?? -ynos Ha>чJ&b]% K93ԣtP,/My"`gGi#cZR/me GDA8Hݝ)®:Һ-,f.޺Fe-)(>$Vй*8 *&Œ%V; ٞqHO\s/^シyDCM EVygD@mZ qbwvA(Y9s:TD+SM5.n[hh(KhI;D +I+k6!A@ι;FQx- 1IENDB`serve-index-1.9.1/public/style.css000066400000000000000000000110021316334533700171050ustar00rootroot00000000000000* { margin: 0; padding: 0; outline: 0; } body { padding: 80px 100px; font: 13px "Helvetica Neue", "Lucida Grande", "Arial"; background: #ECE9E9 -webkit-gradient(linear, 0% 0%, 0% 100%, from(#fff), to(#ECE9E9)); background: #ECE9E9 -moz-linear-gradient(top, #fff, #ECE9E9); background-repeat: no-repeat; color: #555; -webkit-font-smoothing: antialiased; } h1, h2, h3 { font-size: 22px; color: #343434; } h1 em, h2 em { padding: 0 5px; font-weight: normal; } h1 { font-size: 60px; } h2 { margin-top: 10px; } h3 { margin: 5px 0 10px 0; padding-bottom: 5px; border-bottom: 1px solid #eee; font-size: 18px; } ul li { list-style: none; } ul li:hover { cursor: pointer; color: #2e2e2e; } ul li .path { padding-left: 5px; font-weight: bold; } ul li .line { padding-right: 5px; font-style: italic; } ul li:first-child .path { padding-left: 0; } p { line-height: 1.5; } a { color: #555; text-decoration: none; } a:hover { color: #303030; } #stacktrace { margin-top: 15px; } .directory h1 { margin-bottom: 15px; font-size: 18px; } ul#files { width: 100%; height: 100%; overflow: hidden; } ul#files li { float: left; width: 30%; line-height: 25px; margin: 1px; } ul#files li a { display: block; height: 25px; border: 1px solid transparent; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; overflow: hidden; white-space: nowrap; } ul#files li a:focus, ul#files li a:hover { background: rgba(255,255,255,0.65); border: 1px solid #ececec; } ul#files li a.highlight { -webkit-transition: background .4s ease-in-out; background: #ffff4f; border-color: #E9DC51; } #search { display: block; position: fixed; top: 20px; right: 20px; width: 90px; -webkit-transition: width ease 0.2s, opacity ease 0.4s; -moz-transition: width ease 0.2s, opacity ease 0.4s; -webkit-border-radius: 32px; -moz-border-radius: 32px; -webkit-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); -moz-box-shadow: inset 0px 0px 3px rgba(0, 0, 0, 0.25), inset 0px 1px 3px rgba(0, 0, 0, 0.7), 0px 1px 0px rgba(255, 255, 255, 0.03); -webkit-font-smoothing: antialiased; text-align: left; font: 13px "Helvetica Neue", Arial, sans-serif; padding: 4px 10px; border: none; background: transparent; margin-bottom: 0; outline: none; opacity: 0.7; color: #888; } #search:focus { width: 120px; opacity: 1.0; } /*views*/ #files span { display: inline-block; overflow: hidden; text-overflow: ellipsis; text-indent: 10px; } #files .name { background-repeat: no-repeat; } #files .icon .name { text-indent: 28px; } /*tiles*/ .view-tiles .name { width: 100%; background-position: 8px 5px; } .view-tiles .size, .view-tiles .date { display: none; } /*details*/ ul#files.view-details li { float: none; display: block; width: 90%; } ul#files.view-details li.header { height: 25px; background: #000; color: #fff; font-weight: bold; } .view-details .header { border-radius: 5px; } .view-details .name { width: 60%; background-position: 8px 5px; } .view-details .size { width: 10%; } .view-details .date { width: 30%; } .view-details .size, .view-details .date { text-align: right; direction: rtl; } /*mobile*/ @media (max-width: 768px) { body { font-size: 13px; line-height: 16px; padding: 0; } #search { position: static; width: 100%; font-size: 2em; line-height: 1.8em; text-indent: 10px; border: 0; border-radius: 0; padding: 10px 0; margin: 0; } #search:focus { width: 100%; border: 0; opacity: 1; } .directory h1 { font-size: 2em; line-height: 1.5em; color: #fff; background: #000; padding: 15px 10px; margin: 0; } ul#files { border-top: 1px solid #cacaca; } ul#files li { float: none; width: auto !important; display: block; border-bottom: 1px solid #cacaca; font-size: 2em; line-height: 1.2em; text-indent: 0; margin: 0; } ul#files li:nth-child(odd) { background: #e0e0e0; } ul#files li a { height: auto; border: 0; border-radius: 0; padding: 15px 10px; } ul#files li a:focus, ul#files li a:hover { border: 0; } #files .header, #files .size, #files .date { display: none !important; } #files .name { float: none; display: inline-block; width: 100%; text-indent: 0; background-position: 0 50%; } #files .icon .name { text-indent: 41px; } } serve-index-1.9.1/test/000077500000000000000000000000001316334533700147425ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/000077500000000000000000000000001316334533700166135ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/#directory/000077500000000000000000000000001316334533700206625ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/#directory/index.html000066400000000000000000000000271316334533700226560ustar00rootroot00000000000000

tobi, loki, jane

serve-index-1.9.1/test/fixtures/.hidden000066400000000000000000000000131316334533700200410ustar00rootroot00000000000000I am hiddenserve-index-1.9.1/test/fixtures/collect/000077500000000000000000000000001316334533700202405ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample000066400000000000000000000000001316334533700214320ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample.jpg000066400000000000000000000000001316334533700222110ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample.mp4000066400000000000000000000000001316334533700221310ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample.pdf000066400000000000000000000000001316334533700222020ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample.qfx000066400000000000000000000000001316334533700222270ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample.rdf000066400000000000000000000000001316334533700222040ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample.txt000066400000000000000000000000001316334533700222500ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/collect/sample.xlsx000066400000000000000000000000001316334533700224270ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/file #1.txt000066400000000000000000000000101316334533700204460ustar00rootroot00000000000000#1 file!serve-index-1.9.1/test/fixtures/foo & bar000066400000000000000000000000031316334533700201450ustar00rootroot00000000000000bazserve-index-1.9.1/test/fixtures/g# %3 o & %2525 %37 dir/000077500000000000000000000000001316334533700212625ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/g# %3 o & %2525 %37 dir/empty.txt000066400000000000000000000000001316334533700231470ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/nums000066400000000000000000000000111316334533700175100ustar00rootroot00000000000000123456789serve-index-1.9.1/test/fixtures/todo.txt000066400000000000000000000000131316334533700203130ustar00rootroot00000000000000- groceriesserve-index-1.9.1/test/fixtures/users/000077500000000000000000000000001316334533700177545ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/users/#dir/000077500000000000000000000000001316334533700205755ustar00rootroot00000000000000serve-index-1.9.1/test/fixtures/users/#dir/tobi.txt000066400000000000000000000000061316334533700222670ustar00rootroot00000000000000ferretserve-index-1.9.1/test/fixtures/users/index.html000066400000000000000000000000271316334533700217500ustar00rootroot00000000000000

tobi, loki, jane

serve-index-1.9.1/test/fixtures/users/tobi.txt000066400000000000000000000000061316334533700214460ustar00rootroot00000000000000ferretserve-index-1.9.1/test/fixtures/さくら.txt000066400000000000000000000000001316334533700223530ustar00rootroot00000000000000serve-index-1.9.1/test/shared/000077500000000000000000000000001316334533700162105ustar00rootroot00000000000000serve-index-1.9.1/test/shared/styles.css000066400000000000000000000000311316334533700202370ustar00rootroot00000000000000body { color: #00ff00; }serve-index-1.9.1/test/shared/template.html000066400000000000000000000004721316334533700207140ustar00rootroot00000000000000 listing directory {directory}

This is the test template

directory {directory}

{linked-path}

{files}
serve-index-1.9.1/test/test.js000066400000000000000000000537041316334533700162700ustar00rootroot00000000000000 var after = require('after'); var assert = require('assert'); var http = require('http'); var fs = require('fs'); var path = require('path'); var request = require('supertest'); var serveIndex = require('..'); var fixtures = path.join(__dirname, '/fixtures'); var relative = path.relative(process.cwd(), fixtures); var skipRelative = ~relative.indexOf('..') || path.resolve(relative) === relative; describe('serveIndex(root)', function () { it('should require root', function () { assert.throws(serveIndex, /root path required/) }) it('should serve text/html without Accept header', function (done) { var server = createServer() request(server) .get('/') .expect('Content-Type', 'text/html; charset=utf-8') .expect(200, done) }) it('should include security header', function (done) { var server = createServer() request(server) .get('/') .expect('X-Content-Type-Options', 'nosniff') .expect(200, done) }) it('should serve a directory index', function (done) { var server = createServer() request(server) .get('/') .expect(200, /todo\.txt/, done) }) it('should work with HEAD requests', function (done) { var server = createServer() request(server) .head('/') .expect(200, '', done) }) it('should work with OPTIONS requests', function (done) { var server = createServer() request(server) .options('/') .expect('Allow', 'GET, HEAD, OPTIONS') .expect(200, done) }) it('should deny POST requests', function (done) { var server = createServer() request(server) .post('/') .expect(405, done) }) it('should deny path will NULL byte', function (done) { var server = createServer() request(server) .get('/%00') .expect(400, done) }) it('should deny path outside root', function (done) { var server = createServer() request(server) .get('/../') .expect(403, done) }) it('should skip non-existent paths', function (done) { var server = createServer() request(server) .get('/bogus') .expect(404, 'Not Found', done) }) it('should treat an ENAMETOOLONG as a 414', function (done) { var path = Array(11000).join('foobar') var server = createServer() request(server) .get('/' + path) .expect(414, done) }) it('should skip non-directories', function (done) { var server = createServer() request(server) .get('/nums') .expect(404, 'Not Found', done) }) describe('when given Accept: header', function () { describe('when Accept: application/json is given', function () { it('should respond with json', function (done) { var server = createServer() request(server) .get('/') .set('Accept', 'application/json') .expect('Content-Type', /json/) .expect(/g# %3 o & %2525 %37 dir/) .expect(/users/) .expect(/file #1\.txt/) .expect(/nums/) .expect(/todo\.txt/) .expect(/さくら\.txt/) .expect(200, done) }); it('should include security header', function (done) { var server = createServer() request(server) .get('/') .set('Accept', 'application/json') .expect('X-Content-Type-Options', 'nosniff') .expect(200, done) }) }); describe('when Accept: text/html is given', function () { it('should respond with html', function (done) { var server = createServer() request(server) .get('/') .set('Accept', 'text/html') .expect(200) .expect('Content-Type', 'text/html; charset=utf-8') .expect(/')[1]; var urls = body.split(/')[1]; var urls = body.split(/