Showing preview only (599K chars total). Download the full file or copy to clipboard to get everything.
Repository: sinedied/hads
Branch: main
Commit: 065b6bb63081
Files: 37
Total size: 578.8 KB
Directory structure:
gitextract_q9w25szj/
├── .github/
│ └── workflows/
│ ├── build.yml
│ └── release.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── bin/
│ └── hads
├── hads.js
├── lib/
│ ├── helpers.js
│ ├── indexer.js
│ ├── matcher.js
│ └── renderer.js
├── package.json
├── public/
│ ├── css/
│ │ ├── github.css
│ │ └── style.css
│ └── js/
│ └── client.js
├── test/
│ ├── .ignored-folder/
│ │ └── ignored-file.md
│ ├── 001-first folder/
│ │ ├── 3 things.md
│ │ ├── index.md
│ │ └── some doc.md
│ ├── 002-cheatsheet.markdown
│ ├── 003_extras.mdown
│ ├── code.js
│ ├── custom.css
│ ├── example-category/
│ │ ├── a-sub-category/
│ │ │ └── yet-another-doc.md
│ │ ├── another-doc.md
│ │ └── some-doc.md
│ ├── folder with spaces/
│ │ └── dummy.md
│ ├── ignore.txt
│ ├── nom_accentué.md
│ └── readme.md
└── views/
├── add.pug
├── edit.pug
├── file.pug
├── footer.pug
├── header.pug
└── layout.pug
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/workflows/build.yml
================================================
name: build
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
strategy:
matrix:
platform: [ubuntu-latest, macos-latest, windows-latest]
node-version: ['10', '>=14']
name: ${{ matrix.platform }} / Node.js v${{ matrix.node-version }}
runs-on: ${{ matrix.platform }}
steps:
- run: git config --global core.autocrlf false # Preserve line endings
- uses: actions/checkout@v2
- uses: actions/setup-node@v1
with:
node-version: ${{ matrix.node-version }}
- name: Install dependencies and test
run: |
npm ci
npm test
env:
CI: true
build_all:
if: always()
runs-on: ubuntu-latest
needs: build
steps:
- name: Check build matrix status
if: ${{ needs.build.result != 'success' }}
run: exit 1
================================================
FILE: .github/workflows/release.yml
================================================
name: release
on:
workflow_dispatch:
repository_dispatch:
types: [release]
jobs:
release:
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false
- uses: actions/setup-node@v1
with:
node-version: 14
- run: npm ci
env:
CI: true
- run: npx semantic-release
if: success()
env:
GITHUB_TOKEN: ${{ secrets.GH_TOKEN }}
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
# Need owner/admin account to bypass branch protection
GIT_COMMITTER_NAME: sinedied
GIT_COMMITTER_EMAIL: noda@free.fr
================================================
FILE: .gitignore
================================================
node_modules/
test/public/
npm-debug.log
.idea/*
!.idea/runConfigurations/
!.idea/codeStyleSettings.xml
.DS_Store
export-test/
================================================
FILE: CHANGELOG.md
================================================
## [3.0.3](https://github.com/sinedied/hads/compare/3.0.2...3.0.3) (2022-05-02)
### Bug Fixes
* display accented characters properly in index (fixes [#73](https://github.com/sinedied/hads/issues/73)) ([8d9c402](https://github.com/sinedied/hads/commit/8d9c402fdb8c2ea27f7eee4f549a3889b3f04fd6))
## [3.0.2](https://github.com/sinedied/hads/compare/3.0.1...3.0.2) (2021-10-15)
## [3.0.1](https://github.com/sinedied/hads/compare/3.0.0...3.0.1) (2021-09-14)
### Bug Fixes
* remove highlight warning ([e9fd47e](https://github.com/sinedied/hads/commit/e9fd47e204aadc54fb4d53a7bdb0e44957ccd8e7))
* use yargs instead of optimist (fixes [#65](https://github.com/sinedied/hads/issues/65)) ([d311d00](https://github.com/sinedied/hads/commit/d311d005d2c20e8fd2cc37cc48ed3f2f56988a06))
# [3.0.0](https://github.com/sinedied/hads/compare/2.1.0...3.0.0) (2021-01-11)
* fix!: update dependencies ([931d23e](https://github.com/sinedied/hads/commit/931d23e0ce46d098f8fb958979176dcaf7d589dd))
### BREAKING CHANGES
* Require Node.js >= 10
# 2.1.0
- Add ordering in [[index]] (#58)
- Fix search links with files containing spaces
- Update dependencies
# 2.0.2
- Update dependencies
- Fix extra \r character on bin file
# 2.0.1
- Fix export links on Windows
- Update dependencies (fix #51)
# 2.0.0
- Add static HTML export option (PR #45) - by @rhucle
- Replace Bluebird and mkdirp with fs-extra
- Update dependencies
- Fix linter issues
### Breaking changes:
- Bump Node.js requirement to `node >= 8`
# 1.7.3
- Fix crashing on highlighting an unsupported language (PR #43) - by @igorskh
- Fix unescaped characters in TOC links
- Update dependencies
# 1.7.2
- Fix install issue with `highlight.js` package (#41)
- Update dependencies
# 1.7.1
- Fix wrong cursor position in editor (PR #33) - by @jamerson
# 1.7.0
- Update dependencies
- Update `marked` renderer to latest version, rendering may be slightly affected
- Fix "Last updated" text on search page
- Replace `open` module to remove critical vulnerability
# 1.6.1
- Update dependencies
# 1.6.0
- Add read-only mode (PR #26) - by @fabala
# 1.5.1
- Add last modified date (PR #25) - by @fabala
# 1.5.0
- Add support for Mermaid config customization
- Add proper HTTP status codes on error
- Update dropzone dependency
# 1.4.1
- Add link opening in a new tab for images (PR #19) - by @fabala
- Fix link inside link
# 1.4.0
- Add support for Font-Awesome icons in Mermaid graphs (PR #13) - by @thomasleveil
- Add custom.css file support (PR #14) - by @thomasleveil
- Bump Node.js requirement to `node >= 6`
- Fix display on mobile devices (#11)
- Remove neutral theme as it's now integrated in Mermaid directly
- Update dependencies
# 1.3.4
- Fix mermaid loop text color (PR #9)
# 1.3.3
- Add filter for files/folders starting with a dot
- Update Github CSS
# 1.3.2
- Add module export to allow server integration and extension
# 1.3.1
- Add new mermaid neutral theme
- Fix issue with dependencies path when installed as a local module
# 1.3.0
- Add support for github-style markdown links (without extension)
# 1.2.2
- Add image file selector button
- Fix line endings on edited documents for unix platforms
- Fix shape rendering for Mermaid graphs
- Fix unwanted file dialog display
- Remove unwanted uploaded file previews
# 1.2.1
- Fix edition of markdown files containing HTML tags
# 1.2.0
- Add [[toc]] table of contents markdown extension
- Add images drag'n drop support to editor
- Add save (CTRL+S/CMD+S) keyboard shortcut to editor
- Mermaid diagram code is now hidden during processing
- Remov specific rendering for images
- Small fixes and performance improvements
# 1.1.2
- Fix issue on Windows
# 1.1.1
- Add print-friendly styling
- Fix issue when no home page was present
# 1.1.0
- Add mermaid syntax support to generate diagrams
- Fix [[index]] in code blocks
- Fix search extracts
# 1.0.1
- Add new markdown files support
- Rename project to "hads"
================================================
FILE: LICENSE
================================================
The MIT License (MIT)
Copyright (c) 2016-2019 Yohan Lasorsa
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.
================================================
FILE: README.md
================================================
# Hey it's Another Documentation Server! (hads)
[](https://www.npmjs.com/package/hads)
[](https://github.com/sinedied/hads/actions)

[](https://github.com/sindresorhus/xo)

[](LICENSE)
### *The master of ~~hell~~ docs*
> **Hads** is a fast Node.js based web server allowing to browse, search and edit documentation written in
[Markdown](http://daringfireball.net/projects/markdown/).

**Features**:
- No configuration needed
- Github-like presentation
- GFM ([Github Flavoured Markdown](https://guides.github.com/features/mastering-markdown/))
- Automatic indexation and search
- In-browser editor
- Table of contents using Markdown extension `[[toc]]`
- Navigation index using Markdown extension `[[index]]`
- Diagrams and flowcharts using [Mermaid](http://knsv.github.io/mermaid/) syntax
- Drag'n drop images
- 100% offline
- Custom CSS style
## Usage
```bash
npm install -g hads
hads -o
```
Your browser will open `http://localhost:4040` and display your project documentation.
### Command-line options
```
Usage: hads [root dir] [options]
Options:
-p, --port Port number to listen on [default: 4040]
-h, --host Host address to bind to [default: "localhost"]
-i, --images-dir Directory to store images [default: "images"]
-o, --open Open default browser on start
-r, --readonly Read-only mode (no add or edit feature)
-e, --export Export static HTML [default: "./public"]
--help Show this help
```
If no root dir is specified, `./` will be used.
## Extras
### Home page
The server will automatically search for a file named `index.md`, `readme.md` or `README.md` on the specified
documentation root and will use it as your home page.
You can customize the CSS style in a file named `custom.css`.
### Table of contents
The special text `[[toc]]` will be replaced by the table of contents of the markdown document, based on headings.
### Navigation index
The special text `[[index]]` will be replaced by the full navigation index of all markdown files found under the
specified *root dir*. File and folder names will be *humanized* for better readability.
It is particularly useful on the home page to provide an overview of the available documentation for your project.
The sorting of each index level is as follows:
1. Any README.md, readme.md, or index.md is always at the top.
2. All files and folders that are prefixed with a number (e.g. `001-abc` and `002 mno` and `003_xyz`) are next, sorted
by their respective prefix numbers. Note that the prefix numbers are stripped out in the index.
3. All remaining files, sorted by their name.
4. All remaining folders, sorted by their name.
### Mermaid Diagrams and flowcharts
You can use the [Mermaid](http://knsv.github.io/mermaid/) syntax to insert diagrams and flowcharts directly in your
markdown, but using code blocks with the `mermaid` language specified, like this:
```mermaid
graph TD;
A-->B;
A-->C;
B-->D;
C-->D;
```
Mermaid [configuration](https://mermaidjs.github.io/mermaidAPI.html) can be overridden on a given page using the global variable `MERMAID_CONFIG` in a `<script>` tag, for example:
```html
<script>
MERMAID_CONFIG = { theme: 'forest' };
</script>
```
## Updates
See changelog [here](CHANGELOG.md)
## Variants
- [hads-plantuml](https://www.npmjs.com/package/hads-plantuml): Adds PlantUML support for diagrams
================================================
FILE: bin/hads
================================================
#!/usr/bin/env node
require('../hads');
================================================
FILE: hads.js
================================================
'use strict';
const fs = require('fs-extra');
const path = require('path');
const express = require('express');
const multer = require('multer');
const shortId = require('shortid');
const moment = require('moment');
const pkg = require('./package.json');
const pug = require('pug');
const globby = require('globby');
const Matcher = require('./lib/matcher.js');
const Renderer = require('./lib/renderer.js');
const Helpers = require('./lib/helpers.js');
const Indexer = require('./lib/indexer.js');
const yargs = require('yargs/yargs')(process.argv.slice(2))
.usage(`\n${pkg.name} ${pkg.version}\nUsage: $0 [root dir] [options]`)
.version(false)
.option('port', {
alias: 'p',
describe: 'Port number to listen on',
default: 4040
})
.option('host', {
alias: 'h',
describe: 'Host address to bind to',
default: 'localhost'
})
.option('images-dir', {
alias: 'i',
describe: 'Directory to store images',
default: 'images'
})
.option('open', {
alias: 'o',
describe: 'Open default browser on start'
})
.option('readonly', {
alias: 'r',
describe: 'Read-only mode (no add or edit feature)'
})
.option('export', {
alias: 'e',
describe: 'Export static html'
})
.help(false) // Needed to avoid extra [boolean] type
.option('help', {describe: 'Show this help'});
const args = yargs.argv;
if (args.help || args._.length > 1) {
yargs.showHelp(console.log);
process.exit();
}
const INDEXES = [
'index.md',
'README.md',
'readme.md'
];
const ICONS = {
alert: 'octicon-alert',
file: 'octicon-file',
search: 'octicon-search',
fileCode: 'octicon-file-code'
};
const STYLESHEET = 'custom.css';
const PATHS = {
documentation: args._[0] || './',
public: path.join(__dirname, 'public'),
views: path.join(__dirname, 'views'),
/* eslint-disable no-return-assign */
get code() {
delete this.code;
return this.code = path.join(this.root, '**', `*.{${Matcher.getCode().join(',')}}`);
},
get customStylesheet() {
delete this.customStylesheet;
return this.customStylesheet = path.join(this.root, STYLESHEET);
},
get export() {
delete this.export;
return this.export = path.join(process.cwd(), args.export === true ? 'public' : args.export);
},
get hads() {
delete this.hads;
return this.hads = path.join(this.export, '_hads');
},
get images() {
delete this.images;
return this.images = path.join(this.root, Helpers.sanitizePath(args.i));
},
get root() {
delete this.root;
return this.root = path.resolve(this.documentation);
}
/* eslint-enable no-return-assign */
};
const SCRIPTS = [
'/ace/ace.js',
'/mermaid/mermaid.min.js',
'/dropzone/dropzone.min.js',
'/js/client.js'
];
const STYLESHEETS = [
'/highlight/github.css',
'/octicons/octicons.css',
'/css/github.css',
'/css/style.css',
'/font-awesome/css/font-awesome.css'
].concat(fs.existsSync(PATHS.customStylesheet) ? [`/${STYLESHEET}`] : []);
const indexer = new Indexer(PATHS.root);
const renderer = new Renderer(indexer, {
isExport: args.export
});
if (args.export) {
args.export = args.export === true ? './public' : args.export;
(async () => {
await fs.emptyDir(PATHS.export);
globby(path.join(PATHS.root, '**', `*.{${Matcher.getImages().join(',')}}`))
.then(images => {
images.map(file => {
const dest = file.replace(PATHS.root, '');
return fs.copy(file, path.join(PATHS.export, dest));
});
});
const [documentation, code] = await Promise.all([
indexer.indexFiles().then(files => files.map(file => file.file)),
globby(PATHS.code).then(paths => paths.map(path => path.replace(PATHS.root, '')))
]);
documentation
.concat(code)
.forEach(async file => {
const dir = path.dirname(file);
const ext = path.extname(file);
const base = path.basename(file, ext);
const src = path.join(PATHS.documentation, file);
const content = Matcher.isMarkdown(file) ?
await renderer.renderFile(src) :
await renderer.renderCode(src);
const template = path.join(PATHS.views, 'file.pug');
const html = pug.renderFile(template, {
content,
pkg,
route: Helpers.extractRoute(file),
icon: ICONS.file,
readonly: true,
scripts: SCRIPTS,
static: true,
styles: STYLESHEETS,
title: path.basename(src)
});
const buffer = Buffer.from(html);
const array = new Uint8Array(buffer);
const dest = path.join(dir, `${base}.html`);
const isIndex = INDEXES.find(filename => filename.startsWith(base));
await fs.mkdirp(path.join(PATHS.export, dir));
fs.writeFile(path.join(PATHS.export, dest), array);
if (isIndex) {
const dest = path.join(dir, 'index.html');
fs.writeFile(path.join(PATHS.export, dest), array);
}
});
// We `await` because we'll get EEXIST if this and the copy to
// the same directory in Helpers.processPackages are unresolved.
await fs.copy(PATHS.public, PATHS.hads);
if (await fs.exists(PATHS.customStylesheet)) {
fs.copy(path.join(PATHS.root, STYLESHEET), path.join(PATHS.hads, STYLESHEET));
}
Helpers.processPackages((alias, path$) => {
const dest = path.join(PATHS.hads, alias);
fs.copy(path$, dest);
});
})();
return;
}
const app = express();
app.set('views', PATHS.views);
app.set('view engine', 'pug');
app.use(express.json());
app.use(express.urlencoded({
extended: true
}));
app.use('/_hads/', express.static(path.join(__dirname, '/public')));
Helpers.processPackages((alias, path$) => {
app.use('/_hads/' + alias + '/', express.static(path$));
});
if (fs.existsSync(PATHS.customStylesheet)) {
app.use(`/_hads/${STYLESHEET}`, express.static(PATHS.customStylesheet));
}
app.get('*', (req, res, next) => {
let route = Helpers.extractRoute(req.path);
const query = req.query || {};
let rootIndex = -1;
let mdIndex = -1;
const create = Helpers.hasQueryOption(query, 'create');
let edit = Helpers.hasQueryOption(query, 'edit') || create;
let statusCode = 200;
let lastModified = '';
let filePath, icon, search, error, title, contentPromise;
function renderPage() {
if (error) {
edit = false;
contentPromise = Promise.resolve(renderer.renderMarkdown(error));
icon = ICONS.alert;
} else if (search) {
contentPromise = renderer.renderSearch(query.search);
icon = ICONS.search;
} else if (Helpers.hasQueryOption(query, 'raw') || Matcher.isImage(filePath)) {
return res.sendFile(filePath);
} else if (Matcher.isMarkdown(filePath)) {
contentPromise = edit ? renderer.renderRaw(filePath) : renderer.renderFile(filePath);
icon = ICONS.file;
} else if (Matcher.isCode(filePath)) {
contentPromise = renderer.renderCode(filePath);
icon = ICONS.fileCode;
}
if (!title) {
title = search ? renderer.searchResults : path.basename(filePath);
}
if (contentPromise) {
return fs.stat(filePath)
.then(stat => {
if (stat.isFile()) {
lastModified = moment(stat.mtime).fromNow();
}
return contentPromise;
})
.then(content => {
res.status(statusCode);
res.render(edit ? 'edit' : 'file', {
title,
lastModified,
readonly: args.readonly,
route,
icon,
search,
content,
styles: STYLESHEETS,
scripts: SCRIPTS,
pkg
});
})
.catch(err => {
console.error(`Error while retrieving file stats: ${err.code}`);
next();
});
}
return next();
}
function tryProcessFile() {
contentPromise = null;
filePath = path.join(PATHS.root, route);
return fs.stat(filePath)
.then(stat => {
search = query.search && query.search.length > 0 ? query.search.trim() : null;
if (stat.isDirectory() && !search && !error) {
if (!create) {
// Try to find a root file
route = path.join(route, INDEXES[++rootIndex]);
return tryProcessFile();
}
route = '/';
title = 'Error';
error = `Cannot create file \`${filePath}\``;
statusCode = 400;
}
return renderPage();
})
.catch(() => {
if (create) {
const fixedRoute = Helpers.ensureMarkdownExtension(route);
if (fixedRoute !== route) {
return res.redirect(fixedRoute + '?create=1');
}
return fs.mkdirp(path.dirname(filePath))
.then(() => fs.writeFile(filePath, ''))
.then(() => indexer.updateIndexForFile(filePath))
.then(tryProcessFile)
.catch(e => {
console.error(e);
title = 'Error';
error = `Cannot create file \`${filePath}\``;
route = '/';
statusCode = 400;
return renderPage();
});
}
if (rootIndex !== -1 && rootIndex < INDEXES.length - 1) {
route = path.join(path.dirname(route), INDEXES[++rootIndex]);
return tryProcessFile();
}
if (rootIndex === -1 && path.basename(route) !== '' && (path.extname(route) === '' || mdIndex > -1) &&
mdIndex < Matcher.MARKDOWN_EXTENSIONS.length - 1) {
// Maybe it's a github-style link without extension, let's try adding one
const extension = Matcher.MARKDOWN_EXTENSIONS[++mdIndex];
route = path.join(path.dirname(route), `${path.basename(route, path.extname(route))}.${extension}`);
return tryProcessFile();
}
if (path.dirname(route) === path.sep && rootIndex === INDEXES.length - 1) {
error = '## No home page (╥﹏╥)\nDo you want to create an [index.md](/index.md?create=1) or ' +
'[readme.md](/readme.md?create=1) file perhaps?';
} else {
error = '## File not found ¯\\\\\\_(◕\\_\\_◕)_/¯\n> *There\'s a glitch in the matrix...*';
}
title = '404 Error';
route = '/';
statusCode = 404;
return renderPage();
});
}
tryProcessFile();
});
if (!args.readonly) {
app.post('*', (req, res, next) => {
const route = Helpers.extractRoute(req.path);
const filePath = path.join(PATHS.root, route);
let lastModified = '';
fs.stat(filePath)
.then(stat => {
let fileContent = req.body.content;
if (stat.isFile() && fileContent) {
lastModified = moment(stat.mtime).fromNow();
if (process.platform !== 'win32') {
// Www-form-urlencoded data always use CRLF line endings, so this is a quick fix
fileContent = fileContent.replace(/\r\n/g, '\n');
}
return fs.writeFile(filePath, fileContent);
}
return null;
})
.then(() => {
indexer.updateIndexForFile(filePath);
return renderer.renderFile(filePath);
})
.then(content => res.render('file', {
title: path.basename(filePath),
lastModified,
readonly: args.readonly,
route,
icon: 'octicon-file',
content,
styles: STYLESHEETS,
scripts: SCRIPTS,
pkg
}))
.catch(() => {
next();
});
});
app.post('/_hads/upload', [multer({
storage: multer.diskStorage({
destination: (req, file, cb) => {
cb(null, PATHS.images);
},
filename: (req, file, cb) => {
fs.mkdirp(PATHS.images).then(() => {
cb(null, shortId.generate() + path.extname(file.originalname));
});
}
}),
onFileUploadStart: file => !file.mimetype.match(/^image\//),
limits: {
fileSize: 1024 * 1024 * 10 // 10 MB
}
}).single('file'), (req, res) => {
res.json(path.sep + path.relative(PATHS.root, req.file.path));
}]);
}
indexer.indexFiles().then(() => {
app.listen(args.port, args.host, () => {
const serverUrl = `http://${args.host}:${args.port}`;
console.log(`${pkg.name} ${pkg.version} serving at ${serverUrl} (press CTRL+C to exit)`);
if (args.open) {
require('open')(serverUrl, {url: true});
}
});
});
module.exports = app;
================================================
FILE: lib/helpers.js
================================================
'use strict';
const path = require('path');
const Matcher = require('./matcher');
class Helpers {
static extractRoute(requestPath) {
return Helpers.sanitizePath(path.normalize(decodeURI(requestPath)));
}
static sanitizePath(path) {
return path.replace(/^(\.\.[/\\])+/, '');
}
static hasQueryOption(query, option) {
return query[option] && JSON.parse(query[option]);
}
static processPackages(callback) {
return Object.entries({
highlight: ['highlight.js', 'styles'],
octicons: ['octicons', 'build/font'],
'font-awesome': ['font-awesome', ''],
ace: ['ace-builds', 'src-min'],
mermaid: ['mermaid', 'dist'],
dropzone: ['dropzone', 'dist/min']
}).map(([alias, [pkg, sub]]) => {
const one = require.resolve(`${pkg}/package.json`);
const two = path.dirname(one);
const three = path.join(two, sub);
return callback(alias, three);
});
}
static ensureMarkdownExtension(file) {
if (file.endsWith(path.sep)) {
file = file.slice(0, -1);
}
if (!Matcher.isMarkdown(file)) {
file += '.md';
}
return file;
}
static async readCode() {
return Matcher.getCode();
}
}
module.exports = Helpers;
================================================
FILE: lib/indexer.js
================================================
'use strict';
const {
promisify
} = require('util');
const path = require('path');
const fs = require('fs-extra');
const recReadDir = promisify(require('recursive-readdir'));
const elasticlunr = require('elasticlunr');
const Matcher = require('./matcher');
const EXCLUSIONS = ['node_modules'];
class Indexer {
constructor(basePath) {
this.basePath = basePath;
this.index = elasticlunr(function () {
this.setRef('file');
this.addField('filename');
this.addField('content');
});
this.files = [];
}
indexFiles() {
return recReadDir(this.basePath, EXCLUSIONS).then(files => {
files = files.filter(file => Matcher.isMarkdown(file));
files = files.filter(file => {
// Filter files/folder starting with a "."
file = path.relative(this.basePath, file);
const pathComponents = file.split(path.sep);
return !pathComponents.some(c => c.length && c[0] === '.');
});
return Promise.all(files.map(this.updateIndexForFile.bind(this)));
});
}
updateIndexForFile(file) {
const filePath = path.relative(this.basePath, file);
this.files.push(filePath);
return fs.readFile(path.join(this.basePath, filePath), 'utf8')
.then(content => {
const doc = {
file: filePath,
filename: path.basename(filePath, path.extname(filePath)),
content
};
this.index[this.index.documentStore.hasDoc(filePath) ? 'updateDoc' : 'addDoc'](doc);
return doc;
});
}
getContent(file) {
return this.index.documentStore.getDoc(file).content;
}
getFiles() {
return this.files;
}
search(string) {
return this.index.search(string, {
expand: true
});
}
}
module.exports = Indexer;
================================================
FILE: lib/matcher.js
================================================
'use strict';
const path = require('path');
const _ = require('lodash');
const MARKDOWN_EXTENSIONS = ['md', 'mkdn', 'mdown', 'markdown'];
const IMAGES_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'];
const CODE_EXTENSIONS = [
'js',
'json',
'ts',
'coffee',
'css',
'scss',
'sass',
'less',
'stylus',
'html',
'jade',
'pug',
'sh',
'txt'
];
class Matcher {
static isMarkdown(file) {
return Matcher.hasExtension(file, MARKDOWN_EXTENSIONS);
}
static isImage(file) {
return Matcher.hasExtension(file, IMAGES_EXTENSIONS);
}
static getImages() {
return IMAGES_EXTENSIONS;
}
static isCode(file) {
return Matcher.hasExtension(file, CODE_EXTENSIONS);
}
static getCode() {
return CODE_EXTENSIONS;
}
static hasExtension(file, extensions) {
return _.includes(extensions, path.extname(file).replace('.', ''));
}
}
Matcher.MARKDOWN_EXTENSIONS = MARKDOWN_EXTENSIONS;
module.exports = Matcher;
================================================
FILE: lib/renderer.js
================================================
'use strict';
const path = require('path');
const fs = require('fs-extra');
const normalizePath = require('normalize-path');
const {marked} = require('marked');
const {highlight} = require('highlight.js');
const removeMd = require('remove-markdown');
const humanize = require('humanize-string');
const SEARCH_EXTRACT_LENGTH = 400;
const SEARCH_RESULTS_MAX = 10;
const ROOT_FILES_INDEX = {
'index.md': true,
'README.md': true,
'readme.md': true
};
const NUMBER_SEPARATORS = /[-_]/g;
class Renderer {
constructor(indexer, options) {
this.indexer = indexer;
this.searchResults = null;
this.options = options;
}
renderRaw(file) {
return fs.readFile(file, 'utf8');
}
renderFile(file) {
return this.renderRaw(file).then(content => this.renderMarkdown(content));
}
renderCode(file) {
const lang = path.extname(file).replace('.', '');
return this.renderRaw(file).then(content => this.renderMarkdown(`\`\`\`${lang}\n${content}\n\`\`\``));
}
renderSearch(search) {
const results = this.indexer.search(search);
const total = results.length;
let content = total ? '' : 'No results.';
this.searchResults = 'Search results (';
if (total > SEARCH_RESULTS_MAX) {
results.splice(SEARCH_RESULTS_MAX);
this.searchResults += `first ${SEARCH_RESULTS_MAX} of `;
}
this.searchResults += `${total})`;
results.forEach(result => {
let extract = removeMd(this.indexer.getContent(result.ref));
extract = extract.replace(/\s/g, ' ').replace(/`/g, '');
extract = extract.replace(/\[\[index]]/g, '[[index]]');
if (extract.length > SEARCH_EXTRACT_LENGTH) {
extract = extract.substr(0, SEARCH_EXTRACT_LENGTH) + ' [...]';
}
content += `[${result.ref}](${Renderer.encodeFileLink(result.ref)})\n> ${extract}\n\n`;
});
return Promise.resolve(this.renderMarkdown(content));
}
renderIndex() {
const files = this.indexer.getFiles();
const nav = {};
files.forEach(file => {
file = normalizePath(file);
const dir = path.dirname(file);
const components = dir.split(path.sep);
const name = path.basename(file);
let parent = nav;
if (components[0] === '.') {
components.splice(0, 1);
}
components.forEach(component => {
const current = parent[component] || {};
parent[component] = current;
parent = current;
});
parent[name] = file;
});
const content = Renderer.renderIndexLevel(nav, 0);
return this.renderMarkdown(content);
}
renderTableOfContents(content) {
let toc = '';
const renderer = new marked.Renderer();
renderer.heading = (text, level, raw) => {
text = Renderer.removeLinks(text);
const slug = raw.toLowerCase().replace(/[^\w]+/g, '-');
toc += ' '.repeat(level) + `- [${text}](#${slug})\n`;
};
marked(content, {
renderer
});
return this.renderMarkdown(toc);
}
renderMarkdown(content) {
const renderer = new marked.Renderer();
renderer.code = (code, language) => {
if (language === 'mermaid') {
return `<p class="mermaid">${code}</p>`;
}
return marked.Renderer.prototype.code.call(renderer, code, language);
};
renderer.paragraph = text => {
text = text.replace(/^\[\[toc]]/img, () => this.renderTableOfContents(content));
text = text.replace(/^\[\[index]]/img, () => this.renderIndex());
return marked.Renderer.prototype.paragraph.call(renderer, text);
};
renderer.link = (href, title, text) => {
text = Renderer.removeLinks(text);
href = Renderer.formatHref(href, this.options.isExport);
return marked.Renderer.prototype.link.call(renderer, href, title, text);
};
renderer.image = (href, title, text) => {
let out = marked.Renderer.prototype.image.call(renderer, href, title, text);
out = `<a href="${href}" target="_new">${out}</a>`;
return out;
};
return marked(content, {
renderer,
gfm: true,
smartLists: true,
breaks: false,
smartypants: true,
highlight: (code, language) => {
try {
code = language && language !== 'no-highlight' ?
highlight(code, {language, ignoreIllegals: true}).value : code;
} catch (_) {
console.error(`Unsupported language for highlighting: ${language}`);
}
return code;
}
});
}
static removeLinks(text) {
return text.replace(/<a\b[^>]*>/gi, '')
.replace(/<\/a>/gi, '');
}
static formatHref(href, isExport) {
const isExternal = !href.startsWith('/') && path.dirname(href) !== '.';
const isHash = href.startsWith('#');
if (!isExport || isExternal || isHash) {
return href;
}
const ext = path.extname(href);
const dir = path.dirname(href);
const base = path.basename(href, ext);
return normalizePath(path.join(dir, `${base}.html`));
}
static renderIndexLevel(index, level) {
let content = '';
const indent = ' '.repeat(level);
const keys = Object.keys(index).sort((a, b) => {
const aType = typeof index[a];
const bType = typeof index[b];
const aNumPrefix = Renderer.getNumberPrefix(a);
const bNumPrefix = Renderer.getNumberPrefix(b);
if (ROOT_FILES_INDEX[a]) {
return -1;
}
if (ROOT_FILES_INDEX[b]) {
return 1;
}
if (Number.isFinite(aNumPrefix) && Number.isFinite(bNumPrefix)) {
return aNumPrefix - bNumPrefix;
}
if (Number.isFinite(aNumPrefix)) {
return -1;
}
if (Number.isFinite(bNumPrefix)) {
return 1;
}
if (aType === bType) {
return a.localeCompare(b);
}
if (aType === 'string') {
// Display files before folders
return -1;
}
return 1;
});
keys.forEach(key => {
// Only render index files at level 0,
// they're linked to the folder name for index > 0
if (ROOT_FILES_INDEX[key] && level > 0) {
return;
}
const value = index[key];
content += indent;
if (typeof value === 'string') {
const link = Renderer.encodeFileLink(value);
key = path.basename(key, path.extname(key));
content += `- [${humanize(Renderer.trimNumberPrefix(key))}](/${link})\n`;
} else {
const valueKeys = Object.keys(value);
const indexFile = valueKeys.find(key => ROOT_FILES_INDEX[key]);
if (indexFile) {
const indexFilePath = value[indexFile];
const link = Renderer.encodeFileLink(indexFilePath);
content += `- [${humanize(Renderer.trimNumberPrefix(key))}](/${link})\n`;
} else {
content += `- ${humanize(Renderer.trimNumberPrefix(key))}\n`;
}
content += Renderer.renderIndexLevel(value, level + 1);
}
});
return content;
}
static encodeFileLink(link) {
return link.split('/')
.map(part => encodeURIComponent(part))
.join('/');
}
/**
* Removes the numbered prefix like the 000 in 000-xyz.
*
* @param key
*/
static trimNumberPrefix(key) {
const split = key.split(NUMBER_SEPARATORS);
if (split && split.length > 1) { // First item is a number prefix, second+ item is the name.
const num = parseInt(split[0], 10);
if (Number.isFinite(num)) {
return key.substring(key.indexOf(split[1]));
}
}
return key;
}
/**
* Whether the key has a number prefix like 000-xyz.
*
* @param key
* @returns {number}
*/
static getNumberPrefix(key) {
const split = key.split(NUMBER_SEPARATORS);
if (split && split.length > 1) { // First item is a number prefix, second+ item is the name.
const num = parseInt(split[0], 10);
if (Number.isFinite(num)) {
return num;
}
}
return NaN;
}
}
module.exports = Renderer;
================================================
FILE: package.json
================================================
{
"name": "hads",
"version": "3.0.3",
"description": "Fast web server allowing to browse, search and edit project documentation written in Markdown",
"repository": {
"type": "git",
"url": "https://github.com/sinedied/hads.git"
},
"keywords": [
"markdown",
"gfm",
"server",
"local",
"offline",
"search",
"edit",
"doc",
"documentation",
"knowledgebase",
"wiki",
"search",
"mermaid",
"nodejs"
],
"author": {
"name": "Yohan Lasorsa",
"url": "https://twitter.com/sinedied"
},
"license": "MIT",
"homepage": "https://github.com/sinedied/hads",
"bugs": {
"url": "https://github.com/sinedied/hads/issues"
},
"main": "hads.js",
"scripts": {
"start": "node hads.js ./test -o",
"export": "node hads.js ./test -e export-test && npx http-server export-test",
"test": "eslint *.js lib/*.js",
"release:check": "semantic-release --dry-run"
},
"bin": {
"hads": "./bin/hads"
},
"engines": {
"node": ">=12.0.0"
},
"dependencies": {
"ace-builds": "^1.4.11",
"dropzone": "^5.7.0",
"elasticlunr": "^0.9.5",
"express": "^4.17.1",
"font-awesome": "^4.7.0",
"fs-extra": "^10.0.0",
"globby": "^11.0.0",
"highlight.js": "^11.2.0",
"humanize-string": "^2.1.0",
"lodash": "^4.17.15",
"marked": "^4.0.15",
"mermaid": "^9.0.1",
"moment": "^2.24.0",
"multer": "^1.4.2",
"normalize-path": "^3.0.0",
"octicons": "^4.4.0",
"open": "^8.2.1",
"pug": "^3.0.0",
"recursive-readdir": "^2.2.2",
"remove-markdown": "^0.5.0",
"shortid": "^2.2.15",
"yargs": "^17.1.1"
},
"devDependencies": {
"eslint": "^7.32.0",
"eslint-config-xo-space": "^0.24.0",
"semantic-release": "^19.0.2",
"semantic-release-npm-github": "^3.0.0"
},
"eslintConfig": {
"extends": "xo-space/esnext",
"parserOptions": {
"sourceType": "script"
},
"rules": {
"no-multi-spaces": [
"error",
{
"ignoreEOLComments": true
}
],
"one-var": [
"error",
{
"initialized": "never"
}
]
}
},
"release": {
"extends": "semantic-release-npm-github",
"branches": "main"
},
"files": [
"hads.js",
"bin",
"lib",
"public",
"views"
]
}
================================================
FILE: public/css/github.css
================================================
/*!
* GitHub Light v0.3.0
* Copyright (c) 2012 - 2016 GitHub, Inc.
* Licensed under MIT (https://github.com/primer/github-syntax-theme-generator/blob/master/LICENSE)
*/.pl-c{color:#969896}.pl-c1,.pl-s .pl-v{color:#0086b3}.pl-e,.pl-en{color:#795da3}.pl-smi,.pl-s .pl-s1{color:#333}.pl-ent{color:#63a35c}.pl-k{color:#a71d5d}.pl-s,.pl-pds,.pl-s .pl-pse .pl-s1,.pl-sr,.pl-sr .pl-cce,.pl-sr .pl-sre,.pl-sr .pl-sra{color:#183691}.pl-v,.pl-smw{color:#ed6a43}.pl-bu{color:#b52a1d}.pl-ii{color:#f8f8f8;background-color:#b52a1d}.pl-c2{color:#f8f8f8;background-color:#b52a1d}.pl-c2::before{content:"^M"}.pl-sr .pl-cce{font-weight:bold;color:#63a35c}.pl-ml{color:#693a17}.pl-mh,.pl-mh .pl-en,.pl-ms{font-weight:bold;color:#1d3e81}.pl-mq{color:#008080}.pl-mi{font-style:italic;color:#333}.pl-mb{font-weight:bold;color:#333}.pl-md{color:#bd2c00;background-color:#ffecec}.pl-mi1{color:#55a532;background-color:#eaffea}.pl-mc{color:#ef9700;background-color:#ffe3b4}.pl-mi2{color:#d8d8d8;background-color:#808080}.pl-mdr{font-weight:bold;color:#795da3}.pl-mo{color:#1d3e81}.pl-ba{color:#595e62}.pl-sg{color:#c0c0c0}.pl-corl{text-decoration:underline;color:#183691}.CodeMirror{font-family:monospace;height:300px;color:black}.CodeMirror-lines{padding:4px 0}.CodeMirror pre{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0 !important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-webkit-keyframes blink{0%{}50%{background-color:transparent}100%{}}@keyframes blink{0%{}50%{background-color:transparent}100%{}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:-20px;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:#f00}.cm-invalidchar{color:#f00}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0f0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#f22}.CodeMirror-matchingtag{background:rgba(255,150,0,0.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:none;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none !important;border:none !important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre{border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:none;font-variant-ligatures:none}.CodeMirror-wrap pre{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;overflow:auto}.CodeMirror-code{outline:none}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background:#ffa;background:rgba(255,255,0,0.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:none}.CodeMirror-dialog{position:absolute;left:0;right:0;background:inherit;z-index:15;padding:.1em .8em;overflow:hidden;color:inherit}.CodeMirror-dialog-top{border-bottom:1px solid #eee;top:0}.CodeMirror-dialog-bottom{border-top:1px solid #eee;bottom:0}.CodeMirror-dialog input{border:none;outline:none;background:transparent;width:20em;color:inherit;font-family:monospace}.CodeMirror-dialog button{font-size:70%}.CodeMirror-merge{position:relative;border:1px solid #ddd;white-space:pre}.CodeMirror-merge,.CodeMirror-merge .CodeMirror{height:350px}.CodeMirror-merge-2pane .CodeMirror-merge-pane{width:47%}.CodeMirror-merge-2pane .CodeMirror-merge-gap{width:6%}.CodeMirror-merge-3pane .CodeMirror-merge-pane{width:31%}.CodeMirror-merge-3pane .CodeMirror-merge-gap{width:3.5%}.CodeMirror-merge-pane{display:inline-block;white-space:normal;vertical-align:top}.CodeMirror-merge-pane-rightmost{position:absolute;right:0px;z-index:1}.CodeMirror-merge-gap{z-index:2;display:inline-block;height:100%;box-sizing:border-box;overflow:hidden;border-left:1px solid #ddd;border-right:1px solid #ddd;position:relative;background:#f8f8f8}.CodeMirror-merge-scrolllock-wrap{position:absolute;bottom:0;left:50%}.CodeMirror-merge-scrolllock{position:relative;left:-50%;cursor:pointer;color:#555;line-height:1}.CodeMirror-merge-copybuttons-left,.CodeMirror-merge-copybuttons-right{position:absolute;left:0;top:0;right:0;bottom:0;line-height:1}.CodeMirror-merge-copy{position:absolute;cursor:pointer;color:#44c;z-index:3}.CodeMirror-merge-copy-reverse{position:absolute;cursor:pointer;color:#44c}.CodeMirror-merge-copybuttons-left .CodeMirror-merge-copy{left:2px}.CodeMirror-merge-copybuttons-right .CodeMirror-merge-copy{right:2px}.CodeMirror-merge-r-inserted,.CodeMirror-merge-l-inserted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12MwuCXy3+CWyH8GBgYGJgYkAABZbAQ9ELXurwAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.CodeMirror-merge-r-deleted,.CodeMirror-merge-l-deleted{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAACCAYAAACddGYaAAAAGUlEQVQI12M4Kyb2/6yY2H8GBgYGJgYkAABURgPz6Ks7wQAAAABJRU5ErkJggg==);background-position:bottom left;background-repeat:repeat-x}.CodeMirror-merge-r-chunk{background:#ffffe0}.CodeMirror-merge-r-chunk-start{border-top:1px solid #ee8}.CodeMirror-merge-r-chunk-end{border-bottom:1px solid #ee8}.CodeMirror-merge-r-connect{fill:#ffffe0;stroke:#ee8;stroke-width:1px}.CodeMirror-merge-l-chunk{background:#eef}.CodeMirror-merge-l-chunk-start{border-top:1px solid #88e}.CodeMirror-merge-l-chunk-end{border-bottom:1px solid #88e}.CodeMirror-merge-l-connect{fill:#eef;stroke:#88e;stroke-width:1px}.CodeMirror-merge-l-chunk.CodeMirror-merge-r-chunk{background:#dfd}.CodeMirror-merge-l-chunk-start.CodeMirror-merge-r-chunk-start{border-top:1px solid #4e4}.CodeMirror-merge-l-chunk-end.CodeMirror-merge-r-chunk-end{border-bottom:1px solid #4e4}.CodeMirror-merge-collapsed-widget:before{content:"(...)"}.CodeMirror-merge-collapsed-widget{cursor:pointer;color:#88b;background:#eef;border:1px solid #ddf;font-size:90%;padding:0 3px;border-radius:4px}.CodeMirror-merge-collapsed-line .CodeMirror-gutter-elt{display:none}.octicon{display:inline-block;vertical-align:text-top;fill:currentColor}body.chrome-mouse button:focus{outline:none}.CodeMirror{height:calc(100vh - 1px)}.file-editor-textarea{width:100%;padding:5px 4px;font:12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;resize:vertical;border:0;border-radius:0;outline:none}.container-preview .tabnav-tabs{margin:-6px 0 -6px -11px}.container-preview .tabnav-tabs .tabnav-tab{padding:12px 15px;border-radius:0}.container-preview .tabnav-tabs>.selected:first-child{border-top-left-radius:3px}.container-preview .tabnav-tabs .selected{font-weight:600}.container-preview.show-code .commit-create,.container-preview.show-code .actions{display:block}.container-preview.show-code .commit-preview,.container-preview.show-code .loading-preview-msg,.container-preview.show-code .no-changes-preview-msg,.container-preview.show-code .error-preview-msg{display:none}.container-preview:not(.show-code) .commit-create,.container-preview:not(.show-code) .actions{display:none}.container-preview.loading-preview .loading-preview-msg{display:block}.container-preview.loading-preview .no-changes-preview-msg,.container-preview.loading-preview .error-preview-msg,.container-preview.loading-preview .commit-preview{display:none}.container-preview.show-preview .commit-preview{display:block}.container-preview.show-preview .loading-preview-msg,.container-preview.show-preview .no-changes-preview-msg,.container-preview.show-preview .error-preview-msg{display:none}.container-preview.no-changes-preview .no-changes-preview-msg{display:block}.container-preview.no-changes-preview .loading-preview-msg,.container-preview.no-changes-preview .error-preview-msg,.container-preview.no-changes-preview .commit-preview{display:none}.container-preview.error-preview .error-preview-msg{display:block}.container-preview.error-preview .loading-preview-msg,.container-preview.error-preview .no-changes-preview-msg,.container-preview.error-preview .commit-preview{display:none}.container-preview p.preview-msg{padding:30px;font-size:16px}.cm-s-github{font-family:inherit}.cm-s-github .CodeMirror-lines{font-family:Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px;line-height:18px;background:#fff}.cm-s-github .CodeMirror-gutters{background:#fff;border-right-width:0}.cm-s-github .CodeMirror-gutter-background{border-right:1px solid #ddd}.cm-s-github .CodeMirror-linenumber{padding:0 13px 0 19px}.cm-s-github .CodeMirror-cursor{color:#000}.cm-s-github .CodeMirror-activeline-background{background:#f5f5f5 !important}.cm-s-github .CodeMirror-selected{background:#c8c8fa}.cm-s-github .cm-comment{color:#969896}.cm-s-github .cm-string{color:#183691}.cm-s-github .cm-string-2{color:#0086b3}.cm-s-github .cm-tag{color:#63a35c}.cm-s-github .cm-keyword{color:#a71d5d}.cm-s-github .cm-error,.cm-s-github .cm-invalidchar{font-style:italic;font-weight:600;color:#d73a49;text-decoration:underline}.cm-s-github .cm-conflict-marker{font-style:normal !important;font-weight:normal !important;color:#d73a49 !important;text-decoration:none !important}.cm-s-github .CodeMirror-linebackground.conflict-background{background-color:#fffbdd}.cm-s-github .cm-variable{color:#ed6a43}.cm-s-github .cm-variable-2{color:#795da3}.CodeMirror-merge-header{height:30px}.CodeMirror-merge-header .CodeMirror-merge-pane{height:30px;line-height:30px}.cm-s-github .merge-gutter{width:14px}.conflict-background+.CodeMirror-gutter-wrapper .CodeMirror-linenumber{background-color:#fffbdd}.conflict-gutter-marker{background-color:#fffbdd}.conflict-gutter-marker::after,.conflict-gutter-marker::before{position:absolute;left:-1px;content:"";background-color:#d73a49}.conflict-gutter-marker-start::after,.conflict-gutter-marker-end::after{width:1px;height:10px}.conflict-gutter-marker-start::before,.conflict-gutter-marker-middle::before,.conflict-gutter-marker-end::before{width:10px;height:1px}.conflict-gutter-marker-start::after{bottom:0}.conflict-gutter-marker-end::after{top:0}.conflict-gutter-marker-start::before{top:7px}.conflict-gutter-marker-end::before{bottom:7px}.conflict-gutter-marker-line::after,.conflict-gutter-marker-middle::after{width:1px;height:18px}.conflict-gutter-marker-middle::before{top:9px}.date-selector{z-index:9;display:none;width:225px;text-align:left;text-decoration:none}.date-selector .month-nav,.date-selector .year-nav{position:relative;display:block;padding:0;margin-top:5px;margin-bottom:5px;line-height:20px;text-align:center}.date-selector .month-nav{float:left;width:55%}.date-selector .year-nav{float:right;width:35%}.date-selector .date-button{position:absolute;top:0;width:18px;height:18px;padding:4px;font-size:12px;line-height:12px;color:#0366d6;cursor:pointer}.date-selector .prev{left:0}.date-selector .next{right:0}.date-selector table{width:100%;clear:both}.date-selector tr{font-size:0}.date-selector th,.date-selector td{display:inline-block;width:32px;height:32px;padding:0;margin-top:-1px;margin-left:-1px;font-size:12px;font-weight:normal;line-height:28px;text-align:center}.date-selector td{color:#0366d6;cursor:default;background:#fff;border:1px solid #ccc}.date-selector td.today{background:#eee}.date-selector td.selected,.date-selector td.selectable-day:hover{position:relative;z-index:10;color:#fff;cursor:pointer;background:#0366d6;border-color:#024ea4}.date-selector td.unselected-month{color:#ccc}.jcrop-holder{text-align:left;direction:ltr;touch-action:none}.jcrop-vline,.jcrop-hline{position:absolute;font-size:0;background:#fff url("/images/spinners/Jcrop.gif")}.jcrop-vline{width:1px !important;height:100%}.jcrop-vline.right{right:0}.jcrop-hline{width:100%;height:1px !important}.jcrop-hline.bottom{bottom:0}.jcrop-tracker{width:100%;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-tap-highlight-color:transparent;-webkit-touch-callout:none}.jcrop-handle{width:7px;height:7px;font-size:1px;background-color:#333;border:1px #eee solid}.jcrop-handle.ord-n{top:0;left:50%;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-s{bottom:0;left:50%;margin-bottom:-4px;margin-left:-4px}.jcrop-handle.ord-e{top:50%;right:0;margin-top:-4px;margin-right:-4px}.jcrop-handle.ord-w{top:50%;left:0;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-nw{top:0;left:0;margin-top:-4px;margin-left:-4px}.jcrop-handle.ord-ne{top:0;right:0;margin-top:-4px;margin-right:-4px}.jcrop-handle.ord-se{right:0;bottom:0;margin-right:-4px;margin-bottom:-4px}.jcrop-handle.ord-sw{bottom:0;left:0;margin-bottom:-4px;margin-left:-4px}.jcrop-dragbar.ord-n,.jcrop-dragbar.ord-s{width:100%;height:7px}.jcrop-dragbar.ord-e,.jcrop-dragbar.ord-w{width:7px;height:100%}.jcrop-dragbar.ord-n{margin-top:-4px}.jcrop-dragbar.ord-s{bottom:0;margin-bottom:-4px}.jcrop-dragbar.ord-e{right:0;margin-right:-4px}.jcrop-dragbar.ord-w{margin-left:-4px}.jcrop-light .jcrop-vline,.jcrop-light .jcrop-hline{background:#fff;opacity:0.7 !important}.jcrop-light .jcrop-handle{background-color:#000;border-color:#fff;border-radius:3px}.jcrop-dark .jcrop-vline,.jcrop-dark .jcrop-hline{background:#000;opacity:0.7 !important}.jcrop-dark .jcrop-handle{background-color:#fff;border-color:#000;border-radius:3px}.jcrop-holder img,img.jcrop-preview{max-width:none}.user-select-contain{-ms-user-select:element;-webkit-user-select:contain;-moz-user-select:contain;user-select:contain}.zeroclipboard-link{padding:0;margin:0;color:#0366d6;cursor:pointer;background:none;border:0}.zeroclipboard-link .octicon{display:block}/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}template,[hidden]{display:none}a{background-color:transparent;-webkit-text-decoration-skip:objects}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit}b,strong{font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-0.25em}sup{top:-0.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,select,textarea{font:inherit;margin:0}optgroup{font-weight:bold}button,input{overflow:visible}button,select{text-transform:none}button,html [type="button"],[type="reset"],[type="submit"]{-webkit-appearance:button}button::-moz-focus-inner,[type="button"]::-moz-focus-inner,[type="reset"]::-moz-focus-inner,[type="submit"]::-moz-focus-inner{border-style:none;padding:0}button:-moz-focusring,[type="button"]:-moz-focusring,[type="reset"]:-moz-focusring,[type="submit"]:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type="checkbox"],[type="radio"]{box-sizing:border-box;padding:0}[type="number"]::-webkit-inner-spin-button,[type="number"]::-webkit-outer-spin-button{height:auto}[type="search"]{-webkit-appearance:textfield;outline-offset:-2px}[type="search"]::-webkit-search-cancel-button,[type="search"]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:0.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}*{box-sizing:border-box}input,select,textarea,button{font-family:inherit;font-size:inherit;line-height:inherit}body{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-size:14px;line-height:1.5;color:#24292e;background-color:#fff}a{color:#0366d6;text-decoration:none}a:hover{text-decoration:underline}strong{font-weight:600}hr,.rule{height:0;margin:15px 0;overflow:hidden;background:transparent;border:0;border-bottom:1px solid #dfe2e5}hr::before,.rule::before{display:table;content:""}hr::after,.rule::after{display:table;clear:both;content:""}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}button{cursor:pointer}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:0}h1{font-size:32px;font-weight:600}h2{font-size:24px;font-weight:600}h3{font-size:20px;font-weight:600}h4{font-size:16px;font-weight:600}h5{font-size:14px;font-weight:600}h6{font-size:12px;font-weight:600}p{margin-top:0;margin-bottom:10px}small{font-size:90%}blockquote{margin:0}ul,ol{padding-left:0;margin-top:0;margin-bottom:0}ol ol,ul ol{list-style-type:lower-roman}ul ul ol,ul ol ol,ol ul ol,ol ol ol{list-style-type:lower-alpha}dd{margin-left:0}tt,code{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px}pre{margin-top:0;margin-bottom:0;font:12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace}.octicon{vertical-align:text-bottom}.Box{background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.Box--condensed{line-height:1.25}.Box--condensed .Box-header{padding:8px 16px}.Box--condensed .Box-body{padding:8px 16px}.Box--condensed .Box-footer{padding:8px 16px}.Box--condensed .Box-btn-octicon.btn-octicon{padding:8px 16px;margin:-8px -16px;line-height:1.25}.Box--condensed .Box-row{padding:8px 16px}.Box--spacious .Box-header{padding:24px;line-height:1.25}.Box--spacious .Box-title{font-size:20px}.Box--spacious .Box-body{padding:24px}.Box--spacious .Box-footer{padding:24px}.Box--spacious .Box-btn-octicon.btn-octicon{padding:24px;margin:-24px -24px}.Box--spacious .Box-row{padding:24px}.Box-header{padding:16px;margin:-1px -1px 0 -1px;background-color:#f6f8fa;border-color:#d1d5da;border-style:solid;border-width:1px;border-top-left-radius:3px;border-top-right-radius:3px}.Box-title{font-size:14px;font-weight:600}.Box-body{padding:16px;border-bottom:1px solid #e1e4e8}.Box-body:last-of-type{margin-bottom:-1px;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.Box-row{padding:16px;margin-top:-1px;list-style-type:none;border-top:1px solid #e1e4e8}.Box-row:first-of-type{border-top-color:transparent;border-top-left-radius:2px;border-top-right-radius:2px}.Box-row:last-of-type{border-bottom-right-radius:2px;border-bottom-left-radius:2px}.Box-row.Box-row--unread,.Box-row.unread{box-shadow:2px 0 0 #0366d6 inset}.Box-row.navigation-focus .Box-row--drag-button{color:#0366d6;cursor:-webkit-grab;cursor:grab;opacity:100}.Box-row.navigation-focus.is-dragging .Box-row--drag-button{cursor:-webkit-grabbing;cursor:grabbing}.Box-row.navigation-focus.sortable-chosen{background-color:#fafbfc}.Box-row.navigation-focus.sortable-ghost{background-color:#f6f8fa}.Box-row.navigation-focus.sortable-ghost .Box-row--drag-hide{opacity:0}.Box-row--focus-gray.navigation-focus{background-color:#f6f8fa}.Box-row--focus-blue.navigation-focus{background-color:#f1f8ff}.Box-row--hover-gray:hover{background-color:#f6f8fa}.Box-row--hover-blue:hover{background-color:#f1f8ff}@media (min-width: 768px){.Box-row-link{color:#24292e;text-decoration:none}.Box-row-link:hover{color:#0366d6;text-decoration:none}}.Box-row--drag-button{opacity:0}.Box-footer{padding:16px;margin-top:-1px;border-top:1px solid #e1e4e8}.Box--scrollable{max-height:324px;overflow:scroll}.Box--blue{border-color:#c8e1ff}.Box--blue .Box-header{background-color:#f1f8ff;border-color:#c8e1ff}.Box--blue .Box-body{border-color:#c8e1ff}.Box--blue .Box-row{border-color:#c8e1ff}.Box--blue .Box-footer{border-color:#c8e1ff}.Box--danger{border-color:#d73a49}.Box--danger .Box-row:first-of-type{border-color:#d73a49}.Box--danger .Box-body:last-of-type{border-color:#d73a49}.Box-header--blue{background-color:#f1f8ff;border-color:#c8e1ff}.Box-row--yellow{background-color:#fffbdd}.Box-row--blue{background-color:#f1f8ff}.Box-row--gray{background-color:#f6f8fa}.Box-btn-octicon.btn-octicon{padding:16px 16px;margin:-16px -16px;line-height:1.5}.btn{position:relative;display:inline-block;padding:6px 12px;font-size:14px;font-weight:600;line-height:20px;white-space:nowrap;vertical-align:middle;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-repeat:repeat-x;background-position:-1px -1px;background-size:110% 110%;border:1px solid rgba(27,31,35,0.2);border-radius:0.25em;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn i{font-style:normal;font-weight:500;opacity:0.6}.btn .octicon{vertical-align:text-top}.btn .counter{color:#586069;text-shadow:none;background-color:rgba(27,31,35,0.1)}.btn:hover{text-decoration:none;background-repeat:repeat-x}.btn:focus{outline:0}.btn:disabled,.btn.disabled{cursor:default;background-position:0 0}.btn:active,.btn.selected{background-image:none}.btn{color:#24292e;background-color:#eff3f6;background-image:-webkit-linear-gradient(270deg, #fafbfc 0%, #eff3f6 90%);background-image:linear-gradient(-180deg, #fafbfc 0%, #eff3f6 90%)}.btn:focus,.btn.focus{box-shadow:0 0 0 0.2em rgba(3,102,214,0.3)}.btn:hover,.btn.hover{background-color:#e6ebf1;background-image:-webkit-linear-gradient(270deg, #f0f3f6 0%, #e6ebf1 90%);background-image:linear-gradient(-180deg, #f0f3f6 0%, #e6ebf1 90%);background-position:0 -0.5em;border-color:rgba(27,31,35,0.35)}.btn:active,.btn.selected{background-color:#e9ecef;background-image:none;border-color:rgba(27,31,35,0.35);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn:disabled,.btn.disabled{color:rgba(36,41,46,0.4);background-color:#eff3f6;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-primary{color:#fff;background-color:#28a745;background-image:-webkit-linear-gradient(270deg, #34d058 0%, #28a745 90%);background-image:linear-gradient(-180deg, #34d058 0%, #28a745 90%)}.btn-primary:focus,.btn-primary.focus{box-shadow:0 0 0 0.2em rgba(52,208,88,0.3)}.btn-primary:hover,.btn-primary.hover{background-color:#269f42;background-image:-webkit-linear-gradient(270deg, #2fcb53 0%, #269f42 90%);background-image:linear-gradient(-180deg, #2fcb53 0%, #269f42 90%);background-position:0 -0.5em;border-color:rgba(27,31,35,0.5)}.btn-primary:active,.btn-primary.selected{background-color:#279f43;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-primary:disabled,.btn-primary.disabled{color:rgba(255,255,255,0.75);background-color:#94d3a2;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-primary .counter{color:#29b249;background-color:#fff}.btn-purple{color:#fff;background-color:#643ab0;background-image:-webkit-linear-gradient(270deg, #7e55c7 0%, #643ab0 90%);background-image:linear-gradient(-180deg, #7e55c7 0%, #643ab0 90%)}.btn-purple:focus,.btn-purple.focus{box-shadow:0 0 0 0.2em rgba(126,85,199,0.3)}.btn-purple:hover,.btn-purple.hover{background-color:#5f37a8;background-image:-webkit-linear-gradient(270deg, #784ec5 0%, #5f37a8 90%);background-image:linear-gradient(-180deg, #784ec5 0%, #5f37a8 90%);background-position:0 -0.5em;border-color:rgba(27,31,35,0.5)}.btn-purple:active,.btn-purple.selected{background-color:#613ca4;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-purple:disabled,.btn-purple.disabled{color:rgba(255,255,255,0.75);background-color:#b19cd7;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-purple .counter{color:#683cb8;background-color:#fff}.btn-blue{color:#fff;background-color:#0361cc;background-image:-webkit-linear-gradient(270deg, #0679fc 0%, #0361cc 90%);background-image:linear-gradient(-180deg, #0679fc 0%, #0361cc 90%)}.btn-blue:focus,.btn-blue.focus{box-shadow:0 0 0 0.2em rgba(6,121,252,0.3)}.btn-blue:hover,.btn-blue.hover{background-color:#035cc2;background-image:-webkit-linear-gradient(270deg, #0374f4 0%, #035cc2 90%);background-image:linear-gradient(-180deg, #0374f4 0%, #035cc2 90%);background-position:0 -0.5em;border-color:rgba(27,31,35,0.5)}.btn-blue:active,.btn-blue.selected{background-color:#045cc1;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-blue:disabled,.btn-blue.disabled{color:rgba(255,255,255,0.75);background-color:#81b0e5;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-blue .counter{color:#0366d6;background-color:#fff}.btn-danger{color:#cb2431;background-color:#fafbfc;background-image:-webkit-linear-gradient(270deg, #fafbfc 0%, #eff3f6 90%);background-image:linear-gradient(-180deg, #fafbfc 0%, #eff3f6 90%)}.btn-danger:focus{box-shadow:0 0 0 0.2em rgba(203,36,49,0.3)}.btn-danger:hover{color:#fff;background-color:#cb2431;background-image:-webkit-linear-gradient(270deg, #de4450 0%, #cb2431 90%);background-image:linear-gradient(-180deg, #de4450 0%, #cb2431 90%);border-color:rgba(27,31,35,0.5)}.btn-danger:hover .counter{color:#fff}.btn-danger:active,.btn-danger.selected{color:#fff;background-color:#b5202c;background-image:none;border-color:rgba(27,31,35,0.5);box-shadow:inset 0 0.15em 0.3em rgba(27,31,35,0.15)}.btn-danger:disabled,.btn-danger.disabled{color:rgba(203,36,49,0.4);background-color:#eff3f6;background-image:none;border-color:rgba(27,31,35,0.2);box-shadow:none}.btn-outline{color:#0366d6;background-color:#fff;background-image:none}.btn-outline .counter{background-color:rgba(0,0,0,0.07)}.btn-outline:hover,.btn-outline:active,.btn-outline.selected{color:#fff;background-color:#0366d6;background-image:none;border-color:#0366d6}.btn-outline:hover .counter,.btn-outline:active .counter,.btn-outline.selected .counter{color:#0366d6;background-color:#fff}.btn-outline:focus{border-color:#0366d6;box-shadow:0 0 0 0.2em rgba(3,102,214,0.3)}.btn-outline:disabled,.btn-outline.disabled{color:rgba(27,31,35,0.3);background-color:#fff;border-color:rgba(0,0,0,0.15);box-shadow:none}.btn-with-count{float:left;border-top-right-radius:0;border-bottom-right-radius:0}.btn-sm{padding:3px 10px;font-size:12px;line-height:20px}.btn-large{padding:0.75em 1.25em;font-size:inherit;border-radius:6px}.hidden-text-expander{display:block}.hidden-text-expander.inline{position:relative;top:-1px;display:inline-block;margin-left:5px;line-height:0}.hidden-text-expander a,.ellipsis-expander{display:inline-block;height:12px;padding:0 5px 5px;font-size:12px;font-weight:600;line-height:6px;color:#444d56;text-decoration:none;vertical-align:middle;background:#dfe2e5;border:0;border-radius:1px}.hidden-text-expander a:hover,.ellipsis-expander:hover{text-decoration:none;background-color:#c6cbd1}.hidden-text-expander a:active,.ellipsis-expander:active{color:#fff;background-color:#2188ff}.social-count{float:left;padding:3px 10px;font-size:12px;font-weight:600;line-height:20px;color:#24292e;vertical-align:middle;background-color:#fff;border:1px solid rgba(27,31,35,0.2);border-left:0;border-top-right-radius:3px;border-bottom-right-radius:3px}.social-count:hover,.social-count:active{text-decoration:none}.social-count:hover{color:#0366d6;cursor:pointer}.btn-block{display:block;width:100%;text-align:center}.btn-link{display:inline-block;padding:0;font-size:inherit;color:#0366d6;text-decoration:none;white-space:nowrap;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none}.btn-link:hover{text-decoration:underline}.btn-link:disabled,.btn-link:disabled:hover{color:rgba(88,96,105,0.5);cursor:default}.BtnGroup{display:inline-block;vertical-align:middle}.BtnGroup::before{display:table;content:""}.BtnGroup::after{display:table;clear:both;content:""}.BtnGroup+.BtnGroup,.BtnGroup+.btn{margin-left:5px}.BtnGroup-item{position:relative;float:left;border-right-width:0;border-radius:0}.BtnGroup-item:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.BtnGroup-item:last-child{border-right-width:1px;border-top-right-radius:3px;border-bottom-right-radius:3px}.BtnGroup-item.selected,.BtnGroup-item:focus,.BtnGroup-item:active,.BtnGroup-item:hover{border-right-width:1px}.BtnGroup-item.selected+.BtnGroup-item,.BtnGroup-item.selected+.BtnGroup-form .BtnGroup-item,.BtnGroup-item:focus+.BtnGroup-item,.BtnGroup-item:focus+.BtnGroup-form .BtnGroup-item,.BtnGroup-item:active+.BtnGroup-item,.BtnGroup-item:active+.BtnGroup-form .BtnGroup-item,.BtnGroup-item:hover+.BtnGroup-item,.BtnGroup-item:hover+.BtnGroup-form .BtnGroup-item{border-left-width:0}.BtnGroup-form{float:left}.BtnGroup-form:first-child .BtnGroup-item{border-top-left-radius:3px;border-bottom-left-radius:3px}.BtnGroup-form:last-child .BtnGroup-item{border-right-width:1px;border-top-right-radius:3px;border-bottom-right-radius:3px}.BtnGroup-form .BtnGroup-item{border-right-width:0;border-radius:0}.BtnGroup-form.selected .BtnGroup-item,.BtnGroup-form:focus .BtnGroup-item,.BtnGroup-form:active .BtnGroup-item,.BtnGroup-form:hover .BtnGroup-item{border-right-width:1px}.BtnGroup-form.selected+.BtnGroup-item,.BtnGroup-form.selected+.BtnGroup-form .BtnGroup-item,.BtnGroup-form:focus+.BtnGroup-item,.BtnGroup-form:focus+.BtnGroup-form .BtnGroup-item,.BtnGroup-form:active+.BtnGroup-item,.BtnGroup-form:active+.BtnGroup-form .BtnGroup-item,.BtnGroup-form:hover+.BtnGroup-item,.BtnGroup-form:hover+.BtnGroup-form .BtnGroup-item{border-left-width:0}.TableObject{display:table}.TableObject-item{display:table-cell;width:1%;white-space:nowrap;vertical-align:middle}.TableObject-item--primary{width:99%}fieldset{padding:0;margin:0;border:0}label{font-weight:600}.form-control,.form-select{min-height:34px;padding:6px 8px;font-size:14px;line-height:20px;color:#24292e;vertical-align:middle;background-color:#fff;background-repeat:no-repeat;background-position:right 8px center;border:1px solid #d1d5da;border-radius:3px;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075)}.form-control.focus,.form-control:focus,.form-select.focus,.form-select:focus{border-color:#2188ff;outline:none;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075),0 0 0 0.2em rgba(3,102,214,0.3)}.input-contrast{background-color:#fafbfc}.input-contrast:focus{background-color:#fff}::-webkit-input-placeholder{color:#6a737d}::-moz-placeholder{color:#6a737d}:-ms-input-placeholder{color:#6a737d}::placeholder{color:#6a737d}.input-sm{min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px;line-height:20px}.input-lg{padding:4px 10px;font-size:16px}.input-block{display:block;width:100%}.input-monospace{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace}.input-hide-webkit-autofill::-webkit-contacts-auto-fill-button{position:absolute;right:0;display:none !important;pointer-events:none;visibility:hidden}.form-checkbox{padding-left:20px;margin:15px 0;vertical-align:middle}.form-checkbox label em.highlight{position:relative;left:-4px;padding:2px 4px;font-style:normal;background:#fffbdd;border-radius:3px}.form-checkbox input[type=checkbox],.form-checkbox input[type=radio]{float:left;margin:5px 0 0 -20px;vertical-align:middle}.form-checkbox .note{display:block;margin:0;font-size:12px;font-weight:normal;color:#586069}.form-checkbox-details{display:none}.form-checkbox-details-trigger:checked ~ * .form-checkbox-details,.form-checkbox-details-trigger:checked ~ .form-checkbox-details{display:block}.hfields{margin:15px 0}.hfields::before{display:table;content:""}.hfields::after{display:table;clear:both;content:""}.hfields .form-group{float:left;margin:0 30px 0 0}.hfields .form-group dt label{display:inline-block;margin:5px 0 0;color:#586069}.hfields .form-group dt img{position:relative;top:-2px}.hfields .btn{float:left;margin:28px 25px 0 -20px}.hfields .form-select{margin-top:5px}input::-webkit-outer-spin-button,input::-webkit-inner-spin-button{margin:0;-webkit-appearance:none;appearance:none}.form-actions::before{display:table;content:""}.form-actions::after{display:table;clear:both;content:""}.form-actions .btn{float:right}.form-actions .btn+.btn{margin-right:5px}.form-warning{padding:8px 10px;margin:10px 0;font-size:14px;color:#735c0f;background:#fffbdd;border:1px solid #d9d0a5;border-radius:3px}.form-warning p{margin:0;line-height:1.5}.form-warning a{font-weight:600}.form-select{display:inline-block;max-width:100%;height:34px;padding-right:24px;padding-right:8px \9;background:#fff url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAUCAMAAACzvE1FAAAADFBMVEUzMzMzMzMzMzMzMzMKAG/3AAAAA3RSTlMAf4C/aSLHAAAAPElEQVR42q3NMQ4AIAgEQTn//2cLdRKppSGzBYwzVXvznNWs8C58CiussPJj8h6NwgorrKRdTvuV9v16Afn0AYFOB7aYAAAAAElFTkSuQmCC") no-repeat right 8px center;background-image:none \9;background-size:8px 10px;-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-select::-ms-expand{opacity:0}.form-select[multiple]{height:auto}.select-sm{height:28px;min-height:28px;padding-top:3px;padding-bottom:3px;font-size:12px}.select-sm[multiple]{height:auto;min-height:0}.form-group{margin:15px 0}.form-group .form-control{width:440px;max-width:100%;margin-right:5px;background-color:#fafbfc}.form-group .form-control:focus{background-color:#fff}.form-group .form-control.shorter{width:130px}.form-group .form-control.short{width:250px}.form-group .form-control.long{width:100%}.form-group textarea.form-control{width:100%;height:200px;min-height:200px}.form-group textarea.form-control.short{height:50px;min-height:50px}.form-group dt{margin:0 0 6px}.form-group label{position:relative}.form-group.flattened dt{float:left;margin:0;line-height:32px}.form-group.flattened dd{line-height:32px}.form-group dd h4{margin:4px 0 0}.form-group dd h4.is-error{color:#cb2431}.form-group dd h4.is-success{color:#28a745}.form-group dd h4+.note{margin-top:0}.form-group.required dt label::after{padding-left:5px;color:#cb2431;content:"*"}.form-group .success,.form-group .error,.form-group .indicator{display:none;font-size:12px;font-weight:600}.form-group.loading{opacity:0.5}.form-group.loading .indicator{display:inline}.form-group.loading .spinner{display:inline-block;vertical-align:middle}.form-group.successful .success{display:inline;color:#28a745}.form-group.warn .warning,.form-group.warn .error,.form-group.errored .warning,.form-group.errored .error{position:absolute;z-index:10;display:block;max-width:450px;padding:5px 8px;margin:4px 0 0;font-size:13px;font-weight:normal;border-style:solid;border-width:1px;border-radius:3px}.form-group.warn .warning::after,.form-group.warn .warning::before,.form-group.warn .error::after,.form-group.warn .error::before,.form-group.errored .warning::after,.form-group.errored .warning::before,.form-group.errored .error::after,.form-group.errored .error::before{position:absolute;bottom:100%;left:10px;z-index:15;width:0;height:0;pointer-events:none;content:" ";border:solid transparent}.form-group.warn .warning::after,.form-group.warn .error::after,.form-group.errored .warning::after,.form-group.errored .error::after{border-width:5px}.form-group.warn .warning::before,.form-group.warn .error::before,.form-group.errored .warning::before,.form-group.errored .error::before{margin-left:-1px;border-width:6px}.form-group.warn .warning{color:#735c0f;background-color:#fffbdd;border-color:#d9d0a5}.form-group.warn .warning::after{border-bottom-color:#fffbdd}.form-group.warn .warning::before{border-bottom-color:#d9d0a5}.form-group.errored label{color:#cb2431}.form-group.errored .error{color:#86181d;background-color:#ffdce0;border-color:#cea0a5}.form-group.errored .error::after{border-bottom-color:#ffdce0}.form-group.errored .error::before{border-bottom-color:#cea0a5}.note{min-height:17px;margin:4px 0 2px;font-size:12px;color:#586069}.note .spinner{margin-right:3px;vertical-align:middle}dl.form-group>dd .form-control.is-autocheck-loading,dl.form-group>dd .form-control.is-autocheck-successful,dl.form-group>dd .form-control.is-autocheck-errored{padding-right:30px}dl.form-group>dd .form-control.is-autocheck-loading{background-image:url("/images/spinners/octocat-spinner-16px.gif")}dl.form-group>dd .form-control.is-autocheck-successful{background-image:url("/images/modules/ajax/success.png")}dl.form-group>dd .form-control.is-autocheck-errored{background-image:url("/images/modules/ajax/error.png")}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){dl.form-group>dd .form-control.is-autocheck-loading,dl.form-group>dd .form-control.is-autocheck-successful,dl.form-group>dd .form-control.is-autocheck-errored{background-size:16px 16px}dl.form-group>dd .form-control.is-autocheck-loading{background-image:url("/images/spinners/octocat-spinner-32.gif")}dl.form-group>dd .form-control.is-autocheck-successful{background-image:url("/images/modules/ajax/success@2x.png")}dl.form-group>dd .form-control.is-autocheck-errored{background-image:url("/images/modules/ajax/error@2x.png")}}.form-cards{height:31px;margin:0 0 15px}.form-cards .card{float:left;width:47px;height:31px;text-indent:-9999px;background-image:url("/images/modules/pricing/credit-cards-@1x.png");background-position:0 0;opacity:0.6}.form-cards .card.visa{background-position:0 0}.form-cards .card.amex{background-position:-50px 0}.form-cards .card.mastercard{background-position:-100px 0}.form-cards .card.discover{background-position:-150px 0}.form-cards .card.jcb{background-position:-200px 0}.form-cards .card.dinersclub{background-position:-250px 0}.form-cards .card.enabled{opacity:1}.form-cards .card.disabled{opacity:0.2}.form-cards>.cards{margin:0}.form-cards>.cards>li{float:left;margin:0 4px 0 0;list-style-type:none}.form-cards>.cards>li.text{line-height:31px}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.form-cards>.cards .card{background-image:url("/images/modules/pricing/credit-cards-@2x.png");background-size:300px 31px}}.status-indicator{display:inline-block;width:16px;height:16px;margin-left:5px}.status-indicator .octicon{display:none}.status-indicator-success::before{content:""}.status-indicator-success .octicon-check{display:inline-block;color:#28a745;fill:#28a745}.status-indicator-success .octicon-x{display:none}.status-indicator-failed::before{content:""}.status-indicator-failed .octicon-check{display:none}.status-indicator-failed .octicon-x{display:inline-block;color:#cb2431;fill:#d73a49}.status-indicator-loading{width:16px;background:url("/images/spinners/octocat-spinner-32-EAF2F5.gif") 0 0 no-repeat;background-size:16px}.inline-form{display:inline-block}.inline-form .btn-plain{background-color:transparent;border:0}.drag-and-drop{padding:7px 10px;margin:0;font-size:13px;line-height:16px;color:#586069;background-color:#fafbfc;border:1px solid #c3c8cf;border-top:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.drag-and-drop .default,.drag-and-drop .loading,.drag-and-drop .error{display:none}.drag-and-drop .error{color:#cb2431}.drag-and-drop img{vertical-align:top}.is-default .drag-and-drop .default{display:inline-block}.is-uploading .drag-and-drop .loading{display:inline-block}.is-bad-file .drag-and-drop .bad-file{display:inline-block}.is-duplicate-filename .drag-and-drop .duplicate-filename{display:inline-block}.is-too-big .drag-and-drop .too-big{display:inline-block}.is-hidden-file .drag-and-drop .hidden-file{display:inline-block}.is-empty .drag-and-drop .empty{display:inline-block}.is-bad-permissions .drag-and-drop .bad-permissions{display:inline-block}.is-repository-required .drag-and-drop .repository-required{display:inline-block}.drag-and-drop-error-info{font-weight:normal;color:#586069}.drag-and-drop-error-info a{color:#0366d6}.is-failed .drag-and-drop .failed-request{display:inline-block}.manual-file-chooser{position:absolute;width:240px;padding:5px;margin-left:-80px;cursor:pointer;opacity:0.0001}.manual-file-chooser:hover+.manual-file-chooser-text{text-decoration:underline}.btn .manual-file-chooser{top:0;padding:0;line-height:34px}.upload-enabled textarea{display:block;border-bottom:1px dashed #dfe2e5;border-bottom-right-radius:0;border-bottom-left-radius:0}.upload-enabled.focused{border-radius:3px;box-shadow:inset 0 1px 2px rgba(27,31,35,0.075),0 0 0 0.2em rgba(3,102,214,0.3)}.upload-enabled.focused .form-control{box-shadow:none}.upload-enabled.focused .drag-and-drop{border-color:#4a9eff}.dragover textarea,.dragover .drag-and-drop{box-shadow:#c9ff00 0 0 3px}.write-content{position:relative}.previewable-comment-form{position:relative}.previewable-comment-form .tabnav{position:relative;padding:8px 8px 0}.previewable-comment-form .comment{border:1px solid #c3c8cf}.previewable-comment-form .comment-form-error{margin-bottom:8px}.previewable-comment-form .write-content,.previewable-comment-form .preview-content{display:none;margin:0 8px 8px}.previewable-comment-form.write-selected .write-content,.previewable-comment-form.preview-selected .preview-content{display:block}.previewable-comment-form textarea{display:block;width:100%;min-height:100px;max-height:500px;padding:8px;resize:vertical}.form-action-spacious{margin-top:10px}div.composer{margin-top:0;border:0}.composer .comment-form-textarea{height:200px;min-height:200px}.composer .tabnav{margin:0 0 10px}h2.account{margin:15px 0 0;font-size:18px;font-weight:normal;color:#586069}p.explain{position:relative;font-size:12px;color:#586069}p.explain strong{color:#24292e}p.explain .octicon{margin-right:5px;color:#959da5}p.explain .minibutton{top:-4px;float:right}.form-group label{position:static}.container{width:980px;margin-right:auto;margin-left:auto}.container::before{display:table;content:""}.container::after{display:table;clear:both;content:""}.container-md{max-width:768px;margin-right:auto;margin-left:auto}.container-md::before{display:table;content:""}.container-md::after{display:table;clear:both;content:""}.container-lg{max-width:1012px;margin-right:auto;margin-left:auto}.container-lg::before{display:table;content:""}.container-lg::after{display:table;clear:both;content:""}.container-xl{max-width:1280px;margin-right:auto;margin-left:auto}.container-xl::before{display:table;content:""}.container-xl::after{display:table;clear:both;content:""}.columns{margin-right:-10px;margin-left:-10px}.columns::before{display:table;content:""}.columns::after{display:table;clear:both;content:""}.column{float:left;padding-right:10px;padding-left:10px}.one-third{width:33.333333%}.two-thirds{width:66.666667%}.one-fourth{width:25%}.one-half{width:50%}.three-fourths{width:75%}.one-fifth{width:20%}.four-fifths{width:80%}.single-column{padding-right:10px;padding-left:10px}.table-column{display:table-cell;width:1%;padding-right:10px;padding-left:10px;vertical-align:top}.centered{display:block;float:none;margin-right:auto;margin-left:auto}.col-1{width:8.33333%}.col-2{width:16.66667%}.col-3{width:25%}.col-4{width:33.33333%}.col-5{width:41.66667%}.col-6{width:50%}.col-7{width:58.33333%}.col-8{width:66.66667%}.col-9{width:75%}.col-10{width:83.33333%}.col-11{width:91.66667%}.col-12{width:100%}@media (min-width: 544px){.col-sm-1{width:8.33333%}.col-sm-2{width:16.66667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333%}.col-sm-5{width:41.66667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333%}.col-sm-8{width:66.66667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333%}.col-sm-11{width:91.66667%}.col-sm-12{width:100%}}@media (min-width: 768px){.col-md-1{width:8.33333%}.col-md-2{width:16.66667%}.col-md-3{width:25%}.col-md-4{width:33.33333%}.col-md-5{width:41.66667%}.col-md-6{width:50%}.col-md-7{width:58.33333%}.col-md-8{width:66.66667%}.col-md-9{width:75%}.col-md-10{width:83.33333%}.col-md-11{width:91.66667%}.col-md-12{width:100%}}@media (min-width: 1012px){.col-lg-1{width:8.33333%}.col-lg-2{width:16.66667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333%}.col-lg-5{width:41.66667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333%}.col-lg-8{width:66.66667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333%}.col-lg-11{width:91.66667%}.col-lg-12{width:100%}}@media (min-width: 1280px){.col-xl-1{width:8.33333%}.col-xl-2{width:16.66667%}.col-xl-3{width:25%}.col-xl-4{width:33.33333%}.col-xl-5{width:41.66667%}.col-xl-6{width:50%}.col-xl-7{width:58.33333%}.col-xl-8{width:66.66667%}.col-xl-9{width:75%}.col-xl-10{width:83.33333%}.col-xl-11{width:91.66667%}.col-xl-12{width:100%}}.gut-sm{margin-right:-8px;margin-left:-8px}.gut-sm>[class*="col-"]{padding-right:8px !important;padding-left:8px !important}.gut-md{margin-right:-16px;margin-left:-16px}.gut-md>[class*="col-"]{padding-right:16px !important;padding-left:16px !important}.gut-lg{margin-right:-24px;margin-left:-24px}.gut-lg>[class*="col-"]{padding-right:24px !important;padding-left:24px !important}.offset-1{margin-left:8.33333%}.offset-2{margin-left:16.66667%}.offset-3{margin-left:25%}.offset-4{margin-left:33.33333%}.offset-5{margin-left:41.66667%}.offset-6{margin-left:50%}.offset-7{margin-left:58.33333%}.offset-8{margin-left:66.66667%}.offset-9{margin-left:75%}.offset-10{margin-left:83.33333%}.offset-11{margin-left:91.66667%}@media (min-width: 544px){.offset-sm-1{margin-left:8.33333%}.offset-sm-2{margin-left:16.66667%}.offset-sm-3{margin-left:25%}.offset-sm-4{margin-left:33.33333%}.offset-sm-5{margin-left:41.66667%}.offset-sm-6{margin-left:50%}.offset-sm-7{margin-left:58.33333%}.offset-sm-8{margin-left:66.66667%}.offset-sm-9{margin-left:75%}.offset-sm-10{margin-left:83.33333%}.offset-sm-11{margin-left:91.66667%}}@media (min-width: 768px){.offset-md-1{margin-left:8.33333%}.offset-md-2{margin-left:16.66667%}.offset-md-3{margin-left:25%}.offset-md-4{margin-left:33.33333%}.offset-md-5{margin-left:41.66667%}.offset-md-6{margin-left:50%}.offset-md-7{margin-left:58.33333%}.offset-md-8{margin-left:66.66667%}.offset-md-9{margin-left:75%}.offset-md-10{margin-left:83.33333%}.offset-md-11{margin-left:91.66667%}}@media (min-width: 1012px){.offset-lg-1{margin-left:8.33333%}.offset-lg-2{margin-left:16.66667%}.offset-lg-3{margin-left:25%}.offset-lg-4{margin-left:33.33333%}.offset-lg-5{margin-left:41.66667%}.offset-lg-6{margin-left:50%}.offset-lg-7{margin-left:58.33333%}.offset-lg-8{margin-left:66.66667%}.offset-lg-9{margin-left:75%}.offset-lg-10{margin-left:83.33333%}.offset-lg-11{margin-left:91.66667%}}@media (min-width: 1280px){.offset-xl-1{margin-left:8.33333%}.offset-xl-2{margin-left:16.66667%}.offset-xl-3{margin-left:25%}.offset-xl-4{margin-left:33.33333%}.offset-xl-5{margin-left:41.66667%}.offset-xl-6{margin-left:50%}.offset-xl-7{margin-left:58.33333%}.offset-xl-8{margin-left:66.66667%}.offset-xl-9{margin-left:75%}.offset-xl-10{margin-left:83.33333%}.offset-xl-11{margin-left:91.66667%}}.counter{display:inline-block;padding:2px 5px;font-size:12px;font-weight:600;line-height:1;color:#586069;background-color:rgba(27,31,35,0.08);border-radius:20px}.Counter--gray-light{color:#24292e;background-color:rgba(27,31,35,0.15)}.Counter--gray{color:#fff;background-color:#6a737d}.menu{margin-bottom:15px;list-style:none;background-color:#fff;border:1px solid #d1d5da;border-radius:3px}.menu-item{position:relative;display:block;padding:8px 10px;border-bottom:1px solid #e1e4e8}.menu-item:first-child{border-top:0;border-top-left-radius:2px;border-top-right-radius:2px}.menu-item:first-child::before{border-top-left-radius:2px}.menu-item:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.menu-item:last-child::before{border-bottom-left-radius:2px}.menu-item:hover{text-decoration:none;background-color:#f6f8fa}.menu-item.selected{font-weight:600;color:#24292e;cursor:default;background-color:#fff}.menu-item.selected::before{position:absolute;top:0;bottom:0;left:0;width:2px;content:"";background-color:#e36209}.menu-item .octicon{width:16px;margin-right:5px;color:#24292e;text-align:center}.menu-item .counter{float:right;margin-left:5px}.menu-item .menu-warning{float:right;color:#86181d}.menu-item .avatar{float:left;margin-right:5px}.menu-item.alert .counter{color:#cb2431}.menu-heading{display:block;padding:8px 10px;margin-top:0;margin-bottom:0;font-size:13px;font-weight:600;line-height:20px;color:#586069;background-color:#f3f5f8;border-bottom:1px solid #e1e4e8}.menu-heading:hover{text-decoration:none}.menu-heading:first-child{border-top-left-radius:2px;border-top-right-radius:2px}.menu-heading:last-child{border-bottom:0;border-bottom-right-radius:2px;border-bottom-left-radius:2px}.tabnav{margin-top:0;margin-bottom:15px;border-bottom:1px solid #d1d5da}.tabnav .counter{margin-left:5px}.tabnav-tabs{margin-bottom:-1px}.tabnav-tab{display:inline-block;padding:8px 12px;font-size:14px;line-height:20px;color:#586069;text-decoration:none;background-color:transparent;border:1px solid transparent;border-bottom:0}.tabnav-tab.selected{color:#24292e;background-color:#fff;border-color:#d1d5da;border-radius:3px 3px 0 0}.tabnav-tab:hover,.tabnav-tab:focus{color:#24292e;text-decoration:none}.tabnav-extra{display:inline-block;padding-top:10px;margin-left:10px;font-size:12px;color:#586069}.tabnav-extra>.octicon{margin-right:2px}a.tabnav-extra:hover{color:#0366d6;text-decoration:none}.tabnav-btn{margin-left:10px}.filter-list{list-style-type:none}.filter-list.small .filter-item{padding:4px 10px;margin:0 0 2px;font-size:12px}.filter-list.pjax-active .filter-item{color:#586069;background-color:transparent}.filter-list.pjax-active .filter-item.pjax-active{color:#fff;background-color:#0366d6}.filter-item{position:relative;display:block;padding:8px 10px;margin-bottom:5px;overflow:hidden;font-size:14px;color:#586069;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;cursor:pointer;border-radius:3px}.filter-item:hover{text-decoration:none;background-color:#eaecef}.filter-item.selected{color:#fff;background-color:#0366d6}.filter-item .count{float:right;font-weight:600}.filter-item .bar{position:absolute;top:2px;right:0;bottom:2px;z-index:-1;display:inline-block;background-color:#eff3f6}.subnav{margin-bottom:20px}.subnav::before{display:table;content:""}.subnav::after{display:table;clear:both;content:""}.subnav-bordered{padding-bottom:20px;border-bottom:1px solid #eaecef}.subnav-flush{margin-bottom:0}.subnav-item{position:relative;float:left;padding:6px 14px;font-weight:600;line-height:20px;color:#586069;border:1px solid #e1e4e8}.subnav-item+.subnav-item{margin-left:-1px}.subnav-item:hover,.subnav-item:focus{text-decoration:none;background-color:#f6f8fa}.subnav-item.selected,.subnav-item.selected:hover,.subnav-item.selected:focus{z-index:2;color:#fff;background-color:#0366d6;border-color:#0366d6}.subnav-item:first-child{border-top-left-radius:3px;border-bottom-left-radius:3px}.subnav-item:last-child{border-top-right-radius:3px;border-bottom-right-radius:3px}.subnav-search{position:relative;margin-left:10px}.subnav-search-input{width:320px;padding-left:30px;color:#586069}.subnav-search-input-wide{width:500px}.subnav-search-icon{position:absolute;top:9px;left:8px;display:block;color:#c6cbd1;text-align:center;pointer-events:none}.subnav-search-context .btn{color:#444d56;border-top-right-radius:0;border-bottom-right-radius:0}.subnav-search-context .btn:hover,.subnav-search-context .btn:focus,.subnav-search-context .btn:active,.subnav-search-context .btn.selected{z-index:2}.subnav-search-context+.subnav-search{margin-left:-1px}.subnav-search-context+.subnav-search .subnav-search-input{border-top-left-radius:0;border-bottom-left-radius:0}.subnav-search-context .select-menu-modal-holder{z-index:30}.subnav-search-context .select-menu-modal{width:220px}.subnav-search-context .select-menu-item-icon{color:inherit}.subnav-spacer-right{padding-right:10px}.tooltipped{position:relative}.tooltipped::after{position:absolute;z-index:1000000;display:none;padding:5px 8px;font:normal normal 11px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";-webkit-font-smoothing:subpixel-antialiased;color:#fff;text-align:center;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-wrap:break-word;white-space:pre;pointer-events:none;content:attr(aria-label);background:rgba(0,0,0,0.8);border-radius:3px;opacity:0}.tooltipped::before{position:absolute;z-index:1000001;display:none;width:0;height:0;color:rgba(0,0,0,0.8);pointer-events:none;content:"";border:5px solid transparent;opacity:0}@-webkit-keyframes tooltip-appear{from{opacity:0}to{opacity:1}}@keyframes tooltip-appear{from{opacity:0}to{opacity:1}}.tooltipped:hover::before,.tooltipped:hover::after,.tooltipped:active::before,.tooltipped:active::after,.tooltipped:focus::before,.tooltipped:focus::after{display:inline-block;text-decoration:none;-webkit-animation-name:tooltip-appear;animation-name:tooltip-appear;-webkit-animation-duration:0.1s;animation-duration:0.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in;-webkit-animation-delay:0.4s;animation-delay:0.4s}.tooltipped-no-delay:hover::before,.tooltipped-no-delay:hover::after,.tooltipped-no-delay:active::before,.tooltipped-no-delay:active::after,.tooltipped-no-delay:focus::before,.tooltipped-no-delay:focus::after{opacity:1;-webkit-animation:none;animation:none}.tooltipped-multiline:hover::after,.tooltipped-multiline:active::after,.tooltipped-multiline:focus::after{display:table-cell}.tooltipped-s::after,.tooltipped-se::after,.tooltipped-sw::after{top:100%;right:50%;margin-top:5px}.tooltipped-s::before,.tooltipped-se::before,.tooltipped-sw::before{top:auto;right:50%;bottom:-5px;margin-right:-5px;border-bottom-color:rgba(0,0,0,0.8)}.tooltipped-se::after{right:auto;left:50%;margin-left:-15px}.tooltipped-sw::after{margin-right:-15px}.tooltipped-n::after,.tooltipped-ne::after,.tooltipped-nw::after{right:50%;bottom:100%;margin-bottom:5px}.tooltipped-n::before,.tooltipped-ne::before,.tooltipped-nw::before{top:-5px;right:50%;bottom:auto;margin-right:-5px;border-top-color:rgba(0,0,0,0.8)}.tooltipped-ne::after{right:auto;left:50%;margin-left:-15px}.tooltipped-nw::after{margin-right:-15px}.tooltipped-s::after,.tooltipped-n::after{-webkit-transform:translateX(50%);transform:translateX(50%)}.tooltipped-w::after{right:100%;bottom:50%;margin-right:5px;-webkit-transform:translateY(50%);transform:translateY(50%)}.tooltipped-w::before{top:50%;bottom:50%;left:-5px;margin-top:-5px;border-left-color:rgba(0,0,0,0.8)}.tooltipped-e::after{bottom:50%;left:100%;margin-left:5px;-webkit-transform:translateY(50%);transform:translateY(50%)}.tooltipped-e::before{top:50%;right:-5px;bottom:50%;margin-top:-5px;border-right-color:rgba(0,0,0,0.8)}.tooltipped-multiline::after{width:-webkit-max-content;width:-moz-max-content;width:max-content;max-width:250px;word-break:break-word;word-wrap:normal;white-space:pre-line;border-collapse:separate}.tooltipped-multiline.tooltipped-s::after,.tooltipped-multiline.tooltipped-n::after{right:auto;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%)}.tooltipped-multiline.tooltipped-w::after,.tooltipped-multiline.tooltipped-e::after{right:100%}@media screen and (min-width: 0\0){.tooltipped-multiline::after{width:250px}}.tooltipped-sticky::before,.tooltipped-sticky::after{display:inline-block}.tooltipped-sticky.tooltipped-multiline::after{display:table-cell}@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min--moz-device-pixel-ratio: 2), only screen and (-moz-min-device-pixel-ratio: 2), only screen and (min-device-pixel-ratio: 2), only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx){.tooltipped-w::after{margin-right:4.5px}}.css-truncate.css-truncate-target,.css-truncate .css-truncate-target{display:inline-block;max-width:125px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:top}.css-truncate.expandable.zeroclipboard-is-hover .css-truncate-target,.css-truncate.expandable.zeroclipboard-is-hover.css-truncate-target,.css-truncate.expandable:hover .css-truncate-target,.css-truncate.expandable:hover.css-truncate-target{max-width:10000px !important}.anim-fade-in{-webkit-animation-name:fade-in;animation-name:fade-in;-webkit-animation-duration:1s;animation-duration:1s;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}.anim-fade-in.fast{-webkit-animation-duration:300ms;animation-duration:300ms}@-webkit-keyframes fade-in{0%{opacity:0}100%{opacity:1}}@keyframes fade-in{0%{opacity:0}100%{opacity:1}}.anim-fade-up{opacity:0;-webkit-animation-name:fade-up;animation-name:fade-up;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes fade-up{0%{opacity:0.8;-webkit-transform:translateY(100%);transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fade-up{0%{opacity:0.8;-webkit-transform:translateY(100%);transform:translateY(100%)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.anim-fade-down{-webkit-animation-name:fade-down;animation-name:fade-down;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in;animation-timing-function:ease-in}@-webkit-keyframes fade-down{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0.5;-webkit-transform:translateY(100%);transform:translateY(100%)}}@keyframes fade-down{0%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}100%{opacity:0.5;-webkit-transform:translateY(100%);transform:translateY(100%)}}.anim-grow-x{width:0%;-webkit-animation-name:grow-x;animation-name:grow-x;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease;animation-timing-function:ease;-webkit-animation-delay:0.5s;animation-delay:0.5s}@-webkit-keyframes grow-x{to{width:100%}}@keyframes grow-x{to{width:100%}}.anim-shrink-x{-webkit-animation-name:shrink-x;animation-name:shrink-x;-webkit-animation-duration:0.3s;animation-duration:0.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out;-webkit-animation-delay:0.5s;animation-delay:0.5s}@-webkit-keyframes shrink-x{to{width:0%}}@keyframes shrink-x{to{width:0%}}.anim-scale-in{-webkit-animation-name:scale-in;animation-name:scale-in;-webkit-animation-duration:0.15s;animation-duration:0.15s;-webkit-animation-timing-function:cubic-bezier(0.2, 0, 0.13, 1.5);animation-timing-function:cubic-bezier(0.2, 0, 0.13, 1.5)}@-webkit-keyframes scale-in{0%{opacity:0;-webkit-transform:scale(0.5);transform:scale(0.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes scale-in{0%{opacity:0;-webkit-transform:scale(0.5);transform:scale(0.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.anim-pulse{-webkit-animation-name:pulse;animation-name:pulse;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-iteration-count:infinite;animation-iteration-count:infinite}@-webkit-keyframes pulse{0%{opacity:0.3}10%{opacity:1}100%{opacity:0.3}}@keyframes pulse{0%{opacity:0.3}10%{opacity:1}100%{opacity:0.3}}.anim-pulse-in{-webkit-animation-name:pulse-in;animation-name:pulse-in;-webkit-animation-duration:0.5s;animation-duration:0.5s}@-webkit-keyframes pulse-in{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}@keyframes pulse-in{0%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}50%{-webkit-transform:scale3d(1.1, 1.1, 1.1);transform:scale3d(1.1, 1.1, 1.1)}100%{-webkit-transform:scale3d(1, 1, 1);transform:scale3d(1, 1, 1)}}.border{border:1px #e1e4e8 solid !important}.border-top{border-top:1px #e1e4e8 solid !important}.border-right{border-right:1px #e1e4e8 solid !important}.border-bottom{border-bottom:1px #e1e4e8 solid !important}.border-left{border-left:1px #e1e4e8 solid !important}.border-y{border-top:1px #e1e4e8 solid !important;border-bottom:1px #e1e4e8 solid !important}.border-dashed{border-style:dashed !important}.border-blue{border-color:#0366d6 !important}.border-blue-light{border-color:#c8e1ff !important}.border-green{border-color:#34d058 !important}.border-green-light{border-color:#a2cbac !important}.border-red{border-color:#d73a49 !important}.border-red-light{border-color:#cea0a5 !important}.border-yellow{border-color:#d9d0a5 !important}.border-gray-light{border-color:#eaecef !important}.border-gray-dark{border-color:#d1d5da !important}.border-black-fade{border-color:rgba(27,31,35,0.15) !important}.border-0{border:0 !important}.border-top-0{border-top:0 !important}.border-right-0{border-right:0 !important}.border-bottom-0{border-bottom:0 !important}.border-left-0{border-left:0 !important}.rounded-0{border-radius:0 !important}.rounded-1{border-radius:3px !important}.rounded-2{border-radius:6px !important}.box-shadow{box-shadow:0 1px 1px rgba(0,0,0,0.1) !important}.box-shadow-medium{box-shadow:0 1px 5px rgba(0,0,0,0.15) !important}.box-shadow-large{box-shadow:0 1px 15px rgba(0,0,0,0.15) !important}.box-shadow-extra-large{box-shadow:0 10px 50px rgba(0,0,0,0.05) !important}.box-shadow-none{box-shadow:none !important}.bg-white{background-color:#fff !important}.bg-blue{background-color:#0366d6 !important}.bg-blue-light{background-color:#f1f8ff !important}.bg-gray-dark{background-color:#24292e !important}.bg-gray{background-color:#f6f8fa !important}.bg-gray-light{background-color:#fafbfc !important}.bg-green{background-color:#28a745 !important}.bg-green-light{background-color:#dcffe4 !important}.bg-red{background-color:#d73a49 !important}.bg-red-light{background-color:#ffdce0 !important}.bg-yellow{background-color:#ffd33d !important}.bg-yellow-light{background-color:#fff5b1 !important}.bg-purple{background-color:#6f42c1 !important}.bg-purple-light{background-color:#f5f0ff !important}.bg-shade-gradient{background-image:-webkit-linear-gradient(270deg, rgba(0,0,0,0.065), transparent) !important;background-image:linear-gradient(180deg, rgba(0,0,0,0.065), transparent) !important;background-repeat:no-repeat !important;background-size:100% 200px !important}.text-blue{color:#0366d6 !important}.text-red{color:#cb2431 !important}.text-gray-light{color:#6a737d !important}.text-gray{color:#586069 !important}.text-gray-dark{color:#24292e !important}.text-green{color:#28a745 !important}.text-orange{color:#a04100 !important}.text-orange-light{color:#e36209 !important}.text-purple{color:#6f42c1 !important}.text-white{color:#fff !important}.text-inherit{color:inherit !important}.text-renamed{color:#ffd33d !important}.text-pending{color:#b08800 !important}.bg-pending{color:#dbab09 !important}.link-gray{color:#586069 !important}.link-gray:hover{color:#0366d6 !important}.link-gray-dark{color:#24292e !important}.link-gray-dark:hover{color:#0366d6 !important}.link-hover-blue:hover{color:#0366d6 !important}.muted-link{color:#586069 !important}.muted-link:hover{color:#0366d6 !important;text-decoration:none}.flex-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}@media (min-width: 544px){.flex-sm-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-sm-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-sm-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-sm-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-sm-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-sm-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-sm-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-sm-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-sm-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-sm-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-sm-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-sm-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-sm-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-sm-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-sm-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-sm-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-sm-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-sm-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-sm-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-sm-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-sm-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-sm-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-sm-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-sm-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-sm-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-sm-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-sm-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-sm-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-sm-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-sm-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 768px){.flex-md-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-md-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-md-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-md-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-md-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-md-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-md-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-md-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-md-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-md-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-md-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-md-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-md-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-md-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-md-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-md-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-md-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-md-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-md-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-md-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-md-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-md-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-md-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-md-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-md-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-md-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-md-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-md-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-md-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-md-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 1012px){.flex-lg-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-lg-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-lg-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-lg-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-lg-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-lg-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-lg-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-lg-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-lg-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-lg-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-lg-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-lg-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-lg-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-lg-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-lg-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-lg-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-lg-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-lg-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-lg-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-lg-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-lg-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-lg-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-lg-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-lg-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-lg-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-lg-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-lg-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-lg-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-lg-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-lg-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}@media (min-width: 1280px){.flex-xl-row{-webkit-box-orient:horizontal !important;-webkit-box-direction:normal !important;-webkit-flex-direction:row !important;flex-direction:row !important}.flex-xl-row-reverse{-webkit-box-orient:horizontal !important;-webkit-box-direction:reverse !important;-webkit-flex-direction:row-reverse !important;flex-direction:row-reverse !important}.flex-xl-column{-webkit-box-orient:vertical !important;-webkit-box-direction:normal !important;-webkit-flex-direction:column !important;flex-direction:column !important}.flex-xl-wrap{-webkit-flex-wrap:wrap !important;flex-wrap:wrap !important}.flex-xl-nowrap{-webkit-flex-wrap:nowrap !important;flex-wrap:nowrap !important}.flex-xl-justify-start{-webkit-box-pack:start !important;-webkit-justify-content:flex-start !important;justify-content:flex-start !important}.flex-xl-justify-end{-webkit-box-pack:end !important;-webkit-justify-content:flex-end !important;justify-content:flex-end !important}.flex-xl-justify-center{-webkit-box-pack:center !important;-webkit-justify-content:center !important;justify-content:center !important}.flex-xl-justify-between{-webkit-box-pack:justify !important;-webkit-justify-content:space-between !important;justify-content:space-between !important}.flex-xl-justify-around{-webkit-justify-content:space-around !important;justify-content:space-around !important}.flex-xl-items-start{-webkit-box-align:start !important;-webkit-align-items:flex-start !important;align-items:flex-start !important}.flex-xl-items-end{-webkit-box-align:end !important;-webkit-align-items:flex-end !important;align-items:flex-end !important}.flex-xl-items-center{-webkit-box-align:center !important;-webkit-align-items:center !important;align-items:center !important}.flex-xl-items-baseline{-webkit-box-align:baseline !important;-webkit-align-items:baseline !important;align-items:baseline !important}.flex-xl-items-stretch{-webkit-box-align:stretch !important;-webkit-align-items:stretch !important;align-items:stretch !important}.flex-xl-content-start{-webkit-align-content:flex-start !important;align-content:flex-start !important}.flex-xl-content-end{-webkit-align-content:flex-end !important;align-content:flex-end !important}.flex-xl-content-center{-webkit-align-content:center !important;align-content:center !important}.flex-xl-content-between{-webkit-align-content:space-between !important;align-content:space-between !important}.flex-xl-content-around{-webkit-align-content:space-around !important;align-content:space-around !important}.flex-xl-content-stretch{-webkit-align-content:stretch !important;align-content:stretch !important}.flex-xl-auto{-webkit-box-flex:1 !important;-webkit-flex:1 1 auto !important;flex:1 1 auto !important}.flex-xl-shrink-0{-webkit-flex-shrink:0 !important;flex-shrink:0 !important}.flex-xl-self-auto{-webkit-align-self:auto !important;align-self:auto !important}.flex-xl-self-start{-webkit-align-self:flex-start !important;align-self:flex-start !important}.flex-xl-self-end{-webkit-align-self:flex-end !important;align-self:flex-end !important}.flex-xl-self-center{-webkit-align-self:center !important;align-self:center !important}.flex-xl-self-baseline{-webkit-align-self:baseline !important;align-self:baseline !important}.flex-xl-self-stretch{-webkit-align-self:stretch !important;align-self:stretch !important}.flex-xl-item-equal{-webkit-box-flex:1;-webkit-flex-grow:1;flex-grow:1;-webkit-flex-basis:0;flex-basis:0}}.position-static{position:static !important}.position-relative{position:relative !important}.position-absolute{position:absolute !important}.position-fixed{position:fixed !important}.top-0{top:0 !important}.right-0{right:0 !important}.bottom-0{bottom:0 !important}.left-0{left:0 !important}.v-align-middle{vertical-align:middle !important}.v-align-top{vertical-align:top !important}.v-align-bottom{vertical-align:bottom !important}.v-align-text-top{vertical-align:text-top !important}.v-align-text-bottom{vertical-align:text-bottom !important}.overflow-hidden{overflow:hidden !important}.overflow-scroll{overflow:scroll !important}.overflow-auto{overflow:auto !important}.clearfix::before{display:table;content:""}.clearfix::after{display:table;clear:both;content:""}.float-right{float:right !important}.float-left{float:left !important}.float-none{float:none !important}@media (min-width: 544px){.float-sm-left{float:left !important}.float-sm-right{float:right !important}.float-sm-none{float:none !important}}@media (min-width: 768px){.float-md-left{float:left !important}.float-md-right{float:right !important}.float-md-none{float:none !important}}@media (min-width: 1012px){.float-lg-left{float:left !important}.float-lg-right{float:right !important}.float-lg-none{float:none !important}}@media (min-width: 1280px){.float-xl-left{float:left !important}.float-xl-right{float:right !important}.float-xl-none{float:none !important}}.width-fit{max-width:100% !important}.width-full{width:100% !important}.height-full{height:100% !important}.min-width-0{min-width:0 !important}.direction-rtl{direction:rtl !important}.direction-ltr{direction:ltr !important}@media (min-width: 544px){.direction-sm-rtl{direction:rtl !important}.direction-sm-ltr{direction:ltr !important}}@media (min-width: 768px){.direction-md-rtl{direction:rtl !important}.direction-md-ltr{direction:ltr !important}}@media (min-width: 1012px){.direction-lg-rtl{direction:rtl !important}.direction-lg-ltr{direction:ltr !important}}@media (min-width: 1280px){.direction-xl-rtl{direction:rtl !important}.direction-xl-ltr{direction:ltr !important}}.m-0{margin:0 !important}.mt-0{margin-top:0 !important}.mr-0{margin-right:0 !important}.mb-0{margin-bottom:0 !important}.ml-0{margin-left:0 !important}.mt-n0{margin-top:-0 !important}.mr-n0{margin-right:-0 !important}.mb-n0{margin-bottom:-0 !important}.ml-n0{margin-left:-0 !important}.mx-0{margin-right:0 !important;margin-left:0 !important}.my-0{margin-top:0 !important;margin-bottom:0 !important}.m-1{margin:4px !important}.mt-1{margin-top:4px !important}.mr-1{margin-right:4px !important}.mb-1{margin-bottom:4px !important}.ml-1{margin-left:4px !important}.mt-n1{margin-top:-4px !important}.mr-n1{margin-right:-4px !important}.mb-n1{margin-bottom:-4px !important}.ml-n1{margin-left:-4px !important}.mx-1{margin-right:4px !important;margin-left:4px !important}.my-1{margin-top:4px !important;margin-bottom:4px !important}.m-2{margin:8px !important}.mt-2{margin-top:8px !important}.mr-2{margin-right:8px !important}.mb-2{margin-bottom:8px !important}.ml-2{margin-left:8px !important}.mt-n2{margin-top:-8px !important}.mr-n2{margin-right:-8px !important}.mb-n2{margin-bottom:-8px !important}.ml-n2{margin-left:-8px !important}.mx-2{margin-right:8px !important;margin-left:8px !important}.my-2{margin-top:8px !important;margin-bottom:8px !important}.m-3{margin:16px !important}.mt-3{margin-top:16px !important}.mr-3{margin-right:16px !important}.mb-3{margin-bottom:16px !important}.ml-3{margin-left:16px !important}.mt-n3{margin-top:-16px !important}.mr-n3{margin-right:-16px !important}.mb-n3{margin-bottom:-16px !important}.ml-n3{margin-left:-16px !important}.mx-3{margin-right:16px !important;margin-left:16px !important}.my-3{margin-top:16px !important;margin-bottom:16px !important}.m-4{margin:24px !important}.mt-4{margin-top:24px !important}.mr-4{margin-right:24px !important}.mb-4{margin-bottom:24px !important}.ml-4{margin-left:24px !important}.mt-n4{margin-top:-24px !important}.mr-n4{margin-right:-24px !important}.mb-n4{margin-bottom:-24px !important}.ml-n4{margin-left:-24px !important}.mx-4{margin-right:24px !important;margin-left:24px !important}.my-4{margin-top:24px !important;margin-bottom:24px !important}.m-5{margin:32px !important}.mt-5{margin-top:32px !important}.mr-5{margin-right:32px !important}.mb-5{margin-bottom:32px !important}.ml-5{margin-left:32px !important}.mt-n5{margin-top:-32px !important}.mr-n5{margin-right:-32px !important}.mb-n5{margin-bottom:-32px !important}.ml-n5{margin-left:-32px !important}.mx-5{margin-right:32px !important;margin-left:32px !important}.my-5{margin-top:32px !important;margin-bottom:32px !important}.m-6{margin:40px !important}.mt-6{margin-top:40px !important}.mr-6{margin-right:40px !important}.mb-6{margin-bottom:40px !important}.ml-6{margin-left:40px !important}.mt-n6{margin-top:-40px !important}.mr-n6{margin-right:-40px !important}.mb-n6{margin-bottom:-40px !important}.ml-n6{margin-left:-40px !important}.mx-6{margin-right:40px !important;margin-left:40px !important}.my-6{margin-top:40px !important;margin-bottom:40px !important}.mx-auto{margin-right:auto !important;margin-left:auto !important}@media (min-width: 544px){.m-sm-0{margin:0 !important}.mt-sm-0{margin-top:0 !important}.mr-sm-0{margin-right:0 !important}.mb-sm-0{margin-bottom:0 !important}.ml-sm-0{margin-left:0 !important}.mt-sm-n0{margin-top:-0 !important}.mr-sm-n0{margin-right:-0 !important}.mb-sm-n0{margin-bottom:-0 !important}.ml-sm-n0{margin-left:-0 !important}.mx-sm-0{margin-right:0 !important;margin-left:0 !important}.my-sm-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 544px){.m-sm-1{margin:4px !important}.mt-sm-1{margin-top:4px !important}.mr-sm-1{margin-right:4px !important}.mb-sm-1{margin-bottom:4px !important}.ml-sm-1{margin-left:4px !important}.mt-sm-n1{margin-top:-4px !important}.mr-sm-n1{margin-right:-4px !important}.mb-sm-n1{margin-bottom:-4px !important}.ml-sm-n1{margin-left:-4px !important}.mx-sm-1{margin-right:4px !important;margin-left:4px !important}.my-sm-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 544px){.m-sm-2{margin:8px !important}.mt-sm-2{margin-top:8px !important}.mr-sm-2{margin-right:8px !important}.mb-sm-2{margin-bottom:8px !important}.ml-sm-2{margin-left:8px !important}.mt-sm-n2{margin-top:-8px !important}.mr-sm-n2{margin-right:-8px !important}.mb-sm-n2{margin-bottom:-8px !important}.ml-sm-n2{margin-left:-8px !important}.mx-sm-2{margin-right:8px !important;margin-left:8px !important}.my-sm-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 544px){.m-sm-3{margin:16px !important}.mt-sm-3{margin-top:16px !important}.mr-sm-3{margin-right:16px !important}.mb-sm-3{margin-bottom:16px !important}.ml-sm-3{margin-left:16px !important}.mt-sm-n3{margin-top:-16px !important}.mr-sm-n3{margin-right:-16px !important}.mb-sm-n3{margin-bottom:-16px !important}.ml-sm-n3{margin-left:-16px !important}.mx-sm-3{margin-right:16px !important;margin-left:16px !important}.my-sm-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 544px){.m-sm-4{margin:24px !important}.mt-sm-4{margin-top:24px !important}.mr-sm-4{margin-right:24px !important}.mb-sm-4{margin-bottom:24px !important}.ml-sm-4{margin-left:24px !important}.mt-sm-n4{margin-top:-24px !important}.mr-sm-n4{margin-right:-24px !important}.mb-sm-n4{margin-bottom:-24px !important}.ml-sm-n4{margin-left:-24px !important}.mx-sm-4{margin-right:24px !important;margin-left:24px !important}.my-sm-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 544px){.m-sm-5{margin:32px !important}.mt-sm-5{margin-top:32px !important}.mr-sm-5{margin-right:32px !important}.mb-sm-5{margin-bottom:32px !important}.ml-sm-5{margin-left:32px !important}.mt-sm-n5{margin-top:-32px !important}.mr-sm-n5{margin-right:-32px !important}.mb-sm-n5{margin-bottom:-32px !important}.ml-sm-n5{margin-left:-32px !important}.mx-sm-5{margin-right:32px !important;margin-left:32px !important}.my-sm-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 544px){.m-sm-6{margin:40px !important}.mt-sm-6{margin-top:40px !important}.mr-sm-6{margin-right:40px !important}.mb-sm-6{margin-bottom:40px !important}.ml-sm-6{margin-left:40px !important}.mt-sm-n6{margin-top:-40px !important}.mr-sm-n6{margin-right:-40px !important}.mb-sm-n6{margin-bottom:-40px !important}.ml-sm-n6{margin-left:-40px !important}.mx-sm-6{margin-right:40px !important;margin-left:40px !important}.my-sm-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 768px){.m-md-0{margin:0 !important}.mt-md-0{margin-top:0 !important}.mr-md-0{margin-right:0 !important}.mb-md-0{margin-bottom:0 !important}.ml-md-0{margin-left:0 !important}.mt-md-n0{margin-top:-0 !important}.mr-md-n0{margin-right:-0 !important}.mb-md-n0{margin-bottom:-0 !important}.ml-md-n0{margin-left:-0 !important}.mx-md-0{margin-right:0 !important;margin-left:0 !important}.my-md-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 768px){.m-md-1{margin:4px !important}.mt-md-1{margin-top:4px !important}.mr-md-1{margin-right:4px !important}.mb-md-1{margin-bottom:4px !important}.ml-md-1{margin-left:4px !important}.mt-md-n1{margin-top:-4px !important}.mr-md-n1{margin-right:-4px !important}.mb-md-n1{margin-bottom:-4px !important}.ml-md-n1{margin-left:-4px !important}.mx-md-1{margin-right:4px !important;margin-left:4px !important}.my-md-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 768px){.m-md-2{margin:8px !important}.mt-md-2{margin-top:8px !important}.mr-md-2{margin-right:8px !important}.mb-md-2{margin-bottom:8px !important}.ml-md-2{margin-left:8px !important}.mt-md-n2{margin-top:-8px !important}.mr-md-n2{margin-right:-8px !important}.mb-md-n2{margin-bottom:-8px !important}.ml-md-n2{margin-left:-8px !important}.mx-md-2{margin-right:8px !important;margin-left:8px !important}.my-md-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 768px){.m-md-3{margin:16px !important}.mt-md-3{margin-top:16px !important}.mr-md-3{margin-right:16px !important}.mb-md-3{margin-bottom:16px !important}.ml-md-3{margin-left:16px !important}.mt-md-n3{margin-top:-16px !important}.mr-md-n3{margin-right:-16px !important}.mb-md-n3{margin-bottom:-16px !important}.ml-md-n3{margin-left:-16px !important}.mx-md-3{margin-right:16px !important;margin-left:16px !important}.my-md-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 768px){.m-md-4{margin:24px !important}.mt-md-4{margin-top:24px !important}.mr-md-4{margin-right:24px !important}.mb-md-4{margin-bottom:24px !important}.ml-md-4{margin-left:24px !important}.mt-md-n4{margin-top:-24px !important}.mr-md-n4{margin-right:-24px !important}.mb-md-n4{margin-bottom:-24px !important}.ml-md-n4{margin-left:-24px !important}.mx-md-4{margin-right:24px !important;margin-left:24px !important}.my-md-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 768px){.m-md-5{margin:32px !important}.mt-md-5{margin-top:32px !important}.mr-md-5{margin-right:32px !important}.mb-md-5{margin-bottom:32px !important}.ml-md-5{margin-left:32px !important}.mt-md-n5{margin-top:-32px !important}.mr-md-n5{margin-right:-32px !important}.mb-md-n5{margin-bottom:-32px !important}.ml-md-n5{margin-left:-32px !important}.mx-md-5{margin-right:32px !important;margin-left:32px !important}.my-md-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 768px){.m-md-6{margin:40px !important}.mt-md-6{margin-top:40px !important}.mr-md-6{margin-right:40px !important}.mb-md-6{margin-bottom:40px !important}.ml-md-6{margin-left:40px !important}.mt-md-n6{margin-top:-40px !important}.mr-md-n6{margin-right:-40px !important}.mb-md-n6{margin-bottom:-40px !important}.ml-md-n6{margin-left:-40px !important}.mx-md-6{margin-right:40px !important;margin-left:40px !important}.my-md-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 1012px){.m-lg-0{margin:0 !important}.mt-lg-0{margin-top:0 !important}.mr-lg-0{margin-right:0 !important}.mb-lg-0{margin-bottom:0 !important}.ml-lg-0{margin-left:0 !important}.mt-lg-n0{margin-top:-0 !important}.mr-lg-n0{margin-right:-0 !important}.mb-lg-n0{margin-bottom:-0 !important}.ml-lg-n0{margin-left:-0 !important}.mx-lg-0{margin-right:0 !important;margin-left:0 !important}.my-lg-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 1012px){.m-lg-1{margin:4px !important}.mt-lg-1{margin-top:4px !important}.mr-lg-1{margin-right:4px !important}.mb-lg-1{margin-bottom:4px !important}.ml-lg-1{margin-left:4px !important}.mt-lg-n1{margin-top:-4px !important}.mr-lg-n1{margin-right:-4px !important}.mb-lg-n1{margin-bottom:-4px !important}.ml-lg-n1{margin-left:-4px !important}.mx-lg-1{margin-right:4px !important;margin-left:4px !important}.my-lg-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 1012px){.m-lg-2{margin:8px !important}.mt-lg-2{margin-top:8px !important}.mr-lg-2{margin-right:8px !important}.mb-lg-2{margin-bottom:8px !important}.ml-lg-2{margin-left:8px !important}.mt-lg-n2{margin-top:-8px !important}.mr-lg-n2{margin-right:-8px !important}.mb-lg-n2{margin-bottom:-8px !important}.ml-lg-n2{margin-left:-8px !important}.mx-lg-2{margin-right:8px !important;margin-left:8px !important}.my-lg-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 1012px){.m-lg-3{margin:16px !important}.mt-lg-3{margin-top:16px !important}.mr-lg-3{margin-right:16px !important}.mb-lg-3{margin-bottom:16px !important}.ml-lg-3{margin-left:16px !important}.mt-lg-n3{margin-top:-16px !important}.mr-lg-n3{margin-right:-16px !important}.mb-lg-n3{margin-bottom:-16px !important}.ml-lg-n3{margin-left:-16px !important}.mx-lg-3{margin-right:16px !important;margin-left:16px !important}.my-lg-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 1012px){.m-lg-4{margin:24px !important}.mt-lg-4{margin-top:24px !important}.mr-lg-4{margin-right:24px !important}.mb-lg-4{margin-bottom:24px !important}.ml-lg-4{margin-left:24px !important}.mt-lg-n4{margin-top:-24px !important}.mr-lg-n4{margin-right:-24px !important}.mb-lg-n4{margin-bottom:-24px !important}.ml-lg-n4{margin-left:-24px !important}.mx-lg-4{margin-right:24px !important;margin-left:24px !important}.my-lg-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 1012px){.m-lg-5{margin:32px !important}.mt-lg-5{margin-top:32px !important}.mr-lg-5{margin-right:32px !important}.mb-lg-5{margin-bottom:32px !important}.ml-lg-5{margin-left:32px !important}.mt-lg-n5{margin-top:-32px !important}.mr-lg-n5{margin-right:-32px !important}.mb-lg-n5{margin-bottom:-32px !important}.ml-lg-n5{margin-left:-32px !important}.mx-lg-5{margin-right:32px !important;margin-left:32px !important}.my-lg-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 1012px){.m-lg-6{margin:40px !important}.mt-lg-6{margin-top:40px !important}.mr-lg-6{margin-right:40px !important}.mb-lg-6{margin-bottom:40px !important}.ml-lg-6{margin-left:40px !important}.mt-lg-n6{margin-top:-40px !important}.mr-lg-n6{margin-right:-40px !important}.mb-lg-n6{margin-bottom:-40px !important}.ml-lg-n6{margin-left:-40px !important}.mx-lg-6{margin-right:40px !important;margin-left:40px !important}.my-lg-6{margin-top:40px !important;margin-bottom:40px !important}}@media (min-width: 1280px){.m-xl-0{margin:0 !important}.mt-xl-0{margin-top:0 !important}.mr-xl-0{margin-right:0 !important}.mb-xl-0{margin-bottom:0 !important}.ml-xl-0{margin-left:0 !important}.mt-xl-n0{margin-top:-0 !important}.mr-xl-n0{margin-right:-0 !important}.mb-xl-n0{margin-bottom:-0 !important}.ml-xl-n0{margin-left:-0 !important}.mx-xl-0{margin-right:0 !important;margin-left:0 !important}.my-xl-0{margin-top:0 !important;margin-bottom:0 !important}}@media (min-width: 1280px){.m-xl-1{margin:4px !important}.mt-xl-1{margin-top:4px !important}.mr-xl-1{margin-right:4px !important}.mb-xl-1{margin-bottom:4px !important}.ml-xl-1{margin-left:4px !important}.mt-xl-n1{margin-top:-4px !important}.mr-xl-n1{margin-right:-4px !important}.mb-xl-n1{margin-bottom:-4px !important}.ml-xl-n1{margin-left:-4px !important}.mx-xl-1{margin-right:4px !important;margin-left:4px !important}.my-xl-1{margin-top:4px !important;margin-bottom:4px !important}}@media (min-width: 1280px){.m-xl-2{margin:8px !important}.mt-xl-2{margin-top:8px !important}.mr-xl-2{margin-right:8px !important}.mb-xl-2{margin-bottom:8px !important}.ml-xl-2{margin-left:8px !important}.mt-xl-n2{margin-top:-8px !important}.mr-xl-n2{margin-right:-8px !important}.mb-xl-n2{margin-bottom:-8px !important}.ml-xl-n2{margin-left:-8px !important}.mx-xl-2{margin-right:8px !important;margin-left:8px !important}.my-xl-2{margin-top:8px !important;margin-bottom:8px !important}}@media (min-width: 1280px){.m-xl-3{margin:16px !important}.mt-xl-3{margin-top:16px !important}.mr-xl-3{margin-right:16px !important}.mb-xl-3{margin-bottom:16px !important}.ml-xl-3{margin-left:16px !important}.mt-xl-n3{margin-top:-16px !important}.mr-xl-n3{margin-right:-16px !important}.mb-xl-n3{margin-bottom:-16px !important}.ml-xl-n3{margin-left:-16px !important}.mx-xl-3{margin-right:16px !important;margin-left:16px !important}.my-xl-3{margin-top:16px !important;margin-bottom:16px !important}}@media (min-width: 1280px){.m-xl-4{margin:24px !important}.mt-xl-4{margin-top:24px !important}.mr-xl-4{margin-right:24px !important}.mb-xl-4{margin-bottom:24px !important}.ml-xl-4{margin-left:24px !important}.mt-xl-n4{margin-top:-24px !important}.mr-xl-n4{margin-right:-24px !important}.mb-xl-n4{margin-bottom:-24px !important}.ml-xl-n4{margin-left:-24px !important}.mx-xl-4{margin-right:24px !important;margin-left:24px !important}.my-xl-4{margin-top:24px !important;margin-bottom:24px !important}}@media (min-width: 1280px){.m-xl-5{margin:32px !important}.mt-xl-5{margin-top:32px !important}.mr-xl-5{margin-right:32px !important}.mb-xl-5{margin-bottom:32px !important}.ml-xl-5{margin-left:32px !important}.mt-xl-n5{margin-top:-32px !important}.mr-xl-n5{margin-right:-32px !important}.mb-xl-n5{margin-bottom:-32px !important}.ml-xl-n5{margin-left:-32px !important}.mx-xl-5{margin-right:32px !important;margin-left:32px !important}.my-xl-5{margin-top:32px !important;margin-bottom:32px !important}}@media (min-width: 1280px){.m-xl-6{margin:40px !important}.mt-xl-6{margin-top:40px !important}.mr-xl-6{margin-right:40px !important}.mb-xl-6{margin-bottom:40px !important}.ml-xl-6{margin-left:40px !important}.mt-xl-n6{margin-top:-40px !important}.mr-xl-n6{margin-right:-40px !important}.mb-xl-n6{margin-bottom:-40px !important}.ml-xl-n6{margin-left:-40px !important}.mx-xl-6{margin-right:40px !important;margin-left:40px !important}.my-xl-6{margin-top:40px !important;margin-bottom:40px !important}}.p-0{padding:0 !important}.pt-0{padding-top:0 !important}.pr-0{padding-right:0 !important}.pb-0{padding-bottom:0 !important}.pl-0{padding-left:0 !important}.px-0{padding-right:0 !important;padding-left:0 !important}.py-0{padding-top:0 !important;padding-bottom:0 !important}.p-1{padding:4px !important}.pt-1{padding-top:4px !important}.pr-1{padding-right:4px !important}.pb-1{padding-bottom:4px !important}.pl-1{padding-left:4px !important}.px-1{padding-right:4px !important;padding-left:4px !important}.py-1{padding-top:4px !important;padding-bottom:4px !important}.p-2{padding:8px !important}.pt-2{padding-top:8px !important}.pr-2{padding-right:8px !important}.pb-2{padding-bottom:8px !important}.pl-2{padding-left:8px !important}.px-2{padding-right:8px !important;padding-left:8px !important}.py-2{padding-top:8px !important;padding-bottom:8px !important}.p-3{padding:16px !important}.pt-3{padding-top:16px !important}.pr-3{padding-right:16px !important}.pb-3{padding-bottom:16px !important}.pl-3{padding-left:16px !important}.px-3{padding-right:16px !important;padding-left:16px !important}.py-3{padding-top:16px !important;padding-bottom:16px !important}.p-4{padding:24px !important}.pt-4{padding-top:24px !important}.pr-4{padding-right:24px !important}.pb-4{padding-bottom:24px !important}.pl-4{padding-left:24px !important}.px-4{padding-right:24px !important;padding-left:24px !important}.py-4{padding-top:24px !important;padding-bottom:24px !important}.p-5{padding:32px !important}.pt-5{padding-top:32px !important}.pr-5{padding-right:32px !important}.pb-5{padding-bottom:32px !important}.pl-5{padding-left:32px !important}.px-5{padding-right:32px !important;padding-left:32px !important}.py-5{padding-top:32px !important;padding-bottom:32px !important}.p-6{padding:40px !important}.pt-6{padding-top:40px !important}.pr-6{padding-right:40px !important}.pb-6{padding-bottom:40px !important}.pl-6{padding-left:40px !important}.px-6{padding-right:40px !important;padding-left:40px !important}.py-6{padding-top:40px !important;padding-bottom:40px !important}@media (min-width: 544px){.p-sm-0{padding:0 !important}.pt-sm-0{padding-top:0 !important}.pr-sm-0{padding-right:0 !important}.pb-sm-0{padding-bottom:0 !important}.pl-sm-0{padding-left:0 !important}.px-sm-0{padding-right:0 !important;padding-left:0 !important}.py-sm-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 544px){.p-sm-1{padding:4px !important}.pt-sm-1{padding-top:4px !important}.pr-sm-1{padding-right:4px !important}.pb-sm-1{padding-bottom:4px !important}.pl-sm-1{padding-left:4px !important}.px-sm-1{padding-right:4px !important;padding-left:4px !important}.py-sm-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 544px){.p-sm-2{padding:8px !important}.pt-sm-2{padding-top:8px !important}.pr-sm-2{padding-right:8px !important}.pb-sm-2{padding-bottom:8px !important}.pl-sm-2{padding-left:8px !important}.px-sm-2{padding-right:8px !important;padding-left:8px !important}.py-sm-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 544px){.p-sm-3{padding:16px !important}.pt-sm-3{padding-top:16px !important}.pr-sm-3{padding-right:16px !important}.pb-sm-3{padding-bottom:16px !important}.pl-sm-3{padding-left:16px !important}.px-sm-3{padding-right:16px !important;padding-left:16px !important}.py-sm-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 544px){.p-sm-4{padding:24px !important}.pt-sm-4{padding-top:24px !important}.pr-sm-4{padding-right:24px !important}.pb-sm-4{padding-bottom:24px !important}.pl-sm-4{padding-left:24px !important}.px-sm-4{padding-right:24px !important;padding-left:24px !important}.py-sm-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 544px){.p-sm-5{padding:32px !important}.pt-sm-5{padding-top:32px !important}.pr-sm-5{padding-right:32px !important}.pb-sm-5{padding-bottom:32px !important}.pl-sm-5{padding-left:32px !important}.px-sm-5{padding-right:32px !important;padding-left:32px !important}.py-sm-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 544px){.p-sm-6{padding:40px !important}.pt-sm-6{padding-top:40px !important}.pr-sm-6{padding-right:40px !important}.pb-sm-6{padding-bottom:40px !important}.pl-sm-6{padding-left:40px !important}.px-sm-6{padding-right:40px !important;padding-left:40px !important}.py-sm-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 768px){.p-md-0{padding:0 !important}.pt-md-0{padding-top:0 !important}.pr-md-0{padding-right:0 !important}.pb-md-0{padding-bottom:0 !important}.pl-md-0{padding-left:0 !important}.px-md-0{padding-right:0 !important;padding-left:0 !important}.py-md-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 768px){.p-md-1{padding:4px !important}.pt-md-1{padding-top:4px !important}.pr-md-1{padding-right:4px !important}.pb-md-1{padding-bottom:4px !important}.pl-md-1{padding-left:4px !important}.px-md-1{padding-right:4px !important;padding-left:4px !important}.py-md-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 768px){.p-md-2{padding:8px !important}.pt-md-2{padding-top:8px !important}.pr-md-2{padding-right:8px !important}.pb-md-2{padding-bottom:8px !important}.pl-md-2{padding-left:8px !important}.px-md-2{padding-right:8px !important;padding-left:8px !important}.py-md-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 768px){.p-md-3{padding:16px !important}.pt-md-3{padding-top:16px !important}.pr-md-3{padding-right:16px !important}.pb-md-3{padding-bottom:16px !important}.pl-md-3{padding-left:16px !important}.px-md-3{padding-right:16px !important;padding-left:16px !important}.py-md-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 768px){.p-md-4{padding:24px !important}.pt-md-4{padding-top:24px !important}.pr-md-4{padding-right:24px !important}.pb-md-4{padding-bottom:24px !important}.pl-md-4{padding-left:24px !important}.px-md-4{padding-right:24px !important;padding-left:24px !important}.py-md-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 768px){.p-md-5{padding:32px !important}.pt-md-5{padding-top:32px !important}.pr-md-5{padding-right:32px !important}.pb-md-5{padding-bottom:32px !important}.pl-md-5{padding-left:32px !important}.px-md-5{padding-right:32px !important;padding-left:32px !important}.py-md-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 768px){.p-md-6{padding:40px !important}.pt-md-6{padding-top:40px !important}.pr-md-6{padding-right:40px !important}.pb-md-6{padding-bottom:40px !important}.pl-md-6{padding-left:40px !important}.px-md-6{padding-right:40px !important;padding-left:40px !important}.py-md-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 1012px){.p-lg-0{padding:0 !important}.pt-lg-0{padding-top:0 !important}.pr-lg-0{padding-right:0 !important}.pb-lg-0{padding-bottom:0 !important}.pl-lg-0{padding-left:0 !important}.px-lg-0{padding-right:0 !important;padding-left:0 !important}.py-lg-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 1012px){.p-lg-1{padding:4px !important}.pt-lg-1{padding-top:4px !important}.pr-lg-1{padding-right:4px !important}.pb-lg-1{padding-bottom:4px !important}.pl-lg-1{padding-left:4px !important}.px-lg-1{padding-right:4px !important;padding-left:4px !important}.py-lg-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 1012px){.p-lg-2{padding:8px !important}.pt-lg-2{padding-top:8px !important}.pr-lg-2{padding-right:8px !important}.pb-lg-2{padding-bottom:8px !important}.pl-lg-2{padding-left:8px !important}.px-lg-2{padding-right:8px !important;padding-left:8px !important}.py-lg-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 1012px){.p-lg-3{padding:16px !important}.pt-lg-3{padding-top:16px !important}.pr-lg-3{padding-right:16px !important}.pb-lg-3{padding-bottom:16px !important}.pl-lg-3{padding-left:16px !important}.px-lg-3{padding-right:16px !important;padding-left:16px !important}.py-lg-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 1012px){.p-lg-4{padding:24px !important}.pt-lg-4{padding-top:24px !important}.pr-lg-4{padding-right:24px !important}.pb-lg-4{padding-bottom:24px !important}.pl-lg-4{padding-left:24px !important}.px-lg-4{padding-right:24px !important;padding-left:24px !important}.py-lg-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 1012px){.p-lg-5{padding:32px !important}.pt-lg-5{padding-top:32px !important}.pr-lg-5{padding-right:32px !important}.pb-lg-5{padding-bottom:32px !important}.pl-lg-5{padding-left:32px !important}.px-lg-5{padding-right:32px !important;padding-left:32px !important}.py-lg-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 1012px){.p-lg-6{padding:40px !important}.pt-lg-6{padding-top:40px !important}.pr-lg-6{padding-right:40px !important}.pb-lg-6{padding-bottom:40px !important}.pl-lg-6{padding-left:40px !important}.px-lg-6{padding-right:40px !important;padding-left:40px !important}.py-lg-6{padding-top:40px !important;padding-bottom:40px !important}}@media (min-width: 1280px){.p-xl-0{padding:0 !important}.pt-xl-0{padding-top:0 !important}.pr-xl-0{padding-right:0 !important}.pb-xl-0{padding-bottom:0 !important}.pl-xl-0{padding-left:0 !important}.px-xl-0{padding-right:0 !important;padding-left:0 !important}.py-xl-0{padding-top:0 !important;padding-bottom:0 !important}}@media (min-width: 1280px){.p-xl-1{padding:4px !important}.pt-xl-1{padding-top:4px !important}.pr-xl-1{padding-right:4px !important}.pb-xl-1{padding-bottom:4px !important}.pl-xl-1{padding-left:4px !important}.px-xl-1{padding-right:4px !important;padding-left:4px !important}.py-xl-1{padding-top:4px !important;padding-bottom:4px !important}}@media (min-width: 1280px){.p-xl-2{padding:8px !important}.pt-xl-2{padding-top:8px !important}.pr-xl-2{padding-right:8px !important}.pb-xl-2{padding-bottom:8px !important}.pl-xl-2{padding-left:8px !important}.px-xl-2{padding-right:8px !important;padding-left:8px !important}.py-xl-2{padding-top:8px !important;padding-bottom:8px !important}}@media (min-width: 1280px){.p-xl-3{padding:16px !important}.pt-xl-3{padding-top:16px !important}.pr-xl-3{padding-right:16px !important}.pb-xl-3{padding-bottom:16px !important}.pl-xl-3{padding-left:16px !important}.px-xl-3{padding-right:16px !important;padding-left:16px !important}.py-xl-3{padding-top:16px !important;padding-bottom:16px !important}}@media (min-width: 1280px){.p-xl-4{padding:24px !important}.pt-xl-4{padding-top:24px !important}.pr-xl-4{padding-right:24px !important}.pb-xl-4{padding-bottom:24px !important}.pl-xl-4{padding-left:24px !important}.px-xl-4{padding-right:24px !important;padding-left:24px !important}.py-xl-4{padding-top:24px !important;padding-bottom:24px !important}}@media (min-width: 1280px){.p-xl-5{padding:32px !important}.pt-xl-5{padding-top:32px !important}.pr-xl-5{padding-right:32px !important}.pb-xl-5{padding-bottom:32px !important}.pl-xl-5{padding-left:32px !important}.px-xl-5{padding-right:32px !important;padding-left:32px !important}.py-xl-5{padding-top:32px !important;padding-bottom:32px !important}}@media (min-width: 1280px){.p-xl-6{padding:40px !important}.pt-xl-6{padding-top:40px !important}.pr-xl-6{padding-right:40px !important}.pb-xl-6{padding-bottom:40px !important}.pl-xl-6{padding-left:40px !important}.px-xl-6{padding-right:40px !important;padding-left:40px !important}.py-xl-6{padding-top:40px !important;padding-bottom:40px !important}}.h1{font-size:26px !important}@media (min-width: 768px){.h1{font-size:32px !important}}.h2{font-size:22px !important}@media (min-width: 768px){.h2{font-size:24px !important}}.h3{font-size:18px !important}@media (min-width: 768px){.h3{font-size:20px !important}}.h4{font-size:16px !important}@media (min-width: 768px){.h4{font-size:16px !important}}.h5{font-size:14px !important}.h6{font-size:12px !important}.h1,.h2,.h3,.h4,.h5,.h6{font-weight:600 !important}.f1{font-size:26px !important}@media (min-width: 768px){.f1{font-size:32px !important}}.f2{font-size:22px !important}@media (min-width: 768px){.f2{font-size:24px !important}}.f3{font-size:18px !important}@media (min-width: 768px){.f3{font-size:20px !important}}.f4{font-size:16px !important}@media (min-width: 768px){.f4{font-size:16px !important}}.f5{font-size:14px !important}.f6{font-size:12px !important}.f00-light{font-size:40px !important;font-weight:300 !important}@media (min-width: 768px){.f00-light{font-size:48px !important}}.f0-light{font-size:32px !important;font-weight:300 !important}@media (min-width: 768px){.f0-light{font-size:40px !important}}.f1-light{font-size:26px !important;font-weight:300 !important}@media (min-width: 768px){.f1-light{font-size:32px !important}}.f2-light{font-size:22px !important;font-weight:300 !important}@media (min-width: 768px){.f2-light{font-size:24px !important}}.f3-light{font-size:18px !important;font-weight:300 !important}@media (min-width: 768px){.f3-light{font-size:20px !important}}.text-small{font-size:12px !important}.lead{margin-bottom:30px;font-size:20px;font-weight:300;color:#555}.lh-condensed-ultra{line-height:1 !important}.lh-condensed{line-height:1.25 !important}.lh-default{line-height:1.5 !important}.text-right{text-align:right !important}.text-left{text-align:left !important}.text-center{text-align:center !important}@media (min-width: 544px){.text-sm-right{text-align:right !important}.text-sm-left{text-align:left !important}.text-sm-center{text-align:center !important}}@media (min-width: 768px){.text-md-right{text-align:right !important}.text-md-left{text-align:left !important}.text-md-center{text-align:center !important}}@media (min-width: 1012px){.text-lg-right{text-align:right !important}.text-lg-left{text-align:left !important}.text-lg-center{text-align:center !important}}@media (min-width: 1280px){.text-xl-right{text-align:right !important}.text-xl-left{text-align:left !important}.text-xl-center{text-align:center !important}}.text-normal{font-weight:normal !important}.text-bold{font-weight:600 !important}.text-italic{font-style:italic !important}.text-uppercase{text-transform:uppercase !important}.no-underline{text-decoration:none !important}.no-wrap{white-space:nowrap !important}.wb-break-all{word-break:break-all !important}.text-emphasized{font-weight:600;color:#24292e}.list-style-none{list-style:none !important}.text-shadow-dark{text-shadow:0 1px 1px rgba(0,0,0,0.25),0 1px 25px rgba(0,0,0,0.75)}.text-shadow-light{text-shadow:0 1px 0 rgba(255,255,255,0.5)}.v-hidden{visibility:hidden !important}.v-visible{visibility:visible !important}.d-table{display:table !important}.d-table-cell{display:table-cell !important}.table-fixed{table-layout:fixed !important}.d-block{display:block !important}.d-inline{display:inline !important}.d-inline-block{display:inline-block !important}.d-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-none{display:none !important}@media (min-width: 544px){.d-sm-table{display:table !important}.d-sm-table-cell{display:table-cell !important}.d-sm-block{display:block !important}.d-sm-inline{display:inline !important}.d-sm-inline-block{display:inline-block !important}.d-sm-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-sm-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-sm-none{display:none !important}}@media (min-width: 768px){.d-md-table{display:table !important}.d-md-table-cell{display:table-cell !important}.d-md-block{display:block !important}.d-md-inline{display:inline !important}.d-md-inline-block{display:inline-block !important}.d-md-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-md-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-md-none{display:none !important}}@media (min-width: 1012px){.d-lg-table{display:table !important}.d-lg-table-cell{display:table-cell !important}.d-lg-block{display:block !important}.d-lg-inline{display:inline !important}.d-lg-inline-block{display:inline-block !important}.d-lg-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-lg-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-lg-none{display:none !important}}@media (min-width: 1280px){.d-xl-table{display:table !important}.d-xl-table-cell{display:table-cell !important}.d-xl-block{display:block !important}.d-xl-inline{display:inline !important}.d-xl-inline-block{display:inline-block !important}.d-xl-flex{display:-webkit-box !important;display:-webkit-flex !important;display:flex !important}.d-xl-inline-flex{display:-webkit-inline-box !important;display:-webkit-inline-flex !important;display:inline-flex !important}.d-xl-none{display:none !important}}@media (max-width: 544px){.hide-sm{display:none !important}}@media (min-width: 544px) and (max-width: 768px){.hide-md{display:none !important}}@media (min-width: 768px) and (max-width: 1012px){.hide-lg{display:none !important}}@media (min-width: 1012px){.hide-xl{display:none !important}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);word-wrap:normal;border:0}.Details--on .Details-content--shown{display:none !important}.Details:not(.Details--on) .Details-content--hidden{display:none !important}
.flash{position:relative;padding:16px;color:#032f62;background-color:#dbedff;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.flash p:last-child{margin-bottom:0}.flash-messages{margin-bottom:24px}.flash-close{float:right;padding:16px;margin:-16px;color:inherit;text-align:center;cursor:pointer;background:none;border:0;-webkit-appearance:none;-moz-appearance:none;appearance:none;opacity:0.6}.flash-close:hover{opacity:1}.flash-action{float:right;margin-top:-3px;margin-left:24px}.flash-warn{color:#735c0f;background-color:#fffbdd;border-color:rgba(27,31,35,0.15)}.flash-error{color:#86181d;background-color:#ffdce0;border-color:rgba(27,31,35,0.15)}.flash-success{color:#165c26;background-color:#dcffe4;border-color:rgba(27,31,35,0.15)}.flash-full{margin-top:-1px;border-width:1px 0;border-radius:0}.warning{padding:0.5em;margin-bottom:0.8em;font-weight:600;background-color:#fffbdd}.avatar{display:inline-block;overflow:hidden;line-height:1;vertical-align:middle;border-radius:3px}.avatar-small{border-radius:2px}.avatar-link{float:left;line-height:1}.avatar-group-item{display:inline-block;margin-bottom:3px}.avatar-parent-child{position:relative}.avatar-child{position:absolute;right:-15%;bottom:-9%;background-color:#fff;border-radius:2px;box-shadow:-2px -2px 0 rgba(255,255,255,0.8)}.avatar-stack{display:inline-block;white-space:nowrap}.avatar-stack .avatar{position:relative;z-index:2;display:inline-block;width:20px;height:20px;box-sizing:content-box;margin-right:-15px;background-color:#fff;border-right:1px solid #fff;border-radius:2px;-webkit-transition:margin 0.1s ease-in-out;transition:margin 0.1s ease-in-out}.avatar-stack .avatar:only-child{background-color:transparent}.avatar-stack .avatar:first-child{z-index:3}.avatar-stack .avatar:last-child{z-index:1;margin-right:0;border-right:0}.avatar-stack:hover .avatar{margin-right:3px}.avatar-stack:hover .avatar:last-child{margin-right:0}.CircleBadge{display:-webkit-box;display:-webkit-flex;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-webkit-box-pack:center;-webkit-justify-content:center;justify-content:center;background-color:#fff;border-radius:50%;box-shadow:0 1px 5px rgba(0,0,0,0.15)}.CircleBadge-icon{max-width:60% !important;height:auto !important;max-height:55% !important}.CircleBadge--small{width:56px;height:56px}.CircleBadge--medium{width:96px;height:96px}.CircleBadge--large{width:128px;height:128px}.DashedConnection{position:relative}.DashedConnection::before{position:absolute;top:50%;left:0;width:100%;content:"";border-bottom:2px dashed #e1e4e8}.DashedConnection .CircleBadge{position:relative}.blankslate{position:relative;padding:32px;text-align:center;background-color:#fafbfc;border:1px solid #e1e4e8;border-radius:3px;box-shadow:inset 0 0 10px rgba(27,31,35,0.05)}.blankslate code{padding:2px 5px 3px;font-size:14px;background:#fff;border:1px solid #eaecef;border-radius:3px}.blankslate-icon{margin-right:4px;margin-bottom:8px;margin-left:4px;color:#a3aab1}.blankslate-capped{border-radius:0 0 3px 3px}.blankslate-spacious{padding:80px 40px}.blankslate-narrow{width:485px;margin:0 auto}.blankslate-large h3{margin:16px 0;font-size:20px}.blankslate-large p{font-size:16px}.blankslate-clean-background{background:none;border:0;box-shadow:none}.markdown-body{font-family:-apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";font-size:16px;line-height:1.5;word-wrap:break-word}.markdown-body::before{display:table;content:""}.markdown-body::after{display:table;clear:both;content:""}.markdown-body>*:first-child{margin-top:0 !important}.markdown-body>*:last-child{margin-bottom:0 !important}.markdown-body a:not([href]){color:inherit;text-decoration:none}.markdown-body .absent{color:#cb2431}.markdown-body .anchor{float:left;padding-right:4px;margin-left:-20px;line-height:1}.markdown-body .anchor:focus{outline:none}.markdown-body p,.markdown-body blockquote,.markdown-body ul,.markdown-body ol,.markdown-body dl,.markdown-body table,.markdown-body pre{margin-top:0;margin-bottom:16px}.markdown-body hr{height:0.25em;padding:0;margin:24px 0;background-color:#e1e4e8;border:0}.markdown-body blockquote{padding:0 1em;color:#6a737d;border-left:0.25em solid #dfe2e5}.markdown-body blockquote>:first-child{margin-top:0}.markdown-body blockquote>:last-child{margin-bottom:0}.markdown-body kbd{display:inline-block;padding:3px 5px;font-size:11px;line-height:10px;color:#444d56;vertical-align:middle;background-color:#fafbfc;border:solid 1px #c6cbd1;border-bottom-color:#959da5;border-radius:3px;box-shadow:inset 0 -1px 0 #959da5}.markdown-body h1,.markdown-body h2,.markdown-body h3,.markdown-body h4,.markdown-body h5,.markdown-body h6{margin-top:24px;margin-bottom:16px;font-weight:600;line-height:1.25}.markdown-body h1 .octicon-link,.markdown-body h2 .octicon-link,.markdown-body h3 .octicon-link,.markdown-body h4 .octicon-link,.markdown-body h5 .octicon-link,.markdown-body h6 .octicon-link{color:#1b1f23;vertical-align:middle;visibility:hidden}.markdown-body h1:hover .anchor,.markdown-body h2:hover .anchor,.markdown-body h3:hover .anchor,.markdown-body h4:hover .anchor,.markdown-body h5:hover .anchor,.markdown-body h6:hover .anchor{text-decoration:none}.markdown-body h1:hover .anchor .octicon-link,.markdown-body h2:hover .anchor .octicon-link,.markdown-body h3:hover .anchor .octicon-link,.markdown-body h4:hover .anchor .octicon-link,.markdown-body h5:hover .anchor .octicon-link,.markdown-body h6:hover .anchor .octicon-link{visibility:visible}.markdown-body h1 tt,.markdown-body h1 code,.markdown-body h2 tt,.markdown-body h2 code,.markdown-body h3 tt,.markdown-body h3 code,.markdown-body h4 tt,.markdown-body h4 code,.markdown-body h5 tt,.markdown-body h5 code,.markdown-body h6 tt,.markdown-body h6 code{font-size:inherit}.markdown-body h1{padding-bottom:0.3em;font-size:2em;border-bottom:1px solid #eaecef}.markdown-body h2{padding-bottom:0.3em;font-size:1.5em;border-bottom:1px solid #eaecef}.markdown-body h3{font-size:1.25em}.markdown-body h4{font-size:1em}.markdown-body h5{font-size:0.875em}.markdown-body h6{font-size:0.85em;color:#6a737d}.markdown-body ul,.markdown-body ol{padding-left:2em}.markdown-body ul.no-list,.markdown-body ol.no-list{padding:0;list-style-type:none}.markdown-body ul ul,.markdown-body ul ol,.markdown-body ol ol,.markdown-body ol ul{margin-top:0;margin-bottom:0}.markdown-body li>p{margin-top:16px}.markdown-body li+li{margin-top:0.25em}.markdown-body dl{padding:0}.markdown-body dl dt{padding:0;margin-top:16px;font-size:1em;font-style:italic;font-weight:600}.markdown-body dl dd{padding:0 16px;margin-bottom:16px}.markdown-body table{display:block;width:100%;overflow:auto}.markdown-body table th{font-weight:600}.markdown-body table th,.markdown-body table td{padding:6px 13px;border:1px solid #dfe2e5}.markdown-body table tr{background-color:#fff;border-top:1px solid #c6cbd1}.markdown-body table tr:nth-child(2n){background-color:#f6f8fa}.markdown-body table img{background-color:transparent}.markdown-body img{max-width:100%;box-sizing:content-box;background-color:#fff}.markdown-body img[align=right]{padding-left:20px}.markdown-body img[align=left]{padding-right:20px}.markdown-body .emoji{max-width:none;vertical-align:text-top;background-color:transparent}.markdown-body span.frame{display:block;overflow:hidden}.markdown-body span.frame>span{display:block;float:left;width:auto;padding:7px;margin:13px 0 0;overflow:hidden;border:1px solid #dfe2e5}.markdown-body span.frame span img{display:block;float:left}.markdown-body span.frame span span{display:block;padding:5px 0 0;clear:both;color:#24292e}.markdown-body span.align-center{display:block;overflow:hidden;clear:both}.markdown-body span.align-center>span{display:block;margin:13px auto 0;overflow:hidden;text-align:center}.markdown-body span.align-center span img{margin:0 auto;text-align:center}.markdown-body span.align-right{display:block;overflow:hidden;clear:both}.markdown-body span.align-right>span{display:block;margin:13px 0 0;overflow:hidden;text-align:right}.markdown-body span.align-right span img{margin:0;text-align:right}.markdown-body span.float-left{display:block;float:left;margin-right:13px;overflow:hidden}.markdown-body span.float-left span{margin:13px 0 0}.markdown-body span.float-right{display:block;float:right;margin-left:13px;overflow:hidden}.markdown-body span.float-right>span{display:block;margin:13px auto 0;overflow:hidden;text-align:right}.markdown-body code,.markdown-body tt{padding:0;padding-top:0.2em;padding-bottom:0.2em;margin:0;font-size:85%;background-color:rgba(27,31,35,0.05);border-radius:3px}.markdown-body code::before,.markdown-body code::after,.markdown-body tt::before,.markdown-body tt::after{letter-spacing:-0.2em;content:"\00a0"}.markdown-body code br,.markdown-body tt br{display:none}.markdown-body del code{text-decoration:inherit}.markdown-body pre{word-wrap:normal}.markdown-body pre>code{padding:0;margin:0;font-size:100%;word-break:normal;white-space:pre;background:transparent;border:0}.markdown-body .highlight{margin-bottom:16px}.markdown-body .highlight pre{margin-bottom:0;word-break:normal}.markdown-body .highlight pre,.markdown-body pre{padding:16px;overflow:auto;font-size:85%;line-height:1.45;background-color:#f6f8fa;border-radius:3px}.markdown-body pre code,.markdown-body pre tt{display:inline;max-width:auto;padding:0;margin:0;overflow:visible;line-height:inherit;word-wrap:normal;background-color:transparent;border:0}.markdown-body pre code::before,.markdown-body pre code::after,.markdown-body pre tt::before,.markdown-body pre tt::after{content:normal}.markdown-body .csv-data td,.markdown-body .csv-data th{padding:5px;overflow:hidden;font-size:12px;line-height:1;text-align:left;white-space:nowrap}.markdown-body .csv-data .blob-num{padding:10px 8px 9px;text-align:right;background:#fff;border:0}.markdown-body .csv-data tr{border-top:0}.markdown-body .csv-data th{font-weight:600;background:#f6f8fa;border-top:0}.state{display:inline-block;padding:4px 8px;font-weight:600;line-height:20px;color:#fff;text-align:center;background-color:#959da5;border-radius:3px}.state-open,.state-proposed,.state-reopened{background-color:#2cbe4e}.state-merged{background-color:#6f42c1}.state-closed{background-color:#cb2431}.state-renamed{background-color:#ffd33d}.table-list{display:table;width:100%;color:#6a737d;table-layout:fixed;border-bottom:1px solid #d1d5da}.table-list ol{list-style-type:decimal}.table-list-bordered{border-bottom-color:#eaecef}.table-list-bordered .table-list-cell:first-child{border-left:1px solid #eaecef}.table-list-bordered .table-list-cell:last-child{border-right:1px solid #eaecef}.table-list-item{position:relative;display:table-row;list-style:none}.table-list-item.unread .table-list-cell:first-child{box-shadow:2px 0 0 #0366d6 inset}.table-list-cell{position:relative;display:table-cell;padding:8px 10px;font-size:12px;vertical-align:top;border-top:1px solid #eaecef}.table-list-cell.flush-left{padding-left:0}.table-list-cell.flush-right{padding-right:0}.table-list-cell-checkbox{width:30px;padding-right:0;padding-left:0;text-align:center}.table-list-header{position:relative;margin-top:20px;background-color:#f6f8fa;border:1px solid #e1e4e8;border-radius:3px 3px 0 0}.table-list-header::before{display:table;content:""}.table-list-header::after{display:table;clear:both;content:""}.table-list-header .btn-link{position:relative;display:inline-block;padding-top:13px;padding-bottom:13px;font-weight:normal}.table-list-heading{margin-left:10px}.table-list-header-select-all{float:left;width:30px;padding:12px 10px;margin-right:5px;margin-left:-1px;text-align:center}.table-list-header-meta{display:inline-block;padding-top:13px;padding-bottom:13px;color:#586069}.table-list-header-toggle h4{padding:12px 0}.table-list-filters:first-child .table-list-header-toggle:first-child{padding-left:16px}.table-list-header-toggle.states .selected{font-weight:600}.table-list-header-toggle .btn-link{color:#586069}.table-list-header-toggle .btn-link .octicon{margin-right:2px}.table-list-header-toggle .btn-link:hover{color:#222;text-decoration:none}.table-list-header-toggle .btn-link.selected,.table-list-header-toggle .btn-link.selected:hover{color:#222}.table-list-header-toggle .btn-link+.btn-link{margin-left:10px}.table-list-header-toggle .btn-link:disabled,.table-list-header-toggle .btn-link.disabled{pointer-events:none;opacity:0.5}.table-list-header-toggle .select-menu{position:relative}.table-list-header-toggle .select-menu-item.selected{font-weight:600}.table-list-header-toggle .select-menu-button{padding-right:15px;padding-left:15px}.table-list-header-toggle .select-menu-button:hover,.table-list-header-toggle .select-menu-button.selected,.table-list-header-toggle .select-menu-button.selected:hover{color:#222}.table-list-header-toggle .select-menu-modal-holder{right:10px}.table-list-header-toggle .select-menu-modal-holder .select-menu-modal{margin-top:-1px}.table-list-header-next{margin-top:20px;margin-bottom:-1px}.table-list-header-next .table-list-header-select-all{padding-left:14px}.table-list-header-next .select-all-dropdown{padding-top:10px;padding-bottom:10px}.bulk-actions-header{position:-webkit-sticky;position:sticky;top:0;z-index:32;height:50px}.bulk-actions-header.is-stuck{background-color:#fff;border-color:transparent}.bulk-actions-header.is-stuck::after{position:fixed;top:0;right:0;left:0;z-index:-1;display:block;height:50px;content:"";border-bottom:1px solid rgba(27,31,35,0.1);box-shadow:0 1px 2px rgba(27,31,35,0.075)}.table-list-triage{display:none}.triage-mode .table-list-filters{display:none}.triage-mode .table-list-triage{display:block}.autocomplete-results{position:absolute;z-index:99;display:none;max-height:20em;overflow-y:auto;font-size:13px;list-style:none;background:#fff;border-radius:3px;box-shadow:0 0 5px rgba(27,31,35,0.3)}.autocomplete-results .no-results{display:none}.autocomplete-group{width:100%;overflow:hidden}.autocomplete-item{display:block;padding:5px;overflow:hidden;font-weight:600;text-decoration:none;text-overflow:ellipsis;white-space:nowrap;cursor:pointer}.autocomplete-item.selected,.autocomplete-item.navigation-focus{color:#fff;text-decoration:none;background-color:#0366d6}.autocomplete-item.selected .organization-member,.autocomplete-item.selected .ldap-group-dn,.autocomplete-item.navigation-focus .organization-member,.autocomplete-item.navigation-focus .ldap-group-dn{color:#f2f2f2}.autocomplete-item .secondary-label{font-weight:normal}.autocomplete-item .organization-member{float:right;padding-top:1px;color:#808080}.suggester-container{position:absolute;top:0;left:0;z-index:30;-webkit-transform:translateZ(0);transform:translateZ(0)}.suggester{position:relative;top:0;left:0;display:none;min-width:180px;margin-top:20px;background:#fff;border:1px solid #dfe2e5;border-radius:3px;box-shadow:0 0 5px rgba(27,31,35,0.1)}.suggester.active{display:block}.suggester ul{padding:0;margin:0;list-style:none}.suggester li{display:block;padding:5px 10px;font-weight:600;border-bottom:1px solid #dfe2e5}.suggester li small{font-weight:normal;color:#586069}.suggester li:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.suggester li:first-child a{border-top-left-radius:3px;border-top-right-radius:3px}.suggester li.navigation-focus{color:#fff;text-decoration:none;background:#0366d6}.suggester li.navigation-focus small{color:#fff}.boxed-group{position:relative;margin-bottom:30px;border-radius:3px}.boxed-group .counter{color:#fff;background-color:rgba(47,54,61,0.5)}.boxed-group.flush .boxed-group-inner{padding:0}.boxed-group.condensed .boxed-group-inner{padding:0;font-size:12px}.boxed-group>h3,.boxed-group .heading{display:block;padding:9px 10px 10px;margin:0;font-size:14px;line-height:17px;background-color:#f6f8fa;border:1px solid rgba(27,31,35,0.15);border-bottom:0;border-radius:3px 3px 0 0}.boxed-group>h3 a,.boxed-group .heading a{color:inherit}.boxed-group>h3 a.boxed-group-breadcrumb,.boxed-group .heading a.boxed-group-breadcrumb{font-weight:normal;color:#586069;text-decoration:none}.boxed-group>h3 .avatar,.boxed-group .heading .avatar{margin-top:-4px}.boxed-group .tabnav.heading{padding:0}.boxed-group .tabnav.heading .tabnav-tab.selected{border-top:0}.boxed-group .tabnav.heading li:first-child .selected{border-left-color:#fff;border-top-left-radius:3px}.boxed-group .tabnav-tab{border-top:0;border-radius:0}.boxed-group code.heading{font-size:12px}.boxed-group.dangerzone>h3{color:#fff;background-color:#d73a49;border:1px solid #9e1c23}.boxed-group.dangerzone .boxed-group-inner{border-top:0}.boxed-group.condensed>h3{padding:6px 6px 7px;font-size:12px}.boxed-group.condensed>h3 .octicon{padding:0 6px 0 2px}.one-half .boxed-group,.dashboard-sidebar .boxed-group{margin-bottom:20px}.boxed-group .bleed-flush{width:100%;padding:0 10px;margin-left:-10px}.boxed-group .compact{margin-top:10px;margin-bottom:10px}.boxed-group-inner{padding:10px;color:#586069;background:#fff;border:1px solid #d1d5da;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.boxed-group-inner .markdown-body{padding:20px 10px 10px;font-size:13px}.boxed-group-inner.markdown-body{padding-top:10px;padding-bottom:10px}.boxed-group-inner.inline-error{padding-top:40px;padding-bottom:40px;text-align:center}.boxed-group-inner.seamless{padding:0}.boxed-group-inner .tabnav{padding-right:10px;padding-left:10px;margin-right:-10px;margin-left:-10px}.boxed-group-inner .tabnav-tab.selected{border-top:1px solid #dfe2e5}.boxed-group-inner .help{padding:1em 10px 1em 35px;margin:1em -10px -10px;clear:both;color:#586069;border-top:1px solid #dfe2e5}.boxed-group-inner .help .octicon{margin-right:5px;margin-left:-25px}.boxed-group-inner .boxed-group-list+.help{margin-top:0}.boxed-action{float:right;margin-left:10px}.boxed-group-action{position:relative;z-index:2;float:right;margin:5px 10px 0 0}.boxed-group-action.flush{margin-top:0;margin-right:0}.field-with-errors{display:inline}.compact-options{margin:-6px 0 13px}.compact-options>li{display:inline-block;margin:0 12px 0 0;font-weight:600;list-style-type:none}.compact-options>li label{float:left}.compact-options>li .spinner{display:block;float:left;width:16px;height:16px;margin-left:5px}.boxed-group-list{margin:0;list-style:none}.boxed-group-list:first-child>li:first-child{border-top:0}.boxed-group-list>li{display:block;padding:5px 10px;margin-right:-10px;margin-left:-10px;line-height:23px;border-bottom:1px solid #e1e4e8}.boxed-group-list>li:first-child{border-top:1px solid #dfe2e5}.boxed-group-list>li:last-of-type{border-bottom:0}.boxed-group-list>li.selected{background:#dcffe4}.boxed-group-list>li.approved .btn-sm,.boxed-group-list>li.rejected .btn-sm{display:none}.boxed-group-list>li.rejected a{text-decoration:line-through}.boxed-group-list>li .avatar{margin-top:-2px;margin-right:4px}.boxed-group-list>li .octicon{width:24px;margin-right:4px}.boxed-group-list>li .btn-sm{float:right;margin:-1px 0 0 10px}.boxed-group-list>li .BtnGroup{float:right}.boxed-group-list>li .BtnGroup .btn-sm{float:left}.boxed-group.flush .boxed-group-list li{width:auto;padding-right:0;padding-left:0;margin-left:0}.boxed-group-list.standalone{margin-top:-1px}.boxed-group-list.standalone>li:first-child{border-top:0}.boxed-group-standalone{margin-top:-10px;margin-bottom:-10px}.boxed-group-standalone>li:last-child{border-radius:0 0 2px 2px}.boxed-group-table{width:100%;text-align:left}.boxed-group-table tr:last-child td{border-bottom:0}.boxed-group-table th{padding:9px;background-color:#fafbfc;border-bottom:1px solid #eaecef}.boxed-group-table td{padding:9px;vertical-align:top;border-bottom:1px solid #eaecef}.ajax-error-message{position:fixed;top:-200px;left:50%;z-index:9999;display:none;width:974px;margin:0 3px;margin-left:-487px;-webkit-transition:top 0.5s ease-in-out;transition:top 0.5s ease-in-out}.ajax-error-message.visible{top:0;display:block}.ajax-error-message>.octicon-alert{vertical-align:text-top}.boxed-group-success,.boxed-group-warning,.boxed-group-info{padding:10px 15px;margin:-10px -10px 10px;border-style:solid;border-width:1px 0}.boxed-group-success .btn-sm,.boxed-group-warning .btn-sm,.boxed-group-info .btn-sm{margin:-5px 0}.boxed-group-success:first-child,.boxed-group-warning:first-child,.boxed-group-info:first-child{border-top:0}.boxed-group-success{color:#165c26;background-color:#dcffe4;border-color:rgba(27,31,35,0.15)}.boxed-group-warning{color:rgba(27,31,35,0.85);background-color:#fffbdd;border-color:rgba(27,31,35,0.15)}.boxed-group-info{color:inherit;border-color:inherit}.branch-name{display:inline-block;padding:2px 6px;font:12px "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;color:rgba(27,31,35,0.6);background-color:#eaf5ff;border-radius:3px}.branch-name .octicon{margin:1px -2px 0 0;color:#a8bbd0}a.branch-name{color:#0366d6}.breadcrumb{margin-bottom:10px;font-size:18px;color:#586069}.breadcrumb .separator::before,.breadcrumb .separator::after{content:" "}.breadcrumb strong.final-path{color:#24292e}.breadcrumb .zeroclipboard-button{display:inline-block;margin-left:5px}.breadcrumb .repo-root{font-weight:600}.breadcrumb .octicon{vertical-align:-2px}.editor-license-template,.editor-code-of-conduct-template,.editor-gitignore-template{position:relative;top:3px;display:none;float:right;font-size:14px}.editor-license-template.is-visible,.editor-code-of-conduct-template.is-visible,.editor-gitignore-template.is-visible{display:block}.editor-license-template .select-menu-git-ignore,.editor-license-template .select-menu-license-picker,.editor-code-of-conduct-template .select-menu-git-ignore,.editor-code-of-conduct-template .select-menu-license-picker,.editor-gitignore-template .select-menu-git-ignore,.editor-gitignore-template .select-menu-license-picker{right:0}.starring-container .unstarred,.starring-container.on .starred{display:block}.starring-container.on .unstarred,.starring-container .starred{display:none}.starring-container.loading{opacity:0.5}.user-following-container .follow,.user-following-container.on .unfollow{display:inline-block}.user-following-container.on .follow,.user-following-container .unfollow{display:none}.user-following-container.loading{opacity:0.5}.members .user-following-container{float:right}.close-button{padding:0;background:transparent;border:0;outline:none}.btn-invisible{color:#0366d6;background-color:#fff;background-image:none;border:0}.btn-invisible:hover,.btn-invisible:active,.btn-invisible:focus,.btn-invisible.selected,.btn-invisible.zeroclipboard-is-hover,.btn-invisible.zeroclipboard-is-active{color:#0366d6;background:none;outline:none;box-shadow:none}.btn-octicon{display:inline-block;padding:5px;margin-left:5px;line-height:1;color:#586069;vertical-align:middle;background:transparent;border:0}.btn-octicon:hover{color:#0366d6}.btn-octicon.disabled{color:#959da5;cursor:default}.btn-octicon.disabled:hover{color:#959da5}.btn-octicon-danger:hover{color:#cb2431}.commit-ref{position:relative;display:inline-block;padding:0 5px;font:0.75em/2 "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;color:#274466;white-space:nowrap;background-color:#eff7ff;border-radius:3px}.commit-ref .user{color:#044289}a.commit-ref:hover{text-decoration:none;text-shadow:-1px -1px 0 rgba(27,31,35,0.2);background-image:-webkit-linear-gradient(#74a4d4, #2a5177);background-image:linear-gradient(#74a4d4, #2a5177);border-color:#2a5177}.capped-cards{list-style:none}.capped-cards .capped-card{float:left;width:450px}.capped-card{margin:10px;list-style:none;border:1px solid #dfe2e5;border-radius:2px}.capped-card::before{display:table;content:""}.capped-card::after{display:table;clear:both;content:""}.capped-card:nth-child(odd){margin-left:0}.capped-card:nth-child(even){margin-right:0}.capped-card h3{padding:10px;margin:0;line-height:100%;border-bottom:1px solid #eaecef}.capped-card>p{display:block;padding:0 10px 10px;margin:0;font-size:15px;line-height:100%;color:#586069;border-bottom:1px solid #eaecef}.capped-card-content{display:block;background:#f6f8fa}.capped-card-content::before{display:table;content:""}.capped-card-content::after{display:table;clear:both;content:""}.details-collapse .collapse{position:relative;display:none;height:0;overflow:hidden;-webkit-transition:height 0.35s ease-in-out;transition:height 0.35s ease-in-out}.details-collapse.open .collapse{display:block;height:auto;overflow:visible}.comment .email-format{line-height:1.5}.previewable-edit .previewable-comment-form{display:none}.previewable-edit .previewable-comment-form::before{display:table;content:""}.previewable-edit .previewable-comment-form::after{display:table;clear:both;content:""}.previewable-edit .previewable-comment-form .tabnav-tabs{display:inline-block}.previewable-edit .previewable-comment-form .form-actions{float:right;margin-right:10px;margin-bottom:10px}.previewable-edit.is-comment-editing .timeline-comment-header{display:none}.is-comment-editing .previewable-comment-form{display:block}.is-comment-editing .timeline-comment-actions,.is-comment-editing .edit-comment-hide{display:none}.is-comment-loading .previewable-comment-form{opacity:0.5}.is-comment-stale .comment-form-stale{display:block}.comment-body{width:100%;padding:15px;overflow:visible;font-size:14px}.comment-body .highlight{overflow:visible !important;background-color:transparent}.comment-form-textarea{width:100%;max-width:100%;height:100px;min-height:100px;margin:0;font-size:14px;line-height:1.6}.comment-form-textarea.dragover{border:solid 1px #0366d6}.discussion-topic-header{position:relative;padding:10px;word-wrap:break-word}.comment-form-error,.comment-form-stale{display:none;padding:15px 10px;margin:10px;color:#900;background-color:#fcdede;border:1px solid #d2b2b2;border-radius:3px}.comment-form-error.comment-form-bottom,.comment-form-stale.comment-form-bottom{margin-bottom:10px}.email-format{line-height:1.5em !important}.email-format div{white-space:pre-wrap}.email-format .email-hidden-reply{display:none;white-space:pre-wrap}.email-format .email-hidden-reply.expanded{display:block}.email-format .email-quoted-reply,.email-format .email-signature-reply{padding:0 15px;margin:15px 0;color:#586069;border-left:4px solid #dfe2e5}.email-format .email-hidden-toggle a{display:inline-block;height:12px;padding:0 9px;font-size:12px;font-weight:600;line-height:6px;color:#444d56;text-decoration:none;vertical-align:middle;background:#dfe2e5;border-radius:1px}.email-format .email-hidden-toggle a:hover{background-color:#c6cbd1}.email-format .email-hidden-toggle a:active{color:#fff;background-color:#0366d6}.comment-email-format div{white-space:normal}.comment-email-format .email-hidden-reply{display:none;white-space:normal}.comment-email-format .email-hidden-reply.expanded{display:block}.comment-email-format blockquote,.comment-email-format p{margin:0}.blankslate.conversation-limited{padding:20px 0 10px;margin:15px}.locked-conversation .write-tab,.locked-conversation .preview-tab{color:#c6cbd1}.commit-form{position:relative;padding:15px;border:1px solid #dfe2e5;border-radius:3px}.commit-form::after,.commit-form::before{position:absolute;top:11px;right:100%;left:-16px;display:block;width:0;height:0;pointer-events:none;content:" ";border-color:transparent;border-style:solid solid outset}.commit-form::after{margin-top:1px;margin-left:2px;border-width:7px;border-right-color:#fff}.commit-form::before{border-width:8px;border-right-color:#dfe2e5}.commit-form .input-block{margin-top:10px;margin-bottom:10px}.commit-form-avatar{float:left;margin-left:-64px;border-radius:3px}.commit-form-actions::before{display:table;content:""}.commit-form-actions::after{display:table;clear:both;content:""}.commit-form-actions .BtnGroup{margin-right:5px}.commit-form-actions .check-for-fork{line-height:34px}.merge-commit-message{resize:vertical}.commit-sha{padding:0.2em 0.4em;font-size:90%;font-weight:normal;background-color:#f6f8fa;border:1px solid #eaecef;border-radius:0.2em}.commit-partial-notice{margin-top:20px;margin-bottom:20px}.commit-paginate-container{float:right;margin:-5px 0 0;text-align:inherit}.commit .commit-title,.commit .commit-title a{color:#444d56}.commit .commit-title.blank,.commit .commit-title.blank a{color:rgba(27,31,35,0.3)}.commit .commit-title .issue-link{font-weight:600;color:#0366d6}.commit .sha-block,.commit .sha{font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:12px}.commit.open .commit-desc{display:block}.commit-link{font-weight:normal;color:#0366d6}.commit-email-flash{display:inline}.commit-desc{display:none}.commit-desc pre{max-width:700px;margin-top:10px;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:11px;line-height:1.45;color:#444d56;white-space:pre-wrap}.commit-desc+.commit-branches{padding-top:8px;margin-top:2px;border-top:solid 1px rgba(27,31,35,0.15)}.commit-author-section{color:#24292e}.commit-author-section span.user-mention{font-weight:normal}.commit-tease{position:relative;padding:10px;margin-bottom:-1px;font-size:13px;line-height:20px;color:#586069;background-color:#f1f8ff;border:1px solid #c8e1ff;border-radius:3px;border-bottom-right-radius:0;border-bottom-left-radius:0}.commit-tease .muted-link{color:inherit}.commit-tease .loader{float:left;margin:2px 5px 0 2px}.commit-tease .message{color:inherit}.commit-tease .avatar{margin-top:-1px}.commit-tease.open .commit-desc{display:block}.branch-infobar+.commit-tease{border-top-left-radius:0;border-top-right-radius:0}.commit-tease-comments{margin-right:15px}.commit-tease-sha{display:inline-block;font-family:"SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;font-size:90%;color:#444d56}.commit-tease-contributors{padding:5px 10px;margin:10px -10px -10px;background-color:#fff;border-top:1px solid #bedfff;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.commit-tease-contributors::before{display:table;content:""}.commit-tease-contributors::after{display:table;clear:both;content:""}.commit-tease-contributors .contributors-toggle{float:left;margin-right:10px}.commit-tease-contributors .avatar-link{float:left;margin-right:3px}.commit-tease-contributors .loader-loading{margin:2px 5px 2px 0}.commit-tease-contributors.error .loader-loading{display:none}.commit-tease-contributors.error .loader-error{display:block}.commits-listing{position:relative;padding-bottom:20px;margin-bottom:15px}.commits-listing::before{position:absolute;top:0;bottom:0;left:14px;z-index:-1;display:block;width:2px;content:"";background-color:#eff1f3}.commits-listing .discussion-item-icon{margin-right:5px;margin-left:-1px}.commits-listing .timeline-commits{padding-left:8px;margin-bottom:20px}.commits-listing .timeline-commits:last-child{margin-bottom:0}.commits-listing-padded{padding-left:39px}.commit-group{margin-top:10px;list-style-type:none}.commit-group-title{margin-top:15px;margin-left:-31px;color:#586069}.commit-group-title .octicon-git-commit{margin-right:17px;color:#c6cbd1;background:#fff}.commits-list-item.navigation-focus{background:#f6fbff}.commits-list-item .commit-title{margin:0;font-size:15px;font-weight:600;color:#24292e}.commits-list-item .commit-meta{margin-top:1px;font-weight:normal;color:#586069}.commits-list-item .status .octicon{height:14px;line-height:14px}.commits-list-item .commit-author{color:#586069}.commits-list-item .octicon-arrow-right{margin:0 3px}.commits-list-item .btn-outline{margin-top:2px}.commits-list-item .commit-desc pre{margin-top:5px;margin-bottom:10px;color:#586069}.commits-list-item .commit-desc pre a{word-break:break-word}.commits-list-item em{padding:3px;font-style:normal;font-weight:600;background-color:rgba(255,247,140,0.5);border-radius:3px}.commit-avatar-cell{width:47px}.commit-avatar-cell.table-list-cell{padding-right:0}.commit-indicator{margin-left:5px}.commit-links-cell{width:335px;text-align:right}.commit-links-group{margin-right:5px}.commits-list-item+.commits-list-item{border-top:1px solid #e1e4e8}.timeline-commits{width:100%;margin-top:5px;border-collapse:separate}.timeline-commits+.timeline-commits{margin-top:15px}.timeline-commits td{padding-top:4px;padding-right:8px;padding-bottom:4px;font-size:12px;line-height:16px;vertical-align:top;background-color:transparent}.discussion-item .timeline-commits .commit-author{display:none}.timeline-commits .commit-gravatar{width:16px;padding-left:10px}.timeline-commits .commit-author{width:200px;padding-right:20px;white-space:nowrap}.timeline-commits .author{font-weight:600;color:#444d56}.timeline-commits .commit-message{max-width:550px;min-height:0}.timeline-commits .commit-message>code a{color:#444d56}.timeline-commits .commit-message>code a:hover{color:#0366d6}.timeline-commits .commit-desc pre{overflow:visible;color:#586069}.timeline-commits .hidden-text-expander{margin-top:3px;margin-left:0;vertical-align:top}.timeline-commits .hidden-text-expander .ellipsis-expander{height:13px;background-color:#eaecef}.timeline-commits .hidden-text-expander .ellipsis-expander:hover{color:#fff;background-color:#0366d6}.timeline-commits .commit-sig-status{width:60px;padding-right:4px;text-align:right}.timeline-commits .commit-ci-status{width:16px;padding-right:4px}.timeline-commits .commit-ci-status .octicon{margin-right:1px;margin-left:1px;vertical-align:bottom}.timeline-commits .commit-ci-status .octicon-primitive-dot{width:9px;margin-right:3px;margin-left:2px}.timeline-commits .commit-meta{width:50px;text-align:right}.commit-icon{display:table-cell;width:16px;color:#d1d5da}.commit-icon .octicon{background-color:#fff}.commit-id{color:#959da5}.commit-id:hover{color:#0366d6}.full-commit{padding:8px 8px 0;margin:10px 0;font-size:14px;background:#eaf5ff;border:1px solid rgba(27,31,35,0.15);border-radius:3px}.full-commit:first-child{margin-top:0}.full-commit .btn-outline,.full-commit .btn-outline:disabled{background-color:transparent;border-color:rgba(27,31,35,0.15)}.full-commit .btn-outline:not(:disabled):hover{color:#005cc5;border-color:#005cc5}.full-commit p.commit-title{margin:0 0 8px;font-size:18px;font-weight:600;color:#05264c}.full-commit .branches-list{display:inline;margin-right:10px;margin-left:2px;vertical-align:middle;list-style:none}.full-commit .branches-list li{display:inline-block;padding-left:3px;font-weight:600;color:#444d56}.full-commit .branches-list li::before{padding-right:6px;font-weight:normal;content:"+"}.full-commit .branches-list li:first-child{padding-left:0}.full-commit .branches-list li:first-child::before{padding-right:0;content:""}.full-commit .branches-list li.loading{font-weight:normal;color:#6a737d}.full-commit .branches-list li.pull-request{font-weight:normal;color:#6a737d}.full-commit .branches-list li.pull-request::before{margin-left:-8px;content:""}.full-commit .branches-list li.pull-request-error{margin-bottom:-1px}.full-commit .branches-list li a{color:inherit}.full-commit .commit-meta{padding:8px;margin-right:-8px;margin-left:-8px;background:#fff;border-top:1px solid rgba(27,31,35,0.15);border-bottom-right-radius:3px;border-bottom-left-radius:3px}.full-commit .sha-block{margin-left:15px;font-size:12px;line-height:24px;color:#586069}.full-commit .sha-block>.sha{color:#444d56}.full-commit .sha-block>a{color:#444d56;text-decoration:none;border-bottom:1px dotted #c6cbd1}.full-commit .sha-block>a:hover{border-bottom:1px solid #444d56}.full-commit .commit-desc{display:block;margin:-5px 0 10px}.full-commit .commit-desc pre{max-width:100%;overflow:visible;font-size:13px;word-wrap:break-word}.branches-tag-list{display:inline;margin-right:10px;margin-left:2px;vertical-align:middle;list-style:none}.branches-tag-list .more-commit-details,.branches-tag-list.open .hidden-text-expander{display:none}.branches-tag-list.open .more-commit-details{display:inline-block}.branches-tag-list li{display:inline-block;padding-left:3px}.branches-tag-list li:first-child{padding-left:0;font-weight:600;color:#444d56}.branches-tag-list li.loading{font-weight:normal;color:#6a737d}.branches-tag-list li.abbrev-tags{cursor:pointer}.branches-tag-list li a,.branches-tag-list li .ellipsis-expander{color:inherit}.branches-tag-list li .ellipsis-expander{background-color:#d3e2f4}.branches-tag-list li .ellipsis-expander:hover{background-color:#d6e2f1}.commit-branches{min-height:18px;margin-top:-6px;margin-bottom:8px;font-size:12px;color:#6a737d;vertical-align:middle}.commit-branches .octicon{vertical-align:middle}.commit-loader .loader-error{display:none;margin:0;font-size:12px;font-weight:600;color:#cb2431}.commit-loader.error .loader-loading{display:none}.commit-loader.error .loader-error{display:block}.historical-banner{padding:15px 20px 15px 130px;margin-bottom:20px;overflow:hidden;color:#24292e;background:#fff;border:1px solid #e1e4e8;border-radius:5px}.historical-banner h2{margin:0 0 5px}.historical-banner p{margin:0}.historical-banner .illustration{position:absolute;top:12px;left:20px;color:rgba(27,31,35,0.1)}.roses-divider{margin-bottom:20px;text-align:center}.commit-comments-heading{max-width:780px;margin-bottom:15px}.commit-comment-count{display:inline-block;margin-right:15px;margin-bottom:0}.commit-build-statuses{position:relative;display:inline-block;text-align:left}.commit-build-statuses .octicon-primitive-dot{width:10px}.commit-build-statuses.active .dropdown-menu-content{display:block}.commit-build-statuses.active .tooltipped::before,.commit-build-statuses.active .tooltipped::after{display:none}.commit-build-statuses .dropdown-menu{min-width:400px;max-width:500px;padding-top:0;padding-bottom:0}.commit-build-statuses .dropdown-menu .merge-status-list{max-height:170px;border-bottom:0}.commit-build-statuses .dropdown-menu-w,.commit-build-statuses .dropdown-menu-e{top:-11px}.commit-build-statuses .merge-status-item:last-child{border-radius:0 0 2px 2px}.dropdown-signed-commit{display:inline-block}.dropdown-signed-commit .dropdown-menu{width:260px;padding-top:0;padding-bottom:0;margin-top:7px;font-size:13px;line-height:1.4;color:#24292e;text-align:left}.dropdown-signed-commit .dropdown-menu::after{border-bottom-color:#f6f8fa}.dropdown-signed-commit .dropdown-menu-w{top:-28px;margin-top:0}.dropdown-signed-commit .dropdown-menu-w::after{border-bottom-color:transparent;border-left-color:#f6f8fa}.signed-commit-header{padding:12px;line-height:1.3;white-space:normal;border-collapse:separate;background-color:#f6f8fa;border-bottom:solid 1px #e1e4e8;border-top-left-radius:3px;border-top-right-radius:3px}.signed-commit-header .octicon-verified{color:#28a745}.signed-commit-header .octicon-unverified{color:#959da5}.signed-commit-signer{padding-right:12px;padding-left:12px;margin-top:12px;border-collapse:separate}.signed-commit-footer{padding:12px;font-size:12px;line-height:1.5}.signed-commit-cert-info{margin-bottom:6px}.signed-commit-cert-info td{vertical-align:top}.signed-commit-cert-info td:first-child{width:44px;padding-right:12px}.signed-commit-badge{display:inline-block;padding:1px 4px;font-size:10px;color:#586069;vertical-align:middle;background:none;border:solid 1px #e1e4e8;border-radius:2px}.signed-commit-badge:hover{text-decoration:none;border-color:#c6cbd1}.signed-commit-badge:focus{outline:none}.signed-commit-badge.verified{color:#22863a}.signed-commit-badge.verified:hover{border-color:#28a745}.signed-commit-badge-small{margin-top:-2px;margin-right:3px}.signed-commit-b
gitextract_q9w25szj/
├── .github/
│ └── workflows/
│ ├── build.yml
│ └── release.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE
├── README.md
├── bin/
│ └── hads
├── hads.js
├── lib/
│ ├── helpers.js
│ ├── indexer.js
│ ├── matcher.js
│ └── renderer.js
├── package.json
├── public/
│ ├── css/
│ │ ├── github.css
│ │ └── style.css
│ └── js/
│ └── client.js
├── test/
│ ├── .ignored-folder/
│ │ └── ignored-file.md
│ ├── 001-first folder/
│ │ ├── 3 things.md
│ │ ├── index.md
│ │ └── some doc.md
│ ├── 002-cheatsheet.markdown
│ ├── 003_extras.mdown
│ ├── code.js
│ ├── custom.css
│ ├── example-category/
│ │ ├── a-sub-category/
│ │ │ └── yet-another-doc.md
│ │ ├── another-doc.md
│ │ └── some-doc.md
│ ├── folder with spaces/
│ │ └── dummy.md
│ ├── ignore.txt
│ ├── nom_accentué.md
│ └── readme.md
└── views/
├── add.pug
├── edit.pug
├── file.pug
├── footer.pug
├── header.pug
└── layout.pug
SYMBOL INDEX (60 symbols across 7 files)
FILE: hads.js
constant INDEXES (line 57) | const INDEXES = [
constant ICONS (line 62) | const ICONS = {
constant STYLESHEET (line 68) | const STYLESHEET = 'custom.css';
constant PATHS (line 69) | const PATHS = {
method code (line 74) | get code() {
method customStylesheet (line 78) | get customStylesheet() {
method export (line 82) | get export() {
method hads (line 86) | get hads() {
method images (line 90) | get images() {
method root (line 94) | get root() {
constant SCRIPTS (line 100) | const SCRIPTS = [
constant STYLESHEETS (line 106) | const STYLESHEETS = [
function renderPage (line 218) | function renderPage() {
function tryProcessFile (line 273) | function tryProcessFile() {
FILE: lib/helpers.js
class Helpers (line 6) | class Helpers {
method extractRoute (line 7) | static extractRoute(requestPath) {
method sanitizePath (line 11) | static sanitizePath(path) {
method hasQueryOption (line 15) | static hasQueryOption(query, option) {
method processPackages (line 19) | static processPackages(callback) {
method ensureMarkdownExtension (line 35) | static ensureMarkdownExtension(file) {
method readCode (line 47) | static async readCode() {
FILE: lib/indexer.js
constant EXCLUSIONS (line 12) | const EXCLUSIONS = ['node_modules'];
class Indexer (line 14) | class Indexer {
method constructor (line 15) | constructor(basePath) {
method indexFiles (line 25) | indexFiles() {
method updateIndexForFile (line 38) | updateIndexForFile(file) {
method getContent (line 54) | getContent(file) {
method getFiles (line 58) | getFiles() {
method search (line 62) | search(string) {
FILE: lib/matcher.js
constant MARKDOWN_EXTENSIONS (line 6) | const MARKDOWN_EXTENSIONS = ['md', 'mkdn', 'mdown', 'markdown'];
constant IMAGES_EXTENSIONS (line 7) | const IMAGES_EXTENSIONS = ['png', 'jpg', 'jpeg', 'gif', 'svg', 'webp'];
constant CODE_EXTENSIONS (line 8) | const CODE_EXTENSIONS = [
class Matcher (line 25) | class Matcher {
method isMarkdown (line 26) | static isMarkdown(file) {
method isImage (line 30) | static isImage(file) {
method getImages (line 34) | static getImages() {
method isCode (line 38) | static isCode(file) {
method getCode (line 42) | static getCode() {
method hasExtension (line 46) | static hasExtension(file, extensions) {
FILE: lib/renderer.js
constant SEARCH_EXTRACT_LENGTH (line 11) | const SEARCH_EXTRACT_LENGTH = 400;
constant SEARCH_RESULTS_MAX (line 12) | const SEARCH_RESULTS_MAX = 10;
constant ROOT_FILES_INDEX (line 14) | const ROOT_FILES_INDEX = {
constant NUMBER_SEPARATORS (line 20) | const NUMBER_SEPARATORS = /[-_]/g;
class Renderer (line 22) | class Renderer {
method constructor (line 23) | constructor(indexer, options) {
method renderRaw (line 29) | renderRaw(file) {
method renderFile (line 33) | renderFile(file) {
method renderCode (line 37) | renderCode(file) {
method renderSearch (line 42) | renderSearch(search) {
method renderIndex (line 71) | renderIndex() {
method renderTableOfContents (line 99) | renderTableOfContents(content) {
method renderMarkdown (line 114) | renderMarkdown(content) {
method removeLinks (line 162) | static removeLinks(text) {
method formatHref (line 167) | static formatHref(href, isExport) {
method renderIndexLevel (line 181) | static renderIndexLevel(index, level) {
method encodeFileLink (line 255) | static encodeFileLink(link) {
method trimNumberPrefix (line 266) | static trimNumberPrefix(key) {
method getNumberPrefix (line 284) | static getNumberPrefix(key) {
FILE: public/js/client.js
function getUploadMessage (line 29) | function getUploadMessage(file) {
FILE: test/code.js
function hello (line 1) | function hello(name) {
Condensed preview — 37 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (598K chars).
[
{
"path": ".github/workflows/build.yml",
"chars": 873,
"preview": "name: build\non:\n push:\n branches:\n - main\n pull_request:\n branches:\n - main\n\njobs:\n build:\n strate"
},
{
"path": ".github/workflows/release.yml",
"chars": 670,
"preview": "name: release\non:\n workflow_dispatch:\n repository_dispatch:\n types: [release]\n\njobs:\n release:\n runs-on: ubuntu"
},
{
"path": ".gitignore",
"chars": 126,
"preview": "node_modules/\ntest/public/\nnpm-debug.log\n.idea/*\n!.idea/runConfigurations/\n!.idea/codeStyleSettings.xml\n.DS_Store\nexport"
},
{
"path": "CHANGELOG.md",
"chars": 3941,
"preview": "## [3.0.3](https://github.com/sinedied/hads/compare/3.0.2...3.0.3) (2022-05-02)\n\n\n### Bug Fixes\n\n* display accented char"
},
{
"path": "LICENSE",
"chars": 1085,
"preview": "The MIT License (MIT)\n\nCopyright (c) 2016-2019 Yohan Lasorsa\n\nPermission is hereby granted, free of charge, to any perso"
},
{
"path": "README.md",
"chars": 3917,
"preview": "# Hey it's Another Documentation Server! (hads)\n\n[](https://www.npm"
},
{
"path": "bin/hads",
"chars": 41,
"preview": "#!/usr/bin/env node\n\nrequire('../hads');\n"
},
{
"path": "hads.js",
"chars": 12452,
"preview": "'use strict';\n\nconst fs = require('fs-extra');\nconst path = require('path');\nconst express = require('express');\nconst m"
},
{
"path": "lib/helpers.js",
"chars": 1227,
"preview": "'use strict';\n\nconst path = require('path');\nconst Matcher = require('./matcher');\n\nclass Helpers {\n static extractRout"
},
{
"path": "lib/indexer.js",
"chars": 1769,
"preview": "'use strict';\n\nconst {\n promisify\n} = require('util');\nconst path = require('path');\nconst fs = require('fs-extra');\nco"
},
{
"path": "lib/matcher.js",
"chars": 969,
"preview": "'use strict';\n\nconst path = require('path');\nconst _ = require('lodash');\n\nconst MARKDOWN_EXTENSIONS = ['md', 'mkdn', 'm"
},
{
"path": "lib/renderer.js",
"chars": 7963,
"preview": "'use strict';\n\nconst path = require('path');\nconst fs = require('fs-extra');\nconst normalizePath = require('normalize-pa"
},
{
"path": "package.json",
"chars": 2347,
"preview": "{\n \"name\": \"hads\",\n \"version\": \"3.0.3\",\n \"description\": \"Fast web server allowing to browse, search and edit project "
},
{
"path": "public/css/github.css",
"chars": 532635,
"preview": "/*!\n * GitHub Light v0.3.0\n * Copyright (c) 2012 - 2016 GitHub, Inc.\n * Licensed under MIT (https://github.com/primer/gi"
},
{
"path": "public/css/style.css",
"chars": 1629,
"preview": "body {\n min-width: 0;\n}\n\n.container {\n width: auto;\n max-width: 980px;\n}\n\n.boxed-group {\n margin-top: 20px;\n}\n\n.head"
},
{
"path": "public/js/client.js",
"chars": 2639,
"preview": "window.hads = (function () {\n 'use strict';\n\n var editor = null;\n var byId = document.getElementById.bind(document);\n"
},
{
"path": "test/.ignored-folder/ignored-file.md",
"chars": 29,
"preview": "# This file should be ignored"
},
{
"path": "test/001-first folder/3 things.md",
"chars": 14,
"preview": "# 3 Things\nbla"
},
{
"path": "test/001-first folder/index.md",
"chars": 48,
"preview": "# Index file for first folder\n\nContent goes here"
},
{
"path": "test/001-first folder/some doc.md",
"chars": 18,
"preview": "# Some Doc\n\nHello\n"
},
{
"path": "test/002-cheatsheet.markdown",
"chars": 11317,
"preview": "Downloaded from https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet\n\n---\n\nThis is intended as a quick refer"
},
{
"path": "test/003_extras.mdown",
"chars": 3335,
"preview": "# Test cases for extra features\n\n## Table of contents\n\nA TOC should be inserted below:\n[[toc]]\n\nBut not here: `[[toc]]`\n"
},
{
"path": "test/code.js",
"chars": 80,
"preview": "function hello(name) {\n console.log('Hello ' + name + '!');\n}\n\nhello('world');\n"
},
{
"path": "test/custom.css",
"chars": 38,
"preview": "body {\n background-color: #B0BBBE;\n}\n"
},
{
"path": "test/example-category/a-sub-category/yet-another-doc.md",
"chars": 61,
"preview": "# Yet another project doc\n\nEven more interesting text here..."
},
{
"path": "test/example-category/another-doc.md",
"chars": 40,
"preview": "# Another project doc\n\nMore text here..."
},
{
"path": "test/example-category/some-doc.md",
"chars": 34,
"preview": "# A project doc\n\nSome text here..."
},
{
"path": "test/folder with spaces/dummy.md",
"chars": 15,
"preview": "# Dummy\nContent"
},
{
"path": "test/ignore.txt",
"chars": 18,
"preview": "file to be ignored"
},
{
"path": "test/nom_accentué.md",
"chars": 60,
"preview": "# Test en Français\n\nPour le support des caractères accentués"
},
{
"path": "test/readme.md",
"chars": 249,
"preview": "# Project documentation test\n\nThis is the main page of the doc.\n\nYou can try accessing one of these test links:\n\n- [Mark"
},
{
"path": "views/add.pug",
"chars": 426,
"preview": "#add-modal.hidden\n .boxed-group\n h3 Add new file\n button.octicon.octicon-x.float-right.close-button(onclick='ha"
},
{
"path": "views/edit.pug",
"chars": 697,
"preview": "extends layout\n\nblock content\n .container\n .file\n .file-header\n if icon === 'octicon-file'\n .fi"
},
{
"path": "views/file.pug",
"chars": 628,
"preview": "extends layout\n\nblock content\n .container\n .file\n .file-header\n if icon === 'octicon-file' && !readonly\n"
},
{
"path": "views/footer.pug",
"chars": 178,
"preview": ".container\n .site-footer\n ul.site-footer-links\n li\n span.octicon.octicon-rocket\n | Powered by"
},
{
"path": "views/header.pug",
"chars": 595,
"preview": "if !static\n .header\n .container.clearfix\n a.header-logo-invertocat(href='/')\n span.mega-octicon.octicon-"
},
{
"path": "views/layout.pug",
"chars": 565,
"preview": "doctype html\nhtml\n head\n meta(charset='utf-8')\n title #{title}\n meta(name='viewport', content='width=device-wi"
}
]
About this extraction
This page contains the full source code of the sinedied/hads GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 37 files (578.8 KB), approximately 167.4k tokens, and a symbol index with 60 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.