From 3772754c2f5771f526fc770139873a2db2db8f78 Mon Sep 17 00:00:00 2001 From: Florian Mounier Date: Wed, 30 Apr 2014 15:48:16 +0200 Subject: [PATCH] To grunt and libsass --- .gitignore | 3 + Gruntfile.coffee | 4 +- butterfly/static/javascripts/main.js | 2870 -------- butterfly/static/main.css | 2930 +++++++++ butterfly/static/main.js | 2886 ++++++++ .../fonts/glyphicons-halflings-regular.eot | Bin 20290 -> 0 bytes .../fonts/glyphicons-halflings-regular.svg | 229 - .../fonts/glyphicons-halflings-regular.ttf | Bin 41236 -> 0 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 23292 -> 0 bytes butterfly/static/stylesheets/main.css | 5075 -------------- butterfly/templates/index.html | 4 +- coffees/main.coffee | 78 +- coffees/selection.coffee | 374 +- coffees/term.coffee | 5824 +++++++++-------- coffees/virtual_input.coffee | 105 +- dev.py | 47 - sass/main.sass | 65 +- 17 files changed, 9060 insertions(+), 11434 deletions(-) delete mode 100644 butterfly/static/javascripts/main.js create mode 100644 butterfly/static/main.css create mode 100644 butterfly/static/main.js delete mode 100644 butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.eot delete mode 100644 butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.svg delete mode 100644 butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.ttf delete mode 100644 butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.woff delete mode 100644 butterfly/static/stylesheets/main.css delete mode 100755 dev.py diff --git a/.gitignore b/.gitignore index cb67298..5b2a70d 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,6 @@ *.key *.p12 node_modules/ +*.src.coffee +*.map +sass/scss diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 237b24a..3bd9df4 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -68,9 +68,9 @@ module.exports = (grunt) -> grunt.loadNpmTasks 'grunt-coffeelint' grunt.loadNpmTasks 'grunt-sass' grunt.loadNpmTasks 'grunt-sass-to-scss' - grunt.loadNpmTasks 'grunt-bower-task' - grunt.registerTask 'dev', ['coffeelint', 'coffee', 'watch'] + grunt.registerTask 'dev', [ + 'coffeelint', 'coffee', 'sass_to_scss', 'sass', 'watch'] grunt.registerTask 'css', ['sass_to_scss', 'sass'] grunt.registerTask 'default', [ 'coffeelint', 'coffee', diff --git a/butterfly/static/javascripts/main.js b/butterfly/static/javascripts/main.js deleted file mode 100644 index 8c6793e..0000000 --- a/butterfly/static/javascripts/main.js +++ /dev/null @@ -1,2870 +0,0 @@ -// Generated by CoffeeScript 1.7.1 -var $, Selection, State, Terminal, alt, bench, cancel, cbench, cols, ctl, ctrl, first, next_leaf, open_ts, previous_leaf, quit, rows, s, selection, send, term, virtual_input, ws, ws_url, - __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, - __slice = [].slice; - -cancel = function(ev) { - if (ev.preventDefault) { - ev.preventDefault(); - } - if (ev.stopPropagation) { - ev.stopPropagation(); - } - ev.cancelBubble = true; - return false; -}; - -s = 0; - -State = { - normal: s++, - escaped: s++, - csi: s++, - osc: s++, - charset: s++, - dcs: s++, - ignore: s++ -}; - -Terminal = (function() { - function Terminal(parent, out, ctl) { - var div, i, term_size; - this.parent = parent; - this.out = out; - this.ctl = ctl != null ? ctl : function() {}; - this.context = this.parent.ownerDocument.defaultView; - this.document = this.parent.ownerDocument; - this.body = this.document.getElementsByTagName('body')[0]; - this.element = this.document.createElement('div'); - this.element.className = 'terminal focus'; - this.element.style.outline = 'none'; - this.element.setAttribute('tabindex', 0); - this.parent.appendChild(this.element); - div = this.document.createElement('div'); - div.className = 'line'; - this.element.appendChild(div); - this.children = [div]; - this.compute_char_size(); - div.style.height = this.char_size.height + 'px'; - term_size = this.parent.getBoundingClientRect(); - this.cols = Math.floor(term_size.width / this.char_size.width) - 1; - this.rows = Math.floor(term_size.height / this.char_size.height); - i = this.rows - 1; - while (i--) { - div = this.document.createElement('div'); - div.style.height = this.char_size.height + 'px'; - div.className = 'line'; - this.element.appendChild(div); - this.children.push(div); - } - this.scrollback = 100000; - this.visualBell = 100; - this.convertEol = false; - this.termName = 'xterm'; - this.cursorBlink = true; - this.cursorState = 0; - this.last_cc = 0; - this.reset_vars(); - this.refresh(0, this.rows - 1); - this.focus(); - this.startBlink(); - addEventListener('keydown', this.keyDown.bind(this)); - addEventListener('keypress', this.keyPress.bind(this)); - addEventListener('focus', this.focus.bind(this)); - addEventListener('blur', this.blur.bind(this)); - addEventListener('paste', this.paste.bind(this)); - addEventListener('resize', this.resize.bind(this)); - if (typeof InstallTrigger !== "undefined") { - this.element.contentEditable = 'true'; - this.element.addEventListener("mouseup", (function(_this) { - return function() { - var sel; - sel = getSelection().getRangeAt(0); - if (sel.startOffset === sel.endOffset) { - return getSelection().removeAllRanges(); - } - }; - })(this)); - } - this.initmouse(); - } - - Terminal.prototype.reset_vars = function() { - var i; - this.ybase = 0; - this.ydisp = 0; - this.x = 0; - this.y = 0; - this.cursorHidden = false; - this.state = State.normal; - this.queue = ''; - this.scrollTop = 0; - this.scrollBottom = this.rows - 1; - this.applicationKeypad = false; - this.applicationCursor = false; - this.originMode = false; - this.wraparoundMode = false; - this.normal = null; - this.charset = null; - this.gcharset = null; - this.glevel = 0; - this.charsets = [null]; - this.defAttr = (0 << 18) | (257 << 9) | (256 << 0); - this.curAttr = this.defAttr; - this.params = []; - this.currentParam = 0; - this.prefix = ""; - this.lines = []; - i = this.rows; - while (i--) { - this.lines.push(this.blankLine()); - } - this.setupStops(); - return this.skipNextKey = null; - }; - - Terminal.prototype.compute_char_size = function() { - var test_span; - test_span = document.createElement('span'); - test_span.textContent = '0123456789'; - this.children[0].appendChild(test_span); - this.char_size = { - width: test_span.getBoundingClientRect().width / 10, - height: this.children[0].getBoundingClientRect().height - }; - return this.children[0].removeChild(test_span); - }; - - Terminal.prototype.eraseAttr = function() { - return (this.defAttr & ~0x1ff) | (this.curAttr & 0x1ff); - }; - - Terminal.prototype.focus = function() { - if (this.sendFocus) { - this.send('\x1b[I'); - } - this.showCursor(); - this.element.classList.add('focus'); - return this.element.classList.remove('blur'); - }; - - Terminal.prototype.blur = function() { - this.cursorState = 1; - this.refresh(this.y, this.y); - if (this.sendFocus) { - this.send('\x1b[O'); - } - this.element.classList.add('blur'); - return this.element.classList.remove('focus'); - }; - - Terminal.prototype.paste = function(ev) { - if (ev.clipboardData) { - this.send(ev.clipboardData.getData('text/plain')); - } else if (this.context.clipboardData) { - this.send(this.context.clipboardData.getData('Text')); - } - return cancel(ev); - }; - - Terminal.prototype.initmouse = function() { - var encode, getButton, getCoords, pressed, sendButton, sendEvent, sendMove; - pressed = 32; - sendButton = (function(_this) { - return function(ev) { - var button, pos; - button = getButton(ev); - pos = getCoords(ev); - if (!pos) { - return; - } - sendEvent(button, pos); - switch (ev.type) { - case "mousedown": - return pressed = button; - case "mouseup": - return pressed = 32; - } - }; - })(this); - sendMove = (function(_this) { - return function(ev) { - var button, pos; - button = pressed; - pos = getCoords(ev); - if (!pos) { - return; - } - button += 32; - return sendEvent(button, pos); - }; - })(this); - encode = (function(_this) { - return function(data, ch) { - if (!_this.utfMouse) { - if (ch === 255) { - return data.push(0); - } - if (ch > 127) { - ch = 127; - } - return data.push(ch); - } else { - if (ch === 2047) { - return data.push(0); - } - if (ch < 127) { - return data.push(ch); - } else { - if (ch > 2047) { - ch = 2047; - } - data.push(0xC0 | (ch >> 6)); - return data.push(0x80 | (ch & 0x3F)); - } - } - }; - })(this); - sendEvent = (function(_this) { - return function(button, pos) { - var data; - if (_this.urxvtMouse) { - pos.x -= 32; - pos.y -= 32; - pos.x++; - pos.y++; - _this.send("\x1b[" + button + ";" + pos.x + ";" + pos.y + "M"); - return; - } - if (_this.sgrMouse) { - pos.x -= 32; - pos.y -= 32; - _this.send("\x1b[<" + ((button & 3) === 3 ? button & ~3 : button) + ";" + pos.x + ";" + pos.y + ((button & 3) === 3 ? "m" : "M")); - return; - } - data = []; - encode(data, button); - encode(data, pos.x); - encode(data, pos.y); - return _this.send("\x1b[M" + String.fromCharCode.apply(String, data)); - }; - })(this); - getButton = (function(_this) { - return function(ev) { - var button, ctrl, meta, mod, shift; - switch (ev.type) { - case "mousedown": - button = ev.button != null ? +ev.button : (ev.which != null ? ev.which - 1 : null); - break; - case "mouseup": - button = 3; - break; - case "wheel": - button = ev.deltaY < 0 ? 64 : 65; - } - shift = ev.shiftKey ? 4 : 0; - meta = ev.metaKey ? 8 : 0; - ctrl = ev.ctrlKey ? 16 : 0; - mod = shift | meta | ctrl; - if (_this.vt200Mouse) { - mod &= ctrl; - } else { - if (!_this.normalMouse) { - mod = 0; - } - } - return (32 + (mod << 2)) + button; - }; - })(this); - getCoords = (function(_this) { - return function(ev) { - var el, h, w, x, y; - x = ev.pageX; - y = ev.pageY; - el = _this.element; - while (el && el !== _this.document.documentElement) { - x -= el.offsetLeft; - y -= el.offsetTop; - el = "offsetParent" in el ? el.offsetParent : el.parentNode; - } - w = _this.element.clientWidth; - h = _this.element.clientHeight; - x = Math.ceil((x / w) * _this.cols); - y = Math.ceil((y / h) * _this.rows); - if (x < 0) { - x = 0; - } - if (x > _this.cols) { - x = _this.cols; - } - if (y < 0) { - y = 0; - } - if (y > _this.rows) { - y = _this.rows; - } - x += 32; - y += 32; - return { - x: x, - y: y, - type: ev.type - }; - }; - })(this); - addEventListener("mousedown", (function(_this) { - return function(ev) { - var up; - if (!_this.mouseEvents) { - return; - } - sendButton(ev); - if (_this.vt200Mouse) { - sendButton({ - __proto__: ev, - type: "mouseup" - }); - return cancel(ev); - } - if (_this.normalMouse) { - addEventListener("mousemove", sendMove.bind(_this)); - } - if (!_this.x10Mouse) { - addEventListener("mouseup", up = function(ev) { - sendButton(ev); - if (_this.normalMouse) { - removeEventListener("mousemove", sendMove); - } - removeEventListener("mouseup", up); - return cancel(ev); - }); - } - return cancel(ev); - }; - })(this)); - return addEventListener("wheel", (function(_this) { - return function(ev) { - if (_this.mouseEvents) { - if (_this.x10Mouse) { - return; - } - sendButton(ev); - } else { - if (_this.applicationKeypad) { - return; - } - _this.scrollDisp(ev.deltaY > 0 ? 5 : -5); - } - return cancel(ev); - }; - })(this)); - }; - - Terminal.prototype.refresh = function(start, end) { - var attr, bg, ch, classes, data, fg, flags, i, line, out, parent, row, width, x, y; - if (end - start >= this.rows / 3) { - parent = this.element.parentNode; - if (parent != null) { - parent.removeChild(this.element); - } - } - width = this.cols; - y = start; - if (end >= this.lines.length) { - end = this.lines.length - 1; - } - while (y <= end) { - row = y + this.ydisp; - line = this.lines[row]; - out = ""; - if (y === this.y && (this.ydisp === this.ybase || this.selectMode) && !this.cursorHidden) { - x = this.x; - } else { - x = -Infinity; - } - attr = this.defAttr; - i = 0; - while (i < width) { - data = line[i][0]; - ch = line[i][1]; - if (data !== attr) { - if (attr !== this.defAttr) { - out += ""; - } - if (data !== this.defAttr) { - classes = []; - out += "> 9) & 0x1ff; - flags = data >> 18; - if (flags & 1) { - classes.push("bold"); - } - if (flags & 2) { - classes.push("underline"); - } - if (flags & 4) { - classes.push("blink"); - } - if (flags & 8) { - classes.push("reverse-video"); - } - if (flags & 16) { - classes.push("invisible"); - } - if (flags & 1 && fg < 8) { - fg += 8; - } - classes.push("bg-color-" + bg); - classes.push("fg-color-" + fg); - out += "class=\""; - out += classes.join(" "); - out += "\">"; - } - } - if (i === x) { - out += ""; - } - if (ch.length > 1) { - out += ch; - } else { - switch (ch) { - case "&": - out += "&"; - break; - case "<": - out += "<"; - break; - case ">": - out += ">"; - break; - default: - if (ch <= " ") { - out += " "; - } else { - if (("\uff00" < ch && ch < "\uffef")) { - i++; - } - out += ch; - } - } - } - if (i === x) { - out += ""; - } - attr = data; - i++; - } - if (attr !== this.defAttr) { - out += ""; - } - this.children[y].innerHTML = out; - y++; - } - return parent != null ? parent.appendChild(this.element) : void 0; - }; - - Terminal.prototype._cursorBlink = function() { - var cursor; - this.cursorState ^= 1; - cursor = this.element.querySelector(".cursor"); - if (!cursor) { - return; - } - if (cursor.classList.contains("reverse-video")) { - return cursor.classList.remove("reverse-video"); - } else { - return cursor.classList.add("reverse-video"); - } - }; - - Terminal.prototype.showCursor = function() { - if (!this.cursorState) { - this.cursorState = 1; - return this.refresh(this.y, this.y); - } - }; - - Terminal.prototype.startBlink = function() { - if (!this.cursorBlink) { - return; - } - this._blinker = (function(_this) { - return function() { - return _this._cursorBlink(); - }; - })(this); - return this.t_blink = setInterval(this._blinker, 500); - }; - - Terminal.prototype.refreshBlink = function() { - if (!this.cursorBlink) { - return; - } - clearInterval(this.t_blink); - return this.t_blink = setInterval(this._blinker, 500); - }; - - Terminal.prototype.scroll = function() { - var row; - if (++this.ybase === this.scrollback) { - this.ybase = this.ybase / 2 | 0; - this.lines = this.lines.slice(-(this.ybase + this.rows) + 1); - } - this.ydisp = this.ybase; - row = this.ybase + this.rows - 1; - row -= this.rows - 1 - this.scrollBottom; - if (row === this.lines.length) { - this.lines.push(this.blankLine()); - } else { - this.lines.splice(row, 0, this.blankLine()); - } - if (this.scrollTop !== 0) { - if (this.ybase !== 0) { - this.ybase--; - this.ydisp = this.ybase; - } - this.lines.splice(this.ybase + this.scrollTop, 1); - } - this.updateRange(this.scrollTop); - return this.updateRange(this.scrollBottom); - }; - - Terminal.prototype.scrollDisp = function(disp) { - this.ydisp += disp; - if (this.ydisp > this.ybase) { - this.ydisp = this.ybase; - } else { - if (this.ydisp < 0) { - this.ydisp = 0; - } - } - return this.refresh(0, this.rows - 1); - }; - - Terminal.prototype.write = function(data) { - var ch, cs, i, j, l, pt, valid, _ref; - this.refreshStart = this.y; - this.refreshEnd = this.y; - if (this.ybase !== this.ydisp) { - this.ydisp = this.ybase; - this.maxRange(); - } - i = 0; - l = data.length; - while (i < l) { - ch = data[i]; - switch (this.state) { - case State.normal: - switch (ch) { - case "\x07": - this.bell(); - break; - case "\n": - case "\x0b": - case "\x0c": - if (this.convertEol) { - this.x = 0; - } - this.y++; - if (this.y > this.scrollBottom) { - this.y--; - this.scroll(); - } - break; - case "\r": - this.x = 0; - break; - case "\b": - if (this.x > 0) { - this.x--; - } - break; - case "\t": - this.x = this.nextStop(); - break; - case "\x0e": - this.setgLevel(1); - break; - case "\x0f": - this.setgLevel(0); - break; - case "\x1b": - this.state = State.escaped; - break; - default: - if (ch >= " ") { - if ((_ref = this.charset) != null ? _ref[ch] : void 0) { - ch = this.charset[ch]; - } - if (this.x >= this.cols) { - this.x = 0; - this.y++; - if (this.y > this.scrollBottom) { - this.y--; - this.scroll(); - } - } - this.lines[this.y + this.ybase][this.x] = [this.curAttr, ch]; - this.x++; - this.updateRange(this.y); - if (("\uff00" < ch && ch < "\uffef")) { - j = this.y + this.ybase; - if (this.cols < 2 || this.x >= this.cols) { - this.lines[j][this.x - 1] = [this.curAttr, " "]; - break; - } - this.lines[j][this.x] = [this.curAttr, " "]; - this.x++; - } - } - } - break; - case State.escaped: - switch (ch) { - case "[": - this.params = []; - this.currentParam = 0; - this.state = State.csi; - break; - case "]": - this.params = []; - this.currentParam = 0; - this.state = State.osc; - break; - case "P": - this.params = []; - this.currentParam = 0; - this.state = State.dcs; - break; - case "_": - this.state = State.ignore; - break; - case "^": - this.state = State.ignore; - break; - case "c": - this.reset(); - break; - case "E": - this.x = 0; - this.index(); - break; - case "D": - this.index(); - break; - case "M": - this.reverseIndex(); - break; - case "%": - this.setgLevel(0); - this.setgCharset(0, Terminal.prototype.charsets.US); - this.state = State.normal; - i++; - break; - case "(": - case ")": - case "*": - case "+": - case "-": - case ".": - switch (ch) { - case "(": - this.gcharset = 0; - break; - case ")": - case "-": - this.gcharset = 1; - break; - case "*": - case ".": - this.gcharset = 2; - break; - case "+": - this.gcharset = 3; - } - this.state = State.charset; - break; - case "/": - this.gcharset = 3; - this.state = State.charset; - i--; - break; - case "n": - this.setgLevel(2); - break; - case "o": - this.setgLevel(3); - break; - case "|": - this.setgLevel(3); - break; - case "}": - this.setgLevel(2); - break; - case "~": - this.setgLevel(1); - break; - case "7": - this.saveCursor(); - this.state = State.normal; - break; - case "8": - this.restoreCursor(); - this.state = State.normal; - break; - case "#": - this.state = State.normal; - i++; - break; - case "H": - this.tabSet(); - break; - case "=": - this.applicationKeypad = true; - this.state = State.normal; - break; - case ">": - this.applicationKeypad = false; - this.state = State.normal; - break; - default: - this.state = State.normal; - console.log("Unknown ESC control:", ch); - } - break; - case State.charset: - switch (ch) { - case "0": - cs = Terminal.prototype.charsets.SCLD; - break; - case "A": - cs = Terminal.prototype.charsets.UK; - break; - case "B": - cs = Terminal.prototype.charsets.US; - break; - case "4": - cs = Terminal.prototype.charsets.Dutch; - break; - case "C": - case "5": - cs = Terminal.prototype.charsets.Finnish; - break; - case "R": - cs = Terminal.prototype.charsets.French; - break; - case "Q": - cs = Terminal.prototype.charsets.FrenchCanadian; - break; - case "K": - cs = Terminal.prototype.charsets.German; - break; - case "Y": - cs = Terminal.prototype.charsets.Italian; - break; - case "E": - case "6": - cs = Terminal.prototype.charsets.NorwegianDanish; - break; - case "Z": - cs = Terminal.prototype.charsets.Spanish; - break; - case "H": - case "7": - cs = Terminal.prototype.charsets.Swedish; - break; - case "=": - cs = Terminal.prototype.charsets.Swiss; - break; - case "/": - cs = Terminal.prototype.charsets.ISOLatin; - i++; - break; - default: - cs = Terminal.prototype.charsets.US; - } - this.setgCharset(this.gcharset, cs); - this.gcharset = null; - this.state = State.normal; - break; - case State.osc: - if (ch === "\x1b" || ch === "\x07") { - if (ch === "\x1b") { - i++; - } - this.params.push(this.currentParam); - switch (this.params[0]) { - case 0: - case 1: - case 2: - if (this.params[1]) { - this.title = this.params[1] + " - ƸӜƷ butterfly"; - this.handleTitle(this.title); - } - } - this.params = []; - this.currentParam = 0; - this.state = State.normal; - } else { - if (!this.params.length) { - if (ch >= "0" && ch <= "9") { - this.currentParam = this.currentParam * 10 + ch.charCodeAt(0) - 48; - } else if (ch === ";") { - this.params.push(this.currentParam); - this.currentParam = ""; - } - } else { - this.currentParam += ch; - } - } - break; - case State.csi: - if (ch === "?" || ch === ">" || ch === "!") { - this.prefix = ch; - break; - } - if (ch >= "0" && ch <= "9") { - this.currentParam = this.currentParam * 10 + ch.charCodeAt(0) - 48; - break; - } - if (ch === "$" || ch === "\"" || ch === " " || ch === "'") { - break; - } - this.params.push(this.currentParam); - this.currentParam = 0; - if (ch === ";") { - break; - } - this.state = State.normal; - switch (ch) { - case "A": - this.cursorUp(this.params); - break; - case "B": - this.cursorDown(this.params); - break; - case "C": - this.cursorForward(this.params); - break; - case "D": - this.cursorBackward(this.params); - break; - case "H": - this.cursorPos(this.params); - break; - case "J": - this.eraseInDisplay(this.params); - break; - case "K": - this.eraseInLine(this.params); - break; - case "m": - if (!this.prefix) { - this.charAttributes(this.params); - } - break; - case "n": - if (!this.prefix) { - this.deviceStatus(this.params); - } - break; - case "@": - this.insertChars(this.params); - break; - case "E": - this.cursorNextLine(this.params); - break; - case "F": - this.cursorPrecedingLine(this.params); - break; - case "G": - this.cursorCharAbsolute(this.params); - break; - case "L": - this.insertLines(this.params); - break; - case "M": - this.deleteLines(this.params); - break; - case "P": - this.deleteChars(this.params); - break; - case "X": - this.eraseChars(this.params); - break; - case "`": - this.charPosAbsolute(this.params); - break; - case "a": - this.HPositionRelative(this.params); - break; - case "c": - this.sendDeviceAttributes(this.params); - break; - case "d": - this.linePosAbsolute(this.params); - break; - case "e": - this.VPositionRelative(this.params); - break; - case "f": - this.HVPosition(this.params); - break; - case "h": - this.setMode(this.params); - break; - case "l": - this.resetMode(this.params); - break; - case "r": - this.setScrollRegion(this.params); - break; - case "s": - this.saveCursor(this.params); - break; - case "u": - this.restoreCursor(this.params); - break; - case "I": - this.cursorForwardTab(this.params); - break; - case "S": - this.scrollUp(this.params); - break; - case "T": - if (this.params.length < 2 && !this.prefix) { - this.scrollDown(this.params); - } - break; - case "Z": - this.cursorBackwardTab(this.params); - break; - case "b": - this.repeatPrecedingCharacter(this.params); - break; - case "g": - this.tabClear(this.params); - break; - case "p": - if (this.prefix === '!') { - this.softReset(this.params); - } - break; - default: - console.error("Unknown CSI code: %s.", ch); - } - this.prefix = ""; - break; - case State.dcs: - if (ch === "\x1b" || ch === "\x07") { - if (ch === "\x1b") { - i++; - } - switch (this.prefix) { - case "": - break; - case "$q": - pt = this.currentParam; - valid = false; - switch (pt) { - case "\"q": - pt = "0\"q"; - break; - case "\"p": - pt = "61\"p"; - break; - case "r": - pt = "" + (this.scrollTop + 1) + ";" + (this.scrollBottom + 1) + "r"; - break; - case "m": - pt = "0m"; - break; - default: - console.error("Unknown DCS Pt: %s.", pt); - pt = ""; - } - this.send("\x1bP" + +valid + "$r" + pt + "\x1b\\"); - break; - case "+q": - pt = this.currentParam; - valid = false; - this.send("\x1bP" + +valid + "+r" + pt + "\x1b\\"); - break; - default: - console.error("Unknown DCS prefix: %s.", this.prefix); - } - this.currentParam = 0; - this.prefix = ""; - this.state = State.normal; - } else if (!this.currentParam) { - if (!this.prefix && ch !== "$" && ch !== "+") { - this.currentParam = ch; - } else if (this.prefix.length === 2) { - this.currentParam = ch; - } else { - this.prefix += ch; - } - } else { - this.currentParam += ch; - } - break; - case State.ignore: - if (ch === "\x1b" || ch === "\x07") { - if (ch === "\x1b") { - i++; - } - this.state = State.normal; - } - } - i++; - } - this.updateRange(this.y); - return this.refresh(this.refreshStart, this.refreshEnd); - }; - - Terminal.prototype.writeln = function(data) { - return this.write("" + data + "\r\n"); - }; - - Terminal.prototype.keyDown = function(ev) { - var id, key, t, _ref; - if (ev.keyCode > 15 && ev.keyCode < 19) { - return true; - } - if ((ev.shiftKey || ev.ctrlKey) && ev.keyCode === 45) { - return true; - } - if ((ev.shiftKey && ev.ctrlKey) && ((_ref = ev.keyCode) === 67 || _ref === 86)) { - return true; - } - if (ev.altKey && ev.keyCode === 90 && !this.skipNextKey) { - this.skipNextKey = true; - this.element.classList.add('skip'); - return cancel(ev); - } - if (this.skipNextKey) { - this.skipNextKey = false; - this.element.classList.remove('skip'); - return true; - } - switch (ev.keyCode) { - case 8: - key = ev.altKey ? "\x1b" : ""; - if (ev.shiftKey) { - key += "\x08"; - break; - } - key += "\x7f"; - break; - case 9: - if (ev.shiftKey) { - key = "\x1b[Z"; - break; - } - key = "\t"; - break; - case 13: - key = "\r"; - break; - case 27: - key = "\x1b"; - break; - case 37: - if (this.applicationCursor) { - key = "\x1bOD"; - break; - } - key = "\x1b[D"; - break; - case 39: - if (this.applicationCursor) { - key = "\x1bOC"; - break; - } - key = "\x1b[C"; - break; - case 38: - if (this.applicationCursor) { - key = "\x1bOA"; - break; - } - if (ev.ctrlKey) { - this.scrollDisp(-1); - return cancel(ev); - } else { - key = "\x1b[A"; - } - break; - case 40: - if (this.applicationCursor) { - key = "\x1bOB"; - break; - } - if (ev.ctrlKey) { - this.scrollDisp(1); - return cancel(ev); - } else { - key = "\x1b[B"; - } - break; - case 46: - key = "\x1b[3~"; - break; - case 45: - key = "\x1b[2~"; - break; - case 36: - if (this.applicationKeypad) { - key = "\x1bOH"; - break; - } - key = "\x1bOH"; - break; - case 35: - if (this.applicationKeypad) { - key = "\x1bOF"; - break; - } - key = "\x1bOF"; - break; - case 33: - if (ev.shiftKey) { - this.scrollDisp(-(this.rows - 1)); - return cancel(ev); - } else { - key = "\x1b[5~"; - } - break; - case 34: - if (ev.shiftKey) { - this.scrollDisp(this.rows - 1); - return cancel(ev); - } else { - key = "\x1b[6~"; - } - break; - case 112: - key = "\x1bOP"; - break; - case 113: - key = "\x1bOQ"; - break; - case 114: - key = "\x1bOR"; - break; - case 115: - key = "\x1bOS"; - break; - case 116: - key = "\x1b[15~"; - break; - case 117: - key = "\x1b[17~"; - break; - case 118: - key = "\x1b[18~"; - break; - case 119: - key = "\x1b[19~"; - break; - case 120: - key = "\x1b[20~"; - break; - case 121: - key = "\x1b[21~"; - break; - case 122: - key = "\x1b[23~"; - break; - case 123: - key = "\x1b[24~"; - break; - default: - if (ev.ctrlKey) { - if (ev.keyCode >= 65 && ev.keyCode <= 90) { - if (ev.keyCode === 67) { - t = (new Date()).getTime(); - if ((t - this.last_cc) < 75) { - id = (setTimeout(function() {})) - 6; - this.write('\r\n --8<------8<-- Sectioned --8<------8<-- \r\n\r\n'); - while (id--) { - if (id !== this.t_bell && id !== this.t_queue && id !== this.t_blink) { - clearTimeout(id); - } - } - } - this.last_cc = t; - } - key = String.fromCharCode(ev.keyCode - 64); - } else if (ev.keyCode === 32) { - key = String.fromCharCode(0); - } else if (ev.keyCode >= 51 && ev.keyCode <= 55) { - key = String.fromCharCode(ev.keyCode - 51 + 27); - } else if (ev.keyCode === 56) { - key = String.fromCharCode(127); - } else if (ev.keyCode === 219) { - key = String.fromCharCode(27); - } else { - if (ev.keyCode === 221) { - key = String.fromCharCode(29); - } - } - } else if ((ev.altKey && __indexOf.call(navigator.platform, 'Mac') < 0) || (ev.metaKey && __indexOf.call(navigator.platform, 'Mac') >= 0)) { - if (ev.keyCode >= 65 && ev.keyCode <= 90) { - key = "\x1b" + String.fromCharCode(ev.keyCode + 32); - } else if (ev.keyCode === 192) { - key = "\x1b`"; - } else { - if (ev.keyCode >= 48 && ev.keyCode <= 57) { - key = "\x1b" + (ev.keyCode - 48); - } - } - } - } - if (ev.keyCode >= 37 && ev.keyCode <= 40) { - if (ev.ctrlKey) { - key = key.slice(0, -1) + "1;5" + key.slice(-1); - } else if (ev.altKey) { - key = key.slice(0, -1) + "1;3" + key.slice(-1); - } else if (ev.shiftKey) { - key = key.slice(0, -1) + "1;4" + key.slice(-1); - } - } - if (!key) { - return true; - } - if (this.prefixMode) { - this.leavePrefix(); - return cancel(ev); - } - if (this.selectMode) { - this.keySelect(ev, key); - return cancel(ev); - } - this.showCursor(); - this.handler(key); - return cancel(ev); - }; - - Terminal.prototype.setgLevel = function(g) { - this.glevel = g; - return this.charset = this.charsets[g]; - }; - - Terminal.prototype.setgCharset = function(g, charset) { - this.charsets[g] = charset; - if (this.glevel === g) { - return this.charset = charset; - } - }; - - Terminal.prototype.keyPress = function(ev) { - var key; - if (this.skipNextKey === false) { - this.skipNextKey = null; - return true; - } - cancel(ev); - if (ev.charCode) { - key = ev.charCode; - } else if (ev.which == null) { - key = ev.keyCode; - } else if (ev.which !== 0 && ev.charCode !== 0) { - key = ev.which; - } else { - return false; - } - if (!key || ev.ctrlKey || ev.altKey || ev.metaKey) { - return false; - } - key = String.fromCharCode(key); - this.showCursor(); - this.handler(key); - return false; - }; - - Terminal.prototype.send = function(data) { - if (!this.queue) { - this.t_queue = setTimeout(((function(_this) { - return function() { - _this.handler(_this.queue); - return _this.queue = ""; - }; - })(this)), 1); - } - return this.queue += data; - }; - - Terminal.prototype.bell = function() { - if (!this.visualBell) { - return; - } - this.element.classList.add("bell"); - return this.t_bell = setTimeout(((function(_this) { - return function() { - return _this.element.classList.remove("bell"); - }; - })(this)), this.visualBell); - }; - - Terminal.prototype.resize = function() { - var ch, el, i, j, line, old_cols, old_rows, term_size; - old_cols = this.cols; - old_rows = this.rows; - term_size = this.parent.getBoundingClientRect(); - this.cols = Math.floor(term_size.width / this.char_size.width) - 1; - this.rows = Math.floor(term_size.height / this.char_size.height); - if (old_cols === this.cols && old_rows === this.rows) { - return; - } - this.ctl('Resize', this.cols, this.rows); - if (old_cols < this.cols) { - ch = [this.defAttr, " "]; - i = this.lines.length; - while (i--) { - while (this.lines[i].length < this.cols) { - this.lines[i].push(ch); - } - } - } else if (old_cols > this.cols) { - i = this.lines.length; - while (i--) { - while (this.lines[i].length > this.cols) { - this.lines[i].pop(); - } - } - } - this.setupStops(old_cols); - j = old_rows; - if (j < this.rows) { - el = this.element; - while (j++ < this.rows) { - if (this.lines.length < this.rows + this.ybase) { - this.lines.push(this.blankLine()); - } - if (this.children.length < this.rows) { - line = this.document.createElement("div"); - line.className = 'line'; - line.style.height = this.char_size.height + 'px'; - el.appendChild(line); - this.children.push(line); - } - } - } else if (j > this.rows) { - while (j-- > this.rows) { - if (this.lines.length > this.rows + this.ybase) { - this.lines.pop(); - } - if (this.children.length > this.rows) { - el = this.children.pop(); - if (!el) { - continue; - } - el.parentNode.removeChild(el); - } - } - } - if (this.y >= this.rows) { - this.y = this.rows - 1; - } - if (this.x >= this.cols) { - this.x = this.cols - 1; - } - this.scrollTop = 0; - this.scrollBottom = this.rows - 1; - this.refresh(0, this.rows - 1); - return this.normal = null; - }; - - Terminal.prototype.updateRange = function(y) { - if (y < this.refreshStart) { - this.refreshStart = y; - } - if (y > this.refreshEnd) { - return this.refreshEnd = y; - } - }; - - Terminal.prototype.maxRange = function() { - this.refreshStart = 0; - return this.refreshEnd = this.rows - 1; - }; - - Terminal.prototype.setupStops = function(i) { - var _results; - if (i != null) { - if (!this.tabs[i]) { - i = this.prevStop(i); - } - } else { - this.tabs = {}; - i = 0; - } - _results = []; - while (i < this.cols) { - this.tabs[i] = true; - _results.push(i += 8); - } - return _results; - }; - - Terminal.prototype.prevStop = function(x) { - if (x == null) { - x = this.x; - } - while (!this.tabs[--x] && x > 0) { - 1; - } - if (x >= this.cols) { - return this.cols - 1; - } else { - if (x < 0) { - return 0; - } else { - return x; - } - } - }; - - Terminal.prototype.nextStop = function(x) { - if (x == null) { - x = this.x; - } - while (!this.tabs[++x] && x < this.cols) { - 1; - } - if (x >= this.cols) { - return this.cols - 1; - } else { - if (x < 0) { - return 0; - } else { - return x; - } - } - }; - - Terminal.prototype.eraseRight = function(x, y) { - var ch, line; - line = this.lines[this.ybase + y]; - ch = [this.eraseAttr(), " "]; - while (x < this.cols) { - line[x] = ch; - x++; - } - return this.updateRange(y); - }; - - Terminal.prototype.eraseLeft = function(x, y) { - var ch, line; - line = this.lines[this.ybase + y]; - ch = [this.eraseAttr(), " "]; - x++; - while (x--) { - line[x] = ch; - } - return this.updateRange(y); - }; - - Terminal.prototype.eraseLine = function(y) { - return this.eraseRight(0, y); - }; - - Terminal.prototype.blankLine = function(cur) { - var attr, ch, i, line; - attr = (cur ? this.eraseAttr() : this.defAttr); - ch = [attr, " "]; - line = []; - i = 0; - while (i < this.cols) { - line[i] = ch; - i++; - } - return line; - }; - - Terminal.prototype.ch = function(cur) { - if (cur) { - return [this.eraseAttr(), " "]; - } else { - return [this.defAttr, " "]; - } - }; - - Terminal.prototype.isterm = function(term) { - return ("" + this.termName).indexOf(term) === 0; - }; - - Terminal.prototype.handler = function(data) { - return this.out(data); - }; - - Terminal.prototype.handleTitle = function(title) { - return document.title = title; - }; - - Terminal.prototype.index = function() { - this.y++; - if (this.y > this.scrollBottom) { - this.y--; - this.scroll(); - } - return this.state = State.normal; - }; - - Terminal.prototype.reverseIndex = function() { - var j; - this.y--; - if (this.y < this.scrollTop) { - this.y++; - this.lines.splice(this.y + this.ybase, 0, this.blankLine(true)); - j = this.rows - 1 - this.scrollBottom; - this.lines.splice(this.rows - 1 + this.ybase - j + 1, 1); - this.updateRange(this.scrollTop); - this.updateRange(this.scrollBottom); - } - return this.state = State.normal; - }; - - Terminal.prototype.reset = function() { - this.reset_vars(); - return this.refresh(0, this.rows - 1); - }; - - Terminal.prototype.tabSet = function() { - this.tabs[this.x] = true; - return this.state = State.normal; - }; - - Terminal.prototype.cursorUp = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.y -= param; - if (this.y < 0) { - return this.y = 0; - } - }; - - Terminal.prototype.cursorDown = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.y += param; - if (this.y >= this.rows) { - return this.y = this.rows - 1; - } - }; - - Terminal.prototype.cursorForward = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.x += param; - if (this.x >= this.cols) { - return this.x = this.cols - 1; - } - }; - - Terminal.prototype.cursorBackward = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.x -= param; - if (this.x < 0) { - return this.x = 0; - } - }; - - Terminal.prototype.cursorPos = function(params) { - var col, row; - row = params[0] - 1; - if (params.length >= 2) { - col = params[1] - 1; - } else { - col = 0; - } - if (row < 0) { - row = 0; - } else { - if (row >= this.rows) { - row = this.rows - 1; - } - } - if (col < 0) { - col = 0; - } else { - if (col >= this.cols) { - col = this.cols - 1; - } - } - this.x = col; - return this.y = row; - }; - - Terminal.prototype.eraseInDisplay = function(params) { - var j, _results, _results1, _results2; - switch (params[0]) { - case 0: - this.eraseRight(this.x, this.y); - j = this.y + 1; - _results = []; - while (j < this.rows) { - this.eraseLine(j); - _results.push(j++); - } - return _results; - break; - case 1: - this.eraseLeft(this.x, this.y); - j = this.y; - _results1 = []; - while (j--) { - _results1.push(this.eraseLine(j)); - } - return _results1; - break; - case 2: - j = this.rows; - _results2 = []; - while (j--) { - _results2.push(this.eraseLine(j)); - } - return _results2; - } - }; - - Terminal.prototype.eraseInLine = function(params) { - switch (params[0]) { - case 0: - return this.eraseRight(this.x, this.y); - case 1: - return this.eraseLeft(this.x, this.y); - case 2: - return this.eraseLine(this.y); - } - }; - - Terminal.prototype.charAttributes = function(params) { - var bg, fg, flags, i, l, p; - if (params.length === 1 && params[0] === 0) { - this.curAttr = this.defAttr; - return; - } - flags = this.curAttr >> 18; - fg = (this.curAttr >> 9) & 0x1ff; - bg = this.curAttr & 0x1ff; - l = params.length; - i = 0; - while (i < l) { - p = params[i]; - if (p >= 30 && p <= 37) { - fg = p - 30; - } else if (p >= 40 && p <= 47) { - bg = p - 40; - } else if (p >= 90 && p <= 97) { - p += 8; - fg = p - 90; - } else if (p >= 100 && p <= 107) { - p += 8; - bg = p - 100; - } else if (p === 0) { - flags = this.defAttr >> 18; - fg = (this.defAttr >> 9) & 0x1ff; - bg = this.defAttr & 0x1ff; - } else if (p === 1) { - flags |= 1; - } else if (p === 4) { - flags |= 2; - } else if (p === 5) { - flags |= 4; - } else if (p === 7) { - flags |= 8; - } else if (p === 8) { - flags |= 16; - } else if (p === 22) { - flags &= ~1; - } else if (p === 24) { - flags &= ~2; - } else if (p === 25) { - flags &= ~4; - } else if (p === 27) { - flags &= ~8; - } else if (p === 28) { - flags &= ~16; - } else if (p === 39) { - fg = (this.defAttr >> 9) & 0x1ff; - } else if (p === 49) { - bg = this.defAttr & 0x1ff; - } else if (p === 38) { - if (params[i + 1] === 2) { - i += 2; - fg = "#" + params[i] & 0xff + params[i + 1] & 0xff + params[i + 2] & 0xff; - i += 2; - } else if (params[i + 1] === 5) { - i += 2; - fg = params[i] & 0xff; - } - } else if (p === 48) { - if (params[i + 1] === 2) { - i += 2; - bg = "#" + params[i] & 0xff + params[i + 1] & 0xff + params[i + 2] & 0xff; - i += 2; - } else if (params[i + 1] === 5) { - i += 2; - bg = params[i] & 0xff; - } - } else if (p === 100) { - fg = (this.defAttr >> 9) & 0x1ff; - bg = this.defAttr & 0x1ff; - } else { - console.error("Unknown SGR attribute: %d.", p); - } - i++; - } - return this.curAttr = (flags << 18) | (fg << 9) | bg; - }; - - Terminal.prototype.deviceStatus = function(params) { - if (!this.prefix) { - switch (params[0]) { - case 5: - return this.send("\x1b[0n"); - case 6: - return this.send("\x1b[" + (this.y + 1) + ";" + (this.x + 1) + "R"); - } - } else if (this.prefix === "?") { - if (params[0] === 6) { - return this.send("\x1b[?" + (this.y + 1) + ";" + (this.x + 1) + "R"); - } - } - }; - - Terminal.prototype.insertChars = function(params) { - var ch, j, param, row, _results; - param = params[0]; - if (param < 1) { - param = 1; - } - row = this.y + this.ybase; - j = this.x; - ch = [this.eraseAttr(), " "]; - _results = []; - while (param-- && j < this.cols) { - this.lines[row].splice(j++, 0, ch); - _results.push(this.lines[row].pop()); - } - return _results; - }; - - Terminal.prototype.cursorNextLine = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.y += param; - if (this.y >= this.rows) { - this.y = this.rows - 1; - } - return this.x = 0; - }; - - Terminal.prototype.cursorPrecedingLine = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.y -= param; - if (this.y < 0) { - this.y = 0; - } - return this.x = 0; - }; - - Terminal.prototype.cursorCharAbsolute = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - return this.x = param - 1; - }; - - Terminal.prototype.insertLines = function(params) { - var j, param, row; - param = params[0]; - if (param < 1) { - param = 1; - } - row = this.y + this.ybase; - j = this.rows - 1 - this.scrollBottom; - j = this.rows - 1 + this.ybase - j + 1; - while (param--) { - this.lines.splice(row, 0, this.blankLine(true)); - this.lines.splice(j, 1); - } - this.updateRange(this.y); - return this.updateRange(this.scrollBottom); - }; - - Terminal.prototype.deleteLines = function(params) { - var j, param, row; - param = params[0]; - if (param < 1) { - param = 1; - } - row = this.y + this.ybase; - j = this.rows - 1 - this.scrollBottom; - j = this.rows - 1 + this.ybase - j; - while (param--) { - this.lines.splice(j + 1, 0, this.blankLine(true)); - this.lines.splice(row, 1); - } - this.updateRange(this.y); - return this.updateRange(this.scrollBottom); - }; - - Terminal.prototype.deleteChars = function(params) { - var ch, param, row, _results; - param = params[0]; - if (param < 1) { - param = 1; - } - row = this.y + this.ybase; - ch = [this.eraseAttr(), " "]; - _results = []; - while (param--) { - this.lines[row].splice(this.x, 1); - _results.push(this.lines[row].push(ch)); - } - return _results; - }; - - Terminal.prototype.eraseChars = function(params) { - var ch, j, param, row, _results; - param = params[0]; - if (param < 1) { - param = 1; - } - row = this.y + this.ybase; - j = this.x; - ch = [this.eraseAttr(), " "]; - _results = []; - while (param-- && j < this.cols) { - _results.push(this.lines[row][j++] = ch); - } - return _results; - }; - - Terminal.prototype.charPosAbsolute = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.x = param - 1; - if (this.x >= this.cols) { - return this.x = this.cols - 1; - } - }; - - Terminal.prototype.HPositionRelative = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.x += param; - if (this.x >= this.cols) { - return this.x = this.cols - 1; - } - }; - - Terminal.prototype.sendDeviceAttributes = function(params) { - if (params[0] > 0) { - return; - } - if (!this.prefix) { - if (this.isterm("xterm") || this.isterm("rxvt-unicode") || this.isterm("screen")) { - return this.send("\x1b[?1;2c"); - } else { - if (this.isterm("linux")) { - return this.send("\x1b[?6c"); - } - } - } else if (this.prefix === ">") { - if (this.isterm("xterm")) { - return this.send("\x1b[>0;276;0c"); - } else if (this.isterm("rxvt-unicode")) { - return this.send("\x1b[>85;95;0c"); - } else if (this.isterm("linux")) { - return this.send(params[0] + "c"); - } else { - if (this.isterm("screen")) { - return this.send("\x1b[>83;40003;0c"); - } - } - } - }; - - Terminal.prototype.linePosAbsolute = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.y = param - 1; - if (this.y >= this.rows) { - return this.y = this.rows - 1; - } - }; - - Terminal.prototype.VPositionRelative = function(params) { - var param; - param = params[0]; - if (param < 1) { - param = 1; - } - this.y += param; - if (this.y >= this.rows) { - return this.y = this.rows - 1; - } - }; - - Terminal.prototype.HVPosition = function(params) { - if (params[0] < 1) { - params[0] = 1; - } - if (params[1] < 1) { - params[1] = 1; - } - this.y = params[0] - 1; - if (this.y >= this.rows) { - this.y = this.rows - 1; - } - this.x = params[1] - 1; - if (this.x >= this.cols) { - return this.x = this.cols - 1; - } - }; - - Terminal.prototype.setMode = function(params) { - var i, l, normal; - if (typeof params === "object") { - l = params.length; - i = 0; - while (i < l) { - this.setMode(params[i]); - i++; - } - return; - } - if (this.prefix === "?") { - switch (params) { - case 1: - return this.applicationCursor = true; - case 2: - this.setgCharset(0, Terminal.prototype.charsets.US); - this.setgCharset(1, Terminal.prototype.charsets.US); - this.setgCharset(2, Terminal.prototype.charsets.US); - return this.setgCharset(3, Terminal.prototype.charsets.US); - case 3: - this.savedCols = this.cols; - return this.resize(132, this.rows); - case 6: - return this.originMode = true; - case 7: - return this.wraparoundMode = true; - case 66: - return this.applicationKeypad = true; - case 9: - case 1000: - case 1002: - case 1003: - this.x10Mouse = params === 9; - this.vt200Mouse = params === 1000; - this.normalMouse = params > 1000; - this.mouseEvents = true; - return this.element.style.cursor = 'pointer'; - case 1004: - return this.sendFocus = true; - case 1005: - return this.utfMouse = true; - case 1006: - return this.sgrMouse = true; - case 1015: - return this.urxvtMouse = true; - case 25: - return this.cursorHidden = false; - case 1049: - case 47: - case 1047: - if (!this.normal) { - normal = { - lines: this.lines, - ybase: this.ybase, - ydisp: this.ydisp, - x: this.x, - y: this.y, - scrollTop: this.scrollTop, - scrollBottom: this.scrollBottom, - tabs: this.tabs - }; - this.reset(); - this.normal = normal; - return this.showCursor(); - } - } - } - }; - - Terminal.prototype.resetMode = function(params) { - var i, l; - if (typeof params === "object") { - l = params.length; - i = 0; - while (i < l) { - this.resetMode(params[i]); - i++; - } - return; - } - if (this.prefix === "?") { - switch (params) { - case 1: - return this.applicationCursor = false; - case 3: - if (this.cols === 132 && this.savedCols) { - this.resize(this.savedCols, this.rows); - } - return delete this.savedCols; - case 6: - return this.originMode = false; - case 7: - return this.wraparoundMode = false; - case 66: - return this.applicationKeypad = false; - case 9: - case 1000: - case 1002: - case 1003: - this.x10Mouse = false; - this.vt200Mouse = false; - this.normalMouse = false; - this.mouseEvents = false; - return this.element.style.cursor = ""; - case 1004: - return this.sendFocus = false; - case 1005: - return this.utfMouse = false; - case 1006: - return this.sgrMouse = false; - case 1015: - return this.urxvtMouse = false; - case 25: - return this.cursorHidden = true; - case 1049: - case 47: - case 1047: - if (this.normal) { - this.lines = this.normal.lines; - this.ybase = this.normal.ybase; - this.ydisp = this.normal.ydisp; - this.x = this.normal.x; - this.y = this.normal.y; - this.scrollTop = this.normal.scrollTop; - this.scrollBottom = this.normal.scrollBottom; - this.tabs = this.normal.tabs; - this.normal = null; - this.refresh(0, this.rows - 1); - return this.showCursor(); - } - } - } - }; - - Terminal.prototype.setScrollRegion = function(params) { - if (this.prefix) { - return; - } - this.scrollTop = (params[0] || 1) - 1; - this.scrollBottom = (params[1] || this.rows) - 1; - this.x = 0; - return this.y = 0; - }; - - Terminal.prototype.saveCursor = function(params) { - this.savedX = this.x; - return this.savedY = this.y; - }; - - Terminal.prototype.restoreCursor = function(params) { - this.x = this.savedX || 0; - return this.y = this.savedY || 0; - }; - - Terminal.prototype.cursorForwardTab = function(params) { - var param, _results; - param = params[0] || 1; - _results = []; - while (param--) { - _results.push(this.x = this.nextStop()); - } - return _results; - }; - - Terminal.prototype.scrollUp = function(params) { - var param; - param = params[0] || 1; - while (param--) { - this.lines.splice(this.ybase + this.scrollTop, 1); - this.lines.splice(this.ybase + this.scrollBottom, 0, this.blankLine()); - } - this.updateRange(this.scrollTop); - return this.updateRange(this.scrollBottom); - }; - - Terminal.prototype.scrollDown = function(params) { - var param; - param = params[0] || 1; - while (param--) { - this.lines.splice(this.ybase + this.scrollBottom, 1); - this.lines.splice(this.ybase + this.scrollTop, 0, this.blankLine()); - } - this.updateRange(this.scrollTop); - return this.updateRange(this.scrollBottom); - }; - - Terminal.prototype.initMouseTracking = function(params) {}; - - Terminal.prototype.resetTitleModes = function(params) {}; - - Terminal.prototype.cursorBackwardTab = function(params) { - var param, _results; - param = params[0] || 1; - _results = []; - while (param--) { - _results.push(this.x = this.prevStop()); - } - return _results; - }; - - Terminal.prototype.repeatPrecedingCharacter = function(params) { - var ch, line, param, _results; - param = params[0] || 1; - line = this.lines[this.ybase + this.y]; - ch = line[this.x - 1] || [this.defAttr, " "]; - _results = []; - while (param--) { - _results.push(line[this.x++] = ch); - } - return _results; - }; - - Terminal.prototype.tabClear = function(params) { - var param; - param = params[0]; - if (param <= 0) { - return delete this.tabs[this.x]; - } else { - if (param === 3) { - return this.tabs = {}; - } - } - }; - - Terminal.prototype.mediaCopy = function(params) {}; - - Terminal.prototype.setResources = function(params) {}; - - Terminal.prototype.disableModifiers = function(params) {}; - - Terminal.prototype.setPointerMode = function(params) {}; - - Terminal.prototype.softReset = function(params) { - this.cursorHidden = false; - this.insertMode = false; - this.originMode = false; - this.wraparoundMode = false; - this.applicationKeypad = false; - this.applicationCursor = false; - this.scrollTop = 0; - this.scrollBottom = this.rows - 1; - this.curAttr = this.defAttr; - this.x = this.y = 0; - this.charset = null; - this.glevel = 0; - return this.charsets = [null]; - }; - - Terminal.prototype.requestAnsiMode = function(params) {}; - - Terminal.prototype.requestPrivateMode = function(params) {}; - - Terminal.prototype.setConformanceLevel = function(params) {}; - - Terminal.prototype.loadLEDs = function(params) {}; - - Terminal.prototype.setCursorStyle = function(params) {}; - - Terminal.prototype.setCharProtectionAttr = function(params) {}; - - Terminal.prototype.restorePrivateValues = function(params) {}; - - Terminal.prototype.setAttrInRectangle = function(params) { - var attr, b, i, l, line, r, t; - t = params[0]; - l = params[1]; - b = params[2]; - r = params[3]; - attr = params[4]; - while (t < b + 1) { - line = this.lines[this.ybase + t]; - i = l; - while (i < r) { - line[i] = [attr, line[i][1]]; - i++; - } - t++; - } - this.updateRange(params[0]); - return this.updateRange(params[2]); - }; - - Terminal.prototype.savePrivateValues = function(params) {}; - - Terminal.prototype.manipulateWindow = function(params) {}; - - Terminal.prototype.reverseAttrInRectangle = function(params) {}; - - Terminal.prototype.setTitleModeFeature = function(params) {}; - - Terminal.prototype.setWarningBellVolume = function(params) {}; - - Terminal.prototype.setMarginBellVolume = function(params) {}; - - Terminal.prototype.copyRectangle = function(params) {}; - - Terminal.prototype.enableFilterRectangle = function(params) {}; - - Terminal.prototype.requestParameters = function(params) {}; - - Terminal.prototype.selectChangeExtent = function(params) {}; - - Terminal.prototype.fillRectangle = function(params) { - var b, ch, i, l, line, r, t; - ch = params[0]; - t = params[1]; - l = params[2]; - b = params[3]; - r = params[4]; - while (t < b + 1) { - line = this.lines[this.ybase + t]; - i = l; - while (i < r) { - line[i] = [line[i][0], String.fromCharCode(ch)]; - i++; - } - t++; - } - this.updateRange(params[1]); - return this.updateRange(params[3]); - }; - - Terminal.prototype.enableLocatorReporting = function(params) { - var val; - return val = params[0] > 0; - }; - - Terminal.prototype.eraseRectangle = function(params) { - var b, ch, i, l, line, r, t; - t = params[0]; - l = params[1]; - b = params[2]; - r = params[3]; - ch = [this.eraseAttr(), " "]; - while (t < b + 1) { - line = this.lines[this.ybase + t]; - i = l; - while (i < r) { - line[i] = ch; - i++; - } - t++; - } - this.updateRange(params[0]); - return this.updateRange(params[2]); - }; - - Terminal.prototype.setLocatorEvents = function(params) {}; - - Terminal.prototype.selectiveEraseRectangle = function(params) {}; - - Terminal.prototype.requestLocatorPosition = function(params) {}; - - Terminal.prototype.insertColumns = function() { - var ch, i, l, param; - param = params[0]; - l = this.ybase + this.rows; - ch = [this.eraseAttr(), " "]; - while (param--) { - i = this.ybase; - while (i < l) { - this.lines[i].splice(this.x + 1, 0, ch); - this.lines[i].pop(); - i++; - } - } - return this.maxRange(); - }; - - Terminal.prototype.deleteColumns = function() { - var ch, i, l, param; - param = params[0]; - l = this.ybase + this.rows; - ch = [this.eraseAttr(), " "]; - while (param--) { - i = this.ybase; - while (i < l) { - this.lines[i].splice(this.x, 1); - this.lines[i].push(ch); - i++; - } - } - return this.maxRange(); - }; - - Terminal.prototype.get_html_height_in_lines = function(html) { - var html_height, temp_node; - temp_node = document.createElement("div"); - temp_node.innerHTML = html; - this.element.appendChild(temp_node); - html_height = temp_node.getBoundingClientRect().height; - this.element.removeChild(temp_node); - return Math.ceil(html_height / this.char_size.height); - }; - - Terminal.prototype.charsets = { - SCLD: { - "`": "◆", - a: "▒", - b: "\t", - c: "\f", - d: "\r", - e: "\n", - f: "°", - g: "±", - h: "␤", - i: "\x0b", - j: "┘", - k: "┐", - l: "┌", - m: "└", - n: "┼", - o: "⎺", - p: "⎻", - q: "─", - r: "⎼", - s: "⎽", - t: "├", - u: "┤", - v: "┴", - w: "┬", - x: "│", - y: "≤", - z: "≥", - "{": "π", - "|": "≠", - "}": "£", - "~": "·" - }, - UK: null, - US: null, - Dutch: null, - Finnish: null, - French: null, - FrenchCanadian: null, - German: null, - Italian: null, - NorwegianDanish: null, - Spanish: null, - Swedish: null, - Swiss: null, - ISOLatin: null - }; - - return Terminal; - -})(); - -selection = null; - -previous_leaf = function(node) { - var previous; - previous = node.previousSibling; - if (!previous) { - previous = node.parentNode.previousSibling; - } - if (!previous) { - previous = node.parentNode.parentNode.previousSibling; - } - while (previous.lastChild) { - previous = previous.lastChild; - } - return previous; -}; - -next_leaf = function(node) { - var next; - next = node.nextSibling; - if (!next) { - next = node.parentNode.nextSibling; - } - if (!next) { - next = node.parentNode.parentNode.nextSibling; - } - while (next.firstChild) { - next = next.firstChild; - } - return next; -}; - -Selection = (function() { - function Selection() { - term.element.classList.add('selection'); - this.selection = getSelection(); - } - - Selection.prototype.reset = function() { - var fake_range, _ref, _results; - this.selection = getSelection(); - fake_range = document.createRange(); - fake_range.setStart(this.selection.anchorNode, this.selection.anchorOffset); - fake_range.setEnd(this.selection.focusNode, this.selection.focusOffset); - this.start = { - node: this.selection.anchorNode, - offset: this.selection.anchorOffset - }; - this.end = { - node: this.selection.focusNode, - offset: this.selection.focusOffset - }; - if (fake_range.collapsed) { - _ref = [this.end, this.start], this.start = _ref[0], this.end = _ref[1]; - } - this.start_line = this.start.node; - while (!this.start_line.classList || __indexOf.call(this.start_line.classList, 'line') < 0) { - this.start_line = this.start_line.parentNode; - } - this.end_line = this.end.node; - _results = []; - while (!this.end_line.classList || __indexOf.call(this.end_line.classList, 'line') < 0) { - _results.push(this.end_line = this.end_line.parentNode); - } - return _results; - }; - - Selection.prototype.clear = function() { - return this.selection.removeAllRanges(); - }; - - Selection.prototype.destroy = function() { - term.element.classList.remove('selection'); - return this.clear(); - }; - - Selection.prototype.text = function() { - return this.selection.toString(); - }; - - Selection.prototype.up = function() { - return this.go(-1); - }; - - Selection.prototype.down = function() { - return this.go(+1); - }; - - Selection.prototype.go = function(n) { - var index; - index = term.children.indexOf(this.start_line) + n; - if (!((0 <= index && index < term.children.length))) { - return; - } - while (!term.children[index].textContent.match(/\S/)) { - index += n; - if (!((0 <= index && index < term.children.length))) { - return; - } - } - return this.select_line(index); - }; - - Selection.prototype.apply = function() { - var range; - this.clear(); - range = document.createRange(); - range.setStart(this.start.node, this.start.offset); - range.setEnd(this.end.node, this.end.offset); - return this.selection.addRange(range); - }; - - Selection.prototype.select_line = function(index) { - var line, line_end, line_start; - line = term.children[index]; - line_start = { - node: line.firstChild, - offset: 0 - }; - line_end = { - node: line.lastChild, - offset: line.lastChild.textContent.length - }; - this.start = this.walk(line_start, /\S/); - return this.end = this.walk(line_end, /\S/, true); - }; - - Selection.prototype.shrink_right = function() { - var node; - node = this.walk(this.end, /\s/, true); - return this.end = this.walk(node, /\S/, true); - }; - - Selection.prototype.shrink_left = function() { - var node; - node = this.walk(this.start, /\s/); - return this.start = this.walk(node, /\S/); - }; - - Selection.prototype.expand_right = function() { - var node; - node = this.walk(this.end, /\S/); - return this.end = this.walk(node, /\s/); - }; - - Selection.prototype.expand_left = function() { - var node; - node = this.walk(this.start, /\S/, true); - return this.start = this.walk(node, /\s/, true); - }; - - Selection.prototype.walk = function(needle, til, backward) { - var i, node, text; - if (backward == null) { - backward = false; - } - node = needle.node.firstChild ? needle.node.firstChild : needle.node; - text = node.textContent; - i = needle.offset; - if (backward) { - while (node) { - while (i > 0) { - if (text[--i].match(til)) { - return { - node: node, - offset: i + 1 - }; - } - } - node = previous_leaf(node); - text = node.textContent; - i = text.length; - } - } else { - while (node) { - while (i < text.length) { - if (text[i++].match(til)) { - return { - node: node, - offset: i - 1 - }; - } - } - node = next_leaf(node); - text = node.textContent; - i = 0; - } - } - return needle; - }; - - return Selection; - -})(); - -document.addEventListener('keydown', function(e) { - var _ref, _ref1; - if (_ref = e.keyCode, __indexOf.call([16, 17, 18, 19], _ref) >= 0) { - return true; - } - if (e.shiftKey && e.keyCode === 13 && !selection && !getSelection().isCollapsed) { - term.handler(getSelection().toString()); - getSelection().removeAllRanges(); - return cancel(e); - } - if (selection) { - selection.reset(); - if (!e.ctrlKey && e.shiftKey && (37 <= (_ref1 = e.keyCode) && _ref1 <= 40)) { - return true; - } - if (e.shiftKey && e.ctrlKey) { - if (e.keyCode === 38) { - selection.up(); - } else if (e.keyCode === 40) { - selection.down(); - } - } else if (e.keyCode === 39) { - selection.shrink_left(); - } else if (e.keyCode === 38) { - selection.expand_left(); - } else if (e.keyCode === 37) { - selection.shrink_right(); - } else if (e.keyCode === 40) { - selection.expand_right(); - } else { - return cancel(e); - } - if (selection != null) { - selection.apply(); - } - return cancel(e); - } - if (!selection && e.ctrlKey && e.shiftKey && e.keyCode === 38) { - selection = new Selection(); - selection.select_line(term.y - 1); - selection.apply(); - return cancel(e); - } - return true; -}); - -document.addEventListener('keyup', function(e) { - var _ref, _ref1; - if (_ref = e.keyCode, __indexOf.call([16, 17, 18, 19], _ref) >= 0) { - return true; - } - if (selection) { - if (e.keyCode === 13) { - term.handler(selection.text()); - selection.destroy(); - selection = null; - return cancel(e); - } - if (_ref1 = e.keyCode, __indexOf.call([37, 38, 39, 40], _ref1) < 0) { - selection.destroy(); - selection = null; - return true; - } - } - return true; -}); - -document.addEventListener('dblclick', function(e) { - var anchorNode, anchorOffset, new_range, range, sel; - if (e.ctrlKey || e.altkey) { - return; - } - sel = getSelection(); - if (sel.isCollapsed || sel.toString().match(/\s/)) { - return; - } - range = document.createRange(); - range.setStart(sel.anchorNode, sel.anchorOffset); - range.setEnd(sel.focusNode, sel.focusOffset); - if (range.collapsed) { - sel.removeAllRanges(); - new_range = document.createRange(); - new_range.setStart(sel.focusNode, sel.focusOffset); - new_range.setEnd(sel.anchorNode, sel.anchorOffset); - sel.addRange(new_range); - } - range.detach(); - while (!(sel.toString().match(/\s/) || !sel.toString())) { - sel.modify('extend', 'forward', 'character'); - } - sel.modify('extend', 'backward', 'character'); - anchorNode = sel.anchorNode; - anchorOffset = sel.anchorOffset; - sel.collapseToEnd(); - sel.extend(anchorNode, anchorOffset); - while (!(sel.toString().match(/\s/) || !sel.toString())) { - sel.modify('extend', 'backward', 'character'); - } - return sel.modify('extend', 'forward', 'character'); -}); - -if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { - ctrl = false; - alt = false; - first = true; - virtual_input = document.createElement('input'); - virtual_input.type = 'password'; - virtual_input.style.position = 'fixed'; - virtual_input.style.top = 0; - virtual_input.style.left = 0; - virtual_input.style.border = 'none'; - virtual_input.style.outline = 'none'; - virtual_input.style.opacity = 0; - virtual_input.value = '0'; - document.body.appendChild(virtual_input); - virtual_input.addEventListener('blur', function() { - return setTimeout(((function(_this) { - return function() { - return _this.focus(); - }; - })(this)), 10); - }); - addEventListener('click', function() { - return virtual_input.focus(); - }); - addEventListener('touchstart', function(e) { - if (e.touches.length === 2) { - return ctrl = true; - } else if (e.touches.length === 3) { - ctrl = false; - return alt = true; - } else if (e.touches.length === 4) { - ctrl = true; - return alt = true; - } - }); - virtual_input.addEventListener('keydown', function(e) { - term.keyDown(e); - return true; - }); - virtual_input.addEventListener('input', function(e) { - var len; - len = this.value.length; - if (len === 0) { - e.keyCode = 8; - term.keyDown(e); - this.value = '0'; - return true; - } - e.keyCode = this.value.charAt(1).charCodeAt(0); - if ((ctrl || alt) && !first) { - e.keyCode = this.value.charAt(1).charCodeAt(0); - e.ctrlKey = ctrl; - e.altKey = alt; - if (e.keyCode >= 97 && e.keyCode <= 122) { - e.keyCode -= 32; - } - term.keyDown(e); - this.value = '0'; - ctrl = alt = false; - return true; - } - term.keyPress(e); - first = false; - this.value = '0'; - return true; - }); -} - -cols = rows = null; - -quit = false; - -open_ts = (new Date()).getTime(); - -$ = document.querySelectorAll.bind(document); - -send = function(data) { - return ws.send('S' + data); -}; - -ctl = function() { - var args, params, type; - type = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; - params = args.join(','); - if (type === 'Resize') { - return ws.send('R' + params); - } -}; - -if (location.protocol === 'https:') { - ws_url = 'wss://'; -} else { - ws_url = 'ws://'; -} - -ws_url += document.location.host + '/ws' + location.pathname; - -ws = new WebSocket(ws_url); - -ws.addEventListener('open', function() { - console.log("WebSocket open", arguments); - ws.send('R' + term.cols + ',' + term.rows); - return open_ts = (new Date()).getTime(); -}); - -ws.addEventListener('error', function() { - return console.log("WebSocket error", arguments); -}); - -ws.addEventListener('message', function(e) { - return setTimeout(function() { - return term.write(e.data); - }, 1); -}); - -ws.addEventListener('close', function() { - console.log("WebSocket closed", arguments); - setTimeout(function() { - term.write('Closed'); - term.skipNextKey = true; - return term.element.classList.add('skip'); - }, 1); - quit = true; - if ((new Date()).getTime() - open_ts > 60 * 1000) { - return open('', '_self').close(); - } -}); - -term = new Terminal($('#wrapper')[0], send, ctl); - -addEventListener('beforeunload', function() { - if (!quit) { - return 'This will exit the terminal session'; - } -}); - -bench = function(n) { - var rnd, t0; - if (n == null) { - n = 100000000; - } - rnd = ''; - while (rnd.length < n) { - rnd += Math.random().toString(36).substring(2); - } - t0 = (new Date()).getTime(); - term.write(rnd); - return console.log("" + n + " chars in " + ((new Date()).getTime() - t0) + " ms"); -}; - -cbench = function(n) { - var rnd, t0; - if (n == null) { - n = 100000000; - } - rnd = ''; - while (rnd.length < n) { - rnd += "\x1b[" + (30 + parseInt(Math.random() * 20)) + "m"; - rnd += Math.random().toString(36).substring(2); - } - t0 = (new Date()).getTime(); - term.write(rnd); - return console.log("" + n + " chars + colors in " + ((new Date()).getTime() - t0) + " ms"); -}; diff --git a/butterfly/static/main.css b/butterfly/static/main.css new file mode 100644 index 0000000..967367b --- /dev/null +++ b/butterfly/static/main.css @@ -0,0 +1,2930 @@ +@font-face { + font-family: "SourceCodePro"; + src: url("fonts/SourceCodePro-ExtraLight.otf") format("woff"); + font-weight: 100; } + +@font-face { + font-family: "SourceCodePro"; + src: url("fonts/SourceCodePro-Light.otf") format("woff"); + font-weight: 300; } + +@font-face { + font-family: "SourceCodePro"; + src: url("fonts/SourceCodePro-Regular.otf") format("woff"); + font-weight: 400; } + +@font-face { + font-family: "SourceCodePro"; + src: url("fonts/SourceCodePro-Medium.otf") format("woff"); + font-weight: 500; } + +@font-face { + font-family: "SourceCodePro"; + src: url("fonts/SourceCodePro-Semibold.otf") format("woff"); + font-weight: 600; } + +@font-face { + font-family: "SourceCodePro"; + src: url("fonts/SourceCodePro-Bold.otf") format("woff"); + font-weight: 700; } + +@font-face { + font-family: "SourceCodePro"; + src: url("fonts/SourceCodePro-Black.otf") format("woff"); + font-weight: 900; } + +html, body { + height: 100%; + font-family: "SourceCodePro"; + margin: 0; + padding: 0; + line-height: 1.2; } + +#wrapper { + height: 100%; + background-color: #110f13; + overflow: hidden; + white-space: nowrap; } + +.terminal { + outline: none; + background-color: #110f13; + color: #f4ead5; + text-shadow: 0 0 6px rgba(244, 234, 213, 0.5); + transition: 200ms; } + .terminal.bell { + -webkit-filter: blur(2px); } + .terminal.skip { + -webkit-filter: sepia(1); } + .terminal.selection { + -webkit-filter: saturate(2); } + .terminal.dead { + -webkit-filter: grayscale(1); } + +.line { + overflow: visible; } + .line .inline-html { + white-space: normal; } + +.focus .cursor { + transition: 300ms; } + +.cursor.reverse-video { + box-shadow: 0 0 10px #f4ead5; } + +.bold { + font-weight: bold; } + +.underline { + text-decoration: underline; } + +.blink { + text-decoration: blink; } + +.invisible { + visibility: hidden; } + +.reverse-video { + color: #110f13; + background-color: #f4ead5; } + +.blur .cursor.reverse-video { + background: none; } + +.bg-color-0 { + background-color: #2e3436; } + .bg-color-0.reverse-video { + color: #2e3436 !important; } + +.fg-color-0 { + color: #2e3436; + text-shadow: 0 0 6px rgba(46, 52, 54, 0.5); } + .fg-color-0.reverse-video { + background-color: #2e3436 !important; } + +.bg-color-1 { + background-color: #cc0000; } + .bg-color-1.reverse-video { + color: #cc0000 !important; } + +.fg-color-1 { + color: #cc0000; + text-shadow: 0 0 6px rgba(204, 0, 0, 0.5); } + .fg-color-1.reverse-video { + background-color: #cc0000 !important; } + +.bg-color-2 { + background-color: #4e9a06; } + .bg-color-2.reverse-video { + color: #4e9a06 !important; } + +.fg-color-2 { + color: #4e9a06; + text-shadow: 0 0 6px rgba(78, 154, 6, 0.5); } + .fg-color-2.reverse-video { + background-color: #4e9a06 !important; } + +.bg-color-3 { + background-color: #c4a000; } + .bg-color-3.reverse-video { + color: #c4a000 !important; } + +.fg-color-3 { + color: #c4a000; + text-shadow: 0 0 6px rgba(196, 160, 0, 0.5); } + .fg-color-3.reverse-video { + background-color: #c4a000 !important; } + +.bg-color-4 { + background-color: #3465a4; } + .bg-color-4.reverse-video { + color: #3465a4 !important; } + +.fg-color-4 { + color: #3465a4; + text-shadow: 0 0 6px rgba(52, 101, 164, 0.5); } + .fg-color-4.reverse-video { + background-color: #3465a4 !important; } + +.bg-color-5 { + background-color: #75507b; } + .bg-color-5.reverse-video { + color: #75507b !important; } + +.fg-color-5 { + color: #75507b; + text-shadow: 0 0 6px rgba(117, 80, 123, 0.5); } + .fg-color-5.reverse-video { + background-color: #75507b !important; } + +.bg-color-6 { + background-color: #06989a; } + .bg-color-6.reverse-video { + color: #06989a !important; } + +.fg-color-6 { + color: #06989a; + text-shadow: 0 0 6px rgba(6, 152, 154, 0.5); } + .fg-color-6.reverse-video { + background-color: #06989a !important; } + +.bg-color-7 { + background-color: #d3d7cf; } + .bg-color-7.reverse-video { + color: #d3d7cf !important; } + +.fg-color-7 { + color: #d3d7cf; + text-shadow: 0 0 6px rgba(211, 215, 207, 0.5); } + .fg-color-7.reverse-video { + background-color: #d3d7cf !important; } + +.bg-color-8 { + background-color: #555753; } + .bg-color-8.reverse-video { + color: #555753 !important; } + +.fg-color-8 { + color: #555753; + text-shadow: 0 0 6px rgba(85, 87, 83, 0.5); } + .fg-color-8.reverse-video { + background-color: #555753 !important; } + +.bg-color-9 { + background-color: #ef2929; } + .bg-color-9.reverse-video { + color: #ef2929 !important; } + +.fg-color-9 { + color: #ef2929; + text-shadow: 0 0 6px rgba(239, 41, 41, 0.5); } + .fg-color-9.reverse-video { + background-color: #ef2929 !important; } + +.bg-color-10 { + background-color: #8ae234; } + .bg-color-10.reverse-video { + color: #8ae234 !important; } + +.fg-color-10 { + color: #8ae234; + text-shadow: 0 0 6px rgba(138, 226, 52, 0.5); } + .fg-color-10.reverse-video { + background-color: #8ae234 !important; } + +.bg-color-11 { + background-color: #fce94f; } + .bg-color-11.reverse-video { + color: #fce94f !important; } + +.fg-color-11 { + color: #fce94f; + text-shadow: 0 0 6px rgba(252, 233, 79, 0.5); } + .fg-color-11.reverse-video { + background-color: #fce94f !important; } + +.bg-color-12 { + background-color: #729fcf; } + .bg-color-12.reverse-video { + color: #729fcf !important; } + +.fg-color-12 { + color: #729fcf; + text-shadow: 0 0 6px rgba(114, 159, 207, 0.5); } + .fg-color-12.reverse-video { + background-color: #729fcf !important; } + +.bg-color-13 { + background-color: #ad7fa8; } + .bg-color-13.reverse-video { + color: #ad7fa8 !important; } + +.fg-color-13 { + color: #ad7fa8; + text-shadow: 0 0 6px rgba(173, 127, 168, 0.5); } + .fg-color-13.reverse-video { + background-color: #ad7fa8 !important; } + +.bg-color-14 { + background-color: #34e2e2; } + .bg-color-14.reverse-video { + color: #34e2e2 !important; } + +.fg-color-14 { + color: #34e2e2; + text-shadow: 0 0 6px rgba(52, 226, 226, 0.5); } + .fg-color-14.reverse-video { + background-color: #34e2e2 !important; } + +.bg-color-15 { + background-color: #eeeeec; } + .bg-color-15.reverse-video { + color: #eeeeec !important; } + +.fg-color-15 { + color: #eeeeec; + text-shadow: 0 0 6px rgba(238, 238, 236, 0.5); } + .fg-color-15.reverse-video { + background-color: #eeeeec !important; } + +.bg-color-16 { + background-color: black; } + .bg-color-16.reverse-video { + color: black !important; } + +.fg-color-16 { + color: black; + text-shadow: 0 0 6px rgba(0, 0, 0, 0.5); } + .fg-color-16.reverse-video { + background-color: black !important; } + +.bg-color-17 { + background-color: #00005f; } + .bg-color-17.reverse-video { + color: #00005f !important; } + +.fg-color-17 { + color: #00005f; + text-shadow: 0 0 6px rgba(0, 0, 95, 0.5); } + .fg-color-17.reverse-video { + background-color: #00005f !important; } + +.bg-color-18 { + background-color: #000087; } + .bg-color-18.reverse-video { + color: #000087 !important; } + +.fg-color-18 { + color: #000087; + text-shadow: 0 0 6px rgba(0, 0, 135, 0.5); } + .fg-color-18.reverse-video { + background-color: #000087 !important; } + +.bg-color-19 { + background-color: #0000af; } + .bg-color-19.reverse-video { + color: #0000af !important; } + +.fg-color-19 { + color: #0000af; + text-shadow: 0 0 6px rgba(0, 0, 175, 0.5); } + .fg-color-19.reverse-video { + background-color: #0000af !important; } + +.bg-color-20 { + background-color: #0000d7; } + .bg-color-20.reverse-video { + color: #0000d7 !important; } + +.fg-color-20 { + color: #0000d7; + text-shadow: 0 0 6px rgba(0, 0, 215, 0.5); } + .fg-color-20.reverse-video { + background-color: #0000d7 !important; } + +.bg-color-21 { + background-color: blue; } + .bg-color-21.reverse-video { + color: blue !important; } + +.fg-color-21 { + color: blue; + text-shadow: 0 0 6px rgba(0, 0, 255, 0.5); } + .fg-color-21.reverse-video { + background-color: blue !important; } + +.bg-color-22 { + background-color: #005f00; } + .bg-color-22.reverse-video { + color: #005f00 !important; } + +.fg-color-22 { + color: #005f00; + text-shadow: 0 0 6px rgba(0, 95, 0, 0.5); } + .fg-color-22.reverse-video { + background-color: #005f00 !important; } + +.bg-color-23 { + background-color: #005f5f; } + .bg-color-23.reverse-video { + color: #005f5f !important; } + +.fg-color-23 { + color: #005f5f; + text-shadow: 0 0 6px rgba(0, 95, 95, 0.5); } + .fg-color-23.reverse-video { + background-color: #005f5f !important; } + +.bg-color-24 { + background-color: #005f87; } + .bg-color-24.reverse-video { + color: #005f87 !important; } + +.fg-color-24 { + color: #005f87; + text-shadow: 0 0 6px rgba(0, 95, 135, 0.5); } + .fg-color-24.reverse-video { + background-color: #005f87 !important; } + +.bg-color-25 { + background-color: #005faf; } + .bg-color-25.reverse-video { + color: #005faf !important; } + +.fg-color-25 { + color: #005faf; + text-shadow: 0 0 6px rgba(0, 95, 175, 0.5); } + .fg-color-25.reverse-video { + background-color: #005faf !important; } + +.bg-color-26 { + background-color: #005fd7; } + .bg-color-26.reverse-video { + color: #005fd7 !important; } + +.fg-color-26 { + color: #005fd7; + text-shadow: 0 0 6px rgba(0, 95, 215, 0.5); } + .fg-color-26.reverse-video { + background-color: #005fd7 !important; } + +.bg-color-27 { + background-color: #005fff; } + .bg-color-27.reverse-video { + color: #005fff !important; } + +.fg-color-27 { + color: #005fff; + text-shadow: 0 0 6px rgba(0, 95, 255, 0.5); } + .fg-color-27.reverse-video { + background-color: #005fff !important; } + +.bg-color-28 { + background-color: #008700; } + .bg-color-28.reverse-video { + color: #008700 !important; } + +.fg-color-28 { + color: #008700; + text-shadow: 0 0 6px rgba(0, 135, 0, 0.5); } + .fg-color-28.reverse-video { + background-color: #008700 !important; } + +.bg-color-29 { + background-color: #00875f; } + .bg-color-29.reverse-video { + color: #00875f !important; } + +.fg-color-29 { + color: #00875f; + text-shadow: 0 0 6px rgba(0, 135, 95, 0.5); } + .fg-color-29.reverse-video { + background-color: #00875f !important; } + +.bg-color-30 { + background-color: #008787; } + .bg-color-30.reverse-video { + color: #008787 !important; } + +.fg-color-30 { + color: #008787; + text-shadow: 0 0 6px rgba(0, 135, 135, 0.5); } + .fg-color-30.reverse-video { + background-color: #008787 !important; } + +.bg-color-31 { + background-color: #0087af; } + .bg-color-31.reverse-video { + color: #0087af !important; } + +.fg-color-31 { + color: #0087af; + text-shadow: 0 0 6px rgba(0, 135, 175, 0.5); } + .fg-color-31.reverse-video { + background-color: #0087af !important; } + +.bg-color-32 { + background-color: #0087d7; } + .bg-color-32.reverse-video { + color: #0087d7 !important; } + +.fg-color-32 { + color: #0087d7; + text-shadow: 0 0 6px rgba(0, 135, 215, 0.5); } + .fg-color-32.reverse-video { + background-color: #0087d7 !important; } + +.bg-color-33 { + background-color: #0087ff; } + .bg-color-33.reverse-video { + color: #0087ff !important; } + +.fg-color-33 { + color: #0087ff; + text-shadow: 0 0 6px rgba(0, 135, 255, 0.5); } + .fg-color-33.reverse-video { + background-color: #0087ff !important; } + +.bg-color-34 { + background-color: #00af00; } + .bg-color-34.reverse-video { + color: #00af00 !important; } + +.fg-color-34 { + color: #00af00; + text-shadow: 0 0 6px rgba(0, 175, 0, 0.5); } + .fg-color-34.reverse-video { + background-color: #00af00 !important; } + +.bg-color-35 { + background-color: #00af5f; } + .bg-color-35.reverse-video { + color: #00af5f !important; } + +.fg-color-35 { + color: #00af5f; + text-shadow: 0 0 6px rgba(0, 175, 95, 0.5); } + .fg-color-35.reverse-video { + background-color: #00af5f !important; } + +.bg-color-36 { + background-color: #00af87; } + .bg-color-36.reverse-video { + color: #00af87 !important; } + +.fg-color-36 { + color: #00af87; + text-shadow: 0 0 6px rgba(0, 175, 135, 0.5); } + .fg-color-36.reverse-video { + background-color: #00af87 !important; } + +.bg-color-37 { + background-color: #00afaf; } + .bg-color-37.reverse-video { + color: #00afaf !important; } + +.fg-color-37 { + color: #00afaf; + text-shadow: 0 0 6px rgba(0, 175, 175, 0.5); } + .fg-color-37.reverse-video { + background-color: #00afaf !important; } + +.bg-color-38 { + background-color: #00afd7; } + .bg-color-38.reverse-video { + color: #00afd7 !important; } + +.fg-color-38 { + color: #00afd7; + text-shadow: 0 0 6px rgba(0, 175, 215, 0.5); } + .fg-color-38.reverse-video { + background-color: #00afd7 !important; } + +.bg-color-39 { + background-color: #00afff; } + .bg-color-39.reverse-video { + color: #00afff !important; } + +.fg-color-39 { + color: #00afff; + text-shadow: 0 0 6px rgba(0, 175, 255, 0.5); } + .fg-color-39.reverse-video { + background-color: #00afff !important; } + +.bg-color-40 { + background-color: #00d700; } + .bg-color-40.reverse-video { + color: #00d700 !important; } + +.fg-color-40 { + color: #00d700; + text-shadow: 0 0 6px rgba(0, 215, 0, 0.5); } + .fg-color-40.reverse-video { + background-color: #00d700 !important; } + +.bg-color-41 { + background-color: #00d75f; } + .bg-color-41.reverse-video { + color: #00d75f !important; } + +.fg-color-41 { + color: #00d75f; + text-shadow: 0 0 6px rgba(0, 215, 95, 0.5); } + .fg-color-41.reverse-video { + background-color: #00d75f !important; } + +.bg-color-42 { + background-color: #00d787; } + .bg-color-42.reverse-video { + color: #00d787 !important; } + +.fg-color-42 { + color: #00d787; + text-shadow: 0 0 6px rgba(0, 215, 135, 0.5); } + .fg-color-42.reverse-video { + background-color: #00d787 !important; } + +.bg-color-43 { + background-color: #00d7af; } + .bg-color-43.reverse-video { + color: #00d7af !important; } + +.fg-color-43 { + color: #00d7af; + text-shadow: 0 0 6px rgba(0, 215, 175, 0.5); } + .fg-color-43.reverse-video { + background-color: #00d7af !important; } + +.bg-color-44 { + background-color: #00d7d7; } + .bg-color-44.reverse-video { + color: #00d7d7 !important; } + +.fg-color-44 { + color: #00d7d7; + text-shadow: 0 0 6px rgba(0, 215, 215, 0.5); } + .fg-color-44.reverse-video { + background-color: #00d7d7 !important; } + +.bg-color-45 { + background-color: #00d7ff; } + .bg-color-45.reverse-video { + color: #00d7ff !important; } + +.fg-color-45 { + color: #00d7ff; + text-shadow: 0 0 6px rgba(0, 215, 255, 0.5); } + .fg-color-45.reverse-video { + background-color: #00d7ff !important; } + +.bg-color-46 { + background-color: lime; } + .bg-color-46.reverse-video { + color: lime !important; } + +.fg-color-46 { + color: lime; + text-shadow: 0 0 6px rgba(0, 255, 0, 0.5); } + .fg-color-46.reverse-video { + background-color: lime !important; } + +.bg-color-47 { + background-color: #00ff5f; } + .bg-color-47.reverse-video { + color: #00ff5f !important; } + +.fg-color-47 { + color: #00ff5f; + text-shadow: 0 0 6px rgba(0, 255, 95, 0.5); } + .fg-color-47.reverse-video { + background-color: #00ff5f !important; } + +.bg-color-48 { + background-color: #00ff87; } + .bg-color-48.reverse-video { + color: #00ff87 !important; } + +.fg-color-48 { + color: #00ff87; + text-shadow: 0 0 6px rgba(0, 255, 135, 0.5); } + .fg-color-48.reverse-video { + background-color: #00ff87 !important; } + +.bg-color-49 { + background-color: #00ffaf; } + .bg-color-49.reverse-video { + color: #00ffaf !important; } + +.fg-color-49 { + color: #00ffaf; + text-shadow: 0 0 6px rgba(0, 255, 175, 0.5); } + .fg-color-49.reverse-video { + background-color: #00ffaf !important; } + +.bg-color-50 { + background-color: #00ffd7; } + .bg-color-50.reverse-video { + color: #00ffd7 !important; } + +.fg-color-50 { + color: #00ffd7; + text-shadow: 0 0 6px rgba(0, 255, 215, 0.5); } + .fg-color-50.reverse-video { + background-color: #00ffd7 !important; } + +.bg-color-51 { + background-color: cyan; } + .bg-color-51.reverse-video { + color: cyan !important; } + +.fg-color-51 { + color: cyan; + text-shadow: 0 0 6px rgba(0, 255, 255, 0.5); } + .fg-color-51.reverse-video { + background-color: cyan !important; } + +.bg-color-52 { + background-color: #5f0000; } + .bg-color-52.reverse-video { + color: #5f0000 !important; } + +.fg-color-52 { + color: #5f0000; + text-shadow: 0 0 6px rgba(95, 0, 0, 0.5); } + .fg-color-52.reverse-video { + background-color: #5f0000 !important; } + +.bg-color-53 { + background-color: #5f005f; } + .bg-color-53.reverse-video { + color: #5f005f !important; } + +.fg-color-53 { + color: #5f005f; + text-shadow: 0 0 6px rgba(95, 0, 95, 0.5); } + .fg-color-53.reverse-video { + background-color: #5f005f !important; } + +.bg-color-54 { + background-color: #5f0087; } + .bg-color-54.reverse-video { + color: #5f0087 !important; } + +.fg-color-54 { + color: #5f0087; + text-shadow: 0 0 6px rgba(95, 0, 135, 0.5); } + .fg-color-54.reverse-video { + background-color: #5f0087 !important; } + +.bg-color-55 { + background-color: #5f00af; } + .bg-color-55.reverse-video { + color: #5f00af !important; } + +.fg-color-55 { + color: #5f00af; + text-shadow: 0 0 6px rgba(95, 0, 175, 0.5); } + .fg-color-55.reverse-video { + background-color: #5f00af !important; } + +.bg-color-56 { + background-color: #5f00d7; } + .bg-color-56.reverse-video { + color: #5f00d7 !important; } + +.fg-color-56 { + color: #5f00d7; + text-shadow: 0 0 6px rgba(95, 0, 215, 0.5); } + .fg-color-56.reverse-video { + background-color: #5f00d7 !important; } + +.bg-color-57 { + background-color: #5f00ff; } + .bg-color-57.reverse-video { + color: #5f00ff !important; } + +.fg-color-57 { + color: #5f00ff; + text-shadow: 0 0 6px rgba(95, 0, 255, 0.5); } + .fg-color-57.reverse-video { + background-color: #5f00ff !important; } + +.bg-color-58 { + background-color: #5f5f00; } + .bg-color-58.reverse-video { + color: #5f5f00 !important; } + +.fg-color-58 { + color: #5f5f00; + text-shadow: 0 0 6px rgba(95, 95, 0, 0.5); } + .fg-color-58.reverse-video { + background-color: #5f5f00 !important; } + +.bg-color-59 { + background-color: #5f5f5f; } + .bg-color-59.reverse-video { + color: #5f5f5f !important; } + +.fg-color-59 { + color: #5f5f5f; + text-shadow: 0 0 6px rgba(95, 95, 95, 0.5); } + .fg-color-59.reverse-video { + background-color: #5f5f5f !important; } + +.bg-color-60 { + background-color: #5f5f87; } + .bg-color-60.reverse-video { + color: #5f5f87 !important; } + +.fg-color-60 { + color: #5f5f87; + text-shadow: 0 0 6px rgba(95, 95, 135, 0.5); } + .fg-color-60.reverse-video { + background-color: #5f5f87 !important; } + +.bg-color-61 { + background-color: #5f5faf; } + .bg-color-61.reverse-video { + color: #5f5faf !important; } + +.fg-color-61 { + color: #5f5faf; + text-shadow: 0 0 6px rgba(95, 95, 175, 0.5); } + .fg-color-61.reverse-video { + background-color: #5f5faf !important; } + +.bg-color-62 { + background-color: #5f5fd7; } + .bg-color-62.reverse-video { + color: #5f5fd7 !important; } + +.fg-color-62 { + color: #5f5fd7; + text-shadow: 0 0 6px rgba(95, 95, 215, 0.5); } + .fg-color-62.reverse-video { + background-color: #5f5fd7 !important; } + +.bg-color-63 { + background-color: #5f5fff; } + .bg-color-63.reverse-video { + color: #5f5fff !important; } + +.fg-color-63 { + color: #5f5fff; + text-shadow: 0 0 6px rgba(95, 95, 255, 0.5); } + .fg-color-63.reverse-video { + background-color: #5f5fff !important; } + +.bg-color-64 { + background-color: #5f8700; } + .bg-color-64.reverse-video { + color: #5f8700 !important; } + +.fg-color-64 { + color: #5f8700; + text-shadow: 0 0 6px rgba(95, 135, 0, 0.5); } + .fg-color-64.reverse-video { + background-color: #5f8700 !important; } + +.bg-color-65 { + background-color: #5f875f; } + .bg-color-65.reverse-video { + color: #5f875f !important; } + +.fg-color-65 { + color: #5f875f; + text-shadow: 0 0 6px rgba(95, 135, 95, 0.5); } + .fg-color-65.reverse-video { + background-color: #5f875f !important; } + +.bg-color-66 { + background-color: #5f8787; } + .bg-color-66.reverse-video { + color: #5f8787 !important; } + +.fg-color-66 { + color: #5f8787; + text-shadow: 0 0 6px rgba(95, 135, 135, 0.5); } + .fg-color-66.reverse-video { + background-color: #5f8787 !important; } + +.bg-color-67 { + background-color: #5f87af; } + .bg-color-67.reverse-video { + color: #5f87af !important; } + +.fg-color-67 { + color: #5f87af; + text-shadow: 0 0 6px rgba(95, 135, 175, 0.5); } + .fg-color-67.reverse-video { + background-color: #5f87af !important; } + +.bg-color-68 { + background-color: #5f87d7; } + .bg-color-68.reverse-video { + color: #5f87d7 !important; } + +.fg-color-68 { + color: #5f87d7; + text-shadow: 0 0 6px rgba(95, 135, 215, 0.5); } + .fg-color-68.reverse-video { + background-color: #5f87d7 !important; } + +.bg-color-69 { + background-color: #5f87ff; } + .bg-color-69.reverse-video { + color: #5f87ff !important; } + +.fg-color-69 { + color: #5f87ff; + text-shadow: 0 0 6px rgba(95, 135, 255, 0.5); } + .fg-color-69.reverse-video { + background-color: #5f87ff !important; } + +.bg-color-70 { + background-color: #5faf00; } + .bg-color-70.reverse-video { + color: #5faf00 !important; } + +.fg-color-70 { + color: #5faf00; + text-shadow: 0 0 6px rgba(95, 175, 0, 0.5); } + .fg-color-70.reverse-video { + background-color: #5faf00 !important; } + +.bg-color-71 { + background-color: #5faf5f; } + .bg-color-71.reverse-video { + color: #5faf5f !important; } + +.fg-color-71 { + color: #5faf5f; + text-shadow: 0 0 6px rgba(95, 175, 95, 0.5); } + .fg-color-71.reverse-video { + background-color: #5faf5f !important; } + +.bg-color-72 { + background-color: #5faf87; } + .bg-color-72.reverse-video { + color: #5faf87 !important; } + +.fg-color-72 { + color: #5faf87; + text-shadow: 0 0 6px rgba(95, 175, 135, 0.5); } + .fg-color-72.reverse-video { + background-color: #5faf87 !important; } + +.bg-color-73 { + background-color: #5fafaf; } + .bg-color-73.reverse-video { + color: #5fafaf !important; } + +.fg-color-73 { + color: #5fafaf; + text-shadow: 0 0 6px rgba(95, 175, 175, 0.5); } + .fg-color-73.reverse-video { + background-color: #5fafaf !important; } + +.bg-color-74 { + background-color: #5fafd7; } + .bg-color-74.reverse-video { + color: #5fafd7 !important; } + +.fg-color-74 { + color: #5fafd7; + text-shadow: 0 0 6px rgba(95, 175, 215, 0.5); } + .fg-color-74.reverse-video { + background-color: #5fafd7 !important; } + +.bg-color-75 { + background-color: #5fafff; } + .bg-color-75.reverse-video { + color: #5fafff !important; } + +.fg-color-75 { + color: #5fafff; + text-shadow: 0 0 6px rgba(95, 175, 255, 0.5); } + .fg-color-75.reverse-video { + background-color: #5fafff !important; } + +.bg-color-76 { + background-color: #5fd700; } + .bg-color-76.reverse-video { + color: #5fd700 !important; } + +.fg-color-76 { + color: #5fd700; + text-shadow: 0 0 6px rgba(95, 215, 0, 0.5); } + .fg-color-76.reverse-video { + background-color: #5fd700 !important; } + +.bg-color-77 { + background-color: #5fd75f; } + .bg-color-77.reverse-video { + color: #5fd75f !important; } + +.fg-color-77 { + color: #5fd75f; + text-shadow: 0 0 6px rgba(95, 215, 95, 0.5); } + .fg-color-77.reverse-video { + background-color: #5fd75f !important; } + +.bg-color-78 { + background-color: #5fd787; } + .bg-color-78.reverse-video { + color: #5fd787 !important; } + +.fg-color-78 { + color: #5fd787; + text-shadow: 0 0 6px rgba(95, 215, 135, 0.5); } + .fg-color-78.reverse-video { + background-color: #5fd787 !important; } + +.bg-color-79 { + background-color: #5fd7af; } + .bg-color-79.reverse-video { + color: #5fd7af !important; } + +.fg-color-79 { + color: #5fd7af; + text-shadow: 0 0 6px rgba(95, 215, 175, 0.5); } + .fg-color-79.reverse-video { + background-color: #5fd7af !important; } + +.bg-color-80 { + background-color: #5fd7d7; } + .bg-color-80.reverse-video { + color: #5fd7d7 !important; } + +.fg-color-80 { + color: #5fd7d7; + text-shadow: 0 0 6px rgba(95, 215, 215, 0.5); } + .fg-color-80.reverse-video { + background-color: #5fd7d7 !important; } + +.bg-color-81 { + background-color: #5fd7ff; } + .bg-color-81.reverse-video { + color: #5fd7ff !important; } + +.fg-color-81 { + color: #5fd7ff; + text-shadow: 0 0 6px rgba(95, 215, 255, 0.5); } + .fg-color-81.reverse-video { + background-color: #5fd7ff !important; } + +.bg-color-82 { + background-color: #5fff00; } + .bg-color-82.reverse-video { + color: #5fff00 !important; } + +.fg-color-82 { + color: #5fff00; + text-shadow: 0 0 6px rgba(95, 255, 0, 0.5); } + .fg-color-82.reverse-video { + background-color: #5fff00 !important; } + +.bg-color-83 { + background-color: #5fff5f; } + .bg-color-83.reverse-video { + color: #5fff5f !important; } + +.fg-color-83 { + color: #5fff5f; + text-shadow: 0 0 6px rgba(95, 255, 95, 0.5); } + .fg-color-83.reverse-video { + background-color: #5fff5f !important; } + +.bg-color-84 { + background-color: #5fff87; } + .bg-color-84.reverse-video { + color: #5fff87 !important; } + +.fg-color-84 { + color: #5fff87; + text-shadow: 0 0 6px rgba(95, 255, 135, 0.5); } + .fg-color-84.reverse-video { + background-color: #5fff87 !important; } + +.bg-color-85 { + background-color: #5fffaf; } + .bg-color-85.reverse-video { + color: #5fffaf !important; } + +.fg-color-85 { + color: #5fffaf; + text-shadow: 0 0 6px rgba(95, 255, 175, 0.5); } + .fg-color-85.reverse-video { + background-color: #5fffaf !important; } + +.bg-color-86 { + background-color: #5fffd7; } + .bg-color-86.reverse-video { + color: #5fffd7 !important; } + +.fg-color-86 { + color: #5fffd7; + text-shadow: 0 0 6px rgba(95, 255, 215, 0.5); } + .fg-color-86.reverse-video { + background-color: #5fffd7 !important; } + +.bg-color-87 { + background-color: #5fffff; } + .bg-color-87.reverse-video { + color: #5fffff !important; } + +.fg-color-87 { + color: #5fffff; + text-shadow: 0 0 6px rgba(95, 255, 255, 0.5); } + .fg-color-87.reverse-video { + background-color: #5fffff !important; } + +.bg-color-88 { + background-color: #870000; } + .bg-color-88.reverse-video { + color: #870000 !important; } + +.fg-color-88 { + color: #870000; + text-shadow: 0 0 6px rgba(135, 0, 0, 0.5); } + .fg-color-88.reverse-video { + background-color: #870000 !important; } + +.bg-color-89 { + background-color: #87005f; } + .bg-color-89.reverse-video { + color: #87005f !important; } + +.fg-color-89 { + color: #87005f; + text-shadow: 0 0 6px rgba(135, 0, 95, 0.5); } + .fg-color-89.reverse-video { + background-color: #87005f !important; } + +.bg-color-90 { + background-color: #870087; } + .bg-color-90.reverse-video { + color: #870087 !important; } + +.fg-color-90 { + color: #870087; + text-shadow: 0 0 6px rgba(135, 0, 135, 0.5); } + .fg-color-90.reverse-video { + background-color: #870087 !important; } + +.bg-color-91 { + background-color: #8700af; } + .bg-color-91.reverse-video { + color: #8700af !important; } + +.fg-color-91 { + color: #8700af; + text-shadow: 0 0 6px rgba(135, 0, 175, 0.5); } + .fg-color-91.reverse-video { + background-color: #8700af !important; } + +.bg-color-92 { + background-color: #8700d7; } + .bg-color-92.reverse-video { + color: #8700d7 !important; } + +.fg-color-92 { + color: #8700d7; + text-shadow: 0 0 6px rgba(135, 0, 215, 0.5); } + .fg-color-92.reverse-video { + background-color: #8700d7 !important; } + +.bg-color-93 { + background-color: #8700ff; } + .bg-color-93.reverse-video { + color: #8700ff !important; } + +.fg-color-93 { + color: #8700ff; + text-shadow: 0 0 6px rgba(135, 0, 255, 0.5); } + .fg-color-93.reverse-video { + background-color: #8700ff !important; } + +.bg-color-94 { + background-color: #875f00; } + .bg-color-94.reverse-video { + color: #875f00 !important; } + +.fg-color-94 { + color: #875f00; + text-shadow: 0 0 6px rgba(135, 95, 0, 0.5); } + .fg-color-94.reverse-video { + background-color: #875f00 !important; } + +.bg-color-95 { + background-color: #875f5f; } + .bg-color-95.reverse-video { + color: #875f5f !important; } + +.fg-color-95 { + color: #875f5f; + text-shadow: 0 0 6px rgba(135, 95, 95, 0.5); } + .fg-color-95.reverse-video { + background-color: #875f5f !important; } + +.bg-color-96 { + background-color: #875f87; } + .bg-color-96.reverse-video { + color: #875f87 !important; } + +.fg-color-96 { + color: #875f87; + text-shadow: 0 0 6px rgba(135, 95, 135, 0.5); } + .fg-color-96.reverse-video { + background-color: #875f87 !important; } + +.bg-color-97 { + background-color: #875faf; } + .bg-color-97.reverse-video { + color: #875faf !important; } + +.fg-color-97 { + color: #875faf; + text-shadow: 0 0 6px rgba(135, 95, 175, 0.5); } + .fg-color-97.reverse-video { + background-color: #875faf !important; } + +.bg-color-98 { + background-color: #875fd7; } + .bg-color-98.reverse-video { + color: #875fd7 !important; } + +.fg-color-98 { + color: #875fd7; + text-shadow: 0 0 6px rgba(135, 95, 215, 0.5); } + .fg-color-98.reverse-video { + background-color: #875fd7 !important; } + +.bg-color-99 { + background-color: #875fff; } + .bg-color-99.reverse-video { + color: #875fff !important; } + +.fg-color-99 { + color: #875fff; + text-shadow: 0 0 6px rgba(135, 95, 255, 0.5); } + .fg-color-99.reverse-video { + background-color: #875fff !important; } + +.bg-color-100 { + background-color: #878700; } + .bg-color-100.reverse-video { + color: #878700 !important; } + +.fg-color-100 { + color: #878700; + text-shadow: 0 0 6px rgba(135, 135, 0, 0.5); } + .fg-color-100.reverse-video { + background-color: #878700 !important; } + +.bg-color-101 { + background-color: #87875f; } + .bg-color-101.reverse-video { + color: #87875f !important; } + +.fg-color-101 { + color: #87875f; + text-shadow: 0 0 6px rgba(135, 135, 95, 0.5); } + .fg-color-101.reverse-video { + background-color: #87875f !important; } + +.bg-color-102 { + background-color: #878787; } + .bg-color-102.reverse-video { + color: #878787 !important; } + +.fg-color-102 { + color: #878787; + text-shadow: 0 0 6px rgba(135, 135, 135, 0.5); } + .fg-color-102.reverse-video { + background-color: #878787 !important; } + +.bg-color-103 { + background-color: #8787af; } + .bg-color-103.reverse-video { + color: #8787af !important; } + +.fg-color-103 { + color: #8787af; + text-shadow: 0 0 6px rgba(135, 135, 175, 0.5); } + .fg-color-103.reverse-video { + background-color: #8787af !important; } + +.bg-color-104 { + background-color: #8787d7; } + .bg-color-104.reverse-video { + color: #8787d7 !important; } + +.fg-color-104 { + color: #8787d7; + text-shadow: 0 0 6px rgba(135, 135, 215, 0.5); } + .fg-color-104.reverse-video { + background-color: #8787d7 !important; } + +.bg-color-105 { + background-color: #8787ff; } + .bg-color-105.reverse-video { + color: #8787ff !important; } + +.fg-color-105 { + color: #8787ff; + text-shadow: 0 0 6px rgba(135, 135, 255, 0.5); } + .fg-color-105.reverse-video { + background-color: #8787ff !important; } + +.bg-color-106 { + background-color: #87af00; } + .bg-color-106.reverse-video { + color: #87af00 !important; } + +.fg-color-106 { + color: #87af00; + text-shadow: 0 0 6px rgba(135, 175, 0, 0.5); } + .fg-color-106.reverse-video { + background-color: #87af00 !important; } + +.bg-color-107 { + background-color: #87af5f; } + .bg-color-107.reverse-video { + color: #87af5f !important; } + +.fg-color-107 { + color: #87af5f; + text-shadow: 0 0 6px rgba(135, 175, 95, 0.5); } + .fg-color-107.reverse-video { + background-color: #87af5f !important; } + +.bg-color-108 { + background-color: #87af87; } + .bg-color-108.reverse-video { + color: #87af87 !important; } + +.fg-color-108 { + color: #87af87; + text-shadow: 0 0 6px rgba(135, 175, 135, 0.5); } + .fg-color-108.reverse-video { + background-color: #87af87 !important; } + +.bg-color-109 { + background-color: #87afaf; } + .bg-color-109.reverse-video { + color: #87afaf !important; } + +.fg-color-109 { + color: #87afaf; + text-shadow: 0 0 6px rgba(135, 175, 175, 0.5); } + .fg-color-109.reverse-video { + background-color: #87afaf !important; } + +.bg-color-110 { + background-color: #87afd7; } + .bg-color-110.reverse-video { + color: #87afd7 !important; } + +.fg-color-110 { + color: #87afd7; + text-shadow: 0 0 6px rgba(135, 175, 215, 0.5); } + .fg-color-110.reverse-video { + background-color: #87afd7 !important; } + +.bg-color-111 { + background-color: #87afff; } + .bg-color-111.reverse-video { + color: #87afff !important; } + +.fg-color-111 { + color: #87afff; + text-shadow: 0 0 6px rgba(135, 175, 255, 0.5); } + .fg-color-111.reverse-video { + background-color: #87afff !important; } + +.bg-color-112 { + background-color: #87d700; } + .bg-color-112.reverse-video { + color: #87d700 !important; } + +.fg-color-112 { + color: #87d700; + text-shadow: 0 0 6px rgba(135, 215, 0, 0.5); } + .fg-color-112.reverse-video { + background-color: #87d700 !important; } + +.bg-color-113 { + background-color: #87d75f; } + .bg-color-113.reverse-video { + color: #87d75f !important; } + +.fg-color-113 { + color: #87d75f; + text-shadow: 0 0 6px rgba(135, 215, 95, 0.5); } + .fg-color-113.reverse-video { + background-color: #87d75f !important; } + +.bg-color-114 { + background-color: #87d787; } + .bg-color-114.reverse-video { + color: #87d787 !important; } + +.fg-color-114 { + color: #87d787; + text-shadow: 0 0 6px rgba(135, 215, 135, 0.5); } + .fg-color-114.reverse-video { + background-color: #87d787 !important; } + +.bg-color-115 { + background-color: #87d7af; } + .bg-color-115.reverse-video { + color: #87d7af !important; } + +.fg-color-115 { + color: #87d7af; + text-shadow: 0 0 6px rgba(135, 215, 175, 0.5); } + .fg-color-115.reverse-video { + background-color: #87d7af !important; } + +.bg-color-116 { + background-color: #87d7d7; } + .bg-color-116.reverse-video { + color: #87d7d7 !important; } + +.fg-color-116 { + color: #87d7d7; + text-shadow: 0 0 6px rgba(135, 215, 215, 0.5); } + .fg-color-116.reverse-video { + background-color: #87d7d7 !important; } + +.bg-color-117 { + background-color: #87d7ff; } + .bg-color-117.reverse-video { + color: #87d7ff !important; } + +.fg-color-117 { + color: #87d7ff; + text-shadow: 0 0 6px rgba(135, 215, 255, 0.5); } + .fg-color-117.reverse-video { + background-color: #87d7ff !important; } + +.bg-color-118 { + background-color: #87ff00; } + .bg-color-118.reverse-video { + color: #87ff00 !important; } + +.fg-color-118 { + color: #87ff00; + text-shadow: 0 0 6px rgba(135, 255, 0, 0.5); } + .fg-color-118.reverse-video { + background-color: #87ff00 !important; } + +.bg-color-119 { + background-color: #87ff5f; } + .bg-color-119.reverse-video { + color: #87ff5f !important; } + +.fg-color-119 { + color: #87ff5f; + text-shadow: 0 0 6px rgba(135, 255, 95, 0.5); } + .fg-color-119.reverse-video { + background-color: #87ff5f !important; } + +.bg-color-120 { + background-color: #87ff87; } + .bg-color-120.reverse-video { + color: #87ff87 !important; } + +.fg-color-120 { + color: #87ff87; + text-shadow: 0 0 6px rgba(135, 255, 135, 0.5); } + .fg-color-120.reverse-video { + background-color: #87ff87 !important; } + +.bg-color-121 { + background-color: #87ffaf; } + .bg-color-121.reverse-video { + color: #87ffaf !important; } + +.fg-color-121 { + color: #87ffaf; + text-shadow: 0 0 6px rgba(135, 255, 175, 0.5); } + .fg-color-121.reverse-video { + background-color: #87ffaf !important; } + +.bg-color-122 { + background-color: #87ffd7; } + .bg-color-122.reverse-video { + color: #87ffd7 !important; } + +.fg-color-122 { + color: #87ffd7; + text-shadow: 0 0 6px rgba(135, 255, 215, 0.5); } + .fg-color-122.reverse-video { + background-color: #87ffd7 !important; } + +.bg-color-123 { + background-color: #87ffff; } + .bg-color-123.reverse-video { + color: #87ffff !important; } + +.fg-color-123 { + color: #87ffff; + text-shadow: 0 0 6px rgba(135, 255, 255, 0.5); } + .fg-color-123.reverse-video { + background-color: #87ffff !important; } + +.bg-color-124 { + background-color: #af0000; } + .bg-color-124.reverse-video { + color: #af0000 !important; } + +.fg-color-124 { + color: #af0000; + text-shadow: 0 0 6px rgba(175, 0, 0, 0.5); } + .fg-color-124.reverse-video { + background-color: #af0000 !important; } + +.bg-color-125 { + background-color: #af005f; } + .bg-color-125.reverse-video { + color: #af005f !important; } + +.fg-color-125 { + color: #af005f; + text-shadow: 0 0 6px rgba(175, 0, 95, 0.5); } + .fg-color-125.reverse-video { + background-color: #af005f !important; } + +.bg-color-126 { + background-color: #af0087; } + .bg-color-126.reverse-video { + color: #af0087 !important; } + +.fg-color-126 { + color: #af0087; + text-shadow: 0 0 6px rgba(175, 0, 135, 0.5); } + .fg-color-126.reverse-video { + background-color: #af0087 !important; } + +.bg-color-127 { + background-color: #af00af; } + .bg-color-127.reverse-video { + color: #af00af !important; } + +.fg-color-127 { + color: #af00af; + text-shadow: 0 0 6px rgba(175, 0, 175, 0.5); } + .fg-color-127.reverse-video { + background-color: #af00af !important; } + +.bg-color-128 { + background-color: #af00d7; } + .bg-color-128.reverse-video { + color: #af00d7 !important; } + +.fg-color-128 { + color: #af00d7; + text-shadow: 0 0 6px rgba(175, 0, 215, 0.5); } + .fg-color-128.reverse-video { + background-color: #af00d7 !important; } + +.bg-color-129 { + background-color: #af00ff; } + .bg-color-129.reverse-video { + color: #af00ff !important; } + +.fg-color-129 { + color: #af00ff; + text-shadow: 0 0 6px rgba(175, 0, 255, 0.5); } + .fg-color-129.reverse-video { + background-color: #af00ff !important; } + +.bg-color-130 { + background-color: #af5f00; } + .bg-color-130.reverse-video { + color: #af5f00 !important; } + +.fg-color-130 { + color: #af5f00; + text-shadow: 0 0 6px rgba(175, 95, 0, 0.5); } + .fg-color-130.reverse-video { + background-color: #af5f00 !important; } + +.bg-color-131 { + background-color: #af5f5f; } + .bg-color-131.reverse-video { + color: #af5f5f !important; } + +.fg-color-131 { + color: #af5f5f; + text-shadow: 0 0 6px rgba(175, 95, 95, 0.5); } + .fg-color-131.reverse-video { + background-color: #af5f5f !important; } + +.bg-color-132 { + background-color: #af5f87; } + .bg-color-132.reverse-video { + color: #af5f87 !important; } + +.fg-color-132 { + color: #af5f87; + text-shadow: 0 0 6px rgba(175, 95, 135, 0.5); } + .fg-color-132.reverse-video { + background-color: #af5f87 !important; } + +.bg-color-133 { + background-color: #af5faf; } + .bg-color-133.reverse-video { + color: #af5faf !important; } + +.fg-color-133 { + color: #af5faf; + text-shadow: 0 0 6px rgba(175, 95, 175, 0.5); } + .fg-color-133.reverse-video { + background-color: #af5faf !important; } + +.bg-color-134 { + background-color: #af5fd7; } + .bg-color-134.reverse-video { + color: #af5fd7 !important; } + +.fg-color-134 { + color: #af5fd7; + text-shadow: 0 0 6px rgba(175, 95, 215, 0.5); } + .fg-color-134.reverse-video { + background-color: #af5fd7 !important; } + +.bg-color-135 { + background-color: #af5fff; } + .bg-color-135.reverse-video { + color: #af5fff !important; } + +.fg-color-135 { + color: #af5fff; + text-shadow: 0 0 6px rgba(175, 95, 255, 0.5); } + .fg-color-135.reverse-video { + background-color: #af5fff !important; } + +.bg-color-136 { + background-color: #af8700; } + .bg-color-136.reverse-video { + color: #af8700 !important; } + +.fg-color-136 { + color: #af8700; + text-shadow: 0 0 6px rgba(175, 135, 0, 0.5); } + .fg-color-136.reverse-video { + background-color: #af8700 !important; } + +.bg-color-137 { + background-color: #af875f; } + .bg-color-137.reverse-video { + color: #af875f !important; } + +.fg-color-137 { + color: #af875f; + text-shadow: 0 0 6px rgba(175, 135, 95, 0.5); } + .fg-color-137.reverse-video { + background-color: #af875f !important; } + +.bg-color-138 { + background-color: #af8787; } + .bg-color-138.reverse-video { + color: #af8787 !important; } + +.fg-color-138 { + color: #af8787; + text-shadow: 0 0 6px rgba(175, 135, 135, 0.5); } + .fg-color-138.reverse-video { + background-color: #af8787 !important; } + +.bg-color-139 { + background-color: #af87af; } + .bg-color-139.reverse-video { + color: #af87af !important; } + +.fg-color-139 { + color: #af87af; + text-shadow: 0 0 6px rgba(175, 135, 175, 0.5); } + .fg-color-139.reverse-video { + background-color: #af87af !important; } + +.bg-color-140 { + background-color: #af87d7; } + .bg-color-140.reverse-video { + color: #af87d7 !important; } + +.fg-color-140 { + color: #af87d7; + text-shadow: 0 0 6px rgba(175, 135, 215, 0.5); } + .fg-color-140.reverse-video { + background-color: #af87d7 !important; } + +.bg-color-141 { + background-color: #af87ff; } + .bg-color-141.reverse-video { + color: #af87ff !important; } + +.fg-color-141 { + color: #af87ff; + text-shadow: 0 0 6px rgba(175, 135, 255, 0.5); } + .fg-color-141.reverse-video { + background-color: #af87ff !important; } + +.bg-color-142 { + background-color: #afaf00; } + .bg-color-142.reverse-video { + color: #afaf00 !important; } + +.fg-color-142 { + color: #afaf00; + text-shadow: 0 0 6px rgba(175, 175, 0, 0.5); } + .fg-color-142.reverse-video { + background-color: #afaf00 !important; } + +.bg-color-143 { + background-color: #afaf5f; } + .bg-color-143.reverse-video { + color: #afaf5f !important; } + +.fg-color-143 { + color: #afaf5f; + text-shadow: 0 0 6px rgba(175, 175, 95, 0.5); } + .fg-color-143.reverse-video { + background-color: #afaf5f !important; } + +.bg-color-144 { + background-color: #afaf87; } + .bg-color-144.reverse-video { + color: #afaf87 !important; } + +.fg-color-144 { + color: #afaf87; + text-shadow: 0 0 6px rgba(175, 175, 135, 0.5); } + .fg-color-144.reverse-video { + background-color: #afaf87 !important; } + +.bg-color-145 { + background-color: #afafaf; } + .bg-color-145.reverse-video { + color: #afafaf !important; } + +.fg-color-145 { + color: #afafaf; + text-shadow: 0 0 6px rgba(175, 175, 175, 0.5); } + .fg-color-145.reverse-video { + background-color: #afafaf !important; } + +.bg-color-146 { + background-color: #afafd7; } + .bg-color-146.reverse-video { + color: #afafd7 !important; } + +.fg-color-146 { + color: #afafd7; + text-shadow: 0 0 6px rgba(175, 175, 215, 0.5); } + .fg-color-146.reverse-video { + background-color: #afafd7 !important; } + +.bg-color-147 { + background-color: #afafff; } + .bg-color-147.reverse-video { + color: #afafff !important; } + +.fg-color-147 { + color: #afafff; + text-shadow: 0 0 6px rgba(175, 175, 255, 0.5); } + .fg-color-147.reverse-video { + background-color: #afafff !important; } + +.bg-color-148 { + background-color: #afd700; } + .bg-color-148.reverse-video { + color: #afd700 !important; } + +.fg-color-148 { + color: #afd700; + text-shadow: 0 0 6px rgba(175, 215, 0, 0.5); } + .fg-color-148.reverse-video { + background-color: #afd700 !important; } + +.bg-color-149 { + background-color: #afd75f; } + .bg-color-149.reverse-video { + color: #afd75f !important; } + +.fg-color-149 { + color: #afd75f; + text-shadow: 0 0 6px rgba(175, 215, 95, 0.5); } + .fg-color-149.reverse-video { + background-color: #afd75f !important; } + +.bg-color-150 { + background-color: #afd787; } + .bg-color-150.reverse-video { + color: #afd787 !important; } + +.fg-color-150 { + color: #afd787; + text-shadow: 0 0 6px rgba(175, 215, 135, 0.5); } + .fg-color-150.reverse-video { + background-color: #afd787 !important; } + +.bg-color-151 { + background-color: #afd7af; } + .bg-color-151.reverse-video { + color: #afd7af !important; } + +.fg-color-151 { + color: #afd7af; + text-shadow: 0 0 6px rgba(175, 215, 175, 0.5); } + .fg-color-151.reverse-video { + background-color: #afd7af !important; } + +.bg-color-152 { + background-color: #afd7d7; } + .bg-color-152.reverse-video { + color: #afd7d7 !important; } + +.fg-color-152 { + color: #afd7d7; + text-shadow: 0 0 6px rgba(175, 215, 215, 0.5); } + .fg-color-152.reverse-video { + background-color: #afd7d7 !important; } + +.bg-color-153 { + background-color: #afd7ff; } + .bg-color-153.reverse-video { + color: #afd7ff !important; } + +.fg-color-153 { + color: #afd7ff; + text-shadow: 0 0 6px rgba(175, 215, 255, 0.5); } + .fg-color-153.reverse-video { + background-color: #afd7ff !important; } + +.bg-color-154 { + background-color: #afff00; } + .bg-color-154.reverse-video { + color: #afff00 !important; } + +.fg-color-154 { + color: #afff00; + text-shadow: 0 0 6px rgba(175, 255, 0, 0.5); } + .fg-color-154.reverse-video { + background-color: #afff00 !important; } + +.bg-color-155 { + background-color: #afff5f; } + .bg-color-155.reverse-video { + color: #afff5f !important; } + +.fg-color-155 { + color: #afff5f; + text-shadow: 0 0 6px rgba(175, 255, 95, 0.5); } + .fg-color-155.reverse-video { + background-color: #afff5f !important; } + +.bg-color-156 { + background-color: #afff87; } + .bg-color-156.reverse-video { + color: #afff87 !important; } + +.fg-color-156 { + color: #afff87; + text-shadow: 0 0 6px rgba(175, 255, 135, 0.5); } + .fg-color-156.reverse-video { + background-color: #afff87 !important; } + +.bg-color-157 { + background-color: #afffaf; } + .bg-color-157.reverse-video { + color: #afffaf !important; } + +.fg-color-157 { + color: #afffaf; + text-shadow: 0 0 6px rgba(175, 255, 175, 0.5); } + .fg-color-157.reverse-video { + background-color: #afffaf !important; } + +.bg-color-158 { + background-color: #afffd7; } + .bg-color-158.reverse-video { + color: #afffd7 !important; } + +.fg-color-158 { + color: #afffd7; + text-shadow: 0 0 6px rgba(175, 255, 215, 0.5); } + .fg-color-158.reverse-video { + background-color: #afffd7 !important; } + +.bg-color-159 { + background-color: #afffff; } + .bg-color-159.reverse-video { + color: #afffff !important; } + +.fg-color-159 { + color: #afffff; + text-shadow: 0 0 6px rgba(175, 255, 255, 0.5); } + .fg-color-159.reverse-video { + background-color: #afffff !important; } + +.bg-color-160 { + background-color: #d70000; } + .bg-color-160.reverse-video { + color: #d70000 !important; } + +.fg-color-160 { + color: #d70000; + text-shadow: 0 0 6px rgba(215, 0, 0, 0.5); } + .fg-color-160.reverse-video { + background-color: #d70000 !important; } + +.bg-color-161 { + background-color: #d7005f; } + .bg-color-161.reverse-video { + color: #d7005f !important; } + +.fg-color-161 { + color: #d7005f; + text-shadow: 0 0 6px rgba(215, 0, 95, 0.5); } + .fg-color-161.reverse-video { + background-color: #d7005f !important; } + +.bg-color-162 { + background-color: #d70087; } + .bg-color-162.reverse-video { + color: #d70087 !important; } + +.fg-color-162 { + color: #d70087; + text-shadow: 0 0 6px rgba(215, 0, 135, 0.5); } + .fg-color-162.reverse-video { + background-color: #d70087 !important; } + +.bg-color-163 { + background-color: #d700af; } + .bg-color-163.reverse-video { + color: #d700af !important; } + +.fg-color-163 { + color: #d700af; + text-shadow: 0 0 6px rgba(215, 0, 175, 0.5); } + .fg-color-163.reverse-video { + background-color: #d700af !important; } + +.bg-color-164 { + background-color: #d700d7; } + .bg-color-164.reverse-video { + color: #d700d7 !important; } + +.fg-color-164 { + color: #d700d7; + text-shadow: 0 0 6px rgba(215, 0, 215, 0.5); } + .fg-color-164.reverse-video { + background-color: #d700d7 !important; } + +.bg-color-165 { + background-color: #d700ff; } + .bg-color-165.reverse-video { + color: #d700ff !important; } + +.fg-color-165 { + color: #d700ff; + text-shadow: 0 0 6px rgba(215, 0, 255, 0.5); } + .fg-color-165.reverse-video { + background-color: #d700ff !important; } + +.bg-color-166 { + background-color: #d75f00; } + .bg-color-166.reverse-video { + color: #d75f00 !important; } + +.fg-color-166 { + color: #d75f00; + text-shadow: 0 0 6px rgba(215, 95, 0, 0.5); } + .fg-color-166.reverse-video { + background-color: #d75f00 !important; } + +.bg-color-167 { + background-color: #d75f5f; } + .bg-color-167.reverse-video { + color: #d75f5f !important; } + +.fg-color-167 { + color: #d75f5f; + text-shadow: 0 0 6px rgba(215, 95, 95, 0.5); } + .fg-color-167.reverse-video { + background-color: #d75f5f !important; } + +.bg-color-168 { + background-color: #d75f87; } + .bg-color-168.reverse-video { + color: #d75f87 !important; } + +.fg-color-168 { + color: #d75f87; + text-shadow: 0 0 6px rgba(215, 95, 135, 0.5); } + .fg-color-168.reverse-video { + background-color: #d75f87 !important; } + +.bg-color-169 { + background-color: #d75faf; } + .bg-color-169.reverse-video { + color: #d75faf !important; } + +.fg-color-169 { + color: #d75faf; + text-shadow: 0 0 6px rgba(215, 95, 175, 0.5); } + .fg-color-169.reverse-video { + background-color: #d75faf !important; } + +.bg-color-170 { + background-color: #d75fd7; } + .bg-color-170.reverse-video { + color: #d75fd7 !important; } + +.fg-color-170 { + color: #d75fd7; + text-shadow: 0 0 6px rgba(215, 95, 215, 0.5); } + .fg-color-170.reverse-video { + background-color: #d75fd7 !important; } + +.bg-color-171 { + background-color: #d75fff; } + .bg-color-171.reverse-video { + color: #d75fff !important; } + +.fg-color-171 { + color: #d75fff; + text-shadow: 0 0 6px rgba(215, 95, 255, 0.5); } + .fg-color-171.reverse-video { + background-color: #d75fff !important; } + +.bg-color-172 { + background-color: #d78700; } + .bg-color-172.reverse-video { + color: #d78700 !important; } + +.fg-color-172 { + color: #d78700; + text-shadow: 0 0 6px rgba(215, 135, 0, 0.5); } + .fg-color-172.reverse-video { + background-color: #d78700 !important; } + +.bg-color-173 { + background-color: #d7875f; } + .bg-color-173.reverse-video { + color: #d7875f !important; } + +.fg-color-173 { + color: #d7875f; + text-shadow: 0 0 6px rgba(215, 135, 95, 0.5); } + .fg-color-173.reverse-video { + background-color: #d7875f !important; } + +.bg-color-174 { + background-color: #d78787; } + .bg-color-174.reverse-video { + color: #d78787 !important; } + +.fg-color-174 { + color: #d78787; + text-shadow: 0 0 6px rgba(215, 135, 135, 0.5); } + .fg-color-174.reverse-video { + background-color: #d78787 !important; } + +.bg-color-175 { + background-color: #d787af; } + .bg-color-175.reverse-video { + color: #d787af !important; } + +.fg-color-175 { + color: #d787af; + text-shadow: 0 0 6px rgba(215, 135, 175, 0.5); } + .fg-color-175.reverse-video { + background-color: #d787af !important; } + +.bg-color-176 { + background-color: #d787d7; } + .bg-color-176.reverse-video { + color: #d787d7 !important; } + +.fg-color-176 { + color: #d787d7; + text-shadow: 0 0 6px rgba(215, 135, 215, 0.5); } + .fg-color-176.reverse-video { + background-color: #d787d7 !important; } + +.bg-color-177 { + background-color: #d787ff; } + .bg-color-177.reverse-video { + color: #d787ff !important; } + +.fg-color-177 { + color: #d787ff; + text-shadow: 0 0 6px rgba(215, 135, 255, 0.5); } + .fg-color-177.reverse-video { + background-color: #d787ff !important; } + +.bg-color-178 { + background-color: #d7af00; } + .bg-color-178.reverse-video { + color: #d7af00 !important; } + +.fg-color-178 { + color: #d7af00; + text-shadow: 0 0 6px rgba(215, 175, 0, 0.5); } + .fg-color-178.reverse-video { + background-color: #d7af00 !important; } + +.bg-color-179 { + background-color: #d7af5f; } + .bg-color-179.reverse-video { + color: #d7af5f !important; } + +.fg-color-179 { + color: #d7af5f; + text-shadow: 0 0 6px rgba(215, 175, 95, 0.5); } + .fg-color-179.reverse-video { + background-color: #d7af5f !important; } + +.bg-color-180 { + background-color: #d7af87; } + .bg-color-180.reverse-video { + color: #d7af87 !important; } + +.fg-color-180 { + color: #d7af87; + text-shadow: 0 0 6px rgba(215, 175, 135, 0.5); } + .fg-color-180.reverse-video { + background-color: #d7af87 !important; } + +.bg-color-181 { + background-color: #d7afaf; } + .bg-color-181.reverse-video { + color: #d7afaf !important; } + +.fg-color-181 { + color: #d7afaf; + text-shadow: 0 0 6px rgba(215, 175, 175, 0.5); } + .fg-color-181.reverse-video { + background-color: #d7afaf !important; } + +.bg-color-182 { + background-color: #d7afd7; } + .bg-color-182.reverse-video { + color: #d7afd7 !important; } + +.fg-color-182 { + color: #d7afd7; + text-shadow: 0 0 6px rgba(215, 175, 215, 0.5); } + .fg-color-182.reverse-video { + background-color: #d7afd7 !important; } + +.bg-color-183 { + background-color: #d7afff; } + .bg-color-183.reverse-video { + color: #d7afff !important; } + +.fg-color-183 { + color: #d7afff; + text-shadow: 0 0 6px rgba(215, 175, 255, 0.5); } + .fg-color-183.reverse-video { + background-color: #d7afff !important; } + +.bg-color-184 { + background-color: #d7d700; } + .bg-color-184.reverse-video { + color: #d7d700 !important; } + +.fg-color-184 { + color: #d7d700; + text-shadow: 0 0 6px rgba(215, 215, 0, 0.5); } + .fg-color-184.reverse-video { + background-color: #d7d700 !important; } + +.bg-color-185 { + background-color: #d7d75f; } + .bg-color-185.reverse-video { + color: #d7d75f !important; } + +.fg-color-185 { + color: #d7d75f; + text-shadow: 0 0 6px rgba(215, 215, 95, 0.5); } + .fg-color-185.reverse-video { + background-color: #d7d75f !important; } + +.bg-color-186 { + background-color: #d7d787; } + .bg-color-186.reverse-video { + color: #d7d787 !important; } + +.fg-color-186 { + color: #d7d787; + text-shadow: 0 0 6px rgba(215, 215, 135, 0.5); } + .fg-color-186.reverse-video { + background-color: #d7d787 !important; } + +.bg-color-187 { + background-color: #d7d7af; } + .bg-color-187.reverse-video { + color: #d7d7af !important; } + +.fg-color-187 { + color: #d7d7af; + text-shadow: 0 0 6px rgba(215, 215, 175, 0.5); } + .fg-color-187.reverse-video { + background-color: #d7d7af !important; } + +.bg-color-188 { + background-color: #d7d7d7; } + .bg-color-188.reverse-video { + color: #d7d7d7 !important; } + +.fg-color-188 { + color: #d7d7d7; + text-shadow: 0 0 6px rgba(215, 215, 215, 0.5); } + .fg-color-188.reverse-video { + background-color: #d7d7d7 !important; } + +.bg-color-189 { + background-color: #d7d7ff; } + .bg-color-189.reverse-video { + color: #d7d7ff !important; } + +.fg-color-189 { + color: #d7d7ff; + text-shadow: 0 0 6px rgba(215, 215, 255, 0.5); } + .fg-color-189.reverse-video { + background-color: #d7d7ff !important; } + +.bg-color-190 { + background-color: #d7ff00; } + .bg-color-190.reverse-video { + color: #d7ff00 !important; } + +.fg-color-190 { + color: #d7ff00; + text-shadow: 0 0 6px rgba(215, 255, 0, 0.5); } + .fg-color-190.reverse-video { + background-color: #d7ff00 !important; } + +.bg-color-191 { + background-color: #d7ff5f; } + .bg-color-191.reverse-video { + color: #d7ff5f !important; } + +.fg-color-191 { + color: #d7ff5f; + text-shadow: 0 0 6px rgba(215, 255, 95, 0.5); } + .fg-color-191.reverse-video { + background-color: #d7ff5f !important; } + +.bg-color-192 { + background-color: #d7ff87; } + .bg-color-192.reverse-video { + color: #d7ff87 !important; } + +.fg-color-192 { + color: #d7ff87; + text-shadow: 0 0 6px rgba(215, 255, 135, 0.5); } + .fg-color-192.reverse-video { + background-color: #d7ff87 !important; } + +.bg-color-193 { + background-color: #d7ffaf; } + .bg-color-193.reverse-video { + color: #d7ffaf !important; } + +.fg-color-193 { + color: #d7ffaf; + text-shadow: 0 0 6px rgba(215, 255, 175, 0.5); } + .fg-color-193.reverse-video { + background-color: #d7ffaf !important; } + +.bg-color-194 { + background-color: #d7ffd7; } + .bg-color-194.reverse-video { + color: #d7ffd7 !important; } + +.fg-color-194 { + color: #d7ffd7; + text-shadow: 0 0 6px rgba(215, 255, 215, 0.5); } + .fg-color-194.reverse-video { + background-color: #d7ffd7 !important; } + +.bg-color-195 { + background-color: #d7ffff; } + .bg-color-195.reverse-video { + color: #d7ffff !important; } + +.fg-color-195 { + color: #d7ffff; + text-shadow: 0 0 6px rgba(215, 255, 255, 0.5); } + .fg-color-195.reverse-video { + background-color: #d7ffff !important; } + +.bg-color-196 { + background-color: red; } + .bg-color-196.reverse-video { + color: red !important; } + +.fg-color-196 { + color: red; + text-shadow: 0 0 6px rgba(255, 0, 0, 0.5); } + .fg-color-196.reverse-video { + background-color: red !important; } + +.bg-color-197 { + background-color: #ff005f; } + .bg-color-197.reverse-video { + color: #ff005f !important; } + +.fg-color-197 { + color: #ff005f; + text-shadow: 0 0 6px rgba(255, 0, 95, 0.5); } + .fg-color-197.reverse-video { + background-color: #ff005f !important; } + +.bg-color-198 { + background-color: #ff0087; } + .bg-color-198.reverse-video { + color: #ff0087 !important; } + +.fg-color-198 { + color: #ff0087; + text-shadow: 0 0 6px rgba(255, 0, 135, 0.5); } + .fg-color-198.reverse-video { + background-color: #ff0087 !important; } + +.bg-color-199 { + background-color: #ff00af; } + .bg-color-199.reverse-video { + color: #ff00af !important; } + +.fg-color-199 { + color: #ff00af; + text-shadow: 0 0 6px rgba(255, 0, 175, 0.5); } + .fg-color-199.reverse-video { + background-color: #ff00af !important; } + +.bg-color-200 { + background-color: #ff00d7; } + .bg-color-200.reverse-video { + color: #ff00d7 !important; } + +.fg-color-200 { + color: #ff00d7; + text-shadow: 0 0 6px rgba(255, 0, 215, 0.5); } + .fg-color-200.reverse-video { + background-color: #ff00d7 !important; } + +.bg-color-201 { + background-color: magenta; } + .bg-color-201.reverse-video { + color: magenta !important; } + +.fg-color-201 { + color: magenta; + text-shadow: 0 0 6px rgba(255, 0, 255, 0.5); } + .fg-color-201.reverse-video { + background-color: magenta !important; } + +.bg-color-202 { + background-color: #ff5f00; } + .bg-color-202.reverse-video { + color: #ff5f00 !important; } + +.fg-color-202 { + color: #ff5f00; + text-shadow: 0 0 6px rgba(255, 95, 0, 0.5); } + .fg-color-202.reverse-video { + background-color: #ff5f00 !important; } + +.bg-color-203 { + background-color: #ff5f5f; } + .bg-color-203.reverse-video { + color: #ff5f5f !important; } + +.fg-color-203 { + color: #ff5f5f; + text-shadow: 0 0 6px rgba(255, 95, 95, 0.5); } + .fg-color-203.reverse-video { + background-color: #ff5f5f !important; } + +.bg-color-204 { + background-color: #ff5f87; } + .bg-color-204.reverse-video { + color: #ff5f87 !important; } + +.fg-color-204 { + color: #ff5f87; + text-shadow: 0 0 6px rgba(255, 95, 135, 0.5); } + .fg-color-204.reverse-video { + background-color: #ff5f87 !important; } + +.bg-color-205 { + background-color: #ff5faf; } + .bg-color-205.reverse-video { + color: #ff5faf !important; } + +.fg-color-205 { + color: #ff5faf; + text-shadow: 0 0 6px rgba(255, 95, 175, 0.5); } + .fg-color-205.reverse-video { + background-color: #ff5faf !important; } + +.bg-color-206 { + background-color: #ff5fd7; } + .bg-color-206.reverse-video { + color: #ff5fd7 !important; } + +.fg-color-206 { + color: #ff5fd7; + text-shadow: 0 0 6px rgba(255, 95, 215, 0.5); } + .fg-color-206.reverse-video { + background-color: #ff5fd7 !important; } + +.bg-color-207 { + background-color: #ff5fff; } + .bg-color-207.reverse-video { + color: #ff5fff !important; } + +.fg-color-207 { + color: #ff5fff; + text-shadow: 0 0 6px rgba(255, 95, 255, 0.5); } + .fg-color-207.reverse-video { + background-color: #ff5fff !important; } + +.bg-color-208 { + background-color: #ff8700; } + .bg-color-208.reverse-video { + color: #ff8700 !important; } + +.fg-color-208 { + color: #ff8700; + text-shadow: 0 0 6px rgba(255, 135, 0, 0.5); } + .fg-color-208.reverse-video { + background-color: #ff8700 !important; } + +.bg-color-209 { + background-color: #ff875f; } + .bg-color-209.reverse-video { + color: #ff875f !important; } + +.fg-color-209 { + color: #ff875f; + text-shadow: 0 0 6px rgba(255, 135, 95, 0.5); } + .fg-color-209.reverse-video { + background-color: #ff875f !important; } + +.bg-color-210 { + background-color: #ff8787; } + .bg-color-210.reverse-video { + color: #ff8787 !important; } + +.fg-color-210 { + color: #ff8787; + text-shadow: 0 0 6px rgba(255, 135, 135, 0.5); } + .fg-color-210.reverse-video { + background-color: #ff8787 !important; } + +.bg-color-211 { + background-color: #ff87af; } + .bg-color-211.reverse-video { + color: #ff87af !important; } + +.fg-color-211 { + color: #ff87af; + text-shadow: 0 0 6px rgba(255, 135, 175, 0.5); } + .fg-color-211.reverse-video { + background-color: #ff87af !important; } + +.bg-color-212 { + background-color: #ff87d7; } + .bg-color-212.reverse-video { + color: #ff87d7 !important; } + +.fg-color-212 { + color: #ff87d7; + text-shadow: 0 0 6px rgba(255, 135, 215, 0.5); } + .fg-color-212.reverse-video { + background-color: #ff87d7 !important; } + +.bg-color-213 { + background-color: #ff87ff; } + .bg-color-213.reverse-video { + color: #ff87ff !important; } + +.fg-color-213 { + color: #ff87ff; + text-shadow: 0 0 6px rgba(255, 135, 255, 0.5); } + .fg-color-213.reverse-video { + background-color: #ff87ff !important; } + +.bg-color-214 { + background-color: #ffaf00; } + .bg-color-214.reverse-video { + color: #ffaf00 !important; } + +.fg-color-214 { + color: #ffaf00; + text-shadow: 0 0 6px rgba(255, 175, 0, 0.5); } + .fg-color-214.reverse-video { + background-color: #ffaf00 !important; } + +.bg-color-215 { + background-color: #ffaf5f; } + .bg-color-215.reverse-video { + color: #ffaf5f !important; } + +.fg-color-215 { + color: #ffaf5f; + text-shadow: 0 0 6px rgba(255, 175, 95, 0.5); } + .fg-color-215.reverse-video { + background-color: #ffaf5f !important; } + +.bg-color-216 { + background-color: #ffaf87; } + .bg-color-216.reverse-video { + color: #ffaf87 !important; } + +.fg-color-216 { + color: #ffaf87; + text-shadow: 0 0 6px rgba(255, 175, 135, 0.5); } + .fg-color-216.reverse-video { + background-color: #ffaf87 !important; } + +.bg-color-217 { + background-color: #ffafaf; } + .bg-color-217.reverse-video { + color: #ffafaf !important; } + +.fg-color-217 { + color: #ffafaf; + text-shadow: 0 0 6px rgba(255, 175, 175, 0.5); } + .fg-color-217.reverse-video { + background-color: #ffafaf !important; } + +.bg-color-218 { + background-color: #ffafd7; } + .bg-color-218.reverse-video { + color: #ffafd7 !important; } + +.fg-color-218 { + color: #ffafd7; + text-shadow: 0 0 6px rgba(255, 175, 215, 0.5); } + .fg-color-218.reverse-video { + background-color: #ffafd7 !important; } + +.bg-color-219 { + background-color: #ffafff; } + .bg-color-219.reverse-video { + color: #ffafff !important; } + +.fg-color-219 { + color: #ffafff; + text-shadow: 0 0 6px rgba(255, 175, 255, 0.5); } + .fg-color-219.reverse-video { + background-color: #ffafff !important; } + +.bg-color-220 { + background-color: gold; } + .bg-color-220.reverse-video { + color: gold !important; } + +.fg-color-220 { + color: gold; + text-shadow: 0 0 6px rgba(255, 215, 0, 0.5); } + .fg-color-220.reverse-video { + background-color: gold !important; } + +.bg-color-221 { + background-color: #ffd75f; } + .bg-color-221.reverse-video { + color: #ffd75f !important; } + +.fg-color-221 { + color: #ffd75f; + text-shadow: 0 0 6px rgba(255, 215, 95, 0.5); } + .fg-color-221.reverse-video { + background-color: #ffd75f !important; } + +.bg-color-222 { + background-color: #ffd787; } + .bg-color-222.reverse-video { + color: #ffd787 !important; } + +.fg-color-222 { + color: #ffd787; + text-shadow: 0 0 6px rgba(255, 215, 135, 0.5); } + .fg-color-222.reverse-video { + background-color: #ffd787 !important; } + +.bg-color-223 { + background-color: #ffd7af; } + .bg-color-223.reverse-video { + color: #ffd7af !important; } + +.fg-color-223 { + color: #ffd7af; + text-shadow: 0 0 6px rgba(255, 215, 175, 0.5); } + .fg-color-223.reverse-video { + background-color: #ffd7af !important; } + +.bg-color-224 { + background-color: #ffd7d7; } + .bg-color-224.reverse-video { + color: #ffd7d7 !important; } + +.fg-color-224 { + color: #ffd7d7; + text-shadow: 0 0 6px rgba(255, 215, 215, 0.5); } + .fg-color-224.reverse-video { + background-color: #ffd7d7 !important; } + +.bg-color-225 { + background-color: #ffd7ff; } + .bg-color-225.reverse-video { + color: #ffd7ff !important; } + +.fg-color-225 { + color: #ffd7ff; + text-shadow: 0 0 6px rgba(255, 215, 255, 0.5); } + .fg-color-225.reverse-video { + background-color: #ffd7ff !important; } + +.bg-color-226 { + background-color: yellow; } + .bg-color-226.reverse-video { + color: yellow !important; } + +.fg-color-226 { + color: yellow; + text-shadow: 0 0 6px rgba(255, 255, 0, 0.5); } + .fg-color-226.reverse-video { + background-color: yellow !important; } + +.bg-color-227 { + background-color: #ffff5f; } + .bg-color-227.reverse-video { + color: #ffff5f !important; } + +.fg-color-227 { + color: #ffff5f; + text-shadow: 0 0 6px rgba(255, 255, 95, 0.5); } + .fg-color-227.reverse-video { + background-color: #ffff5f !important; } + +.bg-color-228 { + background-color: #ffff87; } + .bg-color-228.reverse-video { + color: #ffff87 !important; } + +.fg-color-228 { + color: #ffff87; + text-shadow: 0 0 6px rgba(255, 255, 135, 0.5); } + .fg-color-228.reverse-video { + background-color: #ffff87 !important; } + +.bg-color-229 { + background-color: #ffffaf; } + .bg-color-229.reverse-video { + color: #ffffaf !important; } + +.fg-color-229 { + color: #ffffaf; + text-shadow: 0 0 6px rgba(255, 255, 175, 0.5); } + .fg-color-229.reverse-video { + background-color: #ffffaf !important; } + +.bg-color-230 { + background-color: #ffffd7; } + .bg-color-230.reverse-video { + color: #ffffd7 !important; } + +.fg-color-230 { + color: #ffffd7; + text-shadow: 0 0 6px rgba(255, 255, 215, 0.5); } + .fg-color-230.reverse-video { + background-color: #ffffd7 !important; } + +.bg-color-231 { + background-color: white; } + .bg-color-231.reverse-video { + color: white !important; } + +.fg-color-231 { + color: white; + text-shadow: 0 0 6px rgba(255, 255, 255, 0.5); } + .fg-color-231.reverse-video { + background-color: white !important; } + +.bg-color-232 { + background-color: #080808; } + .bg-color-232.reverse-video { + color: #080808 !important; } + +.fg-color-232 { + color: #080808; + text-shadow: 0 0 6px rgba(8, 8, 8, 0.5); } + .fg-color-232.reverse-video { + background-color: #080808 !important; } + +.bg-color-233 { + background-color: #121212; } + .bg-color-233.reverse-video { + color: #121212 !important; } + +.fg-color-233 { + color: #121212; + text-shadow: 0 0 6px rgba(18, 18, 18, 0.5); } + .fg-color-233.reverse-video { + background-color: #121212 !important; } + +.bg-color-234 { + background-color: #1c1c1c; } + .bg-color-234.reverse-video { + color: #1c1c1c !important; } + +.fg-color-234 { + color: #1c1c1c; + text-shadow: 0 0 6px rgba(28, 28, 28, 0.5); } + .fg-color-234.reverse-video { + background-color: #1c1c1c !important; } + +.bg-color-235 { + background-color: #262626; } + .bg-color-235.reverse-video { + color: #262626 !important; } + +.fg-color-235 { + color: #262626; + text-shadow: 0 0 6px rgba(38, 38, 38, 0.5); } + .fg-color-235.reverse-video { + background-color: #262626 !important; } + +.bg-color-236 { + background-color: #303030; } + .bg-color-236.reverse-video { + color: #303030 !important; } + +.fg-color-236 { + color: #303030; + text-shadow: 0 0 6px rgba(48, 48, 48, 0.5); } + .fg-color-236.reverse-video { + background-color: #303030 !important; } + +.bg-color-237 { + background-color: #3a3a3a; } + .bg-color-237.reverse-video { + color: #3a3a3a !important; } + +.fg-color-237 { + color: #3a3a3a; + text-shadow: 0 0 6px rgba(58, 58, 58, 0.5); } + .fg-color-237.reverse-video { + background-color: #3a3a3a !important; } + +.bg-color-238 { + background-color: #444444; } + .bg-color-238.reverse-video { + color: #444444 !important; } + +.fg-color-238 { + color: #444444; + text-shadow: 0 0 6px rgba(68, 68, 68, 0.5); } + .fg-color-238.reverse-video { + background-color: #444444 !important; } + +.bg-color-239 { + background-color: #4e4e4e; } + .bg-color-239.reverse-video { + color: #4e4e4e !important; } + +.fg-color-239 { + color: #4e4e4e; + text-shadow: 0 0 6px rgba(78, 78, 78, 0.5); } + .fg-color-239.reverse-video { + background-color: #4e4e4e !important; } + +.bg-color-240 { + background-color: #585858; } + .bg-color-240.reverse-video { + color: #585858 !important; } + +.fg-color-240 { + color: #585858; + text-shadow: 0 0 6px rgba(88, 88, 88, 0.5); } + .fg-color-240.reverse-video { + background-color: #585858 !important; } + +.bg-color-241 { + background-color: #626262; } + .bg-color-241.reverse-video { + color: #626262 !important; } + +.fg-color-241 { + color: #626262; + text-shadow: 0 0 6px rgba(98, 98, 98, 0.5); } + .fg-color-241.reverse-video { + background-color: #626262 !important; } + +.bg-color-242 { + background-color: #6c6c6c; } + .bg-color-242.reverse-video { + color: #6c6c6c !important; } + +.fg-color-242 { + color: #6c6c6c; + text-shadow: 0 0 6px rgba(108, 108, 108, 0.5); } + .fg-color-242.reverse-video { + background-color: #6c6c6c !important; } + +.bg-color-243 { + background-color: #767676; } + .bg-color-243.reverse-video { + color: #767676 !important; } + +.fg-color-243 { + color: #767676; + text-shadow: 0 0 6px rgba(118, 118, 118, 0.5); } + .fg-color-243.reverse-video { + background-color: #767676 !important; } + +.bg-color-244 { + background-color: grey; } + .bg-color-244.reverse-video { + color: grey !important; } + +.fg-color-244 { + color: grey; + text-shadow: 0 0 6px rgba(128, 128, 128, 0.5); } + .fg-color-244.reverse-video { + background-color: grey !important; } + +.bg-color-245 { + background-color: #8a8a8a; } + .bg-color-245.reverse-video { + color: #8a8a8a !important; } + +.fg-color-245 { + color: #8a8a8a; + text-shadow: 0 0 6px rgba(138, 138, 138, 0.5); } + .fg-color-245.reverse-video { + background-color: #8a8a8a !important; } + +.bg-color-246 { + background-color: #949494; } + .bg-color-246.reverse-video { + color: #949494 !important; } + +.fg-color-246 { + color: #949494; + text-shadow: 0 0 6px rgba(148, 148, 148, 0.5); } + .fg-color-246.reverse-video { + background-color: #949494 !important; } + +.bg-color-247 { + background-color: #9e9e9e; } + .bg-color-247.reverse-video { + color: #9e9e9e !important; } + +.fg-color-247 { + color: #9e9e9e; + text-shadow: 0 0 6px rgba(158, 158, 158, 0.5); } + .fg-color-247.reverse-video { + background-color: #9e9e9e !important; } + +.bg-color-248 { + background-color: #a8a8a8; } + .bg-color-248.reverse-video { + color: #a8a8a8 !important; } + +.fg-color-248 { + color: #a8a8a8; + text-shadow: 0 0 6px rgba(168, 168, 168, 0.5); } + .fg-color-248.reverse-video { + background-color: #a8a8a8 !important; } + +.bg-color-249 { + background-color: #b2b2b2; } + .bg-color-249.reverse-video { + color: #b2b2b2 !important; } + +.fg-color-249 { + color: #b2b2b2; + text-shadow: 0 0 6px rgba(178, 178, 178, 0.5); } + .fg-color-249.reverse-video { + background-color: #b2b2b2 !important; } + +.bg-color-250 { + background-color: #bcbcbc; } + .bg-color-250.reverse-video { + color: #bcbcbc !important; } + +.fg-color-250 { + color: #bcbcbc; + text-shadow: 0 0 6px rgba(188, 188, 188, 0.5); } + .fg-color-250.reverse-video { + background-color: #bcbcbc !important; } + +.bg-color-251 { + background-color: #c6c6c6; } + .bg-color-251.reverse-video { + color: #c6c6c6 !important; } + +.fg-color-251 { + color: #c6c6c6; + text-shadow: 0 0 6px rgba(198, 198, 198, 0.5); } + .fg-color-251.reverse-video { + background-color: #c6c6c6 !important; } + +.bg-color-252 { + background-color: #d0d0d0; } + .bg-color-252.reverse-video { + color: #d0d0d0 !important; } + +.fg-color-252 { + color: #d0d0d0; + text-shadow: 0 0 6px rgba(208, 208, 208, 0.5); } + .fg-color-252.reverse-video { + background-color: #d0d0d0 !important; } + +.bg-color-253 { + background-color: #dadada; } + .bg-color-253.reverse-video { + color: #dadada !important; } + +.fg-color-253 { + color: #dadada; + text-shadow: 0 0 6px rgba(218, 218, 218, 0.5); } + .fg-color-253.reverse-video { + background-color: #dadada !important; } + +.bg-color-254 { + background-color: #e4e4e4; } + .bg-color-254.reverse-video { + color: #e4e4e4 !important; } + +.fg-color-254 { + color: #e4e4e4; + text-shadow: 0 0 6px rgba(228, 228, 228, 0.5); } + .fg-color-254.reverse-video { + background-color: #e4e4e4 !important; } + +.bg-color-255 { + background-color: #eeeeee; } + .bg-color-255.reverse-video { + color: #eeeeee !important; } + +.fg-color-255 { + color: #eeeeee; + text-shadow: 0 0 6px rgba(238, 238, 238, 0.5); } + .fg-color-255.reverse-video { + background-color: #eeeeee !important; } + +.bg-color-256 { + background-color: #110f13; } + .bg-color-256.reverse-video { + color: #110f13 !important; } + +.fg-color-256 { + color: #110f13; + text-shadow: 0 0 6px rgba(17, 15, 19, 0.5); } + .fg-color-256.reverse-video { + background-color: #110f13 !important; } + +.bg-color-257 { + background-color: #f4ead5; } + .bg-color-257.reverse-video { + color: #f4ead5 !important; } + +.fg-color-257 { + color: #f4ead5; + text-shadow: 0 0 6px rgba(244, 234, 213, 0.5); } + .fg-color-257.reverse-video { + background-color: #f4ead5 !important; } diff --git a/butterfly/static/main.js b/butterfly/static/main.js new file mode 100644 index 0000000..dc09408 --- /dev/null +++ b/butterfly/static/main.js @@ -0,0 +1,2886 @@ +(function() { + var $, Selection, State, Terminal, alt, bench, cancel, cbench, cols, ctl, ctrl, first, next_leaf, open_ts, previous_leaf, quit, rows, s, selection, send, term, virtual_input, ws, ws_url, + __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; }, + __slice = [].slice; + + cancel = function(ev) { + if (ev.preventDefault) { + ev.preventDefault(); + } + if (ev.stopPropagation) { + ev.stopPropagation(); + } + ev.cancelBubble = true; + return false; + }; + + s = 0; + + State = { + normal: s++, + escaped: s++, + csi: s++, + osc: s++, + charset: s++, + dcs: s++, + ignore: s++ + }; + + Terminal = (function() { + function Terminal(parent, out, ctl) { + var div, i, term_size; + this.parent = parent; + this.out = out; + this.ctl = ctl != null ? ctl : function() {}; + this.context = this.parent.ownerDocument.defaultView; + this.document = this.parent.ownerDocument; + this.body = this.document.getElementsByTagName('body')[0]; + this.element = this.document.createElement('div'); + this.element.className = 'terminal focus'; + this.element.style.outline = 'none'; + this.element.setAttribute('tabindex', 0); + this.parent.appendChild(this.element); + div = this.document.createElement('div'); + div.className = 'line'; + this.element.appendChild(div); + this.children = [div]; + this.compute_char_size(); + div.style.height = this.char_size.height + 'px'; + term_size = this.parent.getBoundingClientRect(); + this.cols = Math.floor(term_size.width / this.char_size.width) - 1; + this.rows = Math.floor(term_size.height / this.char_size.height); + i = this.rows - 1; + while (i--) { + div = this.document.createElement('div'); + div.style.height = this.char_size.height + 'px'; + div.className = 'line'; + this.element.appendChild(div); + this.children.push(div); + } + this.scrollback = 100000; + this.visualBell = 100; + this.convertEol = false; + this.termName = 'xterm'; + this.cursorBlink = true; + this.cursorState = 0; + this.last_cc = 0; + this.reset_vars(); + this.refresh(0, this.rows - 1); + this.focus(); + this.startBlink(); + addEventListener('keydown', this.keyDown.bind(this)); + addEventListener('keypress', this.keyPress.bind(this)); + addEventListener('focus', this.focus.bind(this)); + addEventListener('blur', this.blur.bind(this)); + addEventListener('paste', this.paste.bind(this)); + addEventListener('resize', this.resize.bind(this)); + if (typeof InstallTrigger !== "undefined") { + this.element.contentEditable = 'true'; + this.element.addEventListener("mouseup", function() { + var sel; + sel = getSelection().getRangeAt(0); + if (sel.startOffset === sel.endOffset) { + return getSelection().removeAllRanges(); + } + }); + } + this.initmouse(); + } + + Terminal.prototype.reset_vars = function() { + var i; + this.ybase = 0; + this.ydisp = 0; + this.x = 0; + this.y = 0; + this.cursorHidden = false; + this.state = State.normal; + this.queue = ''; + this.scrollTop = 0; + this.scrollBottom = this.rows - 1; + this.applicationKeypad = false; + this.applicationCursor = false; + this.originMode = false; + this.wraparoundMode = false; + this.normal = null; + this.charset = null; + this.gcharset = null; + this.glevel = 0; + this.charsets = [null]; + this.defAttr = (0 << 18) | (257 << 9) | (256 << 0); + this.curAttr = this.defAttr; + this.params = []; + this.currentParam = 0; + this.prefix = ""; + this.lines = []; + i = this.rows; + while (i--) { + this.lines.push(this.blankLine()); + } + this.setupStops(); + return this.skipNextKey = null; + }; + + Terminal.prototype.compute_char_size = function() { + var test_span; + test_span = document.createElement('span'); + test_span.textContent = '0123456789'; + this.children[0].appendChild(test_span); + this.char_size = { + width: test_span.getBoundingClientRect().width / 10, + height: this.children[0].getBoundingClientRect().height + }; + return this.children[0].removeChild(test_span); + }; + + Terminal.prototype.eraseAttr = function() { + return (this.defAttr & ~0x1ff) | (this.curAttr & 0x1ff); + }; + + Terminal.prototype.focus = function() { + if (this.sendFocus) { + this.send('\x1b[I'); + } + this.showCursor(); + this.element.classList.add('focus'); + return this.element.classList.remove('blur'); + }; + + Terminal.prototype.blur = function() { + this.cursorState = 1; + this.refresh(this.y, this.y); + if (this.sendFocus) { + this.send('\x1b[O'); + } + this.element.classList.add('blur'); + return this.element.classList.remove('focus'); + }; + + Terminal.prototype.paste = function(ev) { + if (ev.clipboardData) { + this.send(ev.clipboardData.getData('text/plain')); + } else if (this.context.clipboardData) { + this.send(this.context.clipboardData.getData('Text')); + } + return cancel(ev); + }; + + Terminal.prototype.initmouse = function() { + var encode, getButton, getCoords, pressed, sendButton, sendEvent, sendMove; + pressed = 32; + sendButton = function(ev) { + var button, pos; + button = getButton(ev); + pos = getCoords(ev); + if (!pos) { + return; + } + sendEvent(button, pos); + switch (ev.type) { + case "mousedown": + return pressed = button; + case "mouseup": + return pressed = 32; + } + }; + sendMove = function(ev) { + var button, pos; + button = pressed; + pos = getCoords(ev); + if (!pos) { + return; + } + button += 32; + return sendEvent(button, pos); + }; + encode = (function(_this) { + return function(data, ch) { + if (!_this.utfMouse) { + if (ch === 255) { + return data.push(0); + } + if (ch > 127) { + ch = 127; + } + return data.push(ch); + } else { + if (ch === 2047) { + return data.push(0); + } + if (ch < 127) { + return data.push(ch); + } else { + if (ch > 2047) { + ch = 2047; + } + data.push(0xC0 | (ch >> 6)); + return data.push(0x80 | (ch & 0x3F)); + } + } + }; + })(this); + sendEvent = (function(_this) { + return function(button, pos) { + var data; + if (_this.urxvtMouse) { + pos.x -= 32; + pos.y -= 32; + pos.x++; + pos.y++; + _this.send("\x1b[" + button + ";" + pos.x + ";" + pos.y + "M"); + return; + } + if (_this.sgrMouse) { + pos.x -= 32; + pos.y -= 32; + _this.send("\x1b[<" + ((button & 3) === 3 ? button & ~3 : button) + ";" + pos.x + ";" + pos.y + ((button & 3) === 3 ? "m" : "M")); + return; + } + data = []; + encode(data, button); + encode(data, pos.x); + encode(data, pos.y); + return _this.send("\x1b[M" + String.fromCharCode.apply(String, data)); + }; + })(this); + getButton = (function(_this) { + return function(ev) { + var button, ctrl, meta, mod, shift; + switch (ev.type) { + case "mousedown": + button = ev.button != null ? +ev.button : (ev.which != null ? ev.which - 1 : null); + break; + case "mouseup": + button = 3; + break; + case "wheel": + button = ev.deltaY < 0 ? 64 : 65; + } + shift = ev.shiftKey ? 4 : 0; + meta = ev.metaKey ? 8 : 0; + ctrl = ev.ctrlKey ? 16 : 0; + mod = shift | meta | ctrl; + if (_this.vt200Mouse) { + mod &= ctrl; + } else { + if (!_this.normalMouse) { + mod = 0; + } + } + return (32 + (mod << 2)) + button; + }; + })(this); + getCoords = (function(_this) { + return function(ev) { + var el, h, w, x, y; + x = ev.pageX; + y = ev.pageY; + el = _this.element; + while (el && el !== _this.document.documentElement) { + x -= el.offsetLeft; + y -= el.offsetTop; + el = "offsetParent" in el ? el.offsetParent : el.parentNode; + } + w = _this.element.clientWidth; + h = _this.element.clientHeight; + x = Math.ceil((x / w) * _this.cols); + y = Math.ceil((y / h) * _this.rows); + if (x < 0) { + x = 0; + } + if (x > _this.cols) { + x = _this.cols; + } + if (y < 0) { + y = 0; + } + if (y > _this.rows) { + y = _this.rows; + } + x += 32; + y += 32; + return { + x: x, + y: y, + type: ev.type + }; + }; + })(this); + addEventListener("mousedown", (function(_this) { + return function(ev) { + var up; + if (!_this.mouseEvents) { + return; + } + sendButton(ev); + if (_this.vt200Mouse) { + sendButton({ + __proto__: ev, + type: "mouseup" + }); + return cancel(ev); + } + if (_this.normalMouse) { + addEventListener("mousemove", sendMove.bind(_this)); + } + if (!_this.x10Mouse) { + addEventListener("mouseup", up = function(ev) { + sendButton(ev); + if (_this.normalMouse) { + removeEventListener("mousemove", sendMove); + } + removeEventListener("mouseup", up); + return cancel(ev); + }); + } + return cancel(ev); + }; + })(this)); + return addEventListener("wheel", (function(_this) { + return function(ev) { + if (_this.mouseEvents) { + if (_this.x10Mouse) { + return; + } + sendButton(ev); + } else { + if (_this.applicationKeypad) { + return; + } + _this.scrollDisp(ev.deltaY > 0 ? 5 : -5); + } + return cancel(ev); + }; + })(this)); + }; + + Terminal.prototype.refresh = function(start, end) { + var attr, bg, ch, classes, data, fg, flags, i, line, out, parent, row, width, x, y; + if (end - start >= this.rows / 3) { + parent = this.element.parentNode; + if (parent != null) { + parent.removeChild(this.element); + } + } + width = this.cols; + y = start; + if (end >= this.lines.length) { + end = this.lines.length - 1; + } + while (y <= end) { + row = y + this.ydisp; + line = this.lines[row]; + out = ""; + if (y === this.y && (this.ydisp === this.ybase || this.selectMode) && !this.cursorHidden) { + x = this.x; + } else { + x = -Infinity; + } + attr = this.defAttr; + i = 0; + while (i < width) { + data = line[i][0]; + ch = line[i][1]; + if (data !== attr) { + if (attr !== this.defAttr) { + out += ""; + } + if (data !== this.defAttr) { + classes = []; + out += "> 9) & 0x1ff; + flags = data >> 18; + if (flags & 1) { + classes.push("bold"); + } + if (flags & 2) { + classes.push("underline"); + } + if (flags & 4) { + classes.push("blink"); + } + if (flags & 8) { + classes.push("reverse-video"); + } + if (flags & 16) { + classes.push("invisible"); + } + if (flags & 1 && fg < 8) { + fg += 8; + } + classes.push("bg-color-" + bg); + classes.push("fg-color-" + fg); + out += "class=\""; + out += classes.join(" "); + out += "\">"; + } + } + if (i === x) { + out += ""; + } + if (ch.length > 1) { + out += ch; + } else { + switch (ch) { + case "&": + out += "&"; + break; + case "<": + out += "<"; + break; + case ">": + out += ">"; + break; + default: + if (ch <= " ") { + out += " "; + } else { + if (("\uff00" < ch && ch < "\uffef")) { + i++; + } + out += ch; + } + } + } + if (i === x) { + out += ""; + } + attr = data; + i++; + } + if (attr !== this.defAttr) { + out += ""; + } + this.children[y].innerHTML = out; + y++; + } + return parent != null ? parent.appendChild(this.element) : void 0; + }; + + Terminal.prototype._cursorBlink = function() { + var cursor; + this.cursorState ^= 1; + cursor = this.element.querySelector(".cursor"); + if (!cursor) { + return; + } + if (cursor.classList.contains("reverse-video")) { + return cursor.classList.remove("reverse-video"); + } else { + return cursor.classList.add("reverse-video"); + } + }; + + Terminal.prototype.showCursor = function() { + if (!this.cursorState) { + this.cursorState = 1; + return this.refresh(this.y, this.y); + } + }; + + Terminal.prototype.startBlink = function() { + if (!this.cursorBlink) { + return; + } + this._blinker = (function(_this) { + return function() { + return _this._cursorBlink(); + }; + })(this); + return this.t_blink = setInterval(this._blinker, 500); + }; + + Terminal.prototype.refreshBlink = function() { + if (!this.cursorBlink) { + return; + } + clearInterval(this.t_blink); + return this.t_blink = setInterval(this._blinker, 500); + }; + + Terminal.prototype.scroll = function() { + var row; + if (++this.ybase === this.scrollback) { + this.ybase = this.ybase / 2 | 0; + this.lines = this.lines.slice(-(this.ybase + this.rows) + 1); + } + this.ydisp = this.ybase; + row = this.ybase + this.rows - 1; + row -= this.rows - 1 - this.scrollBottom; + if (row === this.lines.length) { + this.lines.push(this.blankLine()); + } else { + this.lines.splice(row, 0, this.blankLine()); + } + if (this.scrollTop !== 0) { + if (this.ybase !== 0) { + this.ybase--; + this.ydisp = this.ybase; + } + this.lines.splice(this.ybase + this.scrollTop, 1); + } + this.updateRange(this.scrollTop); + return this.updateRange(this.scrollBottom); + }; + + Terminal.prototype.scrollDisp = function(disp) { + this.ydisp += disp; + if (this.ydisp > this.ybase) { + this.ydisp = this.ybase; + } else { + if (this.ydisp < 0) { + this.ydisp = 0; + } + } + return this.refresh(0, this.rows - 1); + }; + + Terminal.prototype.write = function(data) { + var ch, cs, i, j, l, pt, valid, _ref; + this.refreshStart = this.y; + this.refreshEnd = this.y; + if (this.ybase !== this.ydisp) { + this.ydisp = this.ybase; + this.maxRange(); + } + i = 0; + l = data.length; + while (i < l) { + ch = data[i]; + switch (this.state) { + case State.normal: + switch (ch) { + case "\x07": + this.bell(); + break; + case "\n": + case "\x0b": + case "\x0c": + if (this.convertEol) { + this.x = 0; + } + this.y++; + if (this.y > this.scrollBottom) { + this.y--; + this.scroll(); + } + break; + case "\r": + this.x = 0; + break; + case "\b": + if (this.x > 0) { + this.x--; + } + break; + case "\t": + this.x = this.nextStop(); + break; + case "\x0e": + this.setgLevel(1); + break; + case "\x0f": + this.setgLevel(0); + break; + case "\x1b": + this.state = State.escaped; + break; + default: + if (ch >= " ") { + if ((_ref = this.charset) != null ? _ref[ch] : void 0) { + ch = this.charset[ch]; + } + if (this.x >= this.cols) { + this.x = 0; + this.y++; + if (this.y > this.scrollBottom) { + this.y--; + this.scroll(); + } + } + this.lines[this.y + this.ybase][this.x] = [this.curAttr, ch]; + this.x++; + this.updateRange(this.y); + if (("\uff00" < ch && ch < "\uffef")) { + j = this.y + this.ybase; + if (this.cols < 2 || this.x >= this.cols) { + this.lines[j][this.x - 1] = [this.curAttr, " "]; + break; + } + this.lines[j][this.x] = [this.curAttr, " "]; + this.x++; + } + } + } + break; + case State.escaped: + switch (ch) { + case "[": + this.params = []; + this.currentParam = 0; + this.state = State.csi; + break; + case "]": + this.params = []; + this.currentParam = 0; + this.state = State.osc; + break; + case "P": + this.params = []; + this.currentParam = 0; + this.state = State.dcs; + break; + case "_": + this.state = State.ignore; + break; + case "^": + this.state = State.ignore; + break; + case "c": + this.reset(); + break; + case "E": + this.x = 0; + this.index(); + break; + case "D": + this.index(); + break; + case "M": + this.reverseIndex(); + break; + case "%": + this.setgLevel(0); + this.setgCharset(0, Terminal.prototype.charsets.US); + this.state = State.normal; + i++; + break; + case "(": + case ")": + case "*": + case "+": + case "-": + case ".": + switch (ch) { + case "(": + this.gcharset = 0; + break; + case ")": + case "-": + this.gcharset = 1; + break; + case "*": + case ".": + this.gcharset = 2; + break; + case "+": + this.gcharset = 3; + } + this.state = State.charset; + break; + case "/": + this.gcharset = 3; + this.state = State.charset; + i--; + break; + case "n": + this.setgLevel(2); + break; + case "o": + this.setgLevel(3); + break; + case "|": + this.setgLevel(3); + break; + case "}": + this.setgLevel(2); + break; + case "~": + this.setgLevel(1); + break; + case "7": + this.saveCursor(); + this.state = State.normal; + break; + case "8": + this.restoreCursor(); + this.state = State.normal; + break; + case "#": + this.state = State.normal; + i++; + break; + case "H": + this.tabSet(); + break; + case "=": + this.applicationKeypad = true; + this.state = State.normal; + break; + case ">": + this.applicationKeypad = false; + this.state = State.normal; + break; + default: + this.state = State.normal; + console.log("Unknown ESC control:", ch); + } + break; + case State.charset: + switch (ch) { + case "0": + cs = Terminal.prototype.charsets.SCLD; + break; + case "A": + cs = Terminal.prototype.charsets.UK; + break; + case "B": + cs = Terminal.prototype.charsets.US; + break; + case "4": + cs = Terminal.prototype.charsets.Dutch; + break; + case "C": + case "5": + cs = Terminal.prototype.charsets.Finnish; + break; + case "R": + cs = Terminal.prototype.charsets.French; + break; + case "Q": + cs = Terminal.prototype.charsets.FrenchCanadian; + break; + case "K": + cs = Terminal.prototype.charsets.German; + break; + case "Y": + cs = Terminal.prototype.charsets.Italian; + break; + case "E": + case "6": + cs = Terminal.prototype.charsets.NorwegianDanish; + break; + case "Z": + cs = Terminal.prototype.charsets.Spanish; + break; + case "H": + case "7": + cs = Terminal.prototype.charsets.Swedish; + break; + case "=": + cs = Terminal.prototype.charsets.Swiss; + break; + case "/": + cs = Terminal.prototype.charsets.ISOLatin; + i++; + break; + default: + cs = Terminal.prototype.charsets.US; + } + this.setgCharset(this.gcharset, cs); + this.gcharset = null; + this.state = State.normal; + break; + case State.osc: + if (ch === "\x1b" || ch === "\x07") { + if (ch === "\x1b") { + i++; + } + this.params.push(this.currentParam); + switch (this.params[0]) { + case 0: + case 1: + case 2: + if (this.params[1]) { + this.title = this.params[1] + " - ƸӜƷ butterfly"; + this.handleTitle(this.title); + } + } + this.params = []; + this.currentParam = 0; + this.state = State.normal; + } else { + if (!this.params.length) { + if (ch >= "0" && ch <= "9") { + this.currentParam = this.currentParam * 10 + ch.charCodeAt(0) - 48; + } else if (ch === ";") { + this.params.push(this.currentParam); + this.currentParam = ""; + } + } else { + this.currentParam += ch; + } + } + break; + case State.csi: + if (ch === "?" || ch === ">" || ch === "!") { + this.prefix = ch; + break; + } + if (ch >= "0" && ch <= "9") { + this.currentParam = this.currentParam * 10 + ch.charCodeAt(0) - 48; + break; + } + if (ch === "$" || ch === "\"" || ch === " " || ch === "'") { + break; + } + this.params.push(this.currentParam); + this.currentParam = 0; + if (ch === ";") { + break; + } + this.state = State.normal; + switch (ch) { + case "A": + this.cursorUp(this.params); + break; + case "B": + this.cursorDown(this.params); + break; + case "C": + this.cursorForward(this.params); + break; + case "D": + this.cursorBackward(this.params); + break; + case "H": + this.cursorPos(this.params); + break; + case "J": + this.eraseInDisplay(this.params); + break; + case "K": + this.eraseInLine(this.params); + break; + case "m": + if (!this.prefix) { + this.charAttributes(this.params); + } + break; + case "n": + if (!this.prefix) { + this.deviceStatus(this.params); + } + break; + case "@": + this.insertChars(this.params); + break; + case "E": + this.cursorNextLine(this.params); + break; + case "F": + this.cursorPrecedingLine(this.params); + break; + case "G": + this.cursorCharAbsolute(this.params); + break; + case "L": + this.insertLines(this.params); + break; + case "M": + this.deleteLines(this.params); + break; + case "P": + this.deleteChars(this.params); + break; + case "X": + this.eraseChars(this.params); + break; + case "`": + this.charPosAbsolute(this.params); + break; + case "a": + this.HPositionRelative(this.params); + break; + case "c": + this.sendDeviceAttributes(this.params); + break; + case "d": + this.linePosAbsolute(this.params); + break; + case "e": + this.VPositionRelative(this.params); + break; + case "f": + this.HVPosition(this.params); + break; + case "h": + this.setMode(this.params); + break; + case "l": + this.resetMode(this.params); + break; + case "r": + this.setScrollRegion(this.params); + break; + case "s": + this.saveCursor(this.params); + break; + case "u": + this.restoreCursor(this.params); + break; + case "I": + this.cursorForwardTab(this.params); + break; + case "S": + this.scrollUp(this.params); + break; + case "T": + if (this.params.length < 2 && !this.prefix) { + this.scrollDown(this.params); + } + break; + case "Z": + this.cursorBackwardTab(this.params); + break; + case "b": + this.repeatPrecedingCharacter(this.params); + break; + case "g": + this.tabClear(this.params); + break; + case "p": + if (this.prefix === '!') { + this.softReset(this.params); + } + break; + default: + console.error("Unknown CSI code: %s.", ch); + } + this.prefix = ""; + break; + case State.dcs: + if (ch === "\x1b" || ch === "\x07") { + if (ch === "\x1b") { + i++; + } + switch (this.prefix) { + case "": + break; + case "$q": + pt = this.currentParam; + valid = false; + switch (pt) { + case "\"q": + pt = "0\"q"; + break; + case "\"p": + pt = "61\"p"; + break; + case "r": + pt = "" + (this.scrollTop + 1) + ";" + (this.scrollBottom + 1) + "r"; + break; + case "m": + pt = "0m"; + break; + default: + console.error("Unknown DCS Pt: %s.", pt); + pt = ""; + } + this.send("\x1bP" + +valid + "$r" + pt + "\x1b\\"); + break; + case "+q": + pt = this.currentParam; + valid = false; + this.send("\x1bP" + +valid + "+r" + pt + "\x1b\\"); + break; + default: + console.error("Unknown DCS prefix: %s.", this.prefix); + } + this.currentParam = 0; + this.prefix = ""; + this.state = State.normal; + } else if (!this.currentParam) { + if (!this.prefix && ch !== "$" && ch !== "+") { + this.currentParam = ch; + } else if (this.prefix.length === 2) { + this.currentParam = ch; + } else { + this.prefix += ch; + } + } else { + this.currentParam += ch; + } + break; + case State.ignore: + if (ch === "\x1b" || ch === "\x07") { + if (ch === "\x1b") { + i++; + } + this.state = State.normal; + } + } + i++; + } + this.updateRange(this.y); + return this.refresh(this.refreshStart, this.refreshEnd); + }; + + Terminal.prototype.writeln = function(data) { + return this.write("" + data + "\r\n"); + }; + + Terminal.prototype.keyDown = function(ev) { + var id, key, t, _ref; + if (ev.keyCode > 15 && ev.keyCode < 19) { + return true; + } + if ((ev.shiftKey || ev.ctrlKey) && ev.keyCode === 45) { + return true; + } + if ((ev.shiftKey && ev.ctrlKey) && ((_ref = ev.keyCode) === 67 || _ref === 86)) { + return true; + } + if (ev.altKey && ev.keyCode === 90 && !this.skipNextKey) { + this.skipNextKey = true; + this.element.classList.add('skip'); + return cancel(ev); + } + if (this.skipNextKey) { + this.skipNextKey = false; + this.element.classList.remove('skip'); + return true; + } + switch (ev.keyCode) { + case 8: + key = ev.altKey ? "\x1b" : ""; + if (ev.shiftKey) { + key += "\x08"; + break; + } + key += "\x7f"; + break; + case 9: + if (ev.shiftKey) { + key = "\x1b[Z"; + break; + } + key = "\t"; + break; + case 13: + key = "\r"; + break; + case 27: + key = "\x1b"; + break; + case 37: + if (this.applicationCursor) { + key = "\x1bOD"; + break; + } + key = "\x1b[D"; + break; + case 39: + if (this.applicationCursor) { + key = "\x1bOC"; + break; + } + key = "\x1b[C"; + break; + case 38: + if (this.applicationCursor) { + key = "\x1bOA"; + break; + } + if (ev.ctrlKey) { + this.scrollDisp(-1); + return cancel(ev); + } else { + key = "\x1b[A"; + } + break; + case 40: + if (this.applicationCursor) { + key = "\x1bOB"; + break; + } + if (ev.ctrlKey) { + this.scrollDisp(1); + return cancel(ev); + } else { + key = "\x1b[B"; + } + break; + case 46: + key = "\x1b[3~"; + break; + case 45: + key = "\x1b[2~"; + break; + case 36: + if (this.applicationKeypad) { + key = "\x1bOH"; + break; + } + key = "\x1bOH"; + break; + case 35: + if (this.applicationKeypad) { + key = "\x1bOF"; + break; + } + key = "\x1bOF"; + break; + case 33: + if (ev.shiftKey) { + this.scrollDisp(-(this.rows - 1)); + return cancel(ev); + } else { + key = "\x1b[5~"; + } + break; + case 34: + if (ev.shiftKey) { + this.scrollDisp(this.rows - 1); + return cancel(ev); + } else { + key = "\x1b[6~"; + } + break; + case 112: + key = "\x1bOP"; + break; + case 113: + key = "\x1bOQ"; + break; + case 114: + key = "\x1bOR"; + break; + case 115: + key = "\x1bOS"; + break; + case 116: + key = "\x1b[15~"; + break; + case 117: + key = "\x1b[17~"; + break; + case 118: + key = "\x1b[18~"; + break; + case 119: + key = "\x1b[19~"; + break; + case 120: + key = "\x1b[20~"; + break; + case 121: + key = "\x1b[21~"; + break; + case 122: + key = "\x1b[23~"; + break; + case 123: + key = "\x1b[24~"; + break; + default: + if (ev.ctrlKey) { + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + if (ev.keyCode === 67) { + t = (new Date()).getTime(); + if ((t - this.last_cc) < 75) { + id = (setTimeout(function() {})) - 6; + this.write('\r\n --8<------8<-- Sectioned --8<------8<-- \r\n\r\n'); + while (id--) { + if (id !== this.t_bell && id !== this.t_queue && id !== this.t_blink) { + clearTimeout(id); + } + } + } + this.last_cc = t; + } + key = String.fromCharCode(ev.keyCode - 64); + } else if (ev.keyCode === 32) { + key = String.fromCharCode(0); + } else if (ev.keyCode >= 51 && ev.keyCode <= 55) { + key = String.fromCharCode(ev.keyCode - 51 + 27); + } else if (ev.keyCode === 56) { + key = String.fromCharCode(127); + } else if (ev.keyCode === 219) { + key = String.fromCharCode(27); + } else { + if (ev.keyCode === 221) { + key = String.fromCharCode(29); + } + } + } else if ((ev.altKey && __indexOf.call(navigator.platform, 'Mac') < 0) || (ev.metaKey && __indexOf.call(navigator.platform, 'Mac') >= 0)) { + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + key = "\x1b" + String.fromCharCode(ev.keyCode + 32); + } else if (ev.keyCode === 192) { + key = "\x1b`"; + } else { + if (ev.keyCode >= 48 && ev.keyCode <= 57) { + key = "\x1b" + (ev.keyCode - 48); + } + } + } + } + if (ev.keyCode >= 37 && ev.keyCode <= 40) { + if (ev.ctrlKey) { + key = key.slice(0, -1) + "1;5" + key.slice(-1); + } else if (ev.altKey) { + key = key.slice(0, -1) + "1;3" + key.slice(-1); + } else if (ev.shiftKey) { + key = key.slice(0, -1) + "1;4" + key.slice(-1); + } + } + if (!key) { + return true; + } + if (this.prefixMode) { + this.leavePrefix(); + return cancel(ev); + } + if (this.selectMode) { + this.keySelect(ev, key); + return cancel(ev); + } + this.showCursor(); + this.handler(key); + return cancel(ev); + }; + + Terminal.prototype.setgLevel = function(g) { + this.glevel = g; + return this.charset = this.charsets[g]; + }; + + Terminal.prototype.setgCharset = function(g, charset) { + this.charsets[g] = charset; + if (this.glevel === g) { + return this.charset = charset; + } + }; + + Terminal.prototype.keyPress = function(ev) { + var key; + if (this.skipNextKey === false) { + this.skipNextKey = null; + return true; + } + cancel(ev); + if (ev.charCode) { + key = ev.charCode; + } else if (ev.which == null) { + key = ev.keyCode; + } else if (ev.which !== 0 && ev.charCode !== 0) { + key = ev.which; + } else { + return false; + } + if (!key || ev.ctrlKey || ev.altKey || ev.metaKey) { + return false; + } + key = String.fromCharCode(key); + this.showCursor(); + this.handler(key); + return false; + }; + + Terminal.prototype.send = function(data) { + if (!this.queue) { + this.t_queue = setTimeout(((function(_this) { + return function() { + _this.handler(_this.queue); + return _this.queue = ""; + }; + })(this)), 1); + } + return this.queue += data; + }; + + Terminal.prototype.bell = function() { + if (!this.visualBell) { + return; + } + this.element.classList.add("bell"); + return this.t_bell = setTimeout(((function(_this) { + return function() { + return _this.element.classList.remove("bell"); + }; + })(this)), this.visualBell); + }; + + Terminal.prototype.resize = function() { + var ch, el, i, j, line, old_cols, old_rows, term_size; + old_cols = this.cols; + old_rows = this.rows; + term_size = this.parent.getBoundingClientRect(); + this.cols = Math.floor(term_size.width / this.char_size.width) - 1; + this.rows = Math.floor(term_size.height / this.char_size.height); + if (old_cols === this.cols && old_rows === this.rows) { + return; + } + this.ctl('Resize', this.cols, this.rows); + if (old_cols < this.cols) { + ch = [this.defAttr, " "]; + i = this.lines.length; + while (i--) { + while (this.lines[i].length < this.cols) { + this.lines[i].push(ch); + } + } + } else if (old_cols > this.cols) { + i = this.lines.length; + while (i--) { + while (this.lines[i].length > this.cols) { + this.lines[i].pop(); + } + } + } + this.setupStops(old_cols); + j = old_rows; + if (j < this.rows) { + el = this.element; + while (j++ < this.rows) { + if (this.lines.length < this.rows + this.ybase) { + this.lines.push(this.blankLine()); + } + if (this.children.length < this.rows) { + line = this.document.createElement("div"); + line.className = 'line'; + line.style.height = this.char_size.height + 'px'; + el.appendChild(line); + this.children.push(line); + } + } + } else if (j > this.rows) { + while (j-- > this.rows) { + if (this.lines.length > this.rows + this.ybase) { + this.lines.pop(); + } + if (this.children.length > this.rows) { + el = this.children.pop(); + if (!el) { + continue; + } + el.parentNode.removeChild(el); + } + } + } + if (this.y >= this.rows) { + this.y = this.rows - 1; + } + if (this.x >= this.cols) { + this.x = this.cols - 1; + } + this.scrollTop = 0; + this.scrollBottom = this.rows - 1; + this.refresh(0, this.rows - 1); + return this.normal = null; + }; + + Terminal.prototype.updateRange = function(y) { + if (y < this.refreshStart) { + this.refreshStart = y; + } + if (y > this.refreshEnd) { + return this.refreshEnd = y; + } + }; + + Terminal.prototype.maxRange = function() { + this.refreshStart = 0; + return this.refreshEnd = this.rows - 1; + }; + + Terminal.prototype.setupStops = function(i) { + var _results; + if (i != null) { + if (!this.tabs[i]) { + i = this.prevStop(i); + } + } else { + this.tabs = {}; + i = 0; + } + _results = []; + while (i < this.cols) { + this.tabs[i] = true; + _results.push(i += 8); + } + return _results; + }; + + Terminal.prototype.prevStop = function(x) { + if (x == null) { + x = this.x; + } + while (!this.tabs[--x] && x > 0) { + 1; + } + if (x >= this.cols) { + return this.cols - 1; + } else { + if (x < 0) { + return 0; + } else { + return x; + } + } + }; + + Terminal.prototype.nextStop = function(x) { + if (x == null) { + x = this.x; + } + while (!this.tabs[++x] && x < this.cols) { + 1; + } + if (x >= this.cols) { + return this.cols - 1; + } else { + if (x < 0) { + return 0; + } else { + return x; + } + } + }; + + Terminal.prototype.eraseRight = function(x, y) { + var ch, line; + line = this.lines[this.ybase + y]; + ch = [this.eraseAttr(), " "]; + while (x < this.cols) { + line[x] = ch; + x++; + } + return this.updateRange(y); + }; + + Terminal.prototype.eraseLeft = function(x, y) { + var ch, line; + line = this.lines[this.ybase + y]; + ch = [this.eraseAttr(), " "]; + x++; + while (x--) { + line[x] = ch; + } + return this.updateRange(y); + }; + + Terminal.prototype.eraseLine = function(y) { + return this.eraseRight(0, y); + }; + + Terminal.prototype.blankLine = function(cur) { + var attr, ch, i, line; + attr = (cur ? this.eraseAttr() : this.defAttr); + ch = [attr, " "]; + line = []; + i = 0; + while (i < this.cols) { + line[i] = ch; + i++; + } + return line; + }; + + Terminal.prototype.ch = function(cur) { + if (cur) { + return [this.eraseAttr(), " "]; + } else { + return [this.defAttr, " "]; + } + }; + + Terminal.prototype.isterm = function(term) { + return ("" + this.termName).indexOf(term) === 0; + }; + + Terminal.prototype.handler = function(data) { + return this.out(data); + }; + + Terminal.prototype.handleTitle = function(title) { + return document.title = title; + }; + + Terminal.prototype.index = function() { + this.y++; + if (this.y > this.scrollBottom) { + this.y--; + this.scroll(); + } + return this.state = State.normal; + }; + + Terminal.prototype.reverseIndex = function() { + var j; + this.y--; + if (this.y < this.scrollTop) { + this.y++; + this.lines.splice(this.y + this.ybase, 0, this.blankLine(true)); + j = this.rows - 1 - this.scrollBottom; + this.lines.splice(this.rows - 1 + this.ybase - j + 1, 1); + this.updateRange(this.scrollTop); + this.updateRange(this.scrollBottom); + } + return this.state = State.normal; + }; + + Terminal.prototype.reset = function() { + this.reset_vars(); + return this.refresh(0, this.rows - 1); + }; + + Terminal.prototype.tabSet = function() { + this.tabs[this.x] = true; + return this.state = State.normal; + }; + + Terminal.prototype.cursorUp = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.y -= param; + if (this.y < 0) { + return this.y = 0; + } + }; + + Terminal.prototype.cursorDown = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.y += param; + if (this.y >= this.rows) { + return this.y = this.rows - 1; + } + }; + + Terminal.prototype.cursorForward = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.x += param; + if (this.x >= this.cols) { + return this.x = this.cols - 1; + } + }; + + Terminal.prototype.cursorBackward = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.x -= param; + if (this.x < 0) { + return this.x = 0; + } + }; + + Terminal.prototype.cursorPos = function(params) { + var col, row; + row = params[0] - 1; + if (params.length >= 2) { + col = params[1] - 1; + } else { + col = 0; + } + if (row < 0) { + row = 0; + } else { + if (row >= this.rows) { + row = this.rows - 1; + } + } + if (col < 0) { + col = 0; + } else { + if (col >= this.cols) { + col = this.cols - 1; + } + } + this.x = col; + return this.y = row; + }; + + Terminal.prototype.eraseInDisplay = function(params) { + var j, _results, _results1, _results2; + switch (params[0]) { + case 0: + this.eraseRight(this.x, this.y); + j = this.y + 1; + _results = []; + while (j < this.rows) { + this.eraseLine(j); + _results.push(j++); + } + return _results; + break; + case 1: + this.eraseLeft(this.x, this.y); + j = this.y; + _results1 = []; + while (j--) { + _results1.push(this.eraseLine(j)); + } + return _results1; + break; + case 2: + j = this.rows; + _results2 = []; + while (j--) { + _results2.push(this.eraseLine(j)); + } + return _results2; + } + }; + + Terminal.prototype.eraseInLine = function(params) { + switch (params[0]) { + case 0: + return this.eraseRight(this.x, this.y); + case 1: + return this.eraseLeft(this.x, this.y); + case 2: + return this.eraseLine(this.y); + } + }; + + Terminal.prototype.charAttributes = function(params) { + var bg, fg, flags, i, l, p; + if (params.length === 1 && params[0] === 0) { + this.curAttr = this.defAttr; + return; + } + flags = this.curAttr >> 18; + fg = (this.curAttr >> 9) & 0x1ff; + bg = this.curAttr & 0x1ff; + l = params.length; + i = 0; + while (i < l) { + p = params[i]; + if (p >= 30 && p <= 37) { + fg = p - 30; + } else if (p >= 40 && p <= 47) { + bg = p - 40; + } else if (p >= 90 && p <= 97) { + p += 8; + fg = p - 90; + } else if (p >= 100 && p <= 107) { + p += 8; + bg = p - 100; + } else if (p === 0) { + flags = this.defAttr >> 18; + fg = (this.defAttr >> 9) & 0x1ff; + bg = this.defAttr & 0x1ff; + } else if (p === 1) { + flags |= 1; + } else if (p === 4) { + flags |= 2; + } else if (p === 5) { + flags |= 4; + } else if (p === 7) { + flags |= 8; + } else if (p === 8) { + flags |= 16; + } else if (p === 22) { + flags &= ~1; + } else if (p === 24) { + flags &= ~2; + } else if (p === 25) { + flags &= ~4; + } else if (p === 27) { + flags &= ~8; + } else if (p === 28) { + flags &= ~16; + } else if (p === 39) { + fg = (this.defAttr >> 9) & 0x1ff; + } else if (p === 49) { + bg = this.defAttr & 0x1ff; + } else if (p === 38) { + if (params[i + 1] === 2) { + i += 2; + fg = "#" + params[i] & 0xff + params[i + 1] & 0xff + params[i + 2] & 0xff; + i += 2; + } else if (params[i + 1] === 5) { + i += 2; + fg = params[i] & 0xff; + } + } else if (p === 48) { + if (params[i + 1] === 2) { + i += 2; + bg = "#" + params[i] & 0xff + params[i + 1] & 0xff + params[i + 2] & 0xff; + i += 2; + } else if (params[i + 1] === 5) { + i += 2; + bg = params[i] & 0xff; + } + } else if (p === 100) { + fg = (this.defAttr >> 9) & 0x1ff; + bg = this.defAttr & 0x1ff; + } else { + console.error("Unknown SGR attribute: %d.", p); + } + i++; + } + return this.curAttr = (flags << 18) | (fg << 9) | bg; + }; + + Terminal.prototype.deviceStatus = function(params) { + if (!this.prefix) { + switch (params[0]) { + case 5: + return this.send("\x1b[0n"); + case 6: + return this.send("\x1b[" + (this.y + 1) + ";" + (this.x + 1) + "R"); + } + } else if (this.prefix === "?") { + if (params[0] === 6) { + return this.send("\x1b[?" + (this.y + 1) + ";" + (this.x + 1) + "R"); + } + } + }; + + Terminal.prototype.insertChars = function(params) { + var ch, j, param, row, _results; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this.y + this.ybase; + j = this.x; + ch = [this.eraseAttr(), " "]; + _results = []; + while (param-- && j < this.cols) { + this.lines[row].splice(j++, 0, ch); + _results.push(this.lines[row].pop()); + } + return _results; + }; + + Terminal.prototype.cursorNextLine = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.y += param; + if (this.y >= this.rows) { + this.y = this.rows - 1; + } + return this.x = 0; + }; + + Terminal.prototype.cursorPrecedingLine = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.y -= param; + if (this.y < 0) { + this.y = 0; + } + return this.x = 0; + }; + + Terminal.prototype.cursorCharAbsolute = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + return this.x = param - 1; + }; + + Terminal.prototype.insertLines = function(params) { + var j, param, row; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this.y + this.ybase; + j = this.rows - 1 - this.scrollBottom; + j = this.rows - 1 + this.ybase - j + 1; + while (param--) { + this.lines.splice(row, 0, this.blankLine(true)); + this.lines.splice(j, 1); + } + this.updateRange(this.y); + return this.updateRange(this.scrollBottom); + }; + + Terminal.prototype.deleteLines = function(params) { + var j, param, row; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this.y + this.ybase; + j = this.rows - 1 - this.scrollBottom; + j = this.rows - 1 + this.ybase - j; + while (param--) { + this.lines.splice(j + 1, 0, this.blankLine(true)); + this.lines.splice(row, 1); + } + this.updateRange(this.y); + return this.updateRange(this.scrollBottom); + }; + + Terminal.prototype.deleteChars = function(params) { + var ch, param, row, _results; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this.y + this.ybase; + ch = [this.eraseAttr(), " "]; + _results = []; + while (param--) { + this.lines[row].splice(this.x, 1); + _results.push(this.lines[row].push(ch)); + } + return _results; + }; + + Terminal.prototype.eraseChars = function(params) { + var ch, j, param, row, _results; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this.y + this.ybase; + j = this.x; + ch = [this.eraseAttr(), " "]; + _results = []; + while (param-- && j < this.cols) { + _results.push(this.lines[row][j++] = ch); + } + return _results; + }; + + Terminal.prototype.charPosAbsolute = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.x = param - 1; + if (this.x >= this.cols) { + return this.x = this.cols - 1; + } + }; + + Terminal.prototype.HPositionRelative = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.x += param; + if (this.x >= this.cols) { + return this.x = this.cols - 1; + } + }; + + Terminal.prototype.sendDeviceAttributes = function(params) { + if (params[0] > 0) { + return; + } + if (!this.prefix) { + if (this.isterm("xterm") || this.isterm("rxvt-unicode") || this.isterm("screen")) { + return this.send("\x1b[?1;2c"); + } else { + if (this.isterm("linux")) { + return this.send("\x1b[?6c"); + } + } + } else if (this.prefix === ">") { + if (this.isterm("xterm")) { + return this.send("\x1b[>0;276;0c"); + } else if (this.isterm("rxvt-unicode")) { + return this.send("\x1b[>85;95;0c"); + } else if (this.isterm("linux")) { + return this.send(params[0] + "c"); + } else { + if (this.isterm("screen")) { + return this.send("\x1b[>83;40003;0c"); + } + } + } + }; + + Terminal.prototype.linePosAbsolute = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.y = param - 1; + if (this.y >= this.rows) { + return this.y = this.rows - 1; + } + }; + + Terminal.prototype.VPositionRelative = function(params) { + var param; + param = params[0]; + if (param < 1) { + param = 1; + } + this.y += param; + if (this.y >= this.rows) { + return this.y = this.rows - 1; + } + }; + + Terminal.prototype.HVPosition = function(params) { + if (params[0] < 1) { + params[0] = 1; + } + if (params[1] < 1) { + params[1] = 1; + } + this.y = params[0] - 1; + if (this.y >= this.rows) { + this.y = this.rows - 1; + } + this.x = params[1] - 1; + if (this.x >= this.cols) { + return this.x = this.cols - 1; + } + }; + + Terminal.prototype.setMode = function(params) { + var i, l, normal; + if (typeof params === "object") { + l = params.length; + i = 0; + while (i < l) { + this.setMode(params[i]); + i++; + } + return; + } + if (this.prefix === "?") { + switch (params) { + case 1: + return this.applicationCursor = true; + case 2: + this.setgCharset(0, Terminal.prototype.charsets.US); + this.setgCharset(1, Terminal.prototype.charsets.US); + this.setgCharset(2, Terminal.prototype.charsets.US); + return this.setgCharset(3, Terminal.prototype.charsets.US); + case 3: + this.savedCols = this.cols; + return this.resize(132, this.rows); + case 6: + return this.originMode = true; + case 7: + return this.wraparoundMode = true; + case 66: + return this.applicationKeypad = true; + case 9: + case 1000: + case 1002: + case 1003: + this.x10Mouse = params === 9; + this.vt200Mouse = params === 1000; + this.normalMouse = params > 1000; + this.mouseEvents = true; + return this.element.style.cursor = 'pointer'; + case 1004: + return this.sendFocus = true; + case 1005: + return this.utfMouse = true; + case 1006: + return this.sgrMouse = true; + case 1015: + return this.urxvtMouse = true; + case 25: + return this.cursorHidden = false; + case 1049: + case 47: + case 1047: + if (!this.normal) { + normal = { + lines: this.lines, + ybase: this.ybase, + ydisp: this.ydisp, + x: this.x, + y: this.y, + scrollTop: this.scrollTop, + scrollBottom: this.scrollBottom, + tabs: this.tabs + }; + this.reset(); + this.normal = normal; + return this.showCursor(); + } + } + } + }; + + Terminal.prototype.resetMode = function(params) { + var i, l; + if (typeof params === "object") { + l = params.length; + i = 0; + while (i < l) { + this.resetMode(params[i]); + i++; + } + return; + } + if (this.prefix === "?") { + switch (params) { + case 1: + return this.applicationCursor = false; + case 3: + if (this.cols === 132 && this.savedCols) { + this.resize(this.savedCols, this.rows); + } + return delete this.savedCols; + case 6: + return this.originMode = false; + case 7: + return this.wraparoundMode = false; + case 66: + return this.applicationKeypad = false; + case 9: + case 1000: + case 1002: + case 1003: + this.x10Mouse = false; + this.vt200Mouse = false; + this.normalMouse = false; + this.mouseEvents = false; + return this.element.style.cursor = ""; + case 1004: + return this.sendFocus = false; + case 1005: + return this.utfMouse = false; + case 1006: + return this.sgrMouse = false; + case 1015: + return this.urxvtMouse = false; + case 25: + return this.cursorHidden = true; + case 1049: + case 47: + case 1047: + if (this.normal) { + this.lines = this.normal.lines; + this.ybase = this.normal.ybase; + this.ydisp = this.normal.ydisp; + this.x = this.normal.x; + this.y = this.normal.y; + this.scrollTop = this.normal.scrollTop; + this.scrollBottom = this.normal.scrollBottom; + this.tabs = this.normal.tabs; + this.normal = null; + this.refresh(0, this.rows - 1); + return this.showCursor(); + } + } + } + }; + + Terminal.prototype.setScrollRegion = function(params) { + if (this.prefix) { + return; + } + this.scrollTop = (params[0] || 1) - 1; + this.scrollBottom = (params[1] || this.rows) - 1; + this.x = 0; + return this.y = 0; + }; + + Terminal.prototype.saveCursor = function(params) { + this.savedX = this.x; + return this.savedY = this.y; + }; + + Terminal.prototype.restoreCursor = function(params) { + this.x = this.savedX || 0; + return this.y = this.savedY || 0; + }; + + Terminal.prototype.cursorForwardTab = function(params) { + var param, _results; + param = params[0] || 1; + _results = []; + while (param--) { + _results.push(this.x = this.nextStop()); + } + return _results; + }; + + Terminal.prototype.scrollUp = function(params) { + var param; + param = params[0] || 1; + while (param--) { + this.lines.splice(this.ybase + this.scrollTop, 1); + this.lines.splice(this.ybase + this.scrollBottom, 0, this.blankLine()); + } + this.updateRange(this.scrollTop); + return this.updateRange(this.scrollBottom); + }; + + Terminal.prototype.scrollDown = function(params) { + var param; + param = params[0] || 1; + while (param--) { + this.lines.splice(this.ybase + this.scrollBottom, 1); + this.lines.splice(this.ybase + this.scrollTop, 0, this.blankLine()); + } + this.updateRange(this.scrollTop); + return this.updateRange(this.scrollBottom); + }; + + Terminal.prototype.initMouseTracking = function(params) {}; + + Terminal.prototype.resetTitleModes = function(params) {}; + + Terminal.prototype.cursorBackwardTab = function(params) { + var param, _results; + param = params[0] || 1; + _results = []; + while (param--) { + _results.push(this.x = this.prevStop()); + } + return _results; + }; + + Terminal.prototype.repeatPrecedingCharacter = function(params) { + var ch, line, param, _results; + param = params[0] || 1; + line = this.lines[this.ybase + this.y]; + ch = line[this.x - 1] || [this.defAttr, " "]; + _results = []; + while (param--) { + _results.push(line[this.x++] = ch); + } + return _results; + }; + + Terminal.prototype.tabClear = function(params) { + var param; + param = params[0]; + if (param <= 0) { + return delete this.tabs[this.x]; + } else { + if (param === 3) { + return this.tabs = {}; + } + } + }; + + Terminal.prototype.mediaCopy = function(params) {}; + + Terminal.prototype.setResources = function(params) {}; + + Terminal.prototype.disableModifiers = function(params) {}; + + Terminal.prototype.setPointerMode = function(params) {}; + + Terminal.prototype.softReset = function(params) { + this.cursorHidden = false; + this.insertMode = false; + this.originMode = false; + this.wraparoundMode = false; + this.applicationKeypad = false; + this.applicationCursor = false; + this.scrollTop = 0; + this.scrollBottom = this.rows - 1; + this.curAttr = this.defAttr; + this.x = this.y = 0; + this.charset = null; + this.glevel = 0; + return this.charsets = [null]; + }; + + Terminal.prototype.requestAnsiMode = function(params) {}; + + Terminal.prototype.requestPrivateMode = function(params) {}; + + Terminal.prototype.setConformanceLevel = function(params) {}; + + Terminal.prototype.loadLEDs = function(params) {}; + + Terminal.prototype.setCursorStyle = function(params) {}; + + Terminal.prototype.setCharProtectionAttr = function(params) {}; + + Terminal.prototype.restorePrivateValues = function(params) {}; + + Terminal.prototype.setAttrInRectangle = function(params) { + var attr, b, i, l, line, r, t; + t = params[0]; + l = params[1]; + b = params[2]; + r = params[3]; + attr = params[4]; + while (t < b + 1) { + line = this.lines[this.ybase + t]; + i = l; + while (i < r) { + line[i] = [attr, line[i][1]]; + i++; + } + t++; + } + this.updateRange(params[0]); + return this.updateRange(params[2]); + }; + + Terminal.prototype.savePrivateValues = function(params) {}; + + Terminal.prototype.manipulateWindow = function(params) {}; + + Terminal.prototype.reverseAttrInRectangle = function(params) {}; + + Terminal.prototype.setTitleModeFeature = function(params) {}; + + Terminal.prototype.setWarningBellVolume = function(params) {}; + + Terminal.prototype.setMarginBellVolume = function(params) {}; + + Terminal.prototype.copyRectangle = function(params) {}; + + Terminal.prototype.enableFilterRectangle = function(params) {}; + + Terminal.prototype.requestParameters = function(params) {}; + + Terminal.prototype.selectChangeExtent = function(params) {}; + + Terminal.prototype.fillRectangle = function(params) { + var b, ch, i, l, line, r, t; + ch = params[0]; + t = params[1]; + l = params[2]; + b = params[3]; + r = params[4]; + while (t < b + 1) { + line = this.lines[this.ybase + t]; + i = l; + while (i < r) { + line[i] = [line[i][0], String.fromCharCode(ch)]; + i++; + } + t++; + } + this.updateRange(params[1]); + return this.updateRange(params[3]); + }; + + Terminal.prototype.enableLocatorReporting = function(params) { + var val; + return val = params[0] > 0; + }; + + Terminal.prototype.eraseRectangle = function(params) { + var b, ch, i, l, line, r, t; + t = params[0]; + l = params[1]; + b = params[2]; + r = params[3]; + ch = [this.eraseAttr(), " "]; + while (t < b + 1) { + line = this.lines[this.ybase + t]; + i = l; + while (i < r) { + line[i] = ch; + i++; + } + t++; + } + this.updateRange(params[0]); + return this.updateRange(params[2]); + }; + + Terminal.prototype.setLocatorEvents = function(params) {}; + + Terminal.prototype.selectiveEraseRectangle = function(params) {}; + + Terminal.prototype.requestLocatorPosition = function(params) {}; + + Terminal.prototype.insertColumns = function() { + var ch, i, l, param; + param = params[0]; + l = this.ybase + this.rows; + ch = [this.eraseAttr(), " "]; + while (param--) { + i = this.ybase; + while (i < l) { + this.lines[i].splice(this.x + 1, 0, ch); + this.lines[i].pop(); + i++; + } + } + return this.maxRange(); + }; + + Terminal.prototype.deleteColumns = function() { + var ch, i, l, param; + param = params[0]; + l = this.ybase + this.rows; + ch = [this.eraseAttr(), " "]; + while (param--) { + i = this.ybase; + while (i < l) { + this.lines[i].splice(this.x, 1); + this.lines[i].push(ch); + i++; + } + } + return this.maxRange(); + }; + + Terminal.prototype.get_html_height_in_lines = function(html) { + var html_height, temp_node; + temp_node = document.createElement("div"); + temp_node.innerHTML = html; + this.element.appendChild(temp_node); + html_height = temp_node.getBoundingClientRect().height; + this.element.removeChild(temp_node); + return Math.ceil(html_height / this.char_size.height); + }; + + Terminal.prototype.charsets = { + SCLD: { + "`": "◆", + a: "▒", + b: "\t", + c: "\f", + d: "\r", + e: "\n", + f: "°", + g: "±", + h: "␤", + i: "\x0b", + j: "┘", + k: "┐", + l: "┌", + m: "└", + n: "┼", + o: "⎺", + p: "⎻", + q: "─", + r: "⎼", + s: "⎽", + t: "├", + u: "┤", + v: "┴", + w: "┬", + x: "│", + y: "≤", + z: "≥", + "{": "π", + "|": "≠", + "}": "£", + "~": "·" + }, + UK: null, + US: null, + Dutch: null, + Finnish: null, + French: null, + FrenchCanadian: null, + German: null, + Italian: null, + NorwegianDanish: null, + Spanish: null, + Swedish: null, + Swiss: null, + ISOLatin: null + }; + + return Terminal; + + })(); + + selection = null; + + previous_leaf = function(node) { + var previous; + previous = node.previousSibling; + if (!previous) { + previous = node.parentNode.previousSibling; + } + if (!previous) { + previous = node.parentNode.parentNode.previousSibling; + } + while (previous.lastChild) { + previous = previous.lastChild; + } + return previous; + }; + + next_leaf = function(node) { + var next; + next = node.nextSibling; + if (!next) { + next = node.parentNode.nextSibling; + } + if (!next) { + next = node.parentNode.parentNode.nextSibling; + } + while (next.firstChild) { + next = next.firstChild; + } + return next; + }; + + Selection = (function() { + function Selection() { + term.element.classList.add('selection'); + this.selection = getSelection(); + } + + Selection.prototype.reset = function() { + var fake_range, _ref, _results; + this.selection = getSelection(); + fake_range = document.createRange(); + fake_range.setStart(this.selection.anchorNode, this.selection.anchorOffset); + fake_range.setEnd(this.selection.focusNode, this.selection.focusOffset); + this.start = { + node: this.selection.anchorNode, + offset: this.selection.anchorOffset + }; + this.end = { + node: this.selection.focusNode, + offset: this.selection.focusOffset + }; + if (fake_range.collapsed) { + _ref = [this.end, this.start], this.start = _ref[0], this.end = _ref[1]; + } + this.start_line = this.start.node; + while (!this.start_line.classList || __indexOf.call(this.start_line.classList, 'line') < 0) { + this.start_line = this.start_line.parentNode; + } + this.end_line = this.end.node; + _results = []; + while (!this.end_line.classList || __indexOf.call(this.end_line.classList, 'line') < 0) { + _results.push(this.end_line = this.end_line.parentNode); + } + return _results; + }; + + Selection.prototype.clear = function() { + return this.selection.removeAllRanges(); + }; + + Selection.prototype.destroy = function() { + term.element.classList.remove('selection'); + return this.clear(); + }; + + Selection.prototype.text = function() { + return this.selection.toString(); + }; + + Selection.prototype.up = function() { + return this.go(-1); + }; + + Selection.prototype.down = function() { + return this.go(+1); + }; + + Selection.prototype.go = function(n) { + var index; + index = term.children.indexOf(this.start_line) + n; + if (!((0 <= index && index < term.children.length))) { + return; + } + while (!term.children[index].textContent.match(/\S/)) { + index += n; + if (!((0 <= index && index < term.children.length))) { + return; + } + } + return this.select_line(index); + }; + + Selection.prototype.apply = function() { + var range; + this.clear(); + range = document.createRange(); + range.setStart(this.start.node, this.start.offset); + range.setEnd(this.end.node, this.end.offset); + return this.selection.addRange(range); + }; + + Selection.prototype.select_line = function(index) { + var line, line_end, line_start; + line = term.children[index]; + line_start = { + node: line.firstChild, + offset: 0 + }; + line_end = { + node: line.lastChild, + offset: line.lastChild.textContent.length + }; + this.start = this.walk(line_start, /\S/); + return this.end = this.walk(line_end, /\S/, true); + }; + + Selection.prototype.collapsed = function(start, end) { + var fake_range; + fake_range = document.createRange(); + fake_range.setStart(start.node, start.offset); + fake_range.setEnd(end.node, end.offset); + return fake_range.collapsed; + }; + + Selection.prototype.shrink_right = function() { + var end, node; + node = this.walk(this.end, /\s/, true); + end = this.walk(node, /\S/, true); + if (!this.collapsed(this.start, end)) { + return this.end = end; + } + }; + + Selection.prototype.shrink_left = function() { + var node, start; + node = this.walk(this.start, /\s/); + start = this.walk(node, /\S/); + if (!this.collapsed(start, this.end)) { + return this.start = start; + } + }; + + Selection.prototype.expand_right = function() { + var node; + node = this.walk(this.end, /\S/); + return this.end = this.walk(node, /\s/); + }; + + Selection.prototype.expand_left = function() { + var node; + node = this.walk(this.start, /\S/, true); + return this.start = this.walk(node, /\s/, true); + }; + + Selection.prototype.walk = function(needle, til, backward) { + var i, node, text; + if (backward == null) { + backward = false; + } + if (needle.node.firstChild) { + node = needle.node.firstChild; + } else { + node = needle.node; + } + text = node.textContent; + i = needle.offset; + if (backward) { + while (node) { + while (i > 0) { + if (text[--i].match(til)) { + return { + node: node, + offset: i + 1 + }; + } + } + node = previous_leaf(node); + text = node.textContent; + i = text.length; + } + } else { + while (node) { + while (i < text.length) { + if (text[i++].match(til)) { + return { + node: node, + offset: i - 1 + }; + } + } + node = next_leaf(node); + text = node.textContent; + i = 0; + } + } + return needle; + }; + + return Selection; + + })(); + + document.addEventListener('keydown', function(e) { + var _ref, _ref1; + if (_ref = e.keyCode, __indexOf.call([16, 17, 18, 19], _ref) >= 0) { + return true; + } + if (e.shiftKey && e.keyCode === 13 && !selection && !getSelection().isCollapsed) { + term.handler(getSelection().toString()); + getSelection().removeAllRanges(); + return cancel(e); + } + if (selection) { + selection.reset(); + if (!e.ctrlKey && e.shiftKey && (37 <= (_ref1 = e.keyCode) && _ref1 <= 40)) { + return true; + } + if (e.shiftKey && e.ctrlKey) { + if (e.keyCode === 38) { + selection.up(); + } else if (e.keyCode === 40) { + selection.down(); + } + } else if (e.keyCode === 39) { + selection.shrink_left(); + } else if (e.keyCode === 38) { + selection.expand_left(); + } else if (e.keyCode === 37) { + selection.shrink_right(); + } else if (e.keyCode === 40) { + selection.expand_right(); + } else { + return cancel(e); + } + if (selection != null) { + selection.apply(); + } + return cancel(e); + } + if (!selection && e.ctrlKey && e.shiftKey && e.keyCode === 38) { + selection = new Selection(); + selection.select_line(term.y - 1); + selection.apply(); + return cancel(e); + } + return true; + }); + + document.addEventListener('keyup', function(e) { + var _ref, _ref1; + if (_ref = e.keyCode, __indexOf.call([16, 17, 18, 19], _ref) >= 0) { + return true; + } + if (selection) { + if (e.keyCode === 13) { + term.handler(selection.text()); + selection.destroy(); + selection = null; + return cancel(e); + } + if (_ref1 = e.keyCode, __indexOf.call([37, 38, 39, 40], _ref1) < 0) { + selection.destroy(); + selection = null; + return true; + } + } + return true; + }); + + document.addEventListener('dblclick', function(e) { + var anchorNode, anchorOffset, new_range, range, sel; + if (e.ctrlKey || e.altkey) { + return; + } + sel = getSelection(); + if (sel.isCollapsed || sel.toString().match(/\s/)) { + return; + } + range = document.createRange(); + range.setStart(sel.anchorNode, sel.anchorOffset); + range.setEnd(sel.focusNode, sel.focusOffset); + if (range.collapsed) { + sel.removeAllRanges(); + new_range = document.createRange(); + new_range.setStart(sel.focusNode, sel.focusOffset); + new_range.setEnd(sel.anchorNode, sel.anchorOffset); + sel.addRange(new_range); + } + range.detach(); + while (!(sel.toString().match(/\s/) || !sel.toString())) { + sel.modify('extend', 'forward', 'character'); + } + sel.modify('extend', 'backward', 'character'); + anchorNode = sel.anchorNode; + anchorOffset = sel.anchorOffset; + sel.collapseToEnd(); + sel.extend(anchorNode, anchorOffset); + while (!(sel.toString().match(/\s/) || !sel.toString())) { + sel.modify('extend', 'backward', 'character'); + } + return sel.modify('extend', 'forward', 'character'); + }); + + if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) { + ctrl = false; + alt = false; + first = true; + virtual_input = document.createElement('input'); + virtual_input.type = 'password'; + virtual_input.style.position = 'fixed'; + virtual_input.style.top = 0; + virtual_input.style.left = 0; + virtual_input.style.border = 'none'; + virtual_input.style.outline = 'none'; + virtual_input.style.opacity = 0; + virtual_input.value = '0'; + document.body.appendChild(virtual_input); + virtual_input.addEventListener('blur', function() { + return setTimeout(((function(_this) { + return function() { + return _this.focus(); + }; + })(this)), 10); + }); + addEventListener('click', function() { + return virtual_input.focus(); + }); + addEventListener('touchstart', function(e) { + if (e.touches.length === 2) { + return ctrl = true; + } else if (e.touches.length === 3) { + ctrl = false; + return alt = true; + } else if (e.touches.length === 4) { + ctrl = true; + return alt = true; + } + }); + virtual_input.addEventListener('keydown', function(e) { + term.keyDown(e); + return true; + }); + virtual_input.addEventListener('input', function(e) { + var len; + len = this.value.length; + if (len === 0) { + e.keyCode = 8; + term.keyDown(e); + this.value = '0'; + return true; + } + e.keyCode = this.value.charAt(1).charCodeAt(0); + if ((ctrl || alt) && !first) { + e.keyCode = this.value.charAt(1).charCodeAt(0); + e.ctrlKey = ctrl; + e.altKey = alt; + if (e.keyCode >= 97 && e.keyCode <= 122) { + e.keyCode -= 32; + } + term.keyDown(e); + this.value = '0'; + ctrl = alt = false; + return true; + } + term.keyPress(e); + first = false; + this.value = '0'; + return true; + }); + } + + cols = rows = null; + + quit = false; + + open_ts = (new Date()).getTime(); + + $ = document.querySelectorAll.bind(document); + + send = function(data) { + return ws.send('S' + data); + }; + + ctl = function() { + var args, params, type; + type = arguments[0], args = 2 <= arguments.length ? __slice.call(arguments, 1) : []; + params = args.join(','); + if (type === 'Resize') { + return ws.send('R' + params); + } + }; + + if (location.protocol === 'https:') { + ws_url = 'wss://'; + } else { + ws_url = 'ws://'; + } + + ws_url += document.location.host + '/ws' + location.pathname; + + ws = new WebSocket(ws_url); + + ws.addEventListener('open', function() { + console.log("WebSocket open", arguments); + ws.send('R' + term.cols + ',' + term.rows); + return open_ts = (new Date()).getTime(); + }); + + ws.addEventListener('error', function() { + return console.log("WebSocket error", arguments); + }); + + ws.addEventListener('message', function(e) { + return setTimeout(function() { + return term.write(e.data); + }, 1); + }); + + ws.addEventListener('close', function() { + console.log("WebSocket closed", arguments); + setTimeout(function() { + term.write('Closed'); + term.skipNextKey = true; + return term.element.classList.add('dead'); + }, 1); + quit = true; + if ((new Date()).getTime() - open_ts > 60 * 1000) { + return open('', '_self').close(); + } + }); + + term = new Terminal($('#wrapper')[0], send, ctl); + + addEventListener('beforeunload', function() { + if (!quit) { + return 'This will exit the terminal session'; + } + }); + + bench = function(n) { + var rnd, t0; + if (n == null) { + n = 100000000; + } + rnd = ''; + while (rnd.length < n) { + rnd += Math.random().toString(36).substring(2); + } + t0 = (new Date()).getTime(); + term.write(rnd); + return console.log("" + n + " chars in " + ((new Date()).getTime() - t0) + " ms"); + }; + + cbench = function(n) { + var rnd, t0; + if (n == null) { + n = 100000000; + } + rnd = ''; + while (rnd.length < n) { + rnd += "\x1b[" + (30 + parseInt(Math.random() * 20)) + "m"; + rnd += Math.random().toString(36).substring(2); + } + t0 = (new Date()).getTime(); + term.write(rnd); + return console.log("" + n + " chars + colors in " + ((new Date()).getTime() - t0) + " ms"); + }; + +}).call(this); + +//# sourceMappingURL=main.js.map diff --git a/butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.eot b/butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.eot deleted file mode 100644 index 423bd5d3a20b804f596e04e5cd02fb4f16cfcbc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20290 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.ttf b/butterfly/static/stylesheets/fonts/glyphicons-halflings-regular.ttf deleted file mode 100644 index a498ef4e7c8b556fc36f580c5ff524025bb11c84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41236 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. */ -@font-face { - font-family: "SourceCodePro"; - src: url('/static/fonts/'); - src: url('/static/fonts/?#iefix') format('embedded-opentype'), url('/static/fonts/SourceCodePro-ExtraLight.otf') format('opentype'); - font-weight: 100; - font-style: normal; -} - -@font-face { - font-family: "SourceCodePro"; - src: url('/static/fonts/'); - src: url('/static/fonts/?#iefix') format('embedded-opentype'), url('/static/fonts/SourceCodePro-Light.otf') format('opentype'); - font-weight: 300; - font-style: normal; -} - -@font-face { - font-family: "SourceCodePro"; - src: url('/static/fonts/'); - src: url('/static/fonts/?#iefix') format('embedded-opentype'), url('/static/fonts/SourceCodePro-Regular.otf') format('opentype'); - font-weight: 400; - font-style: normal; -} - -@font-face { - font-family: "SourceCodePro"; - src: url('/static/fonts/'); - src: url('/static/fonts/?#iefix') format('embedded-opentype'), url('/static/fonts/SourceCodePro-Medium.otf') format('opentype'); - font-weight: 500; - font-style: normal; -} - -@font-face { - font-family: "SourceCodePro"; - src: url('/static/fonts/'); - src: url('/static/fonts/?#iefix') format('embedded-opentype'), url('/static/fonts/SourceCodePro-Semibold.otf') format('opentype'); - font-weight: 600; - font-style: normal; -} - -@font-face { - font-family: "SourceCodePro"; - src: url('/static/fonts/'); - src: url('/static/fonts/?#iefix') format('embedded-opentype'), url('/static/fonts/SourceCodePro-Bold.otf') format('opentype'); - font-weight: 700; - font-style: normal; -} - -@font-face { - font-family: "SourceCodePro"; - src: url('/static/fonts/'); - src: url('/static/fonts/?#iefix') format('embedded-opentype'), url('/static/fonts/SourceCodePro-Black.otf') format('opentype'); - font-weight: 900; - font-style: normal; -} - -/* line 34, ../sass/main.sass */ -html, body { - height: 100%; - font-family: "SourceCodePro"; - margin: 0; - padding: 0; - line-height: 1.2; -} - -/* line 42, ../sass/main.sass */ -#wrapper { - height: 100%; - background-color: #110f13; - overflow: hidden; - white-space: nowrap; -} - -/* line 48, ../sass/main.sass */ -.terminal { - outline: none; - background-color: #110f13; - color: #f4ead5; - text-shadow: 0 0 6px rgba(244, 234, 213, 0.5); - -webkit-transition: 200ms; - -moz-transition: 200ms; - -o-transition: 200ms; - transition: 200ms; -} -/* line 55, ../sass/main.sass */ -.terminal.bell { - -webkit-filter: blur(2px); - -moz-filter: blur(2px); - filter: blur(2px); -} -/* line 58, ../sass/main.sass */ -.terminal.skip { - -webkit-filter: sepia(1); - -moz-filter: sepia(1); - filter: sepia(1); -} -/* line 61, ../sass/main.sass */ -.terminal.selection { - -webkit-filter: saturate(2); - -moz-filter: saturate(2); - filter: saturate(2); -} - -/* line 64, ../sass/main.sass */ -.line { - overflow: visible; -} -/* line 67, ../sass/main.sass */ -.line .inline-html { - white-space: normal; -} - -/* line 71, ../sass/main.sass */ -.focus .cursor { - -webkit-transition: 300ms; - -moz-transition: 300ms; - -o-transition: 300ms; - transition: 300ms; -} - -/* line 74, ../sass/main.sass */ -.cursor.reverse-video { - box-shadow: 0 0 10px #f4ead5; -} - -/* Terminal styles */ -/* line 78, ../sass/main.sass */ -.bold { - font-weight: bold; -} - -/* line 81, ../sass/main.sass */ -.underline { - text-decoration: underline; -} - -/* line 84, ../sass/main.sass */ -.blink { - text-decoration: blink; -} - -/* line 87, ../sass/main.sass */ -.invisible { - visibility: hidden; -} - -/* line 90, ../sass/main.sass */ -.reverse-video { - color: #110f13; - background-color: #f4ead5; -} - -/* line 94, ../sass/main.sass */ -.blur .cursor.reverse-video { - background: none; -} - -/* line 98, ../sass/main.sass */ -.bg-color-0 { - background-color: #2e3436; -} -/* line 100, ../sass/main.sass */ -.bg-color-0.reverse-video { - color: #2e3436 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-0 { - color: #2e3436; - text-shadow: 0 0 6px rgba(46, 52, 54, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-0.reverse-video { - background-color: #2e3436 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-1 { - background-color: #cc0000; -} -/* line 100, ../sass/main.sass */ -.bg-color-1.reverse-video { - color: #cc0000 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-1 { - color: #cc0000; - text-shadow: 0 0 6px rgba(204, 0, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-1.reverse-video { - background-color: #cc0000 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-2 { - background-color: #4e9a06; -} -/* line 100, ../sass/main.sass */ -.bg-color-2.reverse-video { - color: #4e9a06 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-2 { - color: #4e9a06; - text-shadow: 0 0 6px rgba(78, 154, 6, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-2.reverse-video { - background-color: #4e9a06 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-3 { - background-color: #c4a000; -} -/* line 100, ../sass/main.sass */ -.bg-color-3.reverse-video { - color: #c4a000 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-3 { - color: #c4a000; - text-shadow: 0 0 6px rgba(196, 160, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-3.reverse-video { - background-color: #c4a000 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-4 { - background-color: #3465a4; -} -/* line 100, ../sass/main.sass */ -.bg-color-4.reverse-video { - color: #3465a4 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-4 { - color: #3465a4; - text-shadow: 0 0 6px rgba(52, 101, 164, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-4.reverse-video { - background-color: #3465a4 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-5 { - background-color: #75507b; -} -/* line 100, ../sass/main.sass */ -.bg-color-5.reverse-video { - color: #75507b !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-5 { - color: #75507b; - text-shadow: 0 0 6px rgba(117, 80, 123, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-5.reverse-video { - background-color: #75507b !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-6 { - background-color: #06989a; -} -/* line 100, ../sass/main.sass */ -.bg-color-6.reverse-video { - color: #06989a !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-6 { - color: #06989a; - text-shadow: 0 0 6px rgba(6, 152, 154, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-6.reverse-video { - background-color: #06989a !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-7 { - background-color: #d3d7cf; -} -/* line 100, ../sass/main.sass */ -.bg-color-7.reverse-video { - color: #d3d7cf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-7 { - color: #d3d7cf; - text-shadow: 0 0 6px rgba(211, 215, 207, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-7.reverse-video { - background-color: #d3d7cf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-8 { - background-color: #555753; -} -/* line 100, ../sass/main.sass */ -.bg-color-8.reverse-video { - color: #555753 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-8 { - color: #555753; - text-shadow: 0 0 6px rgba(85, 87, 83, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-8.reverse-video { - background-color: #555753 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-9 { - background-color: #ef2929; -} -/* line 100, ../sass/main.sass */ -.bg-color-9.reverse-video { - color: #ef2929 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-9 { - color: #ef2929; - text-shadow: 0 0 6px rgba(239, 41, 41, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-9.reverse-video { - background-color: #ef2929 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-10 { - background-color: #8ae234; -} -/* line 100, ../sass/main.sass */ -.bg-color-10.reverse-video { - color: #8ae234 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-10 { - color: #8ae234; - text-shadow: 0 0 6px rgba(138, 226, 52, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-10.reverse-video { - background-color: #8ae234 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-11 { - background-color: #fce94f; -} -/* line 100, ../sass/main.sass */ -.bg-color-11.reverse-video { - color: #fce94f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-11 { - color: #fce94f; - text-shadow: 0 0 6px rgba(252, 233, 79, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-11.reverse-video { - background-color: #fce94f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-12 { - background-color: #729fcf; -} -/* line 100, ../sass/main.sass */ -.bg-color-12.reverse-video { - color: #729fcf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-12 { - color: #729fcf; - text-shadow: 0 0 6px rgba(114, 159, 207, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-12.reverse-video { - background-color: #729fcf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-13 { - background-color: #ad7fa8; -} -/* line 100, ../sass/main.sass */ -.bg-color-13.reverse-video { - color: #ad7fa8 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-13 { - color: #ad7fa8; - text-shadow: 0 0 6px rgba(173, 127, 168, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-13.reverse-video { - background-color: #ad7fa8 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-14 { - background-color: #34e2e2; -} -/* line 100, ../sass/main.sass */ -.bg-color-14.reverse-video { - color: #34e2e2 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-14 { - color: #34e2e2; - text-shadow: 0 0 6px rgba(52, 226, 226, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-14.reverse-video { - background-color: #34e2e2 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-15 { - background-color: #eeeeec; -} -/* line 100, ../sass/main.sass */ -.bg-color-15.reverse-video { - color: #eeeeec !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-15 { - color: #eeeeec; - text-shadow: 0 0 6px rgba(238, 238, 236, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-15.reverse-video { - background-color: #eeeeec !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-16 { - background-color: black; -} -/* line 100, ../sass/main.sass */ -.bg-color-16.reverse-video { - color: black !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-16 { - color: black; - text-shadow: 0 0 6px rgba(0, 0, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-16.reverse-video { - background-color: black !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-17 { - background-color: #00005f; -} -/* line 100, ../sass/main.sass */ -.bg-color-17.reverse-video { - color: #00005f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-17 { - color: #00005f; - text-shadow: 0 0 6px rgba(0, 0, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-17.reverse-video { - background-color: #00005f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-18 { - background-color: #000087; -} -/* line 100, ../sass/main.sass */ -.bg-color-18.reverse-video { - color: #000087 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-18 { - color: #000087; - text-shadow: 0 0 6px rgba(0, 0, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-18.reverse-video { - background-color: #000087 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-19 { - background-color: #0000af; -} -/* line 100, ../sass/main.sass */ -.bg-color-19.reverse-video { - color: #0000af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-19 { - color: #0000af; - text-shadow: 0 0 6px rgba(0, 0, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-19.reverse-video { - background-color: #0000af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-20 { - background-color: #0000d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-20.reverse-video { - color: #0000d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-20 { - color: #0000d7; - text-shadow: 0 0 6px rgba(0, 0, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-20.reverse-video { - background-color: #0000d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-21 { - background-color: blue; -} -/* line 100, ../sass/main.sass */ -.bg-color-21.reverse-video { - color: blue !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-21 { - color: blue; - text-shadow: 0 0 6px rgba(0, 0, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-21.reverse-video { - background-color: blue !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-22 { - background-color: #005f00; -} -/* line 100, ../sass/main.sass */ -.bg-color-22.reverse-video { - color: #005f00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-22 { - color: #005f00; - text-shadow: 0 0 6px rgba(0, 95, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-22.reverse-video { - background-color: #005f00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-23 { - background-color: #005f5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-23.reverse-video { - color: #005f5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-23 { - color: #005f5f; - text-shadow: 0 0 6px rgba(0, 95, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-23.reverse-video { - background-color: #005f5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-24 { - background-color: #005f87; -} -/* line 100, ../sass/main.sass */ -.bg-color-24.reverse-video { - color: #005f87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-24 { - color: #005f87; - text-shadow: 0 0 6px rgba(0, 95, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-24.reverse-video { - background-color: #005f87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-25 { - background-color: #005faf; -} -/* line 100, ../sass/main.sass */ -.bg-color-25.reverse-video { - color: #005faf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-25 { - color: #005faf; - text-shadow: 0 0 6px rgba(0, 95, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-25.reverse-video { - background-color: #005faf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-26 { - background-color: #005fd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-26.reverse-video { - color: #005fd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-26 { - color: #005fd7; - text-shadow: 0 0 6px rgba(0, 95, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-26.reverse-video { - background-color: #005fd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-27 { - background-color: #005fff; -} -/* line 100, ../sass/main.sass */ -.bg-color-27.reverse-video { - color: #005fff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-27 { - color: #005fff; - text-shadow: 0 0 6px rgba(0, 95, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-27.reverse-video { - background-color: #005fff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-28 { - background-color: #008700; -} -/* line 100, ../sass/main.sass */ -.bg-color-28.reverse-video { - color: #008700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-28 { - color: #008700; - text-shadow: 0 0 6px rgba(0, 135, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-28.reverse-video { - background-color: #008700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-29 { - background-color: #00875f; -} -/* line 100, ../sass/main.sass */ -.bg-color-29.reverse-video { - color: #00875f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-29 { - color: #00875f; - text-shadow: 0 0 6px rgba(0, 135, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-29.reverse-video { - background-color: #00875f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-30 { - background-color: #008787; -} -/* line 100, ../sass/main.sass */ -.bg-color-30.reverse-video { - color: #008787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-30 { - color: #008787; - text-shadow: 0 0 6px rgba(0, 135, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-30.reverse-video { - background-color: #008787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-31 { - background-color: #0087af; -} -/* line 100, ../sass/main.sass */ -.bg-color-31.reverse-video { - color: #0087af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-31 { - color: #0087af; - text-shadow: 0 0 6px rgba(0, 135, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-31.reverse-video { - background-color: #0087af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-32 { - background-color: #0087d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-32.reverse-video { - color: #0087d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-32 { - color: #0087d7; - text-shadow: 0 0 6px rgba(0, 135, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-32.reverse-video { - background-color: #0087d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-33 { - background-color: #0087ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-33.reverse-video { - color: #0087ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-33 { - color: #0087ff; - text-shadow: 0 0 6px rgba(0, 135, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-33.reverse-video { - background-color: #0087ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-34 { - background-color: #00af00; -} -/* line 100, ../sass/main.sass */ -.bg-color-34.reverse-video { - color: #00af00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-34 { - color: #00af00; - text-shadow: 0 0 6px rgba(0, 175, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-34.reverse-video { - background-color: #00af00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-35 { - background-color: #00af5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-35.reverse-video { - color: #00af5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-35 { - color: #00af5f; - text-shadow: 0 0 6px rgba(0, 175, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-35.reverse-video { - background-color: #00af5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-36 { - background-color: #00af87; -} -/* line 100, ../sass/main.sass */ -.bg-color-36.reverse-video { - color: #00af87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-36 { - color: #00af87; - text-shadow: 0 0 6px rgba(0, 175, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-36.reverse-video { - background-color: #00af87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-37 { - background-color: #00afaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-37.reverse-video { - color: #00afaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-37 { - color: #00afaf; - text-shadow: 0 0 6px rgba(0, 175, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-37.reverse-video { - background-color: #00afaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-38 { - background-color: #00afd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-38.reverse-video { - color: #00afd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-38 { - color: #00afd7; - text-shadow: 0 0 6px rgba(0, 175, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-38.reverse-video { - background-color: #00afd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-39 { - background-color: #00afff; -} -/* line 100, ../sass/main.sass */ -.bg-color-39.reverse-video { - color: #00afff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-39 { - color: #00afff; - text-shadow: 0 0 6px rgba(0, 175, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-39.reverse-video { - background-color: #00afff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-40 { - background-color: #00d700; -} -/* line 100, ../sass/main.sass */ -.bg-color-40.reverse-video { - color: #00d700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-40 { - color: #00d700; - text-shadow: 0 0 6px rgba(0, 215, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-40.reverse-video { - background-color: #00d700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-41 { - background-color: #00d75f; -} -/* line 100, ../sass/main.sass */ -.bg-color-41.reverse-video { - color: #00d75f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-41 { - color: #00d75f; - text-shadow: 0 0 6px rgba(0, 215, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-41.reverse-video { - background-color: #00d75f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-42 { - background-color: #00d787; -} -/* line 100, ../sass/main.sass */ -.bg-color-42.reverse-video { - color: #00d787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-42 { - color: #00d787; - text-shadow: 0 0 6px rgba(0, 215, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-42.reverse-video { - background-color: #00d787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-43 { - background-color: #00d7af; -} -/* line 100, ../sass/main.sass */ -.bg-color-43.reverse-video { - color: #00d7af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-43 { - color: #00d7af; - text-shadow: 0 0 6px rgba(0, 215, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-43.reverse-video { - background-color: #00d7af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-44 { - background-color: #00d7d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-44.reverse-video { - color: #00d7d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-44 { - color: #00d7d7; - text-shadow: 0 0 6px rgba(0, 215, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-44.reverse-video { - background-color: #00d7d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-45 { - background-color: #00d7ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-45.reverse-video { - color: #00d7ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-45 { - color: #00d7ff; - text-shadow: 0 0 6px rgba(0, 215, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-45.reverse-video { - background-color: #00d7ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-46 { - background-color: lime; -} -/* line 100, ../sass/main.sass */ -.bg-color-46.reverse-video { - color: lime !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-46 { - color: lime; - text-shadow: 0 0 6px rgba(0, 255, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-46.reverse-video { - background-color: lime !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-47 { - background-color: #00ff5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-47.reverse-video { - color: #00ff5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-47 { - color: #00ff5f; - text-shadow: 0 0 6px rgba(0, 255, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-47.reverse-video { - background-color: #00ff5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-48 { - background-color: #00ff87; -} -/* line 100, ../sass/main.sass */ -.bg-color-48.reverse-video { - color: #00ff87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-48 { - color: #00ff87; - text-shadow: 0 0 6px rgba(0, 255, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-48.reverse-video { - background-color: #00ff87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-49 { - background-color: #00ffaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-49.reverse-video { - color: #00ffaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-49 { - color: #00ffaf; - text-shadow: 0 0 6px rgba(0, 255, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-49.reverse-video { - background-color: #00ffaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-50 { - background-color: #00ffd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-50.reverse-video { - color: #00ffd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-50 { - color: #00ffd7; - text-shadow: 0 0 6px rgba(0, 255, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-50.reverse-video { - background-color: #00ffd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-51 { - background-color: cyan; -} -/* line 100, ../sass/main.sass */ -.bg-color-51.reverse-video { - color: cyan !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-51 { - color: cyan; - text-shadow: 0 0 6px rgba(0, 255, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-51.reverse-video { - background-color: cyan !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-52 { - background-color: #5f0000; -} -/* line 100, ../sass/main.sass */ -.bg-color-52.reverse-video { - color: #5f0000 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-52 { - color: #5f0000; - text-shadow: 0 0 6px rgba(95, 0, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-52.reverse-video { - background-color: #5f0000 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-53 { - background-color: #5f005f; -} -/* line 100, ../sass/main.sass */ -.bg-color-53.reverse-video { - color: #5f005f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-53 { - color: #5f005f; - text-shadow: 0 0 6px rgba(95, 0, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-53.reverse-video { - background-color: #5f005f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-54 { - background-color: #5f0087; -} -/* line 100, ../sass/main.sass */ -.bg-color-54.reverse-video { - color: #5f0087 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-54 { - color: #5f0087; - text-shadow: 0 0 6px rgba(95, 0, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-54.reverse-video { - background-color: #5f0087 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-55 { - background-color: #5f00af; -} -/* line 100, ../sass/main.sass */ -.bg-color-55.reverse-video { - color: #5f00af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-55 { - color: #5f00af; - text-shadow: 0 0 6px rgba(95, 0, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-55.reverse-video { - background-color: #5f00af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-56 { - background-color: #5f00d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-56.reverse-video { - color: #5f00d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-56 { - color: #5f00d7; - text-shadow: 0 0 6px rgba(95, 0, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-56.reverse-video { - background-color: #5f00d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-57 { - background-color: #5f00ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-57.reverse-video { - color: #5f00ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-57 { - color: #5f00ff; - text-shadow: 0 0 6px rgba(95, 0, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-57.reverse-video { - background-color: #5f00ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-58 { - background-color: #5f5f00; -} -/* line 100, ../sass/main.sass */ -.bg-color-58.reverse-video { - color: #5f5f00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-58 { - color: #5f5f00; - text-shadow: 0 0 6px rgba(95, 95, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-58.reverse-video { - background-color: #5f5f00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-59 { - background-color: #5f5f5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-59.reverse-video { - color: #5f5f5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-59 { - color: #5f5f5f; - text-shadow: 0 0 6px rgba(95, 95, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-59.reverse-video { - background-color: #5f5f5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-60 { - background-color: #5f5f87; -} -/* line 100, ../sass/main.sass */ -.bg-color-60.reverse-video { - color: #5f5f87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-60 { - color: #5f5f87; - text-shadow: 0 0 6px rgba(95, 95, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-60.reverse-video { - background-color: #5f5f87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-61 { - background-color: #5f5faf; -} -/* line 100, ../sass/main.sass */ -.bg-color-61.reverse-video { - color: #5f5faf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-61 { - color: #5f5faf; - text-shadow: 0 0 6px rgba(95, 95, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-61.reverse-video { - background-color: #5f5faf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-62 { - background-color: #5f5fd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-62.reverse-video { - color: #5f5fd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-62 { - color: #5f5fd7; - text-shadow: 0 0 6px rgba(95, 95, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-62.reverse-video { - background-color: #5f5fd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-63 { - background-color: #5f5fff; -} -/* line 100, ../sass/main.sass */ -.bg-color-63.reverse-video { - color: #5f5fff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-63 { - color: #5f5fff; - text-shadow: 0 0 6px rgba(95, 95, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-63.reverse-video { - background-color: #5f5fff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-64 { - background-color: #5f8700; -} -/* line 100, ../sass/main.sass */ -.bg-color-64.reverse-video { - color: #5f8700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-64 { - color: #5f8700; - text-shadow: 0 0 6px rgba(95, 135, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-64.reverse-video { - background-color: #5f8700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-65 { - background-color: #5f875f; -} -/* line 100, ../sass/main.sass */ -.bg-color-65.reverse-video { - color: #5f875f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-65 { - color: #5f875f; - text-shadow: 0 0 6px rgba(95, 135, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-65.reverse-video { - background-color: #5f875f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-66 { - background-color: #5f8787; -} -/* line 100, ../sass/main.sass */ -.bg-color-66.reverse-video { - color: #5f8787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-66 { - color: #5f8787; - text-shadow: 0 0 6px rgba(95, 135, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-66.reverse-video { - background-color: #5f8787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-67 { - background-color: #5f87af; -} -/* line 100, ../sass/main.sass */ -.bg-color-67.reverse-video { - color: #5f87af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-67 { - color: #5f87af; - text-shadow: 0 0 6px rgba(95, 135, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-67.reverse-video { - background-color: #5f87af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-68 { - background-color: #5f87d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-68.reverse-video { - color: #5f87d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-68 { - color: #5f87d7; - text-shadow: 0 0 6px rgba(95, 135, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-68.reverse-video { - background-color: #5f87d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-69 { - background-color: #5f87ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-69.reverse-video { - color: #5f87ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-69 { - color: #5f87ff; - text-shadow: 0 0 6px rgba(95, 135, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-69.reverse-video { - background-color: #5f87ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-70 { - background-color: #5faf00; -} -/* line 100, ../sass/main.sass */ -.bg-color-70.reverse-video { - color: #5faf00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-70 { - color: #5faf00; - text-shadow: 0 0 6px rgba(95, 175, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-70.reverse-video { - background-color: #5faf00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-71 { - background-color: #5faf5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-71.reverse-video { - color: #5faf5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-71 { - color: #5faf5f; - text-shadow: 0 0 6px rgba(95, 175, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-71.reverse-video { - background-color: #5faf5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-72 { - background-color: #5faf87; -} -/* line 100, ../sass/main.sass */ -.bg-color-72.reverse-video { - color: #5faf87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-72 { - color: #5faf87; - text-shadow: 0 0 6px rgba(95, 175, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-72.reverse-video { - background-color: #5faf87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-73 { - background-color: #5fafaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-73.reverse-video { - color: #5fafaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-73 { - color: #5fafaf; - text-shadow: 0 0 6px rgba(95, 175, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-73.reverse-video { - background-color: #5fafaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-74 { - background-color: #5fafd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-74.reverse-video { - color: #5fafd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-74 { - color: #5fafd7; - text-shadow: 0 0 6px rgba(95, 175, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-74.reverse-video { - background-color: #5fafd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-75 { - background-color: #5fafff; -} -/* line 100, ../sass/main.sass */ -.bg-color-75.reverse-video { - color: #5fafff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-75 { - color: #5fafff; - text-shadow: 0 0 6px rgba(95, 175, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-75.reverse-video { - background-color: #5fafff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-76 { - background-color: #5fd700; -} -/* line 100, ../sass/main.sass */ -.bg-color-76.reverse-video { - color: #5fd700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-76 { - color: #5fd700; - text-shadow: 0 0 6px rgba(95, 215, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-76.reverse-video { - background-color: #5fd700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-77 { - background-color: #5fd75f; -} -/* line 100, ../sass/main.sass */ -.bg-color-77.reverse-video { - color: #5fd75f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-77 { - color: #5fd75f; - text-shadow: 0 0 6px rgba(95, 215, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-77.reverse-video { - background-color: #5fd75f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-78 { - background-color: #5fd787; -} -/* line 100, ../sass/main.sass */ -.bg-color-78.reverse-video { - color: #5fd787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-78 { - color: #5fd787; - text-shadow: 0 0 6px rgba(95, 215, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-78.reverse-video { - background-color: #5fd787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-79 { - background-color: #5fd7af; -} -/* line 100, ../sass/main.sass */ -.bg-color-79.reverse-video { - color: #5fd7af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-79 { - color: #5fd7af; - text-shadow: 0 0 6px rgba(95, 215, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-79.reverse-video { - background-color: #5fd7af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-80 { - background-color: #5fd7d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-80.reverse-video { - color: #5fd7d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-80 { - color: #5fd7d7; - text-shadow: 0 0 6px rgba(95, 215, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-80.reverse-video { - background-color: #5fd7d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-81 { - background-color: #5fd7ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-81.reverse-video { - color: #5fd7ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-81 { - color: #5fd7ff; - text-shadow: 0 0 6px rgba(95, 215, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-81.reverse-video { - background-color: #5fd7ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-82 { - background-color: #5fff00; -} -/* line 100, ../sass/main.sass */ -.bg-color-82.reverse-video { - color: #5fff00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-82 { - color: #5fff00; - text-shadow: 0 0 6px rgba(95, 255, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-82.reverse-video { - background-color: #5fff00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-83 { - background-color: #5fff5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-83.reverse-video { - color: #5fff5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-83 { - color: #5fff5f; - text-shadow: 0 0 6px rgba(95, 255, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-83.reverse-video { - background-color: #5fff5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-84 { - background-color: #5fff87; -} -/* line 100, ../sass/main.sass */ -.bg-color-84.reverse-video { - color: #5fff87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-84 { - color: #5fff87; - text-shadow: 0 0 6px rgba(95, 255, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-84.reverse-video { - background-color: #5fff87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-85 { - background-color: #5fffaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-85.reverse-video { - color: #5fffaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-85 { - color: #5fffaf; - text-shadow: 0 0 6px rgba(95, 255, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-85.reverse-video { - background-color: #5fffaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-86 { - background-color: #5fffd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-86.reverse-video { - color: #5fffd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-86 { - color: #5fffd7; - text-shadow: 0 0 6px rgba(95, 255, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-86.reverse-video { - background-color: #5fffd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-87 { - background-color: #5fffff; -} -/* line 100, ../sass/main.sass */ -.bg-color-87.reverse-video { - color: #5fffff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-87 { - color: #5fffff; - text-shadow: 0 0 6px rgba(95, 255, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-87.reverse-video { - background-color: #5fffff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-88 { - background-color: #870000; -} -/* line 100, ../sass/main.sass */ -.bg-color-88.reverse-video { - color: #870000 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-88 { - color: #870000; - text-shadow: 0 0 6px rgba(135, 0, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-88.reverse-video { - background-color: #870000 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-89 { - background-color: #87005f; -} -/* line 100, ../sass/main.sass */ -.bg-color-89.reverse-video { - color: #87005f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-89 { - color: #87005f; - text-shadow: 0 0 6px rgba(135, 0, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-89.reverse-video { - background-color: #87005f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-90 { - background-color: #870087; -} -/* line 100, ../sass/main.sass */ -.bg-color-90.reverse-video { - color: #870087 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-90 { - color: #870087; - text-shadow: 0 0 6px rgba(135, 0, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-90.reverse-video { - background-color: #870087 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-91 { - background-color: #8700af; -} -/* line 100, ../sass/main.sass */ -.bg-color-91.reverse-video { - color: #8700af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-91 { - color: #8700af; - text-shadow: 0 0 6px rgba(135, 0, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-91.reverse-video { - background-color: #8700af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-92 { - background-color: #8700d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-92.reverse-video { - color: #8700d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-92 { - color: #8700d7; - text-shadow: 0 0 6px rgba(135, 0, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-92.reverse-video { - background-color: #8700d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-93 { - background-color: #8700ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-93.reverse-video { - color: #8700ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-93 { - color: #8700ff; - text-shadow: 0 0 6px rgba(135, 0, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-93.reverse-video { - background-color: #8700ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-94 { - background-color: #875f00; -} -/* line 100, ../sass/main.sass */ -.bg-color-94.reverse-video { - color: #875f00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-94 { - color: #875f00; - text-shadow: 0 0 6px rgba(135, 95, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-94.reverse-video { - background-color: #875f00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-95 { - background-color: #875f5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-95.reverse-video { - color: #875f5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-95 { - color: #875f5f; - text-shadow: 0 0 6px rgba(135, 95, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-95.reverse-video { - background-color: #875f5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-96 { - background-color: #875f87; -} -/* line 100, ../sass/main.sass */ -.bg-color-96.reverse-video { - color: #875f87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-96 { - color: #875f87; - text-shadow: 0 0 6px rgba(135, 95, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-96.reverse-video { - background-color: #875f87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-97 { - background-color: #875faf; -} -/* line 100, ../sass/main.sass */ -.bg-color-97.reverse-video { - color: #875faf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-97 { - color: #875faf; - text-shadow: 0 0 6px rgba(135, 95, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-97.reverse-video { - background-color: #875faf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-98 { - background-color: #875fd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-98.reverse-video { - color: #875fd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-98 { - color: #875fd7; - text-shadow: 0 0 6px rgba(135, 95, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-98.reverse-video { - background-color: #875fd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-99 { - background-color: #875fff; -} -/* line 100, ../sass/main.sass */ -.bg-color-99.reverse-video { - color: #875fff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-99 { - color: #875fff; - text-shadow: 0 0 6px rgba(135, 95, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-99.reverse-video { - background-color: #875fff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-100 { - background-color: #878700; -} -/* line 100, ../sass/main.sass */ -.bg-color-100.reverse-video { - color: #878700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-100 { - color: #878700; - text-shadow: 0 0 6px rgba(135, 135, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-100.reverse-video { - background-color: #878700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-101 { - background-color: #87875f; -} -/* line 100, ../sass/main.sass */ -.bg-color-101.reverse-video { - color: #87875f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-101 { - color: #87875f; - text-shadow: 0 0 6px rgba(135, 135, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-101.reverse-video { - background-color: #87875f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-102 { - background-color: #878787; -} -/* line 100, ../sass/main.sass */ -.bg-color-102.reverse-video { - color: #878787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-102 { - color: #878787; - text-shadow: 0 0 6px rgba(135, 135, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-102.reverse-video { - background-color: #878787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-103 { - background-color: #8787af; -} -/* line 100, ../sass/main.sass */ -.bg-color-103.reverse-video { - color: #8787af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-103 { - color: #8787af; - text-shadow: 0 0 6px rgba(135, 135, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-103.reverse-video { - background-color: #8787af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-104 { - background-color: #8787d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-104.reverse-video { - color: #8787d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-104 { - color: #8787d7; - text-shadow: 0 0 6px rgba(135, 135, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-104.reverse-video { - background-color: #8787d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-105 { - background-color: #8787ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-105.reverse-video { - color: #8787ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-105 { - color: #8787ff; - text-shadow: 0 0 6px rgba(135, 135, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-105.reverse-video { - background-color: #8787ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-106 { - background-color: #87af00; -} -/* line 100, ../sass/main.sass */ -.bg-color-106.reverse-video { - color: #87af00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-106 { - color: #87af00; - text-shadow: 0 0 6px rgba(135, 175, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-106.reverse-video { - background-color: #87af00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-107 { - background-color: #87af5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-107.reverse-video { - color: #87af5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-107 { - color: #87af5f; - text-shadow: 0 0 6px rgba(135, 175, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-107.reverse-video { - background-color: #87af5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-108 { - background-color: #87af87; -} -/* line 100, ../sass/main.sass */ -.bg-color-108.reverse-video { - color: #87af87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-108 { - color: #87af87; - text-shadow: 0 0 6px rgba(135, 175, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-108.reverse-video { - background-color: #87af87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-109 { - background-color: #87afaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-109.reverse-video { - color: #87afaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-109 { - color: #87afaf; - text-shadow: 0 0 6px rgba(135, 175, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-109.reverse-video { - background-color: #87afaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-110 { - background-color: #87afd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-110.reverse-video { - color: #87afd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-110 { - color: #87afd7; - text-shadow: 0 0 6px rgba(135, 175, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-110.reverse-video { - background-color: #87afd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-111 { - background-color: #87afff; -} -/* line 100, ../sass/main.sass */ -.bg-color-111.reverse-video { - color: #87afff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-111 { - color: #87afff; - text-shadow: 0 0 6px rgba(135, 175, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-111.reverse-video { - background-color: #87afff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-112 { - background-color: #87d700; -} -/* line 100, ../sass/main.sass */ -.bg-color-112.reverse-video { - color: #87d700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-112 { - color: #87d700; - text-shadow: 0 0 6px rgba(135, 215, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-112.reverse-video { - background-color: #87d700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-113 { - background-color: #87d75f; -} -/* line 100, ../sass/main.sass */ -.bg-color-113.reverse-video { - color: #87d75f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-113 { - color: #87d75f; - text-shadow: 0 0 6px rgba(135, 215, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-113.reverse-video { - background-color: #87d75f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-114 { - background-color: #87d787; -} -/* line 100, ../sass/main.sass */ -.bg-color-114.reverse-video { - color: #87d787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-114 { - color: #87d787; - text-shadow: 0 0 6px rgba(135, 215, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-114.reverse-video { - background-color: #87d787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-115 { - background-color: #87d7af; -} -/* line 100, ../sass/main.sass */ -.bg-color-115.reverse-video { - color: #87d7af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-115 { - color: #87d7af; - text-shadow: 0 0 6px rgba(135, 215, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-115.reverse-video { - background-color: #87d7af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-116 { - background-color: #87d7d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-116.reverse-video { - color: #87d7d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-116 { - color: #87d7d7; - text-shadow: 0 0 6px rgba(135, 215, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-116.reverse-video { - background-color: #87d7d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-117 { - background-color: #87d7ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-117.reverse-video { - color: #87d7ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-117 { - color: #87d7ff; - text-shadow: 0 0 6px rgba(135, 215, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-117.reverse-video { - background-color: #87d7ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-118 { - background-color: #87ff00; -} -/* line 100, ../sass/main.sass */ -.bg-color-118.reverse-video { - color: #87ff00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-118 { - color: #87ff00; - text-shadow: 0 0 6px rgba(135, 255, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-118.reverse-video { - background-color: #87ff00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-119 { - background-color: #87ff5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-119.reverse-video { - color: #87ff5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-119 { - color: #87ff5f; - text-shadow: 0 0 6px rgba(135, 255, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-119.reverse-video { - background-color: #87ff5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-120 { - background-color: #87ff87; -} -/* line 100, ../sass/main.sass */ -.bg-color-120.reverse-video { - color: #87ff87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-120 { - color: #87ff87; - text-shadow: 0 0 6px rgba(135, 255, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-120.reverse-video { - background-color: #87ff87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-121 { - background-color: #87ffaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-121.reverse-video { - color: #87ffaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-121 { - color: #87ffaf; - text-shadow: 0 0 6px rgba(135, 255, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-121.reverse-video { - background-color: #87ffaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-122 { - background-color: #87ffd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-122.reverse-video { - color: #87ffd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-122 { - color: #87ffd7; - text-shadow: 0 0 6px rgba(135, 255, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-122.reverse-video { - background-color: #87ffd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-123 { - background-color: #87ffff; -} -/* line 100, ../sass/main.sass */ -.bg-color-123.reverse-video { - color: #87ffff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-123 { - color: #87ffff; - text-shadow: 0 0 6px rgba(135, 255, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-123.reverse-video { - background-color: #87ffff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-124 { - background-color: #af0000; -} -/* line 100, ../sass/main.sass */ -.bg-color-124.reverse-video { - color: #af0000 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-124 { - color: #af0000; - text-shadow: 0 0 6px rgba(175, 0, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-124.reverse-video { - background-color: #af0000 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-125 { - background-color: #af005f; -} -/* line 100, ../sass/main.sass */ -.bg-color-125.reverse-video { - color: #af005f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-125 { - color: #af005f; - text-shadow: 0 0 6px rgba(175, 0, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-125.reverse-video { - background-color: #af005f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-126 { - background-color: #af0087; -} -/* line 100, ../sass/main.sass */ -.bg-color-126.reverse-video { - color: #af0087 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-126 { - color: #af0087; - text-shadow: 0 0 6px rgba(175, 0, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-126.reverse-video { - background-color: #af0087 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-127 { - background-color: #af00af; -} -/* line 100, ../sass/main.sass */ -.bg-color-127.reverse-video { - color: #af00af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-127 { - color: #af00af; - text-shadow: 0 0 6px rgba(175, 0, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-127.reverse-video { - background-color: #af00af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-128 { - background-color: #af00d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-128.reverse-video { - color: #af00d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-128 { - color: #af00d7; - text-shadow: 0 0 6px rgba(175, 0, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-128.reverse-video { - background-color: #af00d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-129 { - background-color: #af00ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-129.reverse-video { - color: #af00ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-129 { - color: #af00ff; - text-shadow: 0 0 6px rgba(175, 0, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-129.reverse-video { - background-color: #af00ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-130 { - background-color: #af5f00; -} -/* line 100, ../sass/main.sass */ -.bg-color-130.reverse-video { - color: #af5f00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-130 { - color: #af5f00; - text-shadow: 0 0 6px rgba(175, 95, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-130.reverse-video { - background-color: #af5f00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-131 { - background-color: #af5f5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-131.reverse-video { - color: #af5f5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-131 { - color: #af5f5f; - text-shadow: 0 0 6px rgba(175, 95, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-131.reverse-video { - background-color: #af5f5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-132 { - background-color: #af5f87; -} -/* line 100, ../sass/main.sass */ -.bg-color-132.reverse-video { - color: #af5f87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-132 { - color: #af5f87; - text-shadow: 0 0 6px rgba(175, 95, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-132.reverse-video { - background-color: #af5f87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-133 { - background-color: #af5faf; -} -/* line 100, ../sass/main.sass */ -.bg-color-133.reverse-video { - color: #af5faf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-133 { - color: #af5faf; - text-shadow: 0 0 6px rgba(175, 95, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-133.reverse-video { - background-color: #af5faf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-134 { - background-color: #af5fd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-134.reverse-video { - color: #af5fd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-134 { - color: #af5fd7; - text-shadow: 0 0 6px rgba(175, 95, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-134.reverse-video { - background-color: #af5fd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-135 { - background-color: #af5fff; -} -/* line 100, ../sass/main.sass */ -.bg-color-135.reverse-video { - color: #af5fff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-135 { - color: #af5fff; - text-shadow: 0 0 6px rgba(175, 95, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-135.reverse-video { - background-color: #af5fff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-136 { - background-color: #af8700; -} -/* line 100, ../sass/main.sass */ -.bg-color-136.reverse-video { - color: #af8700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-136 { - color: #af8700; - text-shadow: 0 0 6px rgba(175, 135, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-136.reverse-video { - background-color: #af8700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-137 { - background-color: #af875f; -} -/* line 100, ../sass/main.sass */ -.bg-color-137.reverse-video { - color: #af875f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-137 { - color: #af875f; - text-shadow: 0 0 6px rgba(175, 135, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-137.reverse-video { - background-color: #af875f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-138 { - background-color: #af8787; -} -/* line 100, ../sass/main.sass */ -.bg-color-138.reverse-video { - color: #af8787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-138 { - color: #af8787; - text-shadow: 0 0 6px rgba(175, 135, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-138.reverse-video { - background-color: #af8787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-139 { - background-color: #af87af; -} -/* line 100, ../sass/main.sass */ -.bg-color-139.reverse-video { - color: #af87af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-139 { - color: #af87af; - text-shadow: 0 0 6px rgba(175, 135, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-139.reverse-video { - background-color: #af87af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-140 { - background-color: #af87d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-140.reverse-video { - color: #af87d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-140 { - color: #af87d7; - text-shadow: 0 0 6px rgba(175, 135, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-140.reverse-video { - background-color: #af87d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-141 { - background-color: #af87ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-141.reverse-video { - color: #af87ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-141 { - color: #af87ff; - text-shadow: 0 0 6px rgba(175, 135, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-141.reverse-video { - background-color: #af87ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-142 { - background-color: #afaf00; -} -/* line 100, ../sass/main.sass */ -.bg-color-142.reverse-video { - color: #afaf00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-142 { - color: #afaf00; - text-shadow: 0 0 6px rgba(175, 175, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-142.reverse-video { - background-color: #afaf00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-143 { - background-color: #afaf5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-143.reverse-video { - color: #afaf5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-143 { - color: #afaf5f; - text-shadow: 0 0 6px rgba(175, 175, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-143.reverse-video { - background-color: #afaf5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-144 { - background-color: #afaf87; -} -/* line 100, ../sass/main.sass */ -.bg-color-144.reverse-video { - color: #afaf87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-144 { - color: #afaf87; - text-shadow: 0 0 6px rgba(175, 175, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-144.reverse-video { - background-color: #afaf87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-145 { - background-color: #afafaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-145.reverse-video { - color: #afafaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-145 { - color: #afafaf; - text-shadow: 0 0 6px rgba(175, 175, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-145.reverse-video { - background-color: #afafaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-146 { - background-color: #afafd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-146.reverse-video { - color: #afafd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-146 { - color: #afafd7; - text-shadow: 0 0 6px rgba(175, 175, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-146.reverse-video { - background-color: #afafd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-147 { - background-color: #afafff; -} -/* line 100, ../sass/main.sass */ -.bg-color-147.reverse-video { - color: #afafff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-147 { - color: #afafff; - text-shadow: 0 0 6px rgba(175, 175, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-147.reverse-video { - background-color: #afafff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-148 { - background-color: #afd700; -} -/* line 100, ../sass/main.sass */ -.bg-color-148.reverse-video { - color: #afd700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-148 { - color: #afd700; - text-shadow: 0 0 6px rgba(175, 215, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-148.reverse-video { - background-color: #afd700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-149 { - background-color: #afd75f; -} -/* line 100, ../sass/main.sass */ -.bg-color-149.reverse-video { - color: #afd75f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-149 { - color: #afd75f; - text-shadow: 0 0 6px rgba(175, 215, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-149.reverse-video { - background-color: #afd75f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-150 { - background-color: #afd787; -} -/* line 100, ../sass/main.sass */ -.bg-color-150.reverse-video { - color: #afd787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-150 { - color: #afd787; - text-shadow: 0 0 6px rgba(175, 215, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-150.reverse-video { - background-color: #afd787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-151 { - background-color: #afd7af; -} -/* line 100, ../sass/main.sass */ -.bg-color-151.reverse-video { - color: #afd7af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-151 { - color: #afd7af; - text-shadow: 0 0 6px rgba(175, 215, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-151.reverse-video { - background-color: #afd7af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-152 { - background-color: #afd7d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-152.reverse-video { - color: #afd7d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-152 { - color: #afd7d7; - text-shadow: 0 0 6px rgba(175, 215, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-152.reverse-video { - background-color: #afd7d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-153 { - background-color: #afd7ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-153.reverse-video { - color: #afd7ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-153 { - color: #afd7ff; - text-shadow: 0 0 6px rgba(175, 215, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-153.reverse-video { - background-color: #afd7ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-154 { - background-color: #afff00; -} -/* line 100, ../sass/main.sass */ -.bg-color-154.reverse-video { - color: #afff00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-154 { - color: #afff00; - text-shadow: 0 0 6px rgba(175, 255, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-154.reverse-video { - background-color: #afff00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-155 { - background-color: #afff5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-155.reverse-video { - color: #afff5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-155 { - color: #afff5f; - text-shadow: 0 0 6px rgba(175, 255, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-155.reverse-video { - background-color: #afff5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-156 { - background-color: #afff87; -} -/* line 100, ../sass/main.sass */ -.bg-color-156.reverse-video { - color: #afff87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-156 { - color: #afff87; - text-shadow: 0 0 6px rgba(175, 255, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-156.reverse-video { - background-color: #afff87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-157 { - background-color: #afffaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-157.reverse-video { - color: #afffaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-157 { - color: #afffaf; - text-shadow: 0 0 6px rgba(175, 255, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-157.reverse-video { - background-color: #afffaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-158 { - background-color: #afffd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-158.reverse-video { - color: #afffd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-158 { - color: #afffd7; - text-shadow: 0 0 6px rgba(175, 255, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-158.reverse-video { - background-color: #afffd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-159 { - background-color: #afffff; -} -/* line 100, ../sass/main.sass */ -.bg-color-159.reverse-video { - color: #afffff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-159 { - color: #afffff; - text-shadow: 0 0 6px rgba(175, 255, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-159.reverse-video { - background-color: #afffff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-160 { - background-color: #d70000; -} -/* line 100, ../sass/main.sass */ -.bg-color-160.reverse-video { - color: #d70000 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-160 { - color: #d70000; - text-shadow: 0 0 6px rgba(215, 0, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-160.reverse-video { - background-color: #d70000 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-161 { - background-color: #d7005f; -} -/* line 100, ../sass/main.sass */ -.bg-color-161.reverse-video { - color: #d7005f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-161 { - color: #d7005f; - text-shadow: 0 0 6px rgba(215, 0, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-161.reverse-video { - background-color: #d7005f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-162 { - background-color: #d70087; -} -/* line 100, ../sass/main.sass */ -.bg-color-162.reverse-video { - color: #d70087 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-162 { - color: #d70087; - text-shadow: 0 0 6px rgba(215, 0, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-162.reverse-video { - background-color: #d70087 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-163 { - background-color: #d700af; -} -/* line 100, ../sass/main.sass */ -.bg-color-163.reverse-video { - color: #d700af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-163 { - color: #d700af; - text-shadow: 0 0 6px rgba(215, 0, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-163.reverse-video { - background-color: #d700af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-164 { - background-color: #d700d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-164.reverse-video { - color: #d700d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-164 { - color: #d700d7; - text-shadow: 0 0 6px rgba(215, 0, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-164.reverse-video { - background-color: #d700d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-165 { - background-color: #d700ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-165.reverse-video { - color: #d700ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-165 { - color: #d700ff; - text-shadow: 0 0 6px rgba(215, 0, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-165.reverse-video { - background-color: #d700ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-166 { - background-color: #d75f00; -} -/* line 100, ../sass/main.sass */ -.bg-color-166.reverse-video { - color: #d75f00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-166 { - color: #d75f00; - text-shadow: 0 0 6px rgba(215, 95, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-166.reverse-video { - background-color: #d75f00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-167 { - background-color: #d75f5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-167.reverse-video { - color: #d75f5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-167 { - color: #d75f5f; - text-shadow: 0 0 6px rgba(215, 95, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-167.reverse-video { - background-color: #d75f5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-168 { - background-color: #d75f87; -} -/* line 100, ../sass/main.sass */ -.bg-color-168.reverse-video { - color: #d75f87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-168 { - color: #d75f87; - text-shadow: 0 0 6px rgba(215, 95, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-168.reverse-video { - background-color: #d75f87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-169 { - background-color: #d75faf; -} -/* line 100, ../sass/main.sass */ -.bg-color-169.reverse-video { - color: #d75faf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-169 { - color: #d75faf; - text-shadow: 0 0 6px rgba(215, 95, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-169.reverse-video { - background-color: #d75faf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-170 { - background-color: #d75fd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-170.reverse-video { - color: #d75fd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-170 { - color: #d75fd7; - text-shadow: 0 0 6px rgba(215, 95, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-170.reverse-video { - background-color: #d75fd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-171 { - background-color: #d75fff; -} -/* line 100, ../sass/main.sass */ -.bg-color-171.reverse-video { - color: #d75fff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-171 { - color: #d75fff; - text-shadow: 0 0 6px rgba(215, 95, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-171.reverse-video { - background-color: #d75fff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-172 { - background-color: #d78700; -} -/* line 100, ../sass/main.sass */ -.bg-color-172.reverse-video { - color: #d78700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-172 { - color: #d78700; - text-shadow: 0 0 6px rgba(215, 135, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-172.reverse-video { - background-color: #d78700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-173 { - background-color: #d7875f; -} -/* line 100, ../sass/main.sass */ -.bg-color-173.reverse-video { - color: #d7875f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-173 { - color: #d7875f; - text-shadow: 0 0 6px rgba(215, 135, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-173.reverse-video { - background-color: #d7875f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-174 { - background-color: #d78787; -} -/* line 100, ../sass/main.sass */ -.bg-color-174.reverse-video { - color: #d78787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-174 { - color: #d78787; - text-shadow: 0 0 6px rgba(215, 135, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-174.reverse-video { - background-color: #d78787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-175 { - background-color: #d787af; -} -/* line 100, ../sass/main.sass */ -.bg-color-175.reverse-video { - color: #d787af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-175 { - color: #d787af; - text-shadow: 0 0 6px rgba(215, 135, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-175.reverse-video { - background-color: #d787af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-176 { - background-color: #d787d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-176.reverse-video { - color: #d787d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-176 { - color: #d787d7; - text-shadow: 0 0 6px rgba(215, 135, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-176.reverse-video { - background-color: #d787d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-177 { - background-color: #d787ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-177.reverse-video { - color: #d787ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-177 { - color: #d787ff; - text-shadow: 0 0 6px rgba(215, 135, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-177.reverse-video { - background-color: #d787ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-178 { - background-color: #d7af00; -} -/* line 100, ../sass/main.sass */ -.bg-color-178.reverse-video { - color: #d7af00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-178 { - color: #d7af00; - text-shadow: 0 0 6px rgba(215, 175, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-178.reverse-video { - background-color: #d7af00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-179 { - background-color: #d7af5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-179.reverse-video { - color: #d7af5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-179 { - color: #d7af5f; - text-shadow: 0 0 6px rgba(215, 175, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-179.reverse-video { - background-color: #d7af5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-180 { - background-color: #d7af87; -} -/* line 100, ../sass/main.sass */ -.bg-color-180.reverse-video { - color: #d7af87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-180 { - color: #d7af87; - text-shadow: 0 0 6px rgba(215, 175, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-180.reverse-video { - background-color: #d7af87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-181 { - background-color: #d7afaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-181.reverse-video { - color: #d7afaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-181 { - color: #d7afaf; - text-shadow: 0 0 6px rgba(215, 175, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-181.reverse-video { - background-color: #d7afaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-182 { - background-color: #d7afd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-182.reverse-video { - color: #d7afd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-182 { - color: #d7afd7; - text-shadow: 0 0 6px rgba(215, 175, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-182.reverse-video { - background-color: #d7afd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-183 { - background-color: #d7afff; -} -/* line 100, ../sass/main.sass */ -.bg-color-183.reverse-video { - color: #d7afff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-183 { - color: #d7afff; - text-shadow: 0 0 6px rgba(215, 175, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-183.reverse-video { - background-color: #d7afff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-184 { - background-color: #d7d700; -} -/* line 100, ../sass/main.sass */ -.bg-color-184.reverse-video { - color: #d7d700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-184 { - color: #d7d700; - text-shadow: 0 0 6px rgba(215, 215, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-184.reverse-video { - background-color: #d7d700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-185 { - background-color: #d7d75f; -} -/* line 100, ../sass/main.sass */ -.bg-color-185.reverse-video { - color: #d7d75f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-185 { - color: #d7d75f; - text-shadow: 0 0 6px rgba(215, 215, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-185.reverse-video { - background-color: #d7d75f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-186 { - background-color: #d7d787; -} -/* line 100, ../sass/main.sass */ -.bg-color-186.reverse-video { - color: #d7d787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-186 { - color: #d7d787; - text-shadow: 0 0 6px rgba(215, 215, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-186.reverse-video { - background-color: #d7d787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-187 { - background-color: #d7d7af; -} -/* line 100, ../sass/main.sass */ -.bg-color-187.reverse-video { - color: #d7d7af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-187 { - color: #d7d7af; - text-shadow: 0 0 6px rgba(215, 215, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-187.reverse-video { - background-color: #d7d7af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-188 { - background-color: #d7d7d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-188.reverse-video { - color: #d7d7d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-188 { - color: #d7d7d7; - text-shadow: 0 0 6px rgba(215, 215, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-188.reverse-video { - background-color: #d7d7d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-189 { - background-color: #d7d7ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-189.reverse-video { - color: #d7d7ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-189 { - color: #d7d7ff; - text-shadow: 0 0 6px rgba(215, 215, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-189.reverse-video { - background-color: #d7d7ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-190 { - background-color: #d7ff00; -} -/* line 100, ../sass/main.sass */ -.bg-color-190.reverse-video { - color: #d7ff00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-190 { - color: #d7ff00; - text-shadow: 0 0 6px rgba(215, 255, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-190.reverse-video { - background-color: #d7ff00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-191 { - background-color: #d7ff5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-191.reverse-video { - color: #d7ff5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-191 { - color: #d7ff5f; - text-shadow: 0 0 6px rgba(215, 255, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-191.reverse-video { - background-color: #d7ff5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-192 { - background-color: #d7ff87; -} -/* line 100, ../sass/main.sass */ -.bg-color-192.reverse-video { - color: #d7ff87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-192 { - color: #d7ff87; - text-shadow: 0 0 6px rgba(215, 255, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-192.reverse-video { - background-color: #d7ff87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-193 { - background-color: #d7ffaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-193.reverse-video { - color: #d7ffaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-193 { - color: #d7ffaf; - text-shadow: 0 0 6px rgba(215, 255, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-193.reverse-video { - background-color: #d7ffaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-194 { - background-color: #d7ffd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-194.reverse-video { - color: #d7ffd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-194 { - color: #d7ffd7; - text-shadow: 0 0 6px rgba(215, 255, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-194.reverse-video { - background-color: #d7ffd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-195 { - background-color: #d7ffff; -} -/* line 100, ../sass/main.sass */ -.bg-color-195.reverse-video { - color: #d7ffff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-195 { - color: #d7ffff; - text-shadow: 0 0 6px rgba(215, 255, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-195.reverse-video { - background-color: #d7ffff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-196 { - background-color: red; -} -/* line 100, ../sass/main.sass */ -.bg-color-196.reverse-video { - color: red !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-196 { - color: red; - text-shadow: 0 0 6px rgba(255, 0, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-196.reverse-video { - background-color: red !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-197 { - background-color: #ff005f; -} -/* line 100, ../sass/main.sass */ -.bg-color-197.reverse-video { - color: #ff005f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-197 { - color: #ff005f; - text-shadow: 0 0 6px rgba(255, 0, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-197.reverse-video { - background-color: #ff005f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-198 { - background-color: #ff0087; -} -/* line 100, ../sass/main.sass */ -.bg-color-198.reverse-video { - color: #ff0087 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-198 { - color: #ff0087; - text-shadow: 0 0 6px rgba(255, 0, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-198.reverse-video { - background-color: #ff0087 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-199 { - background-color: #ff00af; -} -/* line 100, ../sass/main.sass */ -.bg-color-199.reverse-video { - color: #ff00af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-199 { - color: #ff00af; - text-shadow: 0 0 6px rgba(255, 0, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-199.reverse-video { - background-color: #ff00af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-200 { - background-color: #ff00d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-200.reverse-video { - color: #ff00d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-200 { - color: #ff00d7; - text-shadow: 0 0 6px rgba(255, 0, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-200.reverse-video { - background-color: #ff00d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-201 { - background-color: magenta; -} -/* line 100, ../sass/main.sass */ -.bg-color-201.reverse-video { - color: magenta !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-201 { - color: magenta; - text-shadow: 0 0 6px rgba(255, 0, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-201.reverse-video { - background-color: magenta !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-202 { - background-color: #ff5f00; -} -/* line 100, ../sass/main.sass */ -.bg-color-202.reverse-video { - color: #ff5f00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-202 { - color: #ff5f00; - text-shadow: 0 0 6px rgba(255, 95, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-202.reverse-video { - background-color: #ff5f00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-203 { - background-color: #ff5f5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-203.reverse-video { - color: #ff5f5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-203 { - color: #ff5f5f; - text-shadow: 0 0 6px rgba(255, 95, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-203.reverse-video { - background-color: #ff5f5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-204 { - background-color: #ff5f87; -} -/* line 100, ../sass/main.sass */ -.bg-color-204.reverse-video { - color: #ff5f87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-204 { - color: #ff5f87; - text-shadow: 0 0 6px rgba(255, 95, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-204.reverse-video { - background-color: #ff5f87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-205 { - background-color: #ff5faf; -} -/* line 100, ../sass/main.sass */ -.bg-color-205.reverse-video { - color: #ff5faf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-205 { - color: #ff5faf; - text-shadow: 0 0 6px rgba(255, 95, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-205.reverse-video { - background-color: #ff5faf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-206 { - background-color: #ff5fd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-206.reverse-video { - color: #ff5fd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-206 { - color: #ff5fd7; - text-shadow: 0 0 6px rgba(255, 95, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-206.reverse-video { - background-color: #ff5fd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-207 { - background-color: #ff5fff; -} -/* line 100, ../sass/main.sass */ -.bg-color-207.reverse-video { - color: #ff5fff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-207 { - color: #ff5fff; - text-shadow: 0 0 6px rgba(255, 95, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-207.reverse-video { - background-color: #ff5fff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-208 { - background-color: #ff8700; -} -/* line 100, ../sass/main.sass */ -.bg-color-208.reverse-video { - color: #ff8700 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-208 { - color: #ff8700; - text-shadow: 0 0 6px rgba(255, 135, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-208.reverse-video { - background-color: #ff8700 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-209 { - background-color: #ff875f; -} -/* line 100, ../sass/main.sass */ -.bg-color-209.reverse-video { - color: #ff875f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-209 { - color: #ff875f; - text-shadow: 0 0 6px rgba(255, 135, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-209.reverse-video { - background-color: #ff875f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-210 { - background-color: #ff8787; -} -/* line 100, ../sass/main.sass */ -.bg-color-210.reverse-video { - color: #ff8787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-210 { - color: #ff8787; - text-shadow: 0 0 6px rgba(255, 135, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-210.reverse-video { - background-color: #ff8787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-211 { - background-color: #ff87af; -} -/* line 100, ../sass/main.sass */ -.bg-color-211.reverse-video { - color: #ff87af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-211 { - color: #ff87af; - text-shadow: 0 0 6px rgba(255, 135, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-211.reverse-video { - background-color: #ff87af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-212 { - background-color: #ff87d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-212.reverse-video { - color: #ff87d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-212 { - color: #ff87d7; - text-shadow: 0 0 6px rgba(255, 135, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-212.reverse-video { - background-color: #ff87d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-213 { - background-color: #ff87ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-213.reverse-video { - color: #ff87ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-213 { - color: #ff87ff; - text-shadow: 0 0 6px rgba(255, 135, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-213.reverse-video { - background-color: #ff87ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-214 { - background-color: #ffaf00; -} -/* line 100, ../sass/main.sass */ -.bg-color-214.reverse-video { - color: #ffaf00 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-214 { - color: #ffaf00; - text-shadow: 0 0 6px rgba(255, 175, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-214.reverse-video { - background-color: #ffaf00 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-215 { - background-color: #ffaf5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-215.reverse-video { - color: #ffaf5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-215 { - color: #ffaf5f; - text-shadow: 0 0 6px rgba(255, 175, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-215.reverse-video { - background-color: #ffaf5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-216 { - background-color: #ffaf87; -} -/* line 100, ../sass/main.sass */ -.bg-color-216.reverse-video { - color: #ffaf87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-216 { - color: #ffaf87; - text-shadow: 0 0 6px rgba(255, 175, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-216.reverse-video { - background-color: #ffaf87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-217 { - background-color: #ffafaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-217.reverse-video { - color: #ffafaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-217 { - color: #ffafaf; - text-shadow: 0 0 6px rgba(255, 175, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-217.reverse-video { - background-color: #ffafaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-218 { - background-color: #ffafd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-218.reverse-video { - color: #ffafd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-218 { - color: #ffafd7; - text-shadow: 0 0 6px rgba(255, 175, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-218.reverse-video { - background-color: #ffafd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-219 { - background-color: #ffafff; -} -/* line 100, ../sass/main.sass */ -.bg-color-219.reverse-video { - color: #ffafff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-219 { - color: #ffafff; - text-shadow: 0 0 6px rgba(255, 175, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-219.reverse-video { - background-color: #ffafff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-220 { - background-color: gold; -} -/* line 100, ../sass/main.sass */ -.bg-color-220.reverse-video { - color: gold !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-220 { - color: gold; - text-shadow: 0 0 6px rgba(255, 215, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-220.reverse-video { - background-color: gold !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-221 { - background-color: #ffd75f; -} -/* line 100, ../sass/main.sass */ -.bg-color-221.reverse-video { - color: #ffd75f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-221 { - color: #ffd75f; - text-shadow: 0 0 6px rgba(255, 215, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-221.reverse-video { - background-color: #ffd75f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-222 { - background-color: #ffd787; -} -/* line 100, ../sass/main.sass */ -.bg-color-222.reverse-video { - color: #ffd787 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-222 { - color: #ffd787; - text-shadow: 0 0 6px rgba(255, 215, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-222.reverse-video { - background-color: #ffd787 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-223 { - background-color: #ffd7af; -} -/* line 100, ../sass/main.sass */ -.bg-color-223.reverse-video { - color: #ffd7af !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-223 { - color: #ffd7af; - text-shadow: 0 0 6px rgba(255, 215, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-223.reverse-video { - background-color: #ffd7af !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-224 { - background-color: #ffd7d7; -} -/* line 100, ../sass/main.sass */ -.bg-color-224.reverse-video { - color: #ffd7d7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-224 { - color: #ffd7d7; - text-shadow: 0 0 6px rgba(255, 215, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-224.reverse-video { - background-color: #ffd7d7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-225 { - background-color: #ffd7ff; -} -/* line 100, ../sass/main.sass */ -.bg-color-225.reverse-video { - color: #ffd7ff !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-225 { - color: #ffd7ff; - text-shadow: 0 0 6px rgba(255, 215, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-225.reverse-video { - background-color: #ffd7ff !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-226 { - background-color: yellow; -} -/* line 100, ../sass/main.sass */ -.bg-color-226.reverse-video { - color: yellow !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-226 { - color: yellow; - text-shadow: 0 0 6px rgba(255, 255, 0, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-226.reverse-video { - background-color: yellow !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-227 { - background-color: #ffff5f; -} -/* line 100, ../sass/main.sass */ -.bg-color-227.reverse-video { - color: #ffff5f !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-227 { - color: #ffff5f; - text-shadow: 0 0 6px rgba(255, 255, 95, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-227.reverse-video { - background-color: #ffff5f !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-228 { - background-color: #ffff87; -} -/* line 100, ../sass/main.sass */ -.bg-color-228.reverse-video { - color: #ffff87 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-228 { - color: #ffff87; - text-shadow: 0 0 6px rgba(255, 255, 135, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-228.reverse-video { - background-color: #ffff87 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-229 { - background-color: #ffffaf; -} -/* line 100, ../sass/main.sass */ -.bg-color-229.reverse-video { - color: #ffffaf !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-229 { - color: #ffffaf; - text-shadow: 0 0 6px rgba(255, 255, 175, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-229.reverse-video { - background-color: #ffffaf !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-230 { - background-color: #ffffd7; -} -/* line 100, ../sass/main.sass */ -.bg-color-230.reverse-video { - color: #ffffd7 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-230 { - color: #ffffd7; - text-shadow: 0 0 6px rgba(255, 255, 215, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-230.reverse-video { - background-color: #ffffd7 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-231 { - background-color: white; -} -/* line 100, ../sass/main.sass */ -.bg-color-231.reverse-video { - color: white !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-231 { - color: white; - text-shadow: 0 0 6px rgba(255, 255, 255, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-231.reverse-video { - background-color: white !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-232 { - background-color: #080808; -} -/* line 100, ../sass/main.sass */ -.bg-color-232.reverse-video { - color: #080808 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-232 { - color: #080808; - text-shadow: 0 0 6px rgba(8, 8, 8, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-232.reverse-video { - background-color: #080808 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-233 { - background-color: #121212; -} -/* line 100, ../sass/main.sass */ -.bg-color-233.reverse-video { - color: #121212 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-233 { - color: #121212; - text-shadow: 0 0 6px rgba(18, 18, 18, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-233.reverse-video { - background-color: #121212 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-234 { - background-color: #1c1c1c; -} -/* line 100, ../sass/main.sass */ -.bg-color-234.reverse-video { - color: #1c1c1c !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-234 { - color: #1c1c1c; - text-shadow: 0 0 6px rgba(28, 28, 28, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-234.reverse-video { - background-color: #1c1c1c !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-235 { - background-color: #262626; -} -/* line 100, ../sass/main.sass */ -.bg-color-235.reverse-video { - color: #262626 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-235 { - color: #262626; - text-shadow: 0 0 6px rgba(38, 38, 38, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-235.reverse-video { - background-color: #262626 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-236 { - background-color: #303030; -} -/* line 100, ../sass/main.sass */ -.bg-color-236.reverse-video { - color: #303030 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-236 { - color: #303030; - text-shadow: 0 0 6px rgba(48, 48, 48, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-236.reverse-video { - background-color: #303030 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-237 { - background-color: #3a3a3a; -} -/* line 100, ../sass/main.sass */ -.bg-color-237.reverse-video { - color: #3a3a3a !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-237 { - color: #3a3a3a; - text-shadow: 0 0 6px rgba(58, 58, 58, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-237.reverse-video { - background-color: #3a3a3a !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-238 { - background-color: #444444; -} -/* line 100, ../sass/main.sass */ -.bg-color-238.reverse-video { - color: #444444 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-238 { - color: #444444; - text-shadow: 0 0 6px rgba(68, 68, 68, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-238.reverse-video { - background-color: #444444 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-239 { - background-color: #4e4e4e; -} -/* line 100, ../sass/main.sass */ -.bg-color-239.reverse-video { - color: #4e4e4e !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-239 { - color: #4e4e4e; - text-shadow: 0 0 6px rgba(78, 78, 78, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-239.reverse-video { - background-color: #4e4e4e !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-240 { - background-color: #585858; -} -/* line 100, ../sass/main.sass */ -.bg-color-240.reverse-video { - color: #585858 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-240 { - color: #585858; - text-shadow: 0 0 6px rgba(88, 88, 88, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-240.reverse-video { - background-color: #585858 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-241 { - background-color: #626262; -} -/* line 100, ../sass/main.sass */ -.bg-color-241.reverse-video { - color: #626262 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-241 { - color: #626262; - text-shadow: 0 0 6px rgba(98, 98, 98, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-241.reverse-video { - background-color: #626262 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-242 { - background-color: #6c6c6c; -} -/* line 100, ../sass/main.sass */ -.bg-color-242.reverse-video { - color: #6c6c6c !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-242 { - color: #6c6c6c; - text-shadow: 0 0 6px rgba(108, 108, 108, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-242.reverse-video { - background-color: #6c6c6c !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-243 { - background-color: #767676; -} -/* line 100, ../sass/main.sass */ -.bg-color-243.reverse-video { - color: #767676 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-243 { - color: #767676; - text-shadow: 0 0 6px rgba(118, 118, 118, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-243.reverse-video { - background-color: #767676 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-244 { - background-color: gray; -} -/* line 100, ../sass/main.sass */ -.bg-color-244.reverse-video { - color: gray !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-244 { - color: gray; - text-shadow: 0 0 6px rgba(128, 128, 128, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-244.reverse-video { - background-color: gray !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-245 { - background-color: #8a8a8a; -} -/* line 100, ../sass/main.sass */ -.bg-color-245.reverse-video { - color: #8a8a8a !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-245 { - color: #8a8a8a; - text-shadow: 0 0 6px rgba(138, 138, 138, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-245.reverse-video { - background-color: #8a8a8a !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-246 { - background-color: #949494; -} -/* line 100, ../sass/main.sass */ -.bg-color-246.reverse-video { - color: #949494 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-246 { - color: #949494; - text-shadow: 0 0 6px rgba(148, 148, 148, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-246.reverse-video { - background-color: #949494 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-247 { - background-color: #9e9e9e; -} -/* line 100, ../sass/main.sass */ -.bg-color-247.reverse-video { - color: #9e9e9e !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-247 { - color: #9e9e9e; - text-shadow: 0 0 6px rgba(158, 158, 158, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-247.reverse-video { - background-color: #9e9e9e !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-248 { - background-color: #a8a8a8; -} -/* line 100, ../sass/main.sass */ -.bg-color-248.reverse-video { - color: #a8a8a8 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-248 { - color: #a8a8a8; - text-shadow: 0 0 6px rgba(168, 168, 168, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-248.reverse-video { - background-color: #a8a8a8 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-249 { - background-color: #b2b2b2; -} -/* line 100, ../sass/main.sass */ -.bg-color-249.reverse-video { - color: #b2b2b2 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-249 { - color: #b2b2b2; - text-shadow: 0 0 6px rgba(178, 178, 178, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-249.reverse-video { - background-color: #b2b2b2 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-250 { - background-color: #bcbcbc; -} -/* line 100, ../sass/main.sass */ -.bg-color-250.reverse-video { - color: #bcbcbc !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-250 { - color: #bcbcbc; - text-shadow: 0 0 6px rgba(188, 188, 188, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-250.reverse-video { - background-color: #bcbcbc !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-251 { - background-color: #c6c6c6; -} -/* line 100, ../sass/main.sass */ -.bg-color-251.reverse-video { - color: #c6c6c6 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-251 { - color: #c6c6c6; - text-shadow: 0 0 6px rgba(198, 198, 198, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-251.reverse-video { - background-color: #c6c6c6 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-252 { - background-color: #d0d0d0; -} -/* line 100, ../sass/main.sass */ -.bg-color-252.reverse-video { - color: #d0d0d0 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-252 { - color: #d0d0d0; - text-shadow: 0 0 6px rgba(208, 208, 208, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-252.reverse-video { - background-color: #d0d0d0 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-253 { - background-color: #dadada; -} -/* line 100, ../sass/main.sass */ -.bg-color-253.reverse-video { - color: #dadada !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-253 { - color: #dadada; - text-shadow: 0 0 6px rgba(218, 218, 218, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-253.reverse-video { - background-color: #dadada !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-254 { - background-color: #e4e4e4; -} -/* line 100, ../sass/main.sass */ -.bg-color-254.reverse-video { - color: #e4e4e4 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-254 { - color: #e4e4e4; - text-shadow: 0 0 6px rgba(228, 228, 228, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-254.reverse-video { - background-color: #e4e4e4 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-255 { - background-color: #eeeeee; -} -/* line 100, ../sass/main.sass */ -.bg-color-255.reverse-video { - color: #eeeeee !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-255 { - color: #eeeeee; - text-shadow: 0 0 6px rgba(238, 238, 238, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-255.reverse-video { - background-color: #eeeeee !important; -} - -/* ?? */ -/* line 98, ../sass/main.sass */ -.bg-color-256 { - background-color: #110f13; -} -/* line 100, ../sass/main.sass */ -.bg-color-256.reverse-video { - color: #110f13 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-256 { - color: #110f13; - text-shadow: 0 0 6px rgba(17, 15, 19, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-256.reverse-video { - background-color: #110f13 !important; -} - -/* line 98, ../sass/main.sass */ -.bg-color-257 { - background-color: #f4ead5; -} -/* line 100, ../sass/main.sass */ -.bg-color-257.reverse-video { - color: #f4ead5 !important; -} - -/* line 103, ../sass/main.sass */ -.fg-color-257 { - color: #f4ead5; - text-shadow: 0 0 6px rgba(244, 234, 213, 0.5); -} -/* line 105, ../sass/main.sass */ -.fg-color-257.reverse-video { - background-color: #f4ead5 !important; -} diff --git a/butterfly/templates/index.html b/butterfly/templates/index.html index 4c976b0..dcd77e9 100644 --- a/butterfly/templates/index.html +++ b/butterfly/templates/index.html @@ -10,12 +10,12 @@ Butterfly - +
- diff --git a/coffees/main.coffee b/coffees/main.coffee index e17e3b1..3cbed19 100644 --- a/coffees/main.coffee +++ b/coffees/main.coffee @@ -22,68 +22,68 @@ open_ts = (new Date()).getTime() $ = document.querySelectorAll.bind(document) send = (data) -> - ws.send 'S' + data + ws.send 'S' + data ctl = (type, args...) -> - params = args.join(',') - if type == 'Resize' - ws.send 'R' + params + params = args.join(',') + if type == 'Resize' + ws.send 'R' + params if location.protocol == 'https:' - ws_url = 'wss://' + ws_url = 'wss://' else - ws_url = 'ws://' + ws_url = 'ws://' ws_url += document.location.host + '/ws' + location.pathname ws = new WebSocket ws_url ws.addEventListener 'open', -> - console.log "WebSocket open", arguments - ws.send 'R' + term.cols + ',' + term.rows - open_ts = (new Date()).getTime() + console.log "WebSocket open", arguments + ws.send 'R' + term.cols + ',' + term.rows + open_ts = (new Date()).getTime() ws.addEventListener 'error', -> - console.log "WebSocket error", arguments + console.log "WebSocket error", arguments ws.addEventListener 'message', (e) -> - setTimeout -> - term.write e.data - , 1 + setTimeout -> + term.write e.data + , 1 ws.addEventListener 'close', -> - console.log "WebSocket closed", arguments - setTimeout -> - term.write 'Closed' - # Allow quick reload - term.skipNextKey = true - term.element.classList.add('skip') - , 1 - quit = true - # Don't autoclose if websocket didn't last 1 minute - if (new Date()).getTime() - open_ts > 60 * 1000 - open('','_self').close() + console.log "WebSocket closed", arguments + setTimeout -> + term.write 'Closed' + # Allow quick reload + term.skipNextKey = true + term.element.classList.add('dead') + , 1 + quit = true + # Don't autoclose if websocket didn't last 1 minute + if (new Date()).getTime() - open_ts > 60 * 1000 + open('','_self').close() term = new Terminal $('#wrapper')[0], send, ctl addEventListener 'beforeunload', -> - if not quit - 'This will exit the terminal session' + if not quit + 'This will exit the terminal session' bench = (n=100000000) -> - rnd = '' - while rnd.length < n - rnd += Math.random().toString(36).substring(2) + rnd = '' + while rnd.length < n + rnd += Math.random().toString(36).substring(2) - t0 = (new Date()).getTime() - term.write rnd - console.log "#{n} chars in #{(new Date()).getTime() - t0} ms" + t0 = (new Date()).getTime() + term.write rnd + console.log "#{n} chars in #{(new Date()).getTime() - t0} ms" cbench = (n=100000000) -> - rnd = '' - while rnd.length < n - rnd += "\x1b[#{30 + parseInt(Math.random() * 20)}m" - rnd += Math.random().toString(36).substring(2) + rnd = '' + while rnd.length < n + rnd += "\x1b[#{30 + parseInt(Math.random() * 20)}m" + rnd += Math.random().toString(36).substring(2) - t0 = (new Date()).getTime() - term.write rnd - console.log "#{n} chars + colors in #{(new Date()).getTime() - t0} ms" + t0 = (new Date()).getTime() + term.write rnd + console.log "#{n} chars + colors in #{(new Date()).getTime() - t0} ms" diff --git a/coffees/selection.coffee b/coffees/selection.coffee index c1091a8..89efb97 100644 --- a/coffees/selection.coffee +++ b/coffees/selection.coffee @@ -16,232 +16,238 @@ # along with this program. If not, see . selection = null -# get_line_range = (y) -> -# first_node = term.children[y].firstChild -# last_node = term.children[y].lastChild - -# range = document.createRange() -# range.setStart first_node, 0 -# range.setEnd last_node, last_node.length -# range - previous_leaf = (node) -> - previous = node.previousSibling - if not previous - previous = node.parentNode.previousSibling - if not previous - previous = node.parentNode.parentNode.previousSibling - while previous.lastChild - previous = previous.lastChild - previous + previous = node.previousSibling + if not previous + previous = node.parentNode.previousSibling + if not previous + previous = node.parentNode.parentNode.previousSibling + while previous.lastChild + previous = previous.lastChild + previous next_leaf = (node) -> - next = node.nextSibling - if not next - next = node.parentNode.nextSibling - if not next - next = node.parentNode.parentNode.nextSibling - while next.firstChild - next = next.firstChild - next + next = node.nextSibling + if not next + next = node.parentNode.nextSibling + if not next + next = node.parentNode.parentNode.nextSibling + while next.firstChild + next = next.firstChild + next class Selection - constructor: -> - term.element.classList.add('selection') - @selection = getSelection() + constructor: -> + term.element.classList.add('selection') + @selection = getSelection() - reset: -> - @selection = getSelection() - fake_range = document.createRange() - fake_range.setStart(@selection.anchorNode, @selection.anchorOffset) - fake_range.setEnd(@selection.focusNode, @selection.focusOffset) - @start = - node: @selection.anchorNode - offset: @selection.anchorOffset - @end = - node: @selection.focusNode - offset: @selection.focusOffset + reset: -> + @selection = getSelection() + fake_range = document.createRange() + fake_range.setStart(@selection.anchorNode, @selection.anchorOffset) + fake_range.setEnd(@selection.focusNode, @selection.focusOffset) + @start = + node: @selection.anchorNode + offset: @selection.anchorOffset + @end = + node: @selection.focusNode + offset: @selection.focusOffset - if fake_range.collapsed - [@start, @end] = [@end, @start] + if fake_range.collapsed + [@start, @end] = [@end, @start] - @start_line = @start.node - while not @start_line.classList or 'line' not in @start_line.classList - @start_line = @start_line.parentNode + @start_line = @start.node + while not @start_line.classList or 'line' not in @start_line.classList + @start_line = @start_line.parentNode - @end_line = @end.node - while not @end_line.classList or 'line' not in @end_line.classList - @end_line = @end_line.parentNode + @end_line = @end.node + while not @end_line.classList or 'line' not in @end_line.classList + @end_line = @end_line.parentNode - clear: -> - @selection.removeAllRanges() + clear: -> + @selection.removeAllRanges() - destroy: -> - term.element.classList.remove('selection') - @clear() + destroy: -> + term.element.classList.remove('selection') + @clear() - text: -> - @selection.toString() + text: -> + @selection.toString() - up: -> - @go -1 + up: -> + @go -1 - down: -> - @go +1 + down: -> + @go +1 - go: (n) -> - index = term.children.indexOf(@start_line) + n - return unless 0 <= index < term.children.length + go: (n) -> + index = term.children.indexOf(@start_line) + n + return unless 0 <= index < term.children.length - until term.children[index].textContent.match /\S/ - index += n - return unless 0 <= index < term.children.length + until term.children[index].textContent.match /\S/ + index += n + return unless 0 <= index < term.children.length - @select_line index + @select_line index - apply: -> - @clear() - range = document.createRange() - range.setStart @start.node, @start.offset - range.setEnd @end.node, @end.offset - @selection.addRange range + apply: -> + @clear() + range = document.createRange() + range.setStart @start.node, @start.offset + range.setEnd @end.node, @end.offset + @selection.addRange range - select_line: (index) -> - line = term.children[index] - line_start = - node: line.firstChild - offset: 0 + select_line: (index) -> + line = term.children[index] + line_start = + node: line.firstChild + offset: 0 - line_end = - node: line.lastChild - offset: line.lastChild.textContent.length + line_end = + node: line.lastChild + offset: line.lastChild.textContent.length - @start = @walk line_start, /\S/ - @end = @walk line_end, /\S/, true + @start = @walk line_start, /\S/ + @end = @walk line_end, /\S/, true - shrink_right: -> - node = @walk @end, /\s/, true - @end = @walk node, /\S/, true + collapsed: (start, end) -> + fake_range = document.createRange() + fake_range.setStart(start.node, start.offset) + fake_range.setEnd(end.node, end.offset) + fake_range.collapsed - shrink_left: -> - node = @walk @start, /\s/ - @start = @walk node, /\S/ + shrink_right: -> + node = @walk @end, /\s/, true + end = @walk node, /\S/, true + if not @collapsed(@start, end) + @end = end - expand_right: -> - node = @walk @end, /\S/ - @end = @walk node, /\s/ + shrink_left: -> + node = @walk @start, /\s/ + start = @walk node, /\S/ + if not @collapsed(start, @end) + @start = start - expand_left: -> - node = @walk @start, /\S/, true - @start = @walk node, /\s/, true + expand_right: -> + node = @walk @end, /\S/ + @end = @walk node, /\s/ - walk: (needle, til, backward=false) -> - node = if needle.node.firstChild then needle.node.firstChild else needle.node + expand_left: -> + node = @walk @start, /\S/, true + @start = @walk node, /\s/, true + + walk: (needle, til, backward=false) -> + if needle.node.firstChild + node = needle.node.firstChild + else + node = needle.node + + text = node.textContent + i = needle.offset + if backward + while node + while i > 0 + if text[--i].match til + return node: node, offset: i + 1 + node = previous_leaf node text = node.textContent - i = needle.offset - if backward - while node - while i > 0 - if text[--i].match til - return node: node, offset: i + 1 - node = previous_leaf node - text = node.textContent - i = text.length - else - while node - while i < text.length - if text[i++].match til - return node: node, offset: i - 1 - node = next_leaf node - text = node.textContent - i = 0 + i = text.length + else + while node + while i < text.length + if text[i++].match til + return node: node, offset: i - 1 + node = next_leaf node + text = node.textContent + i = 0 - return needle + return needle document.addEventListener 'keydown', (e) -> - return true if e.keyCode in [16..19] + return true if e.keyCode in [16..19] - # Paste natural selection too if shiftkey - if e.shiftKey and e.keyCode is 13 and not selection and not getSelection().isCollapsed - term.handler getSelection().toString() - getSelection().removeAllRanges() - return cancel e + # Paste natural selection too if shiftkey + if e.shiftKey and e.keyCode is 13 and + not selection and not getSelection().isCollapsed + term.handler getSelection().toString() + getSelection().removeAllRanges() + return cancel e - if selection - selection.reset() - if not e.ctrlKey and e.shiftKey and 37 <= e.keyCode <= 40 - return true - if e.shiftKey and e.ctrlKey - if e.keyCode == 38 - selection.up() - else if e.keyCode == 40 - selection.down() - else if e.keyCode == 39 - selection.shrink_left() - else if e.keyCode == 38 - selection.expand_left() - else if e.keyCode == 37 - selection.shrink_right() - else if e.keyCode == 40 - selection.expand_right() - else - return cancel e + if selection + selection.reset() + if not e.ctrlKey and e.shiftKey and 37 <= e.keyCode <= 40 + return true + if e.shiftKey and e.ctrlKey + if e.keyCode == 38 + selection.up() + else if e.keyCode == 40 + selection.down() + else if e.keyCode == 39 + selection.shrink_left() + else if e.keyCode == 38 + selection.expand_left() + else if e.keyCode == 37 + selection.shrink_right() + else if e.keyCode == 40 + selection.expand_right() + else + return cancel e - selection?.apply() - return cancel e + selection?.apply() + return cancel e - # Start selection mode with shift up - if not selection and e.ctrlKey and e.shiftKey and e.keyCode == 38 - selection = new Selection() - selection.select_line term.y - 1 - selection.apply() - return cancel e - true + # Start selection mode with shift up + if not selection and e.ctrlKey and e.shiftKey and e.keyCode == 38 + selection = new Selection() + selection.select_line term.y - 1 + selection.apply() + return cancel e + true document.addEventListener 'keyup', (e) -> - return true if e.keyCode in [16..19] + return true if e.keyCode in [16..19] - if selection - if e.keyCode == 13 - term.handler selection.text() - selection.destroy() - selection = null - return cancel e - if e.keyCode not in [37..40] - selection.destroy() - selection = null - return true - true + if selection + if e.keyCode == 13 + term.handler selection.text() + selection.destroy() + selection = null + return cancel e + if e.keyCode not in [37..40] + selection.destroy() + selection = null + return true + true document.addEventListener 'dblclick', (e) -> - return if e.ctrlKey or e.altkey - sel = getSelection() - return if sel.isCollapsed or sel.toString().match /\s/ + return if e.ctrlKey or e.altkey + sel = getSelection() + return if sel.isCollapsed or sel.toString().match /\s/ - range = document.createRange() - range.setStart(sel.anchorNode, sel.anchorOffset) - range.setEnd(sel.focusNode, sel.focusOffset) - if range.collapsed - sel.removeAllRanges() - new_range = document.createRange() - new_range.setStart(sel.focusNode, sel.focusOffset) - new_range.setEnd(sel.anchorNode, sel.anchorOffset) - sel.addRange(new_range) - range.detach() + range = document.createRange() + range.setStart(sel.anchorNode, sel.anchorOffset) + range.setEnd(sel.focusNode, sel.focusOffset) + if range.collapsed + sel.removeAllRanges() + new_range = document.createRange() + new_range.setStart(sel.focusNode, sel.focusOffset) + new_range.setEnd(sel.anchorNode, sel.anchorOffset) + sel.addRange(new_range) + range.detach() - until sel.toString().match(/\s/) or not sel.toString() - sel.modify 'extend', 'forward', 'character' + until sel.toString().match(/\s/) or not sel.toString() + sel.modify 'extend', 'forward', 'character' + sel.modify 'extend', 'backward', 'character' + + # Return selection + anchorNode = sel.anchorNode + anchorOffset = sel.anchorOffset + sel.collapseToEnd() + sel.extend(anchorNode, anchorOffset) + + until sel.toString().match(/\s/) or not sel.toString() sel.modify 'extend', 'backward', 'character' - # Return selection - anchorNode = sel.anchorNode - anchorOffset = sel.anchorOffset - sel.collapseToEnd() - sel.extend(anchorNode, anchorOffset) - - until sel.toString().match(/\s/) or not sel.toString() - sel.modify 'extend', 'backward', 'character' - - sel.modify 'extend', 'forward', 'character' + sel.modify 'extend', 'forward', 'character' diff --git a/coffees/term.coffee b/coffees/term.coffee index 008abfc..ca961e5 100644 --- a/coffees/term.coffee +++ b/coffees/term.coffee @@ -37,2955 +37,2973 @@ cancel = (ev) -> s = 0 State = - normal: s++ - escaped: s++ - csi: s++ - osc: s++ - charset: s++ - dcs: s++ - ignore: s++ + normal: s++ + escaped: s++ + csi: s++ + osc: s++ + charset: s++ + dcs: s++ + ignore: s++ class Terminal - constructor: (@parent, @out, @ctl=->) -> - # Global elements - @context = @parent.ownerDocument.defaultView - @document = @parent.ownerDocument - @body = @document.getElementsByTagName('body')[0] + constructor: (@parent, @out, @ctl=->) -> + # Global elements + @context = @parent.ownerDocument.defaultView + @document = @parent.ownerDocument + @body = @document.getElementsByTagName('body')[0] - # Main terminal element - @element = @document.createElement('div') - @element.className = 'terminal focus' - @element.style.outline = 'none' - @element.setAttribute 'tabindex', 0 + # Main terminal element + @element = @document.createElement('div') + @element.className = 'terminal focus' + @element.style.outline = 'none' + @element.setAttribute 'tabindex', 0 - @parent.appendChild(@element) + @parent.appendChild(@element) - # Adding one line to compute char size - div = @document.createElement('div') - div.className = 'line' - @element.appendChild(div) - @children = [div] + # Adding one line to compute char size + div = @document.createElement('div') + div.className = 'line' + @element.appendChild(div) + @children = [div] - @compute_char_size() - div.style.height = @char_size.height + 'px' - term_size = @parent.getBoundingClientRect() - @cols = Math.floor(term_size.width / @char_size.width) - 1 # ? - @rows = Math.floor(term_size.height / @char_size.height) + @compute_char_size() + div.style.height = @char_size.height + 'px' + term_size = @parent.getBoundingClientRect() + @cols = Math.floor(term_size.width / @char_size.width) - 1 # ? + @rows = Math.floor(term_size.height / @char_size.height) - i = @rows - 1 - while i-- - div = @document.createElement('div') - div.style.height = @char_size.height + 'px' - div.className = 'line' - @element.appendChild(div) - @children.push(div) + i = @rows - 1 + while i-- + div = @document.createElement('div') + div.style.height = @char_size.height + 'px' + div.className = 'line' + @element.appendChild(div) + @children.push(div) - @scrollback = 100000 - @visualBell = 100 + @scrollback = 100000 + @visualBell = 100 - @convertEol = false - @termName = 'xterm' - @cursorBlink = true - @cursorState = 0 - @last_cc = 0 - @reset_vars() + @convertEol = false + @termName = 'xterm' + @cursorBlink = true + @cursorState = 0 + @last_cc = 0 + @reset_vars() - # Draw screen - @refresh 0, @rows - 1 + # Draw screen + @refresh 0, @rows - 1 - @focus() + @focus() - @startBlink() - addEventListener 'keydown', @keyDown.bind(@) - addEventListener 'keypress', @keyPress.bind(@) - addEventListener 'focus', @focus.bind(@) - addEventListener 'blur', @blur.bind(@) - addEventListener 'paste', @paste.bind(@) - addEventListener 'resize', @resize.bind(@) + @startBlink() + addEventListener 'keydown', @keyDown.bind(@) + addEventListener 'keypress', @keyPress.bind(@) + addEventListener 'focus', @focus.bind(@) + addEventListener 'blur', @blur.bind(@) + addEventListener 'paste', @paste.bind(@) + addEventListener 'resize', @resize.bind(@) - # Horrible Firefox paste workaround - if typeof InstallTrigger isnt "undefined" - @element.contentEditable = 'true' - @element.addEventListener "mouseup", => - sel = getSelection().getRangeAt(0) - if sel.startOffset is sel.endOffset - getSelection().removeAllRanges() + # Horrible Firefox paste workaround + if typeof InstallTrigger isnt "undefined" + @element.contentEditable = 'true' + @element.addEventListener "mouseup", -> + sel = getSelection().getRangeAt(0) + if sel.startOffset is sel.endOffset + getSelection().removeAllRanges() - @initmouse() + @initmouse() - reset_vars: -> - @ybase = 0 - @ydisp = 0 - @x = 0 - @y = 0 - @cursorHidden = false - @state = State.normal - @queue = '' - @scrollTop = 0 - @scrollBottom = @rows - 1 + reset_vars: -> + @ybase = 0 + @ydisp = 0 + @x = 0 + @y = 0 + @cursorHidden = false + @state = State.normal + @queue = '' + @scrollTop = 0 + @scrollBottom = @rows - 1 - # modes - @applicationKeypad = false - @applicationCursor = false - @originMode = false - @wraparoundMode = false - @normal = null + # modes + @applicationKeypad = false + @applicationCursor = false + @originMode = false + @wraparoundMode = false + @normal = null - # charset - @charset = null - @gcharset = null - @glevel = 0 - @charsets = [null] + # charset + @charset = null + @gcharset = null + @glevel = 0 + @charsets = [null] - # stream - @defAttr = (0 << 18) | (257 << 9) | (256 << 0) - @curAttr = @defAttr - @params = [] - @currentParam = 0 - @prefix = "" - @lines = [] - i = @rows - @lines.push @blankLine() while i-- - @setupStops() - @skipNextKey = null + # stream + @defAttr = (0 << 18) | (257 << 9) | (256 << 0) + @curAttr = @defAttr + @params = [] + @currentParam = 0 + @prefix = "" + @lines = [] + i = @rows + @lines.push @blankLine() while i-- + @setupStops() + @skipNextKey = null - compute_char_size: -> - test_span = document.createElement('span') - test_span.textContent = '0123456789' - @children[0].appendChild(test_span) - @char_size = - width: test_span.getBoundingClientRect().width / 10 - height: @children[0].getBoundingClientRect().height - @children[0].removeChild(test_span) + compute_char_size: -> + test_span = document.createElement('span') + test_span.textContent = '0123456789' + @children[0].appendChild(test_span) + @char_size = + width: test_span.getBoundingClientRect().width / 10 + height: @children[0].getBoundingClientRect().height + @children[0].removeChild(test_span) - eraseAttr: -> - (@defAttr & ~0x1ff) | (@curAttr & 0x1ff) + eraseAttr: -> + (@defAttr & ~0x1ff) | (@curAttr & 0x1ff) - focus: -> - @send('\x1b[I') if @sendFocus - @showCursor() - @element.classList.add('focus') - @element.classList.remove('blur') + focus: -> + @send('\x1b[I') if @sendFocus + @showCursor() + @element.classList.add('focus') + @element.classList.remove('blur') - blur: -> - @cursorState = 1 - @refresh(@y, @y) - @send('\x1b[O') if @sendFocus - @element.classList.add('blur') - @element.classList.remove('focus') + blur: -> + @cursorState = 1 + @refresh(@y, @y) + @send('\x1b[O') if @sendFocus + @element.classList.add('blur') + @element.classList.remove('focus') - paste: (ev) -> - if ev.clipboardData - @send ev.clipboardData.getData('text/plain') - else if @context.clipboardData - @send @context.clipboardData.getData('Text') - cancel(ev) + paste: (ev) -> + if ev.clipboardData + @send ev.clipboardData.getData('text/plain') + else if @context.clipboardData + @send @context.clipboardData.getData('Text') + cancel(ev) - # XTerm mouse events - # http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#Mouse%20Tracking - # To better understand these - # the xterm code is very helpful: - # Relevant files: - # button.c, charproc.c, misc.c - # Relevant functions in xterm/button.c: - # BtnCode, EmitButtonCode, EditorButton, SendMousePosition - initmouse: -> - pressed = 32 + # XTerm mouse events + # http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#Mouse%20Tracking + # To better understand these + # the xterm code is very helpful: + # Relevant files: + # button.c, charproc.c, misc.c + # Relevant functions in xterm/button.c: + # BtnCode, EmitButtonCode, EditorButton, SendMousePosition + initmouse: -> + pressed = 32 - # mouseup, mousedown, mousewheel - # left click: ^[[M 3<^[[M#3< - # mousewheel up: ^[[M`3> - sendButton = (ev) => - # get the xterm-style button - button = getButton(ev) + # mouseup, mousedown, mousewheel + # left click: ^[[M 3<^[[M#3< + # mousewheel up: ^[[M`3> + sendButton = (ev) -> + # get the xterm-style button + button = getButton(ev) - # get mouse coordinates - pos = getCoords(ev) - return unless pos - sendEvent button, pos - switch ev.type - when "mousedown" - pressed = button + # get mouse coordinates + pos = getCoords(ev) + return unless pos + sendEvent button, pos + switch ev.type + when "mousedown" + pressed = button - when "mouseup" - # keep it at the left - # button, just in case. - pressed = 32 + when "mouseup" + # keep it at the left + # button, just in case. + pressed = 32 - # motion example of a left click: - # ^[[M 3<^[[M@4<^[[M@5<^[[M@6<^[[M@7<^[[M#7< - sendMove = (ev) => - button = pressed - pos = getCoords(ev) - return unless pos + # motion example of a left click: + # ^[[M 3<^[[M@4<^[[M@5<^[[M@6<^[[M@7<^[[M#7< + sendMove = (ev) -> + button = pressed + pos = getCoords(ev) + return unless pos - # buttons marked as motions - # are incremented by 32 - button += 32 - sendEvent button, pos + # buttons marked as motions + # are incremented by 32 + button += 32 + sendEvent button, pos - # encode button and - # position to characters - encode = (data, ch) => - unless @utfMouse - return data.push(0) if ch is 255 - ch = 127 if ch > 127 - data.push ch - else - return data.push(0) if ch is 2047 - if ch < 127 - data.push ch - else - ch = 2047 if ch > 2047 - data.push 0xC0 | (ch >> 6) - data.push 0x80 | (ch & 0x3F) - - - # send a mouse event: - # regular/utf8: ^[[M Cb Cx Cy - # urxvt: ^[[ Cb ; Cx ; Cy M - # sgr: ^[[ Cb ; Cx ; Cy M/m - # vt300: ^[[ 24(1/3/5)~ [ Cx , Cy ] \r - # locator: CSI P e ; P b ; P r ; P c ; P p & w - sendEvent = (button, pos) => - - if @urxvtMouse - pos.x -= 32 - pos.y -= 32 - pos.x++ - pos.y++ - @send "\x1b[" + button + ";" + pos.x + ";" + pos.y + "M" - return - - if @sgrMouse - pos.x -= 32 - pos.y -= 32 - @send "\x1b[<" + (if (button & 3) is 3 then button & ~3 else button) + ";" + pos.x + ";" + pos.y + (if (button & 3) is 3 then "m" else "M") - return - - data = [] - encode data, button - encode data, pos.x - encode data, pos.y - @send "\x1b[M" + String.fromCharCode.apply(String, data) - - getButton = (ev) => - # two low bits: - # 0 = left - # 1 = middle - # 2 = right - # 3 = release - # wheel up/down: - # 1, and 2 - with 64 added - switch ev.type - when "mousedown" - button = if ev.button? then +ev.button else (if ev.which? then ev.which - 1 else null) - when "mouseup" - button = 3 - when "wheel" - button = if ev.deltaY < 0 then 64 else 65 - - # next three bits are the modifiers: - # 4 = shift, 8 = meta, 16 = control - shift = if ev.shiftKey then 4 else 0 - meta = if ev.metaKey then 8 else 0 - ctrl = if ev.ctrlKey then 16 else 0 - mod = shift | meta | ctrl - - # no mods - if @vt200Mouse - # ctrl only - mod &= ctrl - else - mod = 0 unless @normalMouse - - # increment to SP - (32 + (mod << 2)) + button - - # mouse coordinates measured in cols/rows - getCoords = (ev) => - x = ev.pageX - y = ev.pageY - - # should probably check offsetParent - # but this is more portable - el = @element - while el and el isnt @document.documentElement - x -= el.offsetLeft - y -= el.offsetTop - el = if "offsetParent" of el then el.offsetParent else el.parentNode - - # convert to cols/rows - w = @element.clientWidth - h = @element.clientHeight - x = Math.ceil((x / w) * @cols) - y = Math.ceil((y / h) * @rows) - - # be sure to avoid sending - # bad positions to the program - x = 0 if x < 0 - x = @cols if x > @cols - y = 0 if y < 0 - y = @rows if y > @rows - - # xterm sends raw bytes and - # starts at 32 (SP) for each. - x += 32 - y += 32 - - x: x - y: y - type: ev.type - - addEventListener "mousedown", (ev) => - return unless @mouseEvents - - # send the button - sendButton ev - - # fix for odd bug - #if (@vt200Mouse && !@normalMouse) { - if @vt200Mouse - sendButton - __proto__: ev - type: "mouseup" - - return cancel(ev) - - addEventListener "mousemove", sendMove.bind(this) if @normalMouse - - # x10 compatibility mode can't send button releases - unless @x10Mouse - addEventListener "mouseup", up = (ev) => - sendButton ev - removeEventListener "mousemove", sendMove if @normalMouse - removeEventListener "mouseup", up - cancel ev - cancel ev - - addEventListener "wheel", (ev) => - if @mouseEvents - return if @x10Mouse - sendButton ev - else - return if @applicationKeypad - @scrollDisp if ev.deltaY > 0 then 5 else -5 - cancel ev - - - refresh: (start, end) -> - if end - start >= @rows / 3 - parent = @element.parentNode - parent?.removeChild @element - - width = @cols - y = start - - if end >= @lines.length - end = @lines.length - 1 - - while y <= end - row = y + @ydisp - line = @lines[row] - out = "" - - if y is @y and (@ydisp is @ybase or @selectMode) and not @cursorHidden - x = @x - else - x = -Infinity - - attr = @defAttr - i = 0 - while i < width - data = line[i][0] - ch = line[i][1] - if data isnt attr - out += "" if attr isnt @defAttr - if data isnt @defAttr - classes = [] - out += "> 9) & 0x1ff - flags = data >> 18 - - # bold - classes.push "bold" if flags & 1 - # underline - classes.push "underline" if flags & 2 - # blink - classes.push "blink" if flags & 4 - # inverse - classes.push "reverse-video" if flags & 8 - # invisible - classes.push "invisible" if flags & 16 - - fg += 8 if flags & 1 and fg < 8 - classes.push "bg-color-" + bg - classes.push "fg-color-" + fg - - out += "class=\"" - out += classes.join(" ") - out += "\">" - out += "" if i is x - - # This is a temporary dirty hack for raw html insertion - if ch.length > 1 - out += ch - else - switch ch - when "&" - out += "&" - when "<" - out += "<" - when ">" - out += ">" - else - if ch <= " " - out += " " - else - i++ if "\uff00" < ch < "\uffef" - out += ch - out += "" if i is x - attr = data - i++ - out += "" if attr isnt @defAttr - @children[y].innerHTML = out - y++ - - parent?.appendChild @element - - - _cursorBlink: -> - @cursorState ^= 1 - cursor = @element.querySelector(".cursor") - return unless cursor - if cursor.classList.contains("reverse-video") - cursor.classList.remove "reverse-video" + # encode button and + # position to characters + encode = (data, ch) => + unless @utfMouse + return data.push(0) if ch is 255 + ch = 127 if ch > 127 + data.push ch + else + return data.push(0) if ch is 2047 + if ch < 127 + data.push ch else - cursor.classList.add "reverse-video" + ch = 2047 if ch > 2047 + data.push 0xC0 | (ch >> 6) + data.push 0x80 | (ch & 0x3F) - showCursor: -> - unless @cursorState - @cursorState = 1 - @refresh @y, @y + # send a mouse event: + # regular/utf8: ^[[M Cb Cx Cy + # urxvt: ^[[ Cb ; Cx ; Cy M + # sgr: ^[[ Cb ; Cx ; Cy M/m + # vt300: ^[[ 24(1/3/5)~ [ Cx , Cy ] \r + # locator: CSI P e ; P b ; P r ; P c ; P p & w + sendEvent = (button, pos) => + + if @urxvtMouse + pos.x -= 32 + pos.y -= 32 + pos.x++ + pos.y++ + @send "\x1b[" + button + ";" + pos.x + ";" + pos.y + "M" + return + + if @sgrMouse + pos.x -= 32 + pos.y -= 32 + @send "\x1b[<" + ( + if (button & 3) is 3 then button & ~3 else button + ) + ";" + pos.x + ";" + pos.y + ( + if (button & 3) is 3 then "m" else "M" + ) + return + + data = [] + encode data, button + encode data, pos.x + encode data, pos.y + @send "\x1b[M" + String.fromCharCode.apply(String, data) + + getButton = (ev) => + # two low bits: + # 0 = left + # 1 = middle + # 2 = right + # 3 = release + # wheel up/down: + # 1, and 2 - with 64 added + switch ev.type + when "mousedown" + button = if ev.button? then +ev.button else ( + if ev.which? then ev.which - 1 else null) + when "mouseup" + button = 3 + when "wheel" + button = if ev.deltaY < 0 then 64 else 65 + + # next three bits are the modifiers: + # 4 = shift, 8 = meta, 16 = control + shift = if ev.shiftKey then 4 else 0 + meta = if ev.metaKey then 8 else 0 + ctrl = if ev.ctrlKey then 16 else 0 + mod = shift | meta | ctrl + + # no mods + if @vt200Mouse + # ctrl only + mod &= ctrl + else + unless @normalMouse + mod = 0 + + # increment to SP + (32 + (mod << 2)) + button + + # mouse coordinates measured in cols/rows + getCoords = (ev) => + x = ev.pageX + y = ev.pageY + + # should probably check offsetParent + # but this is more portable + el = @element + while el and el isnt @document.documentElement + x -= el.offsetLeft + y -= el.offsetTop + el = if "offsetParent" of el then el.offsetParent else el.parentNode + + # convert to cols/rows + w = @element.clientWidth + h = @element.clientHeight + x = Math.ceil((x / w) * @cols) + y = Math.ceil((y / h) * @rows) + + # be sure to avoid sending + # bad positions to the program + x = 0 if x < 0 + x = @cols if x > @cols + y = 0 if y < 0 + y = @rows if y > @rows + + # xterm sends raw bytes and + # starts at 32 (SP) for each. + x += 32 + y += 32 + + x: x + y: y + type: ev.type + + addEventListener "mousedown", (ev) => + return unless @mouseEvents + + # send the button + sendButton ev + + # fix for odd bug + #if (@vt200Mouse && !@normalMouse) { + if @vt200Mouse + sendButton + __proto__: ev + type: "mouseup" + + return cancel(ev) + + addEventListener "mousemove", sendMove.bind(this) if @normalMouse + + # x10 compatibility mode can't send button releases + unless @x10Mouse + addEventListener "mouseup", up = (ev) => + sendButton ev + removeEventListener "mousemove", sendMove if @normalMouse + removeEventListener "mouseup", up + cancel ev + cancel ev + + addEventListener "wheel", (ev) => + if @mouseEvents + return if @x10Mouse + sendButton ev + else + return if @applicationKeypad + @scrollDisp if ev.deltaY > 0 then 5 else -5 + cancel ev - startBlink: -> - return unless @cursorBlink - @_blinker = => @_cursorBlink() - @t_blink = setInterval(@_blinker, 500) + refresh: (start, end) -> + if end - start >= @rows / 3 + parent = @element.parentNode + parent?.removeChild @element + + width = @cols + y = start + + if end >= @lines.length + end = @lines.length - 1 + + while y <= end + row = y + @ydisp + line = @lines[row] + out = "" + + if y is @y and (@ydisp is @ybase or @selectMode) and not @cursorHidden + x = @x + else + x = -Infinity + + attr = @defAttr + i = 0 + while i < width + data = line[i][0] + ch = line[i][1] + if data isnt attr + out += "" if attr isnt @defAttr + if data isnt @defAttr + classes = [] + out += "> 9) & 0x1ff + flags = data >> 18 + + # bold + classes.push "bold" if flags & 1 + # underline + classes.push "underline" if flags & 2 + # blink + classes.push "blink" if flags & 4 + # inverse + classes.push "reverse-video" if flags & 8 + # invisible + classes.push "invisible" if flags & 16 + + fg += 8 if flags & 1 and fg < 8 + classes.push "bg-color-" + bg + classes.push "fg-color-" + fg + + out += "class=\"" + out += classes.join(" ") + out += "\">" + out += "" if i is x + + # This is a temporary dirty hack for raw html insertion + if ch.length > 1 + out += ch + else + switch ch + when "&" + out += "&" + when "<" + out += "<" + when ">" + out += ">" + else + if ch <= " " + out += " " + else + i++ if "\uff00" < ch < "\uffef" + out += ch + out += "" if i is x + attr = data + i++ + out += "" if attr isnt @defAttr + @children[y].innerHTML = out + y++ + + parent?.appendChild @element - refreshBlink: -> - return unless @cursorBlink - clearInterval @t_blink - @t_blink = setInterval(@_blinker, 500) + _cursorBlink: -> + @cursorState ^= 1 + cursor = @element.querySelector(".cursor") + return unless cursor + if cursor.classList.contains("reverse-video") + cursor.classList.remove "reverse-video" + else + cursor.classList.add "reverse-video" - scroll: -> - if ++@ybase is @scrollback - @ybase = @ybase / 2 | 0 - @lines = @lines.slice(-(@ybase + @rows) + 1) + showCursor: -> + unless @cursorState + @cursorState = 1 + @refresh @y, @y + + startBlink: -> + return unless @cursorBlink + @_blinker = => @_cursorBlink() + @t_blink = setInterval(@_blinker, 500) + + + refreshBlink: -> + return unless @cursorBlink + clearInterval @t_blink + @t_blink = setInterval(@_blinker, 500) + + + scroll: -> + if ++@ybase is @scrollback + @ybase = @ybase / 2 | 0 + @lines = @lines.slice(-(@ybase + @rows) + 1) + + @ydisp = @ybase + + # last line + row = @ybase + @rows - 1 + + # subtract the bottom scroll region + row -= @rows - 1 - @scrollBottom + if row is @lines.length + # potential optimization: + # pushing is faster than splicing + # when they amount to the same + # behavior. + @lines.push @blankLine() + else + # add our new line + @lines.splice row, 0, @blankLine() + + if @scrollTop isnt 0 + if @ybase isnt 0 + @ybase-- @ydisp = @ybase + @lines.splice @ybase + @scrollTop, 1 - # last line - row = @ybase + @rows - 1 + @updateRange @scrollTop + @updateRange @scrollBottom - # subtract the bottom scroll region - row -= @rows - 1 - @scrollBottom - if row is @lines.length - # potential optimization: - # pushing is faster than splicing - # when they amount to the same - # behavior. - @lines.push @blankLine() + scrollDisp: (disp) -> + @ydisp += disp + if @ydisp > @ybase + @ydisp = @ybase + + else + @ydisp = 0 if @ydisp < 0 + + @refresh 0, @rows - 1 + + write: (data) -> + @refreshStart = @y + @refreshEnd = @y + + if @ybase isnt @ydisp + @ydisp = @ybase + @maxRange() + + i = 0 + l = data.length + while i < l + ch = data[i] + switch @state + when State.normal + switch ch + + # '\a' + when "\x07" + @bell() + + # '\n', '\v', '\f' + when "\n", "\x0b", "\x0c" + @x = 0 if @convertEol + + @y++ + if @y > @scrollBottom + @y-- + @scroll() + + # '\r' + when "\r" + @x = 0 + + # '\b' + when "\b" + @x-- if @x > 0 + + # '\t' + when "\t" + @x = @nextStop() + + # shift out + when "\x0e" + @setgLevel 1 + + # shift in + when "\x0f" + @setgLevel 0 + + # '\e' + when "\x1b" + @state = State.escaped + + else + # ' ' + if ch >= " " + ch = @charset[ch] if @charset?[ch] + if @x >= @cols + @x = 0 + @y++ + if @y > @scrollBottom + @y-- + @scroll() + @lines[@y + @ybase][@x] = [@curAttr, ch] + @x++ + @updateRange @y + if "\uff00" < ch < "\uffef" + j = @y + @ybase + if @cols < 2 or @x >= @cols + @lines[j][@x - 1] = [@curAttr, " "] + break + + @lines[j][@x] = [@curAttr, " "] + @x++ + + when State.escaped + switch ch + # ESC [ Control Sequence Introducer ( CSI is 0x9b). + when "[" + @params = [] + @currentParam = 0 + @state = State.csi + + # ESC ] Operating System Command ( OSC is 0x9d). + when "]" + @params = [] + @currentParam = 0 + @state = State.osc + + # ESC P Device Control String ( DCS is 0x90). + when "P" + @params = [] + @currentParam = 0 + @state = State.dcs + + # ESC _ Application Program Command ( APC is 0x9f). + when "_" + @state = State.ignore + + # ESC ^ Privacy Message ( PM is 0x9e). + when "^" + @state = State.ignore + + # ESC c Full Reset (RIS). + when "c" + @reset() + + # ESC E Next Line ( NEL is 0x85). + when "E" + @x = 0 + @index() + + # ESC D Index ( IND is 0x84). + when "D" + @index() + + # ESC M Reverse Index ( RI is 0x8d). + when "M" + @reverseIndex() + + # ESC % Select default/utf-8 character set. + # @ = default, G = utf-8 + when "%" + @setgLevel 0 + @setgCharset 0, Terminal::charsets.US + @state = State.normal + i++ + + # ESC (,),*,+,-,. Designate G0-G2 Character Set. + # <-- this seems to get all the attention + when "(", ")" , "*" , "+" , "-" , "." + switch ch + when "(" + @gcharset = 0 + when ")", "-" + @gcharset = 1 + when "*", "." + @gcharset = 2 + when "+" + @gcharset = 3 + @state = State.charset + + # Designate G3 Character Set (VT300). + # A = ISO Latin-1 Supplemental. + # Not implemented. + when "/" + @gcharset = 3 + @state = State.charset + i-- + + # ESC n + # Invoke the G2 Character Set as GL (LS2). + when "n" + @setgLevel 2 + + # ESC o + # Invoke the G3 Character Set as GL (LS3). + when "o" + @setgLevel 3 + + # ESC | + # Invoke the G3 Character Set as GR (LS3R). + when "|" + @setgLevel 3 + + # ESC } + # Invoke the G2 Character Set as GR (LS2R). + when "}" + @setgLevel 2 + + # ESC ~ + # Invoke the G1 Character Set as GR (LS1R). + when "~" + @setgLevel 1 + + # ESC 7 Save Cursor (DECSC). + when "7" + @saveCursor() + @state = State.normal + + # ESC 8 Restore Cursor (DECRC). + when "8" + @restoreCursor() + @state = State.normal + + # ESC # 3 DEC line height/width + when "#" + @state = State.normal + i++ + + # ESC H Tab Set (HTS is 0x88). + when "H" + @tabSet() + + # ESC = Application Keypad (DECPAM). + when "=" + @applicationKeypad = true + @state = State.normal + + # ESC > Normal Keypad (DECPNM). + when ">" + @applicationKeypad = false + @state = State.normal + else + @state = State.normal + console.log "Unknown ESC control:", ch + + when State.charset + switch ch + when "0" # DEC Special Character and Line Drawing Set. + cs = Terminal::charsets.SCLD + when "A" # UK + cs = Terminal::charsets.UK + when "B" # United States (USASCII). + cs = Terminal::charsets.US + when "4" # Dutch + cs = Terminal::charsets.Dutch + # Finnish + when "C", "5" + cs = Terminal::charsets.Finnish + when "R" # French + cs = Terminal::charsets.French + when "Q" # FrenchCanadian + cs = Terminal::charsets.FrenchCanadian + when "K" # German + cs = Terminal::charsets.German + when "Y" # Italian + cs = Terminal::charsets.Italian + # NorwegianDanish + when "E", "6" + cs = Terminal::charsets.NorwegianDanish + when "Z" # Spanish + cs = Terminal::charsets.Spanish + # Swedish + when "H", "7" + cs = Terminal::charsets.Swedish + when "=" # Swiss + cs = Terminal::charsets.Swiss + when "/" # ISOLatin (actually /A) + cs = Terminal::charsets.ISOLatin + i++ + else # Default + cs = Terminal::charsets.US + @setgCharset @gcharset, cs + @gcharset = null + @state = State.normal + + when State.osc + # OSC Ps ; Pt ST + # OSC Ps ; Pt BEL + # Set Text Parameters. + if ch is "\x1b" or ch is "\x07" + i++ if ch is "\x1b" + @params.push @currentParam + switch @params[0] + when 0, 1 , 2 + if @params[1] + @title = @params[1] + " - ƸӜƷ butterfly" + @handleTitle @title + + # Disabling this for now as we need a good script + # striper to avoid malicious script injection + # when 99 + # # Custom escape to produce raw html + # html = "
" + @params[1] + "
" + # @lines[@y + @ybase][@x] = [ + # @curAttr + # html + # ] + # line = 0 + + # while line < @get_html_height_in_lines(html) - 1 + # @y++ + # if @y > @scrollBottom + # @y-- + # @scroll() + # line++ + # @updateRange @y + + # reset colors + @params = [] + @currentParam = 0 + @state = State.normal + else + unless @params.length + if ch >= "0" and ch <= "9" + @currentParam = @currentParam * 10 + ch.charCodeAt(0) - 48 + else if ch is ";" + @params.push @currentParam + @currentParam = "" + else + @currentParam += ch + + when State.csi + # '?', '>', '!' + if ch is "?" or ch is ">" or ch is "!" + @prefix = ch + break + + # 0 - 9 + if ch >= "0" and ch <= "9" + @currentParam = @currentParam * 10 + ch.charCodeAt(0) - 48 + break + + # '$', '"', ' ', '\'' + if ch is "$" or ch is "\"" or ch is " " or ch is "'" + break + @params.push @currentParam + @currentParam = 0 + + # ';' + break if ch is ";" + @state = State.normal + switch ch + # CSI Ps A + # Cursor Up Ps Times (default = 1) (CUU). + when "A" + @cursorUp @params + + # CSI Ps B + # Cursor Down Ps Times (default = 1) (CUD). + when "B" + @cursorDown @params + + # CSI Ps C + # Cursor Forward Ps Times (default = 1) (CUF). + when "C" + @cursorForward @params + + # CSI Ps D + # Cursor Backward Ps Times (default = 1) (CUB). + when "D" + @cursorBackward @params + + # CSI Ps ; Ps H + # Cursor Position [row;column] (default = [1,1]) (CUP). + when "H" + @cursorPos @params + + # CSI Ps J Erase in Display (ED). + when "J" + @eraseInDisplay @params + + # CSI Ps K Erase in Line (EL). + when "K" + @eraseInLine @params + + # CSI Pm m Character Attributes (SGR). + when "m" + @charAttributes @params unless @prefix + + # CSI Ps n Device Status Report (DSR). + when "n" + @deviceStatus @params unless @prefix + + # CSI Ps @ + # Insert Ps (Blank) Character(s) (default = 1) (ICH). + when "@" + @insertChars @params + + # CSI Ps E + # Cursor Next Line Ps Times (default = 1) (CNL). + when "E" + @cursorNextLine @params + + # CSI Ps F + # Cursor Preceding Line Ps Times (default = 1) (CNL). + when "F" + @cursorPrecedingLine @params + + # CSI Ps G + # Cursor Character Absolute [column] (default = [row,1]) (CHA). + when "G" + @cursorCharAbsolute @params + + # CSI Ps L + # Insert Ps Line(s) (default = 1) (IL). + when "L" + @insertLines @params + + # CSI Ps M + # Delete Ps Line(s) (default = 1) (DL). + when "M" + @deleteLines @params + + # CSI Ps P + # Delete Ps Character(s) (default = 1) (DCH). + when "P" + @deleteChars @params + + # CSI Ps X + # Erase Ps Character(s) (default = 1) (ECH). + when "X" + @eraseChars @params + + # CSI Pm ` Character Position Absolute + # [column] (default = [row,1]) (HPA). + when "`" + @charPosAbsolute @params + + # 141 61 a * HPR - + # Horizontal Position Relative + when "a" + @HPositionRelative @params + + # CSI P s c + # Send Device Attributes (Primary DA). + # CSI > P s c + # Send Device Attributes (Secondary DA) + when "c" + @sendDeviceAttributes @params + + # CSI Pm d + # Line Position Absolute [row] (default = [1,column]) (VPA). + when "d" + @linePosAbsolute @params + + # 145 65 e * VPR - Vertical Position Relative + when "e" + @VPositionRelative @params + + # CSI Ps ; Ps f + # Horizontal and Vertical Position [row;column] (default = + # [1,1]) (HVP). + when "f" + @HVPosition @params + + # CSI Pm h Set Mode (SM). + # CSI ? Pm h - mouse escape codes, cursor escape codes + when "h" + @setMode @params + + # CSI Pm l Reset Mode (RM). + # CSI ? Pm l + when "l" + @resetMode @params + + # CSI Ps ; Ps r + # Set Scrolling Region [top;bottom] (default = full size of win- + # dow) (DECSTBM). + # CSI ? Pm r + when "r" + @setScrollRegion @params + + # CSI s + # Save cursor (ANSI.SYS). + when "s" + @saveCursor @params + + # CSI u + # Restore cursor (ANSI.SYS). + when "u" + @restoreCursor @params + + # CSI Ps I + # Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). + when "I" + @cursorForwardTab @params + + # CSI Ps S Scroll up Ps lines (default = 1) (SU). + when "S" + @scrollUp @params + + # CSI Ps T Scroll down Ps lines (default = 1) (SD). + # CSI Ps ; Ps ; Ps ; Ps ; Ps T + # CSI > Ps; Ps T + when "T" + @scrollDown @params if @params.length < 2 and not @prefix + + # CSI Ps Z + # Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). + when "Z" + @cursorBackwardTab @params + + # CSI Ps b Repeat the preceding graphic character Ps times (REP). + when "b" + @repeatPrecedingCharacter @params + + # CSI Ps g Tab Clear (TBC). + when "g" + @tabClear @params + + # CSI > Ps p Set pointer mode. + # CSI ! p Soft terminal reset (DECSTR). + # CSI Ps$ p + # Request ANSI mode (DECRQM). + # CSI ? Ps$ p + # Request DEC private mode (DECRQM). + # CSI Ps ; Ps " p + when "p" + if @prefix is '!' + @softReset @params + + else + console.error "Unknown CSI code: %s.", ch + @prefix = "" + + when State.dcs + if ch is "\x1b" or ch is "\x07" + i++ if ch is "\x1b" + switch @prefix + # User-Defined Keys (DECUDK). + when "" + break + + # Request Status String (DECRQSS). + # test: echo -e '\eP$q"p\e\\' + when "$q" + pt = @currentParam + valid = false + switch pt + + # DECSCA + when "\"q" + pt = "0\"q" + + # DECSCL + when "\"p" + pt = "61\"p" + + # DECSTBM + when "r" + pt = "" + (@scrollTop + 1) + ";" + (@scrollBottom + 1) + "r" + + # SGR + when "m" + pt = "0m" + + else + console.error "Unknown DCS Pt: %s.", pt + pt = "" + + @send "\x1bP" + +valid + "$r" + pt + "\x1b\\" + + when "+q" + pt = @currentParam + valid = false + @send "\x1bP" + +valid + "+r" + pt + "\x1b\\" + + else + console.error "Unknown DCS prefix: %s.", @prefix + + @currentParam = 0 + @prefix = "" + @state = State.normal + + else unless @currentParam + if not @prefix and ch isnt "$" and ch isnt "+" + @currentParam = ch + else if @prefix.length is 2 + @currentParam = ch + else + @prefix += ch + else + @currentParam += ch + + when State.ignore + # For PM and APC. + if ch is "\x1b" or ch is "\x07" + i++ if ch is "\x1b" + @state = State.normal + i++ + @updateRange @y + @refresh @refreshStart, @refreshEnd + + writeln: (data) -> + @write "#{data}\r\n" + + keyDown: (ev) -> + # Key Resources: + # https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent + # Don't handle modifiers alone + return true if ev.keyCode > 15 and ev.keyCode < 19 + + # Handle shift insert and ctrl insert + # copy/paste usefull for typematrix keyboard + return true if (ev.shiftKey or ev.ctrlKey) and ev.keyCode is 45 + + # Let the ctrl+shift+c, ctrl+shift+v go through to handle native copy paste + return true if (ev.shiftKey and ev.ctrlKey) and ev.keyCode in [67, 86] + + # Alt-z works as an escape to relay the following keys to the browser. + # usefull to trigger browser shortcuts, i.e.: Alt+Z F5 to reload + # May be redundant with keyPrefix + if ev.altKey and ev.keyCode is 90 and not @skipNextKey + @skipNextKey = true + @element.classList.add('skip') + return cancel(ev) + + if @skipNextKey + @skipNextKey = false + @element.classList.remove('skip') + return true + + switch ev.keyCode + # backspace + when 8 + key = if ev.altKey then "\x1b" else "" + if ev.shiftKey + key += "\x08" # ^H + break + key += "\x7f" # ^? + + # tab + when 9 + if ev.shiftKey + key = "\x1b[Z" + break + key = "\t" + + # return/enter + when 13 + key = "\r" + + # escape + when 27 + key = "\x1b" + + # left-arrow + when 37 + if @applicationCursor + key = "\x1bOD" # SS3 as ^[O for 7-bit + #key = '\x8fD'; // SS3 as 0x8f for 8-bit + break + key = "\x1b[D" + + # right-arrow + when 39 + if @applicationCursor + key = "\x1bOC" + break + key = "\x1b[C" + + # up-arrow + when 38 + if @applicationCursor + key = "\x1bOA" + break + if ev.ctrlKey + @scrollDisp -1 + return cancel(ev) else - # add our new line - @lines.splice row, 0, @blankLine() - - if @scrollTop isnt 0 - if @ybase isnt 0 - @ybase-- - @ydisp = @ybase - @lines.splice @ybase + @scrollTop, 1 - - @updateRange @scrollTop - @updateRange @scrollBottom - - scrollDisp: (disp) -> - @ydisp += disp - if @ydisp > @ybase - @ydisp = @ybase + key = "\x1b[A" + # down-arrow + when 40 + if @applicationCursor + key = "\x1bOB" + break + if ev.ctrlKey + @scrollDisp 1 + return cancel(ev) else - @ydisp = 0 if @ydisp < 0 - - @refresh 0, @rows - 1 - - write: (data) -> - @refreshStart = @y - @refreshEnd = @y - - if @ybase isnt @ydisp - @ydisp = @ybase - @maxRange() - - i = 0 - l = data.length - while i < l - ch = data[i] - switch @state - when State.normal - switch ch - - # '\a' - when "\x07" - @bell() - - # '\n', '\v', '\f' - when "\n", "\x0b", "\x0c" - @x = 0 if @convertEol - - @y++ - if @y > @scrollBottom - @y-- - @scroll() - - # '\r' - when "\r" - @x = 0 - - # '\b' - when "\b" - @x-- if @x > 0 - - # '\t' - when "\t" - @x = @nextStop() - - # shift out - when "\x0e" - @setgLevel 1 - - # shift in - when "\x0f" - @setgLevel 0 - - # '\e' - when "\x1b" - @state = State.escaped - - else - # ' ' - if ch >= " " - ch = @charset[ch] if @charset?[ch] - if @x >= @cols - @x = 0 - @y++ - if @y > @scrollBottom - @y-- - @scroll() - @lines[@y + @ybase][@x] = [@curAttr, ch] - @x++ - @updateRange @y - if "\uff00" < ch < "\uffef" - j = @y + @ybase - if @cols < 2 or @x >= @cols - @lines[j][@x - 1] = [@curAttr, " "] - break - - @lines[j][@x] = [@curAttr, " "] - @x++ - - when State.escaped - switch ch - # ESC [ Control Sequence Introducer ( CSI is 0x9b). - when "[" - @params = [] - @currentParam = 0 - @state = State.csi - - # ESC ] Operating System Command ( OSC is 0x9d). - when "]" - @params = [] - @currentParam = 0 - @state = State.osc - - # ESC P Device Control String ( DCS is 0x90). - when "P" - @params = [] - @currentParam = 0 - @state = State.dcs - - # ESC _ Application Program Command ( APC is 0x9f). - when "_" - @state = State.ignore - - # ESC ^ Privacy Message ( PM is 0x9e). - when "^" - @state = State.ignore - - # ESC c Full Reset (RIS). - when "c" - @reset() - - # ESC E Next Line ( NEL is 0x85). - when "E" - @x = 0 - @index() - - # ESC D Index ( IND is 0x84). - when "D" - @index() - - # ESC M Reverse Index ( RI is 0x8d). - when "M" - @reverseIndex() - - # ESC % Select default/utf-8 character set. - # @ = default, G = utf-8 - when "%" - @setgLevel 0 - @setgCharset 0, Terminal::charsets.US - @state = State.normal - i++ - - # ESC (,),*,+,-,. Designate G0-G2 Character Set. - # <-- this seems to get all the attention - when "(", ")" , "*" , "+" , "-" , "." - switch ch - when "(" - @gcharset = 0 - when ")", "-" - @gcharset = 1 - when "*", "." - @gcharset = 2 - when "+" - @gcharset = 3 - @state = State.charset - - # Designate G3 Character Set (VT300). - # A = ISO Latin-1 Supplemental. - # Not implemented. - when "/" - @gcharset = 3 - @state = State.charset - i-- - - # ESC n - # Invoke the G2 Character Set as GL (LS2). - when "n" - @setgLevel 2 - - # ESC o - # Invoke the G3 Character Set as GL (LS3). - when "o" - @setgLevel 3 - - # ESC | - # Invoke the G3 Character Set as GR (LS3R). - when "|" - @setgLevel 3 - - # ESC } - # Invoke the G2 Character Set as GR (LS2R). - when "}" - @setgLevel 2 - - # ESC ~ - # Invoke the G1 Character Set as GR (LS1R). - when "~" - @setgLevel 1 - - # ESC 7 Save Cursor (DECSC). - when "7" - @saveCursor() - @state = State.normal - - # ESC 8 Restore Cursor (DECRC). - when "8" - @restoreCursor() - @state = State.normal - - # ESC # 3 DEC line height/width - when "#" - @state = State.normal - i++ - - # ESC H Tab Set (HTS is 0x88). - when "H" - @tabSet() - - # ESC = Application Keypad (DECPAM). - when "=" - @applicationKeypad = true - @state = State.normal - - # ESC > Normal Keypad (DECPNM). - when ">" - @applicationKeypad = false - @state = State.normal - else - @state = State.normal - console.log "Unknown ESC control:", ch - - when State.charset - switch ch - when "0" # DEC Special Character and Line Drawing Set. - cs = Terminal::charsets.SCLD - when "A" # UK - cs = Terminal::charsets.UK - when "B" # United States (USASCII). - cs = Terminal::charsets.US - when "4" # Dutch - cs = Terminal::charsets.Dutch - # Finnish - when "C", "5" - cs = Terminal::charsets.Finnish - when "R" # French - cs = Terminal::charsets.French - when "Q" # FrenchCanadian - cs = Terminal::charsets.FrenchCanadian - when "K" # German - cs = Terminal::charsets.German - when "Y" # Italian - cs = Terminal::charsets.Italian - # NorwegianDanish - when "E", "6" - cs = Terminal::charsets.NorwegianDanish - when "Z" # Spanish - cs = Terminal::charsets.Spanish - # Swedish - when "H", "7" - cs = Terminal::charsets.Swedish - when "=" # Swiss - cs = Terminal::charsets.Swiss - when "/" # ISOLatin (actually /A) - cs = Terminal::charsets.ISOLatin - i++ - else # Default - cs = Terminal::charsets.US - @setgCharset @gcharset, cs - @gcharset = null - @state = State.normal - - when State.osc - # OSC Ps ; Pt ST - # OSC Ps ; Pt BEL - # Set Text Parameters. - if ch is "\x1b" or ch is "\x07" - i++ if ch is "\x1b" - @params.push @currentParam - switch @params[0] - when 0, 1 , 2 - if @params[1] - @title = @params[1] + " - ƸӜƷ butterfly" - @handleTitle @title - - # Disabling this for now as we need a good script striper to avoid malicious script injection - # when 99 - # # Custom escape to produce raw html - # html = "
" + @params[1] + "
" - # @lines[@y + @ybase][@x] = [ - # @curAttr - # html - # ] - # line = 0 - - # while line < @get_html_height_in_lines(html) - 1 - # @y++ - # if @y > @scrollBottom - # @y-- - # @scroll() - # line++ - # @updateRange @y - - # reset colors - @params = [] - @currentParam = 0 - @state = State.normal - else - unless @params.length - if ch >= "0" and ch <= "9" - @currentParam = @currentParam * 10 + ch.charCodeAt(0) - 48 - else if ch is ";" - @params.push @currentParam - @currentParam = "" - else - @currentParam += ch - - when State.csi - # '?', '>', '!' - if ch is "?" or ch is ">" or ch is "!" - @prefix = ch - break - - # 0 - 9 - if ch >= "0" and ch <= "9" - @currentParam = @currentParam * 10 + ch.charCodeAt(0) - 48 - break - - # '$', '"', ' ', '\'' - if ch is "$" or ch is "\"" or ch is " " or ch is "'" - break - @params.push @currentParam - @currentParam = 0 - - # ';' - break if ch is ";" - @state = State.normal - switch ch - # CSI Ps A - # Cursor Up Ps Times (default = 1) (CUU). - when "A" - @cursorUp @params - - # CSI Ps B - # Cursor Down Ps Times (default = 1) (CUD). - when "B" - @cursorDown @params - - # CSI Ps C - # Cursor Forward Ps Times (default = 1) (CUF). - when "C" - @cursorForward @params - - # CSI Ps D - # Cursor Backward Ps Times (default = 1) (CUB). - when "D" - @cursorBackward @params - - # CSI Ps ; Ps H - # Cursor Position [row;column] (default = [1,1]) (CUP). - when "H" - @cursorPos @params - - # CSI Ps J Erase in Display (ED). - when "J" - @eraseInDisplay @params - - # CSI Ps K Erase in Line (EL). - when "K" - @eraseInLine @params - - # CSI Pm m Character Attributes (SGR). - when "m" - @charAttributes @params unless @prefix - - # CSI Ps n Device Status Report (DSR). - when "n" - @deviceStatus @params unless @prefix - - # CSI Ps @ - # Insert Ps (Blank) Character(s) (default = 1) (ICH). - when "@" - @insertChars @params - - # CSI Ps E - # Cursor Next Line Ps Times (default = 1) (CNL). - when "E" - @cursorNextLine @params - - # CSI Ps F - # Cursor Preceding Line Ps Times (default = 1) (CNL). - when "F" - @cursorPrecedingLine @params - - # CSI Ps G - # Cursor Character Absolute [column] (default = [row,1]) (CHA). - when "G" - @cursorCharAbsolute @params - - # CSI Ps L - # Insert Ps Line(s) (default = 1) (IL). - when "L" - @insertLines @params - - # CSI Ps M - # Delete Ps Line(s) (default = 1) (DL). - when "M" - @deleteLines @params - - # CSI Ps P - # Delete Ps Character(s) (default = 1) (DCH). - when "P" - @deleteChars @params - - # CSI Ps X - # Erase Ps Character(s) (default = 1) (ECH). - when "X" - @eraseChars @params - - # CSI Pm ` Character Position Absolute - # [column] (default = [row,1]) (HPA). - when "`" - @charPosAbsolute @params - - # 141 61 a * HPR - - # Horizontal Position Relative - when "a" - @HPositionRelative @params - - # CSI P s c - # Send Device Attributes (Primary DA). - # CSI > P s c - # Send Device Attributes (Secondary DA) - when "c" - @sendDeviceAttributes @params - - # CSI Pm d - # Line Position Absolute [row] (default = [1,column]) (VPA). - when "d" - @linePosAbsolute @params - - # 145 65 e * VPR - Vertical Position Relative - when "e" - @VPositionRelative @params - - # CSI Ps ; Ps f - # Horizontal and Vertical Position [row;column] (default = - # [1,1]) (HVP). - when "f" - @HVPosition @params - - # CSI Pm h Set Mode (SM). - # CSI ? Pm h - mouse escape codes, cursor escape codes - when "h" - @setMode @params - - # CSI Pm l Reset Mode (RM). - # CSI ? Pm l - when "l" - @resetMode @params - - # CSI Ps ; Ps r - # Set Scrolling Region [top;bottom] (default = full size of win- - # dow) (DECSTBM). - # CSI ? Pm r - when "r" - @setScrollRegion @params - - # CSI s - # Save cursor (ANSI.SYS). - when "s" - @saveCursor @params - - # CSI u - # Restore cursor (ANSI.SYS). - when "u" - @restoreCursor @params - - # CSI Ps I - # Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). - when "I" - @cursorForwardTab @params - - # CSI Ps S Scroll up Ps lines (default = 1) (SU). - when "S" - @scrollUp @params - - # CSI Ps T Scroll down Ps lines (default = 1) (SD). - # CSI Ps ; Ps ; Ps ; Ps ; Ps T - # CSI > Ps; Ps T - when "T" - @scrollDown @params if @params.length < 2 and not @prefix - - # CSI Ps Z - # Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). - when "Z" - @cursorBackwardTab @params - - # CSI Ps b Repeat the preceding graphic character Ps times (REP). - when "b" - @repeatPrecedingCharacter @params - - # CSI Ps g Tab Clear (TBC). - when "g" - @tabClear @params - - # CSI > Ps p Set pointer mode. - # CSI ! p Soft terminal reset (DECSTR). - # CSI Ps$ p - # Request ANSI mode (DECRQM). - # CSI ? Ps$ p - # Request DEC private mode (DECRQM). - # CSI Ps ; Ps " p - when "p" - if @prefix is '!' - @softReset @params - - else - console.error "Unknown CSI code: %s.", ch - @prefix = "" - - when State.dcs - if ch is "\x1b" or ch is "\x07" - i++ if ch is "\x1b" - switch @prefix - # User-Defined Keys (DECUDK). - when "" - break - - # Request Status String (DECRQSS). - # test: echo -e '\eP$q"p\e\\' - when "$q" - pt = @currentParam - valid = false - switch pt - - # DECSCA - when "\"q" - pt = "0\"q" - - # DECSCL - when "\"p" - pt = "61\"p" - - # DECSTBM - when "r" - pt = "" + (@scrollTop + 1) + ";" + (@scrollBottom + 1) + "r" - - # SGR - when "m" - pt = "0m" - - else - console.error "Unknown DCS Pt: %s.", pt - pt = "" - - @send "\x1bP" + +valid + "$r" + pt + "\x1b\\" - - when "+q" - pt = @currentParam - valid = false - @send "\x1bP" + +valid + "+r" + pt + "\x1b\\" - - else - console.error "Unknown DCS prefix: %s.", @prefix - - @currentParam = 0 - @prefix = "" - @state = State.normal - - else unless @currentParam - if not @prefix and ch isnt "$" and ch isnt "+" - @currentParam = ch - else if @prefix.length is 2 - @currentParam = ch - else - @prefix += ch - else - @currentParam += ch - - when State.ignore - # For PM and APC. - if ch is "\x1b" or ch is "\x07" - i++ if ch is "\x1b" - @state = State.normal - i++ - @updateRange @y - @refresh @refreshStart, @refreshEnd - - writeln: (data) -> - @write "#{data}\r\n" - - keyDown: (ev) -> - # Key Resources: - # https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent - # Don't handle modifiers alone - return true if ev.keyCode > 15 and ev.keyCode < 19 - - # Handle shift insert and ctrl insert copy/paste usefull for typematrix keyboard - return true if (ev.shiftKey or ev.ctrlKey) and ev.keyCode is 45 - - # Let the ctrl+shift+c, ctrl+shift+v go through to handle native copy paste - return true if (ev.shiftKey and ev.ctrlKey) and ev.keyCode in [67, 86] - - # Alt-z works as an escape to relay the following keys to the browser. - # usefull to trigger browser shortcuts, i.e.: Alt+Z F5 to reload - # May be redundant with keyPrefix - if ev.altKey and ev.keyCode is 90 and not @skipNextKey - @skipNextKey = true - @element.classList.add('skip') - return cancel(ev) - - if @skipNextKey - @skipNextKey = false - @element.classList.remove('skip') - return true - - switch ev.keyCode - # backspace - when 8 - key = if ev.altKey then "\x1b" else "" - if ev.shiftKey - key += "\x08" # ^H - break - key += "\x7f" # ^? - - # tab - when 9 - if ev.shiftKey - key = "\x1b[Z" - break - key = "\t" - - # return/enter - when 13 - key = "\r" - - # escape - when 27 - key = "\x1b" - - # left-arrow - when 37 - if @applicationCursor - key = "\x1bOD" # SS3 as ^[O for 7-bit - #key = '\x8fD'; // SS3 as 0x8f for 8-bit - break - key = "\x1b[D" - - # right-arrow - when 39 - if @applicationCursor - key = "\x1bOC" - break - key = "\x1b[C" - - # up-arrow - when 38 - if @applicationCursor - key = "\x1bOA" - break - if ev.ctrlKey - @scrollDisp -1 - return cancel(ev) - else - key = "\x1b[A" - - # down-arrow - when 40 - if @applicationCursor - key = "\x1bOB" - break - if ev.ctrlKey - @scrollDisp 1 - return cancel(ev) - else - key = "\x1b[B" + key = "\x1b[B" + + # delete + when 46 + key = "\x1b[3~" + + # insert + when 45 + key = "\x1b[2~" + + # home + when 36 + if @applicationKeypad + key = "\x1bOH" + break + key = "\x1bOH" + + # end + when 35 + if @applicationKeypad + key = "\x1bOF" + break + key = "\x1bOF" + + # page up + when 33 + if ev.shiftKey + @scrollDisp -(@rows - 1) + return cancel(ev) + else + key = "\x1b[5~" + + # page down + when 34 + if ev.shiftKey + @scrollDisp @rows - 1 + return cancel(ev) + else + key = "\x1b[6~" + + # F1 + when 112 + key = "\x1bOP" + + # F2 + when 113 + key = "\x1bOQ" + + # F3 + when 114 + key = "\x1bOR" + + # F4 + when 115 + key = "\x1bOS" + + # F5 + when 116 + key = "\x1b[15~" + + # F6 + when 117 + key = "\x1b[17~" + + # F7 + when 118 + key = "\x1b[18~" + + # F8 + when 119 + key = "\x1b[19~" + + # F9 + when 120 + key = "\x1b[20~" + + # F10 + when 121 + key = "\x1b[21~" + + # F11 + when 122 + key = "\x1b[23~" + + # F12 + when 123 + key = "\x1b[24~" + + else + # a-z and space + if ev.ctrlKey + if ev.keyCode >= 65 and ev.keyCode <= 90 + if ev.keyCode is 67 + t = (new Date()).getTime() + if (t - @last_cc) < 75 + id = (setTimeout ->) - 6 # Let the end write + @write '\r\n --8<------8<-- Sectioned --8<------8<-- \r\n\r\n' + (clearTimeout id if id not in [ + @t_bell, @t_queue, @t_blink]) while id-- + @last_cc = t + key = String.fromCharCode(ev.keyCode - 64) + else if ev.keyCode is 32 + + # NUL + key = String.fromCharCode(0) + else if ev.keyCode >= 51 and ev.keyCode <= 55 + + # escape, file sep, group sep, record sep, unit sep + key = String.fromCharCode(ev.keyCode - 51 + 27) + else if ev.keyCode is 56 # delete - when 46 - key = "\x1b[3~" - - # insert - when 45 - key = "\x1b[2~" - - # home - when 36 - if @applicationKeypad - key = "\x1bOH" - break - key = "\x1bOH" - - # end - when 35 - if @applicationKeypad - key = "\x1bOF" - break - key = "\x1bOF" - - # page up - when 33 - if ev.shiftKey - @scrollDisp -(@rows - 1) - return cancel(ev) - else - key = "\x1b[5~" - - # page down - when 34 - if ev.shiftKey - @scrollDisp @rows - 1 - return cancel(ev) - else - key = "\x1b[6~" - - # F1 - when 112 - key = "\x1bOP" - - # F2 - when 113 - key = "\x1bOQ" - - # F3 - when 114 - key = "\x1bOR" - - # F4 - when 115 - key = "\x1bOS" - - # F5 - when 116 - key = "\x1b[15~" - - # F6 - when 117 - key = "\x1b[17~" - - # F7 - when 118 - key = "\x1b[18~" - - # F8 - when 119 - key = "\x1b[19~" - - # F9 - when 120 - key = "\x1b[20~" - - # F10 - when 121 - key = "\x1b[21~" - - # F11 - when 122 - key = "\x1b[23~" - - # F12 - when 123 - key = "\x1b[24~" - - else - # a-z and space - if ev.ctrlKey - if ev.keyCode >= 65 and ev.keyCode <= 90 - if ev.keyCode is 67 - t = (new Date()).getTime() - if (t - @last_cc) < 75 - id = (setTimeout ->) - 6 # Let the end write - @write '\r\n --8<------8<-- Sectioned --8<------8<-- \r\n\r\n' - (clearTimeout id if id not in [@t_bell, @t_queue, @t_blink]) while id-- - @last_cc = t - key = String.fromCharCode(ev.keyCode - 64) - else if ev.keyCode is 32 - - # NUL - key = String.fromCharCode(0) - else if ev.keyCode >= 51 and ev.keyCode <= 55 - - # escape, file sep, group sep, record sep, unit sep - key = String.fromCharCode(ev.keyCode - 51 + 27) - else if ev.keyCode is 56 - - # delete - key = String.fromCharCode(127) - else if ev.keyCode is 219 - - # ^[ - escape - key = String.fromCharCode(27) - - # ^] - group sep - else - key = String.fromCharCode(29) if ev.keyCode is 221 - - else if (ev.altKey and 'Mac' not in navigator.platform) or (ev.metaKey and 'Mac' in navigator.platform) - if ev.keyCode >= 65 and ev.keyCode <= 90 - key = "\x1b" + String.fromCharCode(ev.keyCode + 32) - else if ev.keyCode is 192 - key = "\x1b`" - else - key = "\x1b" + (ev.keyCode - 48) if ev.keyCode >= 48 and ev.keyCode <= 57 - - if ev.keyCode >= 37 and ev.keyCode <= 40 - if ev.ctrlKey - key = key.slice(0, -1) + "1;5" + key.slice(-1) - else if ev.altKey - key = key.slice(0, -1) + "1;3" + key.slice(-1) - else if ev.shiftKey - key = key.slice(0, -1) + "1;4" + key.slice(-1) - - return true unless key - - if @prefixMode - @leavePrefix() - return cancel(ev) - - if @selectMode - @keySelect ev, key - return cancel(ev) - - @showCursor() - @handler(key) - cancel ev - - - setgLevel: (g) -> - @glevel = g - @charset = @charsets[g] - - setgCharset: (g, charset) -> - @charsets[g] = charset - @charset = charset if @glevel is g - - keyPress: (ev) -> - if @skipNextKey is false - @skipNextKey = null - return true - - cancel ev - - if ev.charCode - key = ev.charCode - else unless ev.which? - key = ev.keyCode - else if ev.which isnt 0 and ev.charCode isnt 0 - key = ev.which - else - return false - - return false if not key or ev.ctrlKey or ev.altKey or ev.metaKey - key = String.fromCharCode(key) - - @showCursor() - @handler key - false - - send: (data) -> - unless @queue - @t_queue = setTimeout (=> - @handler @queue - @queue = "" - ), 1 - - @queue += data - - bell: -> - return unless @visualBell - @element.classList.add "bell" - @t_bell = setTimeout (=> - @element.classList.remove "bell" - ), @visualBell - - resize: -> - old_cols = @cols - old_rows = @rows - term_size = @parent.getBoundingClientRect() - @cols = Math.floor(term_size.width / @char_size.width) - 1 # ? - @rows = Math.floor(term_size.height / @char_size.height) - if old_cols == @cols and old_rows == @rows - return - - @ctl 'Resize', @cols, @rows - - # resize cols - if old_cols < @cols - # does xterm use the default attr? - ch = [@defAttr, " "] - i = @lines.length - while i-- - @lines[i].push ch while @lines[i].length < @cols - else if old_cols > @cols - i = @lines.length - while i-- - @lines[i].pop() while @lines[i].length > @cols - - @setupStops old_cols - - # resize rows - j = old_rows - if j < @rows - el = @element - while j++ < @rows - @lines.push @blankLine() if @lines.length < @rows + @ybase - if @children.length < @rows - line = @document.createElement("div") - line.className = 'line' - line.style.height = @char_size.height + 'px' - el.appendChild line - @children.push line - else if j > @rows - while j-- > @rows - @lines.pop() if @lines.length > @rows + @ybase - if @children.length > @rows - el = @children.pop() - continue unless el - el.parentNode.removeChild el - - # make sure the cursor stays on screen - @y = @rows - 1 if @y >= @rows - @x = @cols - 1 if @x >= @cols - - @scrollTop = 0 - @scrollBottom = @rows - 1 - - @refresh 0, @rows - 1 - - # it's a real nightmare trying - # to resize the original - # screen buffer. just set it - # to null for now. - @normal = null - - updateRange: (y) -> - @refreshStart = y if y < @refreshStart - @refreshEnd = y if y > @refreshEnd - - maxRange: -> - @refreshStart = 0 - @refreshEnd = @rows - 1 - - setupStops: (i) -> - if i? - i = @prevStop(i) unless @tabs[i] - else - @tabs = {} - i = 0 - while i < @cols - @tabs[i] = true - i += 8 - - prevStop: (x) -> - x = @x unless x? - while not @tabs[--x] and x > 0 - 1 - - if x >= @cols then @cols - 1 else (if x < 0 then 0 else x) - - nextStop: (x) -> - x = @x unless x? - while not @tabs[++x] and x < @cols - 1 - - if x >= @cols then @cols - 1 else (if x < 0 then 0 else x) - - eraseRight: (x, y) -> - line = @lines[@ybase + y] - # xterm - ch = [@eraseAttr(), " "] - - while x < @cols - line[x] = ch - x++ - @updateRange y - - eraseLeft: (x, y) -> - line = @lines[@ybase + y] - # xterm - ch = [@eraseAttr(), " "] - x++ - line[x] = ch while x-- - @updateRange y - - eraseLine: (y) -> - @eraseRight 0, y - - blankLine: (cur) -> - attr = (if cur then @eraseAttr() else @defAttr) - ch = [attr, " "] - line = [] - i = 0 - while i < @cols - line[i] = ch - i++ - line - - ch: (cur) -> - if cur then [@eraseAttr(), " "] else [@defAttr, " "] - - isterm: (term) -> - "#{@termName}".indexOf(term) is 0 - - handler: (data) -> - @out data - - handleTitle: (title) -> - document.title = title - - ## ESC ## - - # ESC D Index (IND is 0x84). - index: -> - @y++ - if @y > @scrollBottom - @y-- - @scroll() - @state = State.normal - - # ESC M Reverse Index (RI is 0x8d). - reverseIndex: -> - @y-- - if @y < @scrollTop - @y++ - - # possibly move the code below to term.reverseScroll(); - # test: echo -ne '\e[1;1H\e[44m\eM\e[0m' - # blankLine(true) is xterm/linux behavior - @lines.splice @y + @ybase, 0, @blankLine(true) - j = @rows - 1 - @scrollBottom - @lines.splice @rows - 1 + @ybase - j + 1, 1 - - # @maxRange(); - @updateRange @scrollTop - @updateRange @scrollBottom - @state = State.normal - - - # ESC c Full Reset (RIS). - reset: -> - @reset_vars() - @refresh 0, @rows - 1 - - # ESC H Tab Set (HTS is 0x88). - tabSet: -> - @tabs[@x] = true - @state = State.normal - - - ## CSI ## - - # CSI Ps A - # Cursor Up Ps Times (default = 1) (CUU). - cursorUp: (params) -> - param = params[0] - param = 1 if param < 1 - @y -= param - @y = 0 if @y < 0 - - # CSI Ps B - # Cursor Down Ps Times (default = 1) (CUD). - cursorDown: (params) -> - param = params[0] - param = 1 if param < 1 - @y += param - @y = @rows - 1 if @y >= @rows - - # CSI Ps C - # Cursor Forward Ps Times (default = 1) (CUF). - cursorForward: (params) -> - param = params[0] - param = 1 if param < 1 - @x += param - @x = @cols - 1 if @x >= @cols - - # CSI Ps D - # Cursor Backward Ps Times (default = 1) (CUB). - cursorBackward: (params) -> - param = params[0] - param = 1 if param < 1 - @x -= param - @x = 0 if @x < 0 - - # CSI Ps ; Ps H - # Cursor Position [row;column] (default = [1,1]) (CUP). - cursorPos: (params) -> - row = params[0] - 1 - if params.length >= 2 - col = params[1] - 1 - else - col = 0 - - if row < 0 - row = 0 - else - row = @rows - 1 if row >= @rows - - if col < 0 - col = 0 - else - col = @cols - 1 if col >= @cols - - @x = col - @y = row - - - # CSI Ps J Erase in Display (ED). - # Ps = 0 -> Erase Below (default). - # Ps = 1 -> Erase Above. - # Ps = 2 -> Erase All. - # Ps = 3 -> Erase Saved Lines (xterm). - # CSI ? Ps J - # Erase in Display (DECSED). - # Ps = 0 -> Selective Erase Below (default). - # Ps = 1 -> Selective Erase Above. - # Ps = 2 -> Selective Erase All. - eraseInDisplay: (params) -> - switch params[0] - when 0 - @eraseRight @x, @y - j = @y + 1 - while j < @rows - @eraseLine j - j++ - when 1 - @eraseLeft @x, @y - j = @y - @eraseLine j while j-- - when 2 - j = @rows - @eraseLine j while j-- - - - # CSI Ps K Erase in Line (EL). - # Ps = 0 -> Erase to Right (default). - # Ps = 1 -> Erase to Left. - # Ps = 2 -> Erase All. - # CSI ? Ps K - # Erase in Line (DECSEL). - # Ps = 0 -> Selective Erase to Right (default). - # Ps = 1 -> Selective Erase to Left. - # Ps = 2 -> Selective Erase All. - eraseInLine: (params) -> - switch params[0] - when 0 - @eraseRight @x, @y - when 1 - @eraseLeft @x, @y - when 2 - @eraseLine @y - - - # CSI Pm m Character Attributes (SGR). - # Ps = 0 -> Normal (default). - # Ps = 1 -> Bold. - # Ps = 4 -> Underlined. - # Ps = 5 -> Blink (appears as Bold). - # Ps = 7 -> Inverse. - # Ps = 8 -> Invisible, i.e., hidden (VT300). - # Ps = 2 2 -> Normal (neither bold nor faint). - # Ps = 2 4 -> Not underlined. - # Ps = 2 5 -> Steady (not blinking). - # Ps = 2 7 -> Positive (not inverse). - # Ps = 2 8 -> Visible, i.e., not hidden (VT300). - # Ps = 3 0 -> Set foreground color to Black. - # Ps = 3 1 -> Set foreground color to Red. - # Ps = 3 2 -> Set foreground color to Green. - # Ps = 3 3 -> Set foreground color to Yellow. - # Ps = 3 4 -> Set foreground color to Blue. - # Ps = 3 5 -> Set foreground color to Magenta. - # Ps = 3 6 -> Set foreground color to Cyan. - # Ps = 3 7 -> Set foreground color to White. - # Ps = 3 9 -> Set foreground color to default (original). - # Ps = 4 0 -> Set background color to Black. - # Ps = 4 1 -> Set background color to Red. - # Ps = 4 2 -> Set background color to Green. - # Ps = 4 3 -> Set background color to Yellow. - # Ps = 4 4 -> Set background color to Blue. - # Ps = 4 5 -> Set background color to Magenta. - # Ps = 4 6 -> Set background color to Cyan. - # Ps = 4 7 -> Set background color to White. - # Ps = 4 9 -> Set background color to default (original). - - # If 16-color support is compiled, the following apply. Assume - # that xterm's resources are set so that the ISO color codes are - # the first 8 of a set of 16. Then the aixterm colors are the - # bright versions of the ISO colors: - # Ps = 9 0 -> Set foreground color to Black. - # Ps = 9 1 -> Set foreground color to Red. - # Ps = 9 2 -> Set foreground color to Green. - # Ps = 9 3 -> Set foreground color to Yellow. - # Ps = 9 4 -> Set foreground color to Blue. - # Ps = 9 5 -> Set foreground color to Magenta. - # Ps = 9 6 -> Set foreground color to Cyan. - # Ps = 9 7 -> Set foreground color to White. - # Ps = 1 0 0 -> Set background color to Black. - # Ps = 1 0 1 -> Set background color to Red. - # Ps = 1 0 2 -> Set background color to Green. - # Ps = 1 0 3 -> Set background color to Yellow. - # Ps = 1 0 4 -> Set background color to Blue. - # Ps = 1 0 5 -> Set background color to Magenta. - # Ps = 1 0 6 -> Set background color to Cyan. - # Ps = 1 0 7 -> Set background color to White. - - # If xterm is compiled with the 16-color support disabled, it - # supports the following, from rxvt: - # Ps = 1 0 0 -> Set foreground and background color to - # default. - - # If 88- or 256-color support is compiled, the following apply. - # Ps = 3 8 ; 5 ; Ps -> Set foreground color to the second - # Ps. - # Ps = 4 8 ; 5 ; Ps -> Set background color to the second - # Ps. - charAttributes: (params) -> - # Optimize a single SGR0. - if params.length is 1 and params[0] is 0 - @curAttr = @defAttr - return - flags = @curAttr >> 18 - - fg = (@curAttr >> 9) & 0x1ff - bg = @curAttr & 0x1ff - - l = params.length - i = 0 - while i < l - p = params[i] - if p >= 30 and p <= 37 - # fg color 8 - fg = p - 30 - else if p >= 40 and p <= 47 - # bg color 8 - bg = p - 40 - else if p >= 90 and p <= 97 - # fg color 16 - p += 8 - fg = p - 90 - else if p >= 100 and p <= 107 - # bg color 16 - p += 8 - bg = p - 100 - else if p is 0 - # default - flags = @defAttr >> 18 - fg = (@defAttr >> 9) & 0x1ff - bg = @defAttr & 0x1ff - - # flags = 0; - # fg = 0x1ff; - # bg = 0x1ff; - else if p is 1 - # bold text - flags |= 1 - else if p is 4 - # underlined text - flags |= 2 - else if p is 5 - # blink - flags |= 4 - else if p is 7 - # inverse and positive - # test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m' - flags |= 8 - else if p is 8 - # invisible - flags |= 16 - else if p is 22 - # not bold - flags &= ~1 - else if p is 24 - # not underlined - flags &= ~2 - else if p is 25 - # not blink - flags &= ~4 - else if p is 27 - # not inverse - flags &= ~8 - else if p is 28 - # not invisible - flags &= ~16 - else if p is 39 - # reset fg - fg = (@defAttr >> 9) & 0x1ff - else if p is 49 - # reset bg - bg = @defAttr & 0x1ff - else if p is 38 - if params[i + 1] is 2 - # fg color 2^24 - i += 2 - fg = "#" + params[i] & 0xff + params[i + 1] & 0xff + params[i + 2] & 0xff - i += 2 - else if params[i + 1] is 5 - # fg color 256 - i += 2 - fg = params[i] & 0xff - else if p is 48 - if params[i + 1] is 2 - # bg color 2^24 - i += 2 - bg = "#" + params[i] & 0xff + params[i + 1] & 0xff + params[i + 2] & 0xff - i += 2 - else if params[i + 1] is 5 - # bg color 256 - i += 2 - bg = params[i] & 0xff - else if p is 100 - # reset fg/bg - fg = (@defAttr >> 9) & 0x1ff - bg = @defAttr & 0x1ff - else - console.error "Unknown SGR attribute: %d.", p - i++ - @curAttr = (flags << 18) | (fg << 9) | bg - - - # CSI Ps n Device Status Report (DSR). - # Ps = 5 -> Status Report. Result (``OK'') is - # CSI 0 n - # Ps = 6 -> Report Cursor Position (CPR) [row;column]. - # Result is - # CSI r ; c R - # CSI ? Ps n - # Device Status Report (DSR, DEC-specific). - # Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI - # ? r ; c R (assumes page is zero). - # Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready). - # or CSI ? 1 1 n (not ready). - # Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked) - # or CSI ? 2 1 n (locked). - # Ps = 2 6 -> Report Keyboard status as - # CSI ? 2 7 ; 1 ; 0 ; 0 n (North American). - # The last two parameters apply to VT400 & up, and denote key- - # board ready and LK01 respectively. - # Ps = 5 3 -> Report Locator status as - # CSI ? 5 3 n Locator available, if compiled-in, or - # CSI ? 5 0 n No Locator, if not. - deviceStatus: (params) -> - unless @prefix - switch params[0] - when 5 - # status report - @send "\x1b[0n" - when 6 - # cursor position - @send "\x1b[" + (@y + 1) + ";" + (@x + 1) + "R" - else if @prefix is "?" - # modern xterm doesnt seem to - # respond to any of these except ?6, 6, and 5 - if params[0] is 6 - # cursor position - @send "\x1b[?" + (@y + 1) + ";" + (@x + 1) + "R" - - - ## Additions ## - - # CSI Ps @ - # Insert Ps (Blank) Character(s) (default = 1) (ICH). - insertChars: (params) -> - param = params[0] - param = 1 if param < 1 - row = @y + @ybase - j = @x - # xterm - ch = [@eraseAttr(), " "] - while param-- and j < @cols - @lines[row].splice j++, 0, ch - @lines[row].pop() - - - # CSI Ps E - # Cursor Next Line Ps Times (default = 1) (CNL). - # same as CSI Ps B ? - cursorNextLine: (params) -> - param = params[0] - param = 1 if param < 1 - @y += param - @y = @rows - 1 if @y >= @rows - @x = 0 - - - # CSI Ps F - # Cursor Preceding Line Ps Times (default = 1) (CNL). - # reuse CSI Ps A ? - cursorPrecedingLine: (params) -> - param = params[0] - param = 1 if param < 1 - @y -= param - @y = 0 if @y < 0 - @x = 0 - - - # CSI Ps G - # Cursor Character Absolute [column] (default = [row,1]) (CHA). - cursorCharAbsolute: (params) -> - param = params[0] - param = 1 if param < 1 - @x = param - 1 - - # CSI Ps L - # Insert Ps Line(s) (default = 1) (IL). - insertLines: (params) -> - param = params[0] - param = 1 if param < 1 - row = @y + @ybase - j = @rows - 1 - @scrollBottom - j = @rows - 1 + @ybase - j + 1 - while param-- - # test: echo -e '\e[44m\e[1L\e[0m' - # blankLine(true) - xterm/linux behavior - @lines.splice row, 0, @blankLine(true) - @lines.splice j, 1 - - @updateRange @y - @updateRange @scrollBottom - - - # CSI Ps M - # Delete Ps Line(s) (default = 1) (DL). - deleteLines: (params) -> - param = params[0] - param = 1 if param < 1 - row = @y + @ybase - j = @rows - 1 - @scrollBottom - j = @rows - 1 + @ybase - j - while param-- - # test: echo -e '\e[44m\e[1M\e[0m' - # blankLine(true) - xterm/linux behavior - @lines.splice j + 1, 0, @blankLine(true) - @lines.splice row, 1 - - @updateRange @y - @updateRange @scrollBottom - - - # CSI Ps P - # Delete Ps Character(s) (default = 1) (DCH). - deleteChars: (params) -> - param = params[0] - param = 1 if param < 1 - row = @y + @ybase - # xterm - ch = [@eraseAttr(), " "] - while param-- - @lines[row].splice @x, 1 - @lines[row].push ch - - - # CSI Ps X - # Erase Ps Character(s) (default = 1) (ECH). - eraseChars: (params) -> - param = params[0] - param = 1 if param < 1 - row = @y + @ybase - j = @x - # xterm - ch = [@eraseAttr(), " "] - @lines[row][j++] = ch while param-- and j < @cols - - - # CSI Pm ` Character Position Absolute - # [column] (default = [row,1]) (HPA). - charPosAbsolute: (params) -> - param = params[0] - param = 1 if param < 1 - @x = param - 1 - @x = @cols - 1 if @x >= @cols - - - # 141 61 a * HPR - - # Horizontal Position Relative - # reuse CSI Ps C ? - HPositionRelative: (params) -> - param = params[0] - param = 1 if param < 1 - @x += param - @x = @cols - 1 if @x >= @cols - - - # CSI Ps c Send Device Attributes (Primary DA). - # Ps = 0 or omitted -> request attributes from terminal. The - # response depends on the decTerminalID resource setting. - # -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'') - # -> CSI ? 1 ; 0 c (``VT101 with No Options'') - # -> CSI ? 6 c (``VT102'') - # -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'') - # The VT100-style response parameters do not mean anything by - # themselves. VT220 parameters do, telling the host what fea- - # tures the terminal supports: - # Ps = 1 -> 132-columns. - # Ps = 2 -> Printer. - # Ps = 6 -> Selective erase. - # Ps = 8 -> User-defined keys. - # Ps = 9 -> National replacement character sets. - # Ps = 1 5 -> Technical characters. - # Ps = 2 2 -> ANSI color, e.g., VT525. - # Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode). - # CSI > Ps c - # Send Device Attributes (Secondary DA). - # Ps = 0 or omitted -> request the terminal's identification - # code. The response depends on the decTerminalID resource set- - # ting. It should apply only to VT220 and up, but xterm extends - # this to VT100. - # -> CSI > Pp ; Pv ; Pc c - # where Pp denotes the terminal type - # Pp = 0 -> ``VT100''. - # Pp = 1 -> ``VT220''. - # and Pv is the firmware version (for xterm, this was originally - # the XFree86 patch number, starting with 95). In a DEC termi- - # nal, Pc indicates the ROM cartridge registration number and is - # always zero. - # More information: - # xterm/charproc.c - line 2012, for more information. - # vim responds with ^[[?0c or ^[[?1c after the terminal's response (?) - sendDeviceAttributes: (params) -> - return if params[0] > 0 - unless @prefix - if @isterm("xterm") or @isterm("rxvt-unicode") or @isterm("screen") - @send "\x1b[?1;2c" - else @send "\x1b[?6c" if @isterm("linux") - - else if @prefix is ">" - # xterm and urxvt - # seem to spit this - # out around ~370 times (?). - if @isterm("xterm") - @send "\x1b[>0;276;0c" - else if @isterm("rxvt-unicode") - @send "\x1b[>85;95;0c" - else if @isterm("linux") - # not supported by linux console. - # linux console echoes parameters. - @send params[0] + "c" - else @send "\x1b[>83;40003;0c" if @isterm("screen") - - - # CSI Pm d - # Line Position Absolute [row] (default = [1,column]) (VPA). - linePosAbsolute: (params) -> - param = params[0] - param = 1 if param < 1 - @y = param - 1 - @y = @rows - 1 if @y >= @rows - - - # 145 65 e * VPR - Vertical Position Relative - # reuse CSI Ps B ? - VPositionRelative: (params) -> - param = params[0] - param = 1 if param < 1 - @y += param - @y = @rows - 1 if @y >= @rows - - - # CSI Ps ; Ps f - # Horizontal and Vertical Position [row;column] (default = - # [1,1]) (HVP). - HVPosition: (params) -> - params[0] = 1 if params[0] < 1 - params[1] = 1 if params[1] < 1 - @y = params[0] - 1 - @y = @rows - 1 if @y >= @rows - @x = params[1] - 1 - @x = @cols - 1 if @x >= @cols - - - # CSI Pm h Set Mode (SM). - # Ps = 2 -> Keyboard Action Mode (AM). - # Ps = 4 -> Insert Mode (IRM). - # Ps = 1 2 -> Send/receive (SRM). - # Ps = 2 0 -> Automatic Newline (LNM). - # CSI ? Pm h - # DEC Private Mode Set (DECSET). - # Ps = 1 -> Application Cursor Keys (DECCKM). - # Ps = 2 -> Designate USASCII for character sets G0-G3 - # (DECANM), and set VT100 mode. - # Ps = 3 -> 132 Column Mode (DECCOLM). - # Ps = 4 -> Smooth (Slow) Scroll (DECSCLM). - # Ps = 5 -> Reverse Video (DECSCNM). - # Ps = 6 -> Origin Mode (DECOM). - # Ps = 7 -> Wraparound Mode (DECAWM). - # Ps = 8 -> Auto-repeat Keys (DECARM). - # Ps = 9 -> Send Mouse X & Y on button press. See the sec- - # tion Mouse Tracking. - # Ps = 1 0 -> Show toolbar (rxvt). - # Ps = 1 2 -> Start Blinking Cursor (att610). - # Ps = 1 8 -> Print form feed (DECPFF). - # Ps = 1 9 -> Set print extent to full screen (DECPEX). - # Ps = 2 5 -> Show Cursor (DECTCEM). - # Ps = 3 0 -> Show scrollbar (rxvt). - # Ps = 3 5 -> Enable font-shifting functions (rxvt). - # Ps = 3 8 -> Enter Tektronix Mode (DECTEK). - # Ps = 4 0 -> Allow 80 -> 132 Mode. - # Ps = 4 1 -> more(1) fix (see curses resource). - # Ps = 4 2 -> Enable Nation Replacement Character sets (DECN- - # RCM). - # Ps = 4 4 -> Turn On Margin Bell. - # Ps = 4 5 -> Reverse-wraparound Mode. - # Ps = 4 6 -> Start Logging. This is normally disabled by a - # compile-time option. - # Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis- - # abled by the titeInhibit resource). - # Ps = 6 6 -> Application keypad (DECNKM). - # Ps = 6 7 -> Backarrow key sends backspace (DECBKM). - # Ps = 1 0 0 0 -> Send Mouse X & Y on button press and - # release. See the section Mouse Tracking. - # Ps = 1 0 0 1 -> Use Hilite Mouse Tracking. - # Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking. - # Ps = 1 0 0 3 -> Use All Motion Mouse Tracking. - # Ps = 1 0 0 4 -> Send FocusIn/FocusOut events. - # Ps = 1 0 0 5 -> Enable Extended Mouse Mode. - # Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt). - # Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt). - # Ps = 1 0 3 4 -> Interpret "meta" key, sets eighth bit. - # (enables the eightBitInput resource). - # Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num- - # Lock keys. (This enables the numLock resource). - # Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This - # enables the metaSendsEscape resource). - # Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete - # key. - # Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This - # enables the altSendsEscape resource). - # Ps = 1 0 4 0 -> Keep selection even if not highlighted. - # (This enables the keepSelection resource). - # Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables - # the selectToClipboard resource). - # Ps = 1 0 4 2 -> Enable Urgency window manager hint when - # Control-G is received. (This enables the bellIsUrgent - # resource). - # Ps = 1 0 4 3 -> Enable raising of the window when Control-G - # is received. (enables the popOnBell resource). - # Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be - # disabled by the titeInhibit resource). - # Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis- - # abled by the titeInhibit resource). - # Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate - # Screen Buffer, clearing it first. (This may be disabled by - # the titeInhibit resource). This combines the effects of the 1 - # 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based - # applications rather than the 4 7 mode. - # Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode. - # Ps = 1 0 5 1 -> Set Sun function-key mode. - # Ps = 1 0 5 2 -> Set HP function-key mode. - # Ps = 1 0 5 3 -> Set SCO function-key mode. - # Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6). - # Ps = 1 0 6 1 -> Set VT220 keyboard emulation. - # Ps = 2 0 0 4 -> Set bracketed paste mode. - # Modes: - # http://vt100.net/docs/vt220-rm/chapter4.html - setMode: (params) -> - if typeof params is "object" - l = params.length - i = 0 - while i < l - @setMode params[i] - i++ - return - if @prefix is "?" - switch params - when 1 - @applicationCursor = true - when 2 - @setgCharset 0, Terminal::charsets.US - @setgCharset 1, Terminal::charsets.US - @setgCharset 2, Terminal::charsets.US - @setgCharset 3, Terminal::charsets.US - # set VT100 mode here - when 3 # 132 col mode - @savedCols = @cols - @resize 132, @rows - when 6 - @originMode = true - when 7 - @wraparoundMode = true - when 66 - @applicationKeypad = true - # X10 Mouse - # no release, no motion, no wheel, no modifiers. - when 9, 1000, 1002, 1003 # any event mouse - # any event - sends motion events, - # even if there is no button held down. - @x10Mouse = params is 9 - @vt200Mouse = params is 1000 - @normalMouse = params > 1000 - @mouseEvents = true - @element.style.cursor = 'pointer' - when 1004 # send focusin/focusout events - # focusin: ^[[I - # focusout: ^[[O - @sendFocus = true - when 1005 # utf8 ext mode mouse - @utfMouse = true - # for wide terminals - # simply encodes large values as utf8 characters - when 1006 # sgr ext mode mouse - @sgrMouse = true - # for wide terminals - # does not add 32 to fields - # press: ^[[ Keyboard Action Mode (AM). - # Ps = 4 -> Replace Mode (IRM). - # Ps = 1 2 -> Send/receive (SRM). - # Ps = 2 0 -> Normal Linefeed (LNM). - # CSI ? Pm l - # DEC Private Mode Reset (DECRST). - # Ps = 1 -> Normal Cursor Keys (DECCKM). - # Ps = 2 -> Designate VT52 mode (DECANM). - # Ps = 3 -> 80 Column Mode (DECCOLM). - # Ps = 4 -> Jump (Fast) Scroll (DECSCLM). - # Ps = 5 -> Normal Video (DECSCNM). - # Ps = 6 -> Normal Cursor Mode (DECOM). - # Ps = 7 -> No Wraparound Mode (DECAWM). - # Ps = 8 -> No Auto-repeat Keys (DECARM). - # Ps = 9 -> Don't send Mouse X & Y on button press. - # Ps = 1 0 -> Hide toolbar (rxvt). - # Ps = 1 2 -> Stop Blinking Cursor (att610). - # Ps = 1 8 -> Don't print form feed (DECPFF). - # Ps = 1 9 -> Limit print to scrolling region (DECPEX). - # Ps = 2 5 -> Hide Cursor (DECTCEM). - # Ps = 3 0 -> Don't show scrollbar (rxvt). - # Ps = 3 5 -> Disable font-shifting functions (rxvt). - # Ps = 4 0 -> Disallow 80 -> 132 Mode. - # Ps = 4 1 -> No more(1) fix (see curses resource). - # Ps = 4 2 -> Disable Nation Replacement Character sets (DEC- - # NRCM). - # Ps = 4 4 -> Turn Off Margin Bell. - # Ps = 4 5 -> No Reverse-wraparound Mode. - # Ps = 4 6 -> Stop Logging. (This is normally disabled by a - # compile-time option). - # Ps = 4 7 -> Use Normal Screen Buffer. - # Ps = 6 6 -> Numeric keypad (DECNKM). - # Ps = 6 7 -> Backarrow key sends delete (DECBKM). - # Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and - # release. See the section Mouse Tracking. - # Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking. - # Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking. - # Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking. - # Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events. - # Ps = 1 0 0 5 -> Disable Extended Mouse Mode. - # Ps = 1 0 1 0 -> Don't scroll to bottom on tty output - # (rxvt). - # Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt). - # Ps = 1 0 3 4 -> Don't interpret "meta" key. (This disables - # the eightBitInput resource). - # Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num- - # Lock keys. (This disables the numLock resource). - # Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key. - # (This disables the metaSendsEscape resource). - # Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad - # Delete key. - # Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key. - # (This disables the altSendsEscape resource). - # Ps = 1 0 4 0 -> Do not keep selection when not highlighted. - # (This disables the keepSelection resource). - # Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables - # the selectToClipboard resource). - # Ps = 1 0 4 2 -> Disable Urgency window manager hint when - # Control-G is received. (This disables the bellIsUrgent - # resource). - # Ps = 1 0 4 3 -> Disable raising of the window when Control- - # G is received. (This disables the popOnBell resource). - # Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen - # first if in the Alternate Screen. (This may be disabled by - # the titeInhibit resource). - # Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be - # disabled by the titeInhibit resource). - # Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor - # as in DECRC. (This may be disabled by the titeInhibit - # resource). This combines the effects of the 1 0 4 7 and 1 0 - # 4 8 modes. Use this with terminfo-based applications rather - # than the 4 7 mode. - # Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode. - # Ps = 1 0 5 1 -> Reset Sun function-key mode. - # Ps = 1 0 5 2 -> Reset HP function-key mode. - # Ps = 1 0 5 3 -> Reset SCO function-key mode. - # Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6). - # Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style. - # Ps = 2 0 0 4 -> Reset bracketed paste mode. - resetMode: (params) -> - if typeof params is "object" - l = params.length - i = 0 - while i < l - @resetMode params[i] - i++ - return - - if @prefix is "?" - switch params - when 1 - @applicationCursor = false - when 3 - @resize @savedCols, @rows if @cols is 132 and @savedCols - delete @savedCols - when 6 - @originMode = false - when 7 - @wraparoundMode = false - when 66 - @applicationKeypad = false - when 9, 1000, 1002 , 1003 # any event mouse - @x10Mouse = false - @vt200Mouse = false - @normalMouse = false - @mouseEvents = false - @element.style.cursor = "" - when 1004 # send focusin/focusout events - @sendFocus = false - when 1005 # utf8 ext mode mouse - @utfMouse = false - when 1006 # sgr ext mode mouse - @sgrMouse = false - when 1015 # urxvt ext mode mouse - @urxvtMouse = false - when 25 # hide cursor - @cursorHidden = true - when 1049, 47, 1047 # normal screen buffer - clearing it first - if @normal - @lines = @normal.lines - @ybase = @normal.ybase - @ydisp = @normal.ydisp - @x = @normal.x - @y = @normal.y - @scrollTop = @normal.scrollTop - @scrollBottom = @normal.scrollBottom - @tabs = @normal.tabs - @normal = null - @refresh 0, @rows - 1 - @showCursor() - - - # CSI Ps ; Ps r - # Set Scrolling Region [top;bottom] (default = full size of win- - # dow) (DECSTBM). - # CSI ? Pm r - setScrollRegion: (params) -> - return if @prefix - @scrollTop = (params[0] or 1) - 1 - @scrollBottom = (params[1] or @rows) - 1 - @x = 0 - @y = 0 - - - # CSI s - # Save cursor (ANSI.SYS). - saveCursor: (params) -> - @savedX = @x - @savedY = @y - - - # CSI u - # Restore cursor (ANSI.SYS). - restoreCursor: (params) -> - @x = @savedX or 0 - @y = @savedY or 0 - - ## Lesser Used ## - - # CSI Ps I - # Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). - cursorForwardTab: (params) -> - param = params[0] or 1 - @x = @nextStop() while param-- - - - # CSI Ps S Scroll up Ps lines (default = 1) (SU). - scrollUp: (params) -> - param = params[0] or 1 - while param-- - @lines.splice @ybase + @scrollTop, 1 - @lines.splice @ybase + @scrollBottom, 0, @blankLine() - - @updateRange @scrollTop - @updateRange @scrollBottom - - - # CSI Ps T Scroll down Ps lines (default = 1) (SD). - scrollDown: (params) -> - param = params[0] or 1 - while param-- - @lines.splice @ybase + @scrollBottom, 1 - @lines.splice @ybase + @scrollTop, 0, @blankLine() - - @updateRange @scrollTop - @updateRange @scrollBottom - - - # CSI Ps ; Ps ; Ps ; Ps ; Ps T - # Initiate highlight mouse tracking. Parameters are - # [func;startx;starty;firstrow;lastrow]. See the section Mouse - # Tracking. - initMouseTracking: (params) -> - - # Relevant: DECSET 1001 - - # CSI > Ps; Ps T - # Reset one or more features of the title modes to the default - # value. Normally, "reset" disables the feature. It is possi- - # ble to disable the ability to reset features by compiling a - # different default for the title modes into xterm. - # Ps = 0 -> Do not set window/icon labels using hexadecimal. - # Ps = 1 -> Do not query window/icon labels using hexadeci- - # mal. - # Ps = 2 -> Do not set window/icon labels using UTF-8. - # Ps = 3 -> Do not query window/icon labels using UTF-8. - # (See discussion of "Title Modes"). - resetTitleModes: (params) -> - - - # CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). - cursorBackwardTab: (params) -> - param = params[0] or 1 - @x = @prevStop() while param-- - - - # CSI Ps b Repeat the preceding graphic character Ps times (REP). - repeatPrecedingCharacter: (params) -> - param = params[0] or 1 - line = @lines[@ybase + @y] - ch = line[@x - 1] or [@defAttr, " "] - line[@x++] = ch while param-- - - - # CSI Ps g Tab Clear (TBC). - # Ps = 0 -> Clear Current Column (default). - # Ps = 3 -> Clear All. - # Potentially: - # Ps = 2 -> Clear Stops on Line. - # http://vt100.net/annarbor/aaa-ug/section6.html - tabClear: (params) -> - param = params[0] - if param <= 0 - delete @tabs[@x] - else - @tabs = {} if param is 3 - - # CSI Pm i Media Copy (MC). - # Ps = 0 -> Print screen (default). - # Ps = 4 -> Turn off printer controller mode. - # Ps = 5 -> Turn on printer controller mode. - # CSI ? Pm i - # Media Copy (MC, DEC-specific). - # Ps = 1 -> Print line containing cursor. - # Ps = 4 -> Turn off autoprint mode. - # Ps = 5 -> Turn on autoprint mode. - # Ps = 1 0 -> Print composed display, ignores DECPEX. - # Ps = 1 1 -> Print all pages. - mediaCopy: (params) -> - - - # CSI > Ps; Ps m - # Set or reset resource-values used by xterm to decide whether - # to construct escape sequences holding information about the - # modifiers pressed with a given key. The first parameter iden- - # tifies the resource to set/reset. The second parameter is the - # value to assign to the resource. If the second parameter is - # omitted, the resource is reset to its initial value. - # Ps = 1 -> modifyCursorKeys. - # Ps = 2 -> modifyFunctionKeys. - # Ps = 4 -> modifyOtherKeys. - # If no parameters are given, all resources are reset to their - # initial values. - setResources: (params) -> - - - # CSI > Ps n - # Disable modifiers which may be enabled via the CSI > Ps; Ps m - # sequence. This corresponds to a resource value of "-1", which - # cannot be set with the other sequence. The parameter identi- - # fies the resource to be disabled: - # Ps = 1 -> modifyCursorKeys. - # Ps = 2 -> modifyFunctionKeys. - # Ps = 4 -> modifyOtherKeys. - # If the parameter is omitted, modifyFunctionKeys is disabled. - # When modifyFunctionKeys is disabled, xterm uses the modifier - # keys to make an extended sequence of functions rather than - # adding a parameter to each function key to denote the modi- - # fiers. - disableModifiers: (params) -> - - - # CSI > Ps p - # Set resource value pointerMode. This is used by xterm to - # decide whether to hide the pointer cursor as the user types. - # Valid values for the parameter: - # Ps = 0 -> never hide the pointer. - # Ps = 1 -> hide if the mouse tracking mode is not enabled. - # Ps = 2 -> always hide the pointer. If no parameter is - # given, xterm uses the default, which is 1 . - setPointerMode: (params) -> - - - # CSI ! p Soft terminal reset (DECSTR). - # http://vt100.net/docs/vt220-rm/table4-10.html - softReset: (params) -> - @cursorHidden = false - @insertMode = false - @originMode = false - @wraparoundMode = false # autowrap - @applicationKeypad = false # ? - @applicationCursor = false - @scrollTop = 0 - @scrollBottom = @rows - 1 - @curAttr = @defAttr - @x = @y = 0 # ? - @charset = null - @glevel = 0 # ?? - @charsets = [null] # ?? - - - # CSI Ps$ p - # Request ANSI mode (DECRQM). For VT300 and up, reply is - # CSI Ps; Pm$ y - # where Ps is the mode number as in RM, and Pm is the mode - # value: - # 0 - not recognized - # 1 - set - # 2 - reset - # 3 - permanently set - # 4 - permanently reset - requestAnsiMode: (params) -> - - - # CSI ? Ps$ p - # Request DEC private mode (DECRQM). For VT300 and up, reply is - # CSI ? Ps; Pm$ p - # where Ps is the mode number as in DECSET, Pm is the mode value - # as in the ANSI DECRQM. - requestPrivateMode: (params) -> - - - # CSI Ps ; Ps " p - # Set conformance level (DECSCL). Valid values for the first - # parameter: - # Ps = 6 1 -> VT100. - # Ps = 6 2 -> VT200. - # Ps = 6 3 -> VT300. - # Valid values for the second parameter: - # Ps = 0 -> 8-bit controls. - # Ps = 1 -> 7-bit controls (always set for VT100). - # Ps = 2 -> 8-bit controls. - setConformanceLevel: (params) -> - - - # CSI Ps q Load LEDs (DECLL). - # Ps = 0 -> Clear all LEDS (default). - # Ps = 1 -> Light Num Lock. - # Ps = 2 -> Light Caps Lock. - # Ps = 3 -> Light Scroll Lock. - # Ps = 2 1 -> Extinguish Num Lock. - # Ps = 2 2 -> Extinguish Caps Lock. - # Ps = 2 3 -> Extinguish Scroll Lock. - loadLEDs: (params) -> - - - # CSI Ps SP q - # Set cursor style (DECSCUSR, VT520). - # Ps = 0 -> blinking block. - # Ps = 1 -> blinking block (default). - # Ps = 2 -> steady block. - # Ps = 3 -> blinking underline. - # Ps = 4 -> steady underline. - setCursorStyle: (params) -> - - - # CSI Ps " q - # Select character protection attribute (DECSCA). Valid values - # for the parameter: - # Ps = 0 -> DECSED and DECSEL can erase (default). - # Ps = 1 -> DECSED and DECSEL cannot erase. - # Ps = 2 -> DECSED and DECSEL can erase. - setCharProtectionAttr: (params) -> - - - # CSI ? Pm r - # Restore DEC Private Mode Values. The value of Ps previously - # saved is restored. Ps values are the same as for DECSET. - restorePrivateValues: (params) -> - - - # CSI Pt; Pl; Pb; Pr; Ps$ r - # Change Attributes in Rectangular Area (DECCARA), VT400 and up. - # Pt; Pl; Pb; Pr denotes the rectangle. - # Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7. - # NOTE: xterm doesn't enable this code by default. - setAttrInRectangle: (params) -> - t = params[0] - l = params[1] - b = params[2] - r = params[3] - attr = params[4] - while t < b + 1 - line = @lines[@ybase + t] - i = l - while i < r - line[i] = [attr, line[i][1]] - i++ - t++ - - @updateRange params[0] - @updateRange params[2] - - - # CSI ? Pm s - # Save DEC Private Mode Values. Ps values are the same as for - # DECSET. - savePrivateValues: (params) -> - - - # CSI Ps ; Ps ; Ps t - # Window manipulation (from dtterm, as well as extensions). - # These controls may be disabled using the allowWindowOps - # resource. Valid values for the first (and any additional - # parameters) are: - # Ps = 1 -> De-iconify window. - # Ps = 2 -> Iconify window. - # Ps = 3 ; x ; y -> Move window to [x, y]. - # Ps = 4 ; height ; width -> Resize the xterm window to - # height and width in pixels. - # Ps = 5 -> Raise the xterm window to the front of the stack- - # ing order. - # Ps = 6 -> Lower the xterm window to the bottom of the - # stacking order. - # Ps = 7 -> Refresh the xterm window. - # Ps = 8 ; height ; width -> Resize the text area to - # [height;width] in characters. - # Ps = 9 ; 0 -> Restore maximized window. - # Ps = 9 ; 1 -> Maximize window (i.e., resize to screen - # size). - # Ps = 1 0 ; 0 -> Undo full-screen mode. - # Ps = 1 0 ; 1 -> Change to full-screen. - # Ps = 1 1 -> Report xterm window state. If the xterm window - # is open (non-iconified), it returns CSI 1 t . If the xterm - # window is iconified, it returns CSI 2 t . - # Ps = 1 3 -> Report xterm window position. Result is CSI 3 - # ; x ; y t - # Ps = 1 4 -> Report xterm window in pixels. Result is CSI - # 4 ; height ; width t - # Ps = 1 8 -> Report the size of the text area in characters. - # Result is CSI 8 ; height ; width t - # Ps = 1 9 -> Report the size of the screen in characters. - # Result is CSI 9 ; height ; width t - # Ps = 2 0 -> Report xterm window's icon label. Result is - # OSC L label ST - # Ps = 2 1 -> Report xterm window's title. Result is OSC l - # label ST - # Ps = 2 2 ; 0 -> Save xterm icon and window title on - # stack. - # Ps = 2 2 ; 1 -> Save xterm icon title on stack. - # Ps = 2 2 ; 2 -> Save xterm window title on stack. - # Ps = 2 3 ; 0 -> Restore xterm icon and window title from - # stack. - # Ps = 2 3 ; 1 -> Restore xterm icon title from stack. - # Ps = 2 3 ; 2 -> Restore xterm window title from stack. - # Ps >= 2 4 -> Resize to Ps lines (DECSLPP). - manipulateWindow: (params) -> - - - # CSI Pt; Pl; Pb; Pr; Ps$ t - # Reverse Attributes in Rectangular Area (DECRARA), VT400 and - # up. - # Pt; Pl; Pb; Pr denotes the rectangle. - # Ps denotes the attributes to reverse, i.e., 1, 4, 5, 7. - # NOTE: xterm doesn't enable this code by default. - reverseAttrInRectangle: (params) -> - - - # CSI > Ps; Ps t - # Set one or more features of the title modes. Each parameter - # enables a single feature. - # Ps = 0 -> Set window/icon labels using hexadecimal. - # Ps = 1 -> Query window/icon labels using hexadecimal. - # Ps = 2 -> Set window/icon labels using UTF-8. - # Ps = 3 -> Query window/icon labels using UTF-8. (See dis- - # cussion of "Title Modes") - setTitleModeFeature: (params) -> - - - # CSI Ps SP t - # Set warning-bell volume (DECSWBV, VT520). - # Ps = 0 or 1 -> off. - # Ps = 2 , 3 or 4 -> low. - # Ps = 5 , 6 , 7 , or 8 -> high. - setWarningBellVolume: (params) -> - - - # CSI Ps SP u - # Set margin-bell volume (DECSMBV, VT520). - # Ps = 1 -> off. - # Ps = 2 , 3 or 4 -> low. - # Ps = 0 , 5 , 6 , 7 , or 8 -> high. - setMarginBellVolume: (params) -> - - - # CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v - # Copy Rectangular Area (DECCRA, VT400 and up). - # Pt; Pl; Pb; Pr denotes the rectangle. - # Pp denotes the source page. - # Pt; Pl denotes the target location. - # Pp denotes the target page. - # NOTE: xterm doesn't enable this code by default. - copyRectangle: (params) -> - - - # CSI Pt ; Pl ; Pb ; Pr ' w - # Enable Filter Rectangle (DECEFR), VT420 and up. - # Parameters are [top;left;bottom;right]. - # Defines the coordinates of a filter rectangle and activates - # it. Anytime the locator is detected outside of the filter - # rectangle, an outside rectangle event is generated and the - # rectangle is disabled. Filter rectangles are always treated - # as "one-shot" events. Any parameters that are omitted default - # to the current locator position. If all parameters are omit- - # ted, any locator motion will be reported. DECELR always can- - # cels any prevous rectangle definition. - enableFilterRectangle: (params) -> - - - # CSI Ps x Request Terminal Parameters (DECREQTPARM). - # if Ps is a "0" (default) or "1", and xterm is emulating VT100, - # the control sequence elicits a response of the same form whose - # parameters describe the terminal: - # Ps -> the given Ps incremented by 2. - # Pn = 1 <- no parity. - # Pn = 1 <- eight bits. - # Pn = 1 <- 2 8 transmit 38.4k baud. - # Pn = 1 <- 2 8 receive 38.4k baud. - # Pn = 1 <- clock multiplier. - # Pn = 0 <- STP flags. - requestParameters: (params) -> - - - # CSI Ps x Select Attribute Change Extent (DECSACE). - # Ps = 0 -> from start to end position, wrapped. - # Ps = 1 -> from start to end position, wrapped. - # Ps = 2 -> rectangle (exact). - selectChangeExtent: (params) -> - - - # CSI Pc; Pt; Pl; Pb; Pr$ x - # Fill Rectangular Area (DECFRA), VT420 and up. - # Pc is the character to use. - # Pt; Pl; Pb; Pr denotes the rectangle. - # NOTE: xterm doesn't enable this code by default. - fillRectangle: (params) -> - ch = params[0] - t = params[1] - l = params[2] - b = params[3] - r = params[4] - while t < b + 1 - line = @lines[@ybase + t] - i = l - while i < r - line[i] = [line[i][0], String.fromCharCode(ch)] - i++ - t++ - - @updateRange params[1] - @updateRange params[3] - - - # CSI Ps ; Pu ' z - # Enable Locator Reporting (DECELR). - # Valid values for the first parameter: - # Ps = 0 -> Locator disabled (default). - # Ps = 1 -> Locator enabled. - # Ps = 2 -> Locator enabled for one report, then disabled. - # The second parameter specifies the coordinate unit for locator - # reports. - # Valid values for the second parameter: - # Pu = 0 <- or omitted -> default to character cells. - # Pu = 1 <- device physical pixels. - # Pu = 2 <- character cells. - enableLocatorReporting: (params) -> - val = params[0] > 0 - - - # CSI Pt; Pl; Pb; Pr$ z - # Erase Rectangular Area (DECERA), VT400 and up. - # Pt; Pl; Pb; Pr denotes the rectangle. - # NOTE: xterm doesn't enable this code by default. - eraseRectangle: (params) -> - t = params[0] - l = params[1] - b = params[2] - r = params[3] - ch = [@eraseAttr(), " "] - while t < b + 1 - line = @lines[@ybase + t] - i = l - while i < r - line[i] = ch - i++ - t++ - - @updateRange params[0] - @updateRange params[2] - - - # CSI Pm ' { - # Select Locator Events (DECSLE). - # Valid values for the first (and any additional parameters) - # are: - # Ps = 0 -> only respond to explicit host requests (DECRQLP). - # (This is default). It also cancels any filter - # rectangle. - # Ps = 1 -> report button down transitions. - # Ps = 2 -> do not report button down transitions. - # Ps = 3 -> report button up transitions. - # Ps = 4 -> do not report button up transitions. - setLocatorEvents: (params) -> - - - # CSI Pt; Pl; Pb; Pr$ { - # Selective Erase Rectangular Area (DECSERA), VT400 and up. - # Pt; Pl; Pb; Pr denotes the rectangle. - selectiveEraseRectangle: (params) -> - - - # CSI Ps ' | - # Request Locator Position (DECRQLP). - # Valid values for the parameter are: - # Ps = 0 , 1 or omitted -> transmit a single DECLRP locator - # report. - - # If Locator Reporting has been enabled by a DECELR, xterm will - # respond with a DECLRP Locator Report. This report is also - # generated on button up and down events if they have been - # enabled with a DECSLE, or when the locator is detected outside - # of a filter rectangle, if filter rectangles have been enabled - # with a DECEFR. - - # -> CSI Pe ; Pb ; Pr ; Pc ; Pp & w - - # Parameters are [event;button;row;column;page]. - # Valid values for the event: - # Pe = 0 -> locator unavailable - no other parameters sent. - # Pe = 1 -> request - xterm received a DECRQLP. - # Pe = 2 -> left button down. - # Pe = 3 -> left button up. - # Pe = 4 -> middle button down. - # Pe = 5 -> middle button up. - # Pe = 6 -> right button down. - # Pe = 7 -> right button up. - # Pe = 8 -> M4 button down. - # Pe = 9 -> M4 button up. - # Pe = 1 0 -> locator outside filter rectangle. - # ``button'' parameter is a bitmask indicating which buttons are - # pressed: - # Pb = 0 <- no buttons down. - # Pb & 1 <- right button down. - # Pb & 2 <- middle button down. - # Pb & 4 <- left button down. - # Pb & 8 <- M4 button down. - # ``row'' and ``column'' parameters are the coordinates of the - # locator position in the xterm window, encoded as ASCII deci- - # mal. - # The ``page'' parameter is not used by xterm, and will be omit- - # ted. - requestLocatorPosition: (params) -> - - - # CSI P m SP } - # Insert P s Column(s) (default = 1) (DECIC), VT420 and up. - # NOTE: xterm doesn't enable this code by default. - insertColumns: -> - param = params[0] - l = @ybase + @rows - ch = [@eraseAttr(), " "] - while param-- - i = @ybase - while i < l - @lines[i].splice @x + 1, 0, ch - @lines[i].pop() - i++ - @maxRange() - - - # CSI P m SP ~ - # Delete P s Column(s) (default = 1) (DECDC), VT420 and up - # NOTE: xterm doesn't enable this code by default. - deleteColumns: -> - param = params[0] - l = @ybase + @rows - ch = [@eraseAttr(), " "] - while param-- - i = @ybase - while i < l - @lines[i].splice @x, 1 - @lines[i].push ch - i++ - @maxRange() - - - get_html_height_in_lines: (html) -> - temp_node = document.createElement("div") - temp_node.innerHTML = html - @element.appendChild temp_node - html_height = temp_node.getBoundingClientRect().height - @element.removeChild temp_node - Math.ceil(html_height / @char_size.height) - - # DEC Special Character and Line Drawing Set. - # http://vt100.net/docs/vt102-ug/table5-13.html - # A lot of curses apps use this if they see TERM=xterm. - # testing: echo -e '\e(0a\e(B' - # The xterm output sometimes seems to conflict with the - # reference above. xterm seems in line with the reference - # when running vttest however. - # The table below now uses xterm's output from vttest. - charsets: - SCLD:# (0 - "`": "◆" # '◆' - a: "▒" # '▒' - b: "\t" # '\t' - c: "\f" # '\f' - d: "\r" # '\r' - e: "\n" # '\n' - f: "°" # '°' - g: "±" # '±' - h: "␤" # '\u2424' (NL) - i: "\x0b" # '\v' - j: "┘" # '┘' - k: "┐" # '┐' - l: "┌" # '┌' - m: "└" # '└' - n: "┼" # '┼' - o: "⎺" # '⎺' - p: "⎻" # '⎻' - q: "─" # '─' - r: "⎼" # '⎼' - s: "⎽" # '⎽' - t: "├" # '├' - u: "┤" # '┤' - v: "┴" # '┴' - w: "┬" # '┬' - x: "│" # '│' - y: "≤" # '≤' - z: "≥" # '≥' - "{": "π" # 'π' - "|": "≠" # '≠' - "}": "£" # '£' - "~": "·" # '·' - UK: null # (A - US: null # (B (USASCII) - Dutch: null # (4 - Finnish: null # (C or (5 - French: null # (R - FrenchCanadian: null # (Q - German: null # (K - Italian: null # (Y - NorwegianDanish: null # (E or (6 - Spanish: null # (Z - Swedish: null # (H or (7 - Swiss: null # (= - ISOLatin: null # /A + key = String.fromCharCode(127) + else if ev.keyCode is 219 + + # ^[ - escape + key = String.fromCharCode(27) + + # ^] - group sep + else + if ev.keyCode is 221 + key = String.fromCharCode(29) + + else if (ev.altKey and 'Mac' not in navigator.platform) or + (ev.metaKey and 'Mac' in navigator.platform) + if ev.keyCode >= 65 and ev.keyCode <= 90 + key = "\x1b" + String.fromCharCode(ev.keyCode + 32) + else if ev.keyCode is 192 + key = "\x1b`" + else + if ev.keyCode >= 48 and ev.keyCode <= 57 + key = "\x1b" + (ev.keyCode - 48) + + if ev.keyCode >= 37 and ev.keyCode <= 40 + if ev.ctrlKey + key = key.slice(0, -1) + "1;5" + key.slice(-1) + else if ev.altKey + key = key.slice(0, -1) + "1;3" + key.slice(-1) + else if ev.shiftKey + key = key.slice(0, -1) + "1;4" + key.slice(-1) + + return true unless key + + if @prefixMode + @leavePrefix() + return cancel(ev) + + if @selectMode + @keySelect ev, key + return cancel(ev) + + @showCursor() + @handler(key) + cancel ev + + + setgLevel: (g) -> + @glevel = g + @charset = @charsets[g] + + setgCharset: (g, charset) -> + @charsets[g] = charset + @charset = charset if @glevel is g + + keyPress: (ev) -> + if @skipNextKey is false + @skipNextKey = null + return true + + cancel ev + + if ev.charCode + key = ev.charCode + else unless ev.which? + key = ev.keyCode + else if ev.which isnt 0 and ev.charCode isnt 0 + key = ev.which + else + return false + + return false if not key or ev.ctrlKey or ev.altKey or ev.metaKey + key = String.fromCharCode(key) + + @showCursor() + @handler key + false + + send: (data) -> + unless @queue + @t_queue = setTimeout (=> + @handler @queue + @queue = "" + ), 1 + + @queue += data + + bell: -> + return unless @visualBell + @element.classList.add "bell" + @t_bell = setTimeout (=> + @element.classList.remove "bell" + ), @visualBell + + resize: -> + old_cols = @cols + old_rows = @rows + term_size = @parent.getBoundingClientRect() + @cols = Math.floor(term_size.width / @char_size.width) - 1 # ? + @rows = Math.floor(term_size.height / @char_size.height) + if old_cols == @cols and old_rows == @rows + return + + @ctl 'Resize', @cols, @rows + + # resize cols + if old_cols < @cols + # does xterm use the default attr? + ch = [@defAttr, " "] + i = @lines.length + while i-- + @lines[i].push ch while @lines[i].length < @cols + else if old_cols > @cols + i = @lines.length + while i-- + @lines[i].pop() while @lines[i].length > @cols + + @setupStops old_cols + + # resize rows + j = old_rows + if j < @rows + el = @element + while j++ < @rows + @lines.push @blankLine() if @lines.length < @rows + @ybase + if @children.length < @rows + line = @document.createElement("div") + line.className = 'line' + line.style.height = @char_size.height + 'px' + el.appendChild line + @children.push line + else if j > @rows + while j-- > @rows + @lines.pop() if @lines.length > @rows + @ybase + if @children.length > @rows + el = @children.pop() + continue unless el + el.parentNode.removeChild el + + # make sure the cursor stays on screen + @y = @rows - 1 if @y >= @rows + @x = @cols - 1 if @x >= @cols + + @scrollTop = 0 + @scrollBottom = @rows - 1 + + @refresh 0, @rows - 1 + + # it's a real nightmare trying + # to resize the original + # screen buffer. just set it + # to null for now. + @normal = null + + updateRange: (y) -> + @refreshStart = y if y < @refreshStart + @refreshEnd = y if y > @refreshEnd + + maxRange: -> + @refreshStart = 0 + @refreshEnd = @rows - 1 + + setupStops: (i) -> + if i? + i = @prevStop(i) unless @tabs[i] + else + @tabs = {} + i = 0 + while i < @cols + @tabs[i] = true + i += 8 + + prevStop: (x) -> + x = @x unless x? + while not @tabs[--x] and x > 0 + 1 + + if x >= @cols then @cols - 1 else (if x < 0 then 0 else x) + + nextStop: (x) -> + x = @x unless x? + while not @tabs[++x] and x < @cols + 1 + + if x >= @cols then @cols - 1 else (if x < 0 then 0 else x) + + eraseRight: (x, y) -> + line = @lines[@ybase + y] + # xterm + ch = [@eraseAttr(), " "] + + while x < @cols + line[x] = ch + x++ + @updateRange y + + eraseLeft: (x, y) -> + line = @lines[@ybase + y] + # xterm + ch = [@eraseAttr(), " "] + x++ + line[x] = ch while x-- + @updateRange y + + eraseLine: (y) -> + @eraseRight 0, y + + blankLine: (cur) -> + attr = (if cur then @eraseAttr() else @defAttr) + ch = [attr, " "] + line = [] + i = 0 + while i < @cols + line[i] = ch + i++ + line + + ch: (cur) -> + if cur then [@eraseAttr(), " "] else [@defAttr, " "] + + isterm: (term) -> + "#{@termName}".indexOf(term) is 0 + + handler: (data) -> + @out data + + handleTitle: (title) -> + document.title = title + + ## ESC ## + + # ESC D Index (IND is 0x84). + index: -> + @y++ + if @y > @scrollBottom + @y-- + @scroll() + @state = State.normal + + # ESC M Reverse Index (RI is 0x8d). + reverseIndex: -> + @y-- + if @y < @scrollTop + @y++ + + # possibly move the code below to term.reverseScroll(); + # test: echo -ne '\e[1;1H\e[44m\eM\e[0m' + # blankLine(true) is xterm/linux behavior + @lines.splice @y + @ybase, 0, @blankLine(true) + j = @rows - 1 - @scrollBottom + @lines.splice @rows - 1 + @ybase - j + 1, 1 + + # @maxRange(); + @updateRange @scrollTop + @updateRange @scrollBottom + @state = State.normal + + + # ESC c Full Reset (RIS). + reset: -> + @reset_vars() + @refresh 0, @rows - 1 + + # ESC H Tab Set (HTS is 0x88). + tabSet: -> + @tabs[@x] = true + @state = State.normal + + + ## CSI ## + + # CSI Ps A + # Cursor Up Ps Times (default = 1) (CUU). + cursorUp: (params) -> + param = params[0] + param = 1 if param < 1 + @y -= param + @y = 0 if @y < 0 + + # CSI Ps B + # Cursor Down Ps Times (default = 1) (CUD). + cursorDown: (params) -> + param = params[0] + param = 1 if param < 1 + @y += param + @y = @rows - 1 if @y >= @rows + + # CSI Ps C + # Cursor Forward Ps Times (default = 1) (CUF). + cursorForward: (params) -> + param = params[0] + param = 1 if param < 1 + @x += param + @x = @cols - 1 if @x >= @cols + + # CSI Ps D + # Cursor Backward Ps Times (default = 1) (CUB). + cursorBackward: (params) -> + param = params[0] + param = 1 if param < 1 + @x -= param + @x = 0 if @x < 0 + + # CSI Ps ; Ps H + # Cursor Position [row;column] (default = [1,1]) (CUP). + cursorPos: (params) -> + row = params[0] - 1 + if params.length >= 2 + col = params[1] - 1 + else + col = 0 + + if row < 0 + row = 0 + else + row = @rows - 1 if row >= @rows + + if col < 0 + col = 0 + else + col = @cols - 1 if col >= @cols + + @x = col + @y = row + + + # CSI Ps J Erase in Display (ED). + # Ps = 0 -> Erase Below (default). + # Ps = 1 -> Erase Above. + # Ps = 2 -> Erase All. + # Ps = 3 -> Erase Saved Lines (xterm). + # CSI ? Ps J + # Erase in Display (DECSED). + # Ps = 0 -> Selective Erase Below (default). + # Ps = 1 -> Selective Erase Above. + # Ps = 2 -> Selective Erase All. + eraseInDisplay: (params) -> + switch params[0] + when 0 + @eraseRight @x, @y + j = @y + 1 + while j < @rows + @eraseLine j + j++ + when 1 + @eraseLeft @x, @y + j = @y + @eraseLine j while j-- + when 2 + j = @rows + @eraseLine j while j-- + + + # CSI Ps K Erase in Line (EL). + # Ps = 0 -> Erase to Right (default). + # Ps = 1 -> Erase to Left. + # Ps = 2 -> Erase All. + # CSI ? Ps K + # Erase in Line (DECSEL). + # Ps = 0 -> Selective Erase to Right (default). + # Ps = 1 -> Selective Erase to Left. + # Ps = 2 -> Selective Erase All. + eraseInLine: (params) -> + switch params[0] + when 0 + @eraseRight @x, @y + when 1 + @eraseLeft @x, @y + when 2 + @eraseLine @y + + + # CSI Pm m Character Attributes (SGR). + # Ps = 0 -> Normal (default). + # Ps = 1 -> Bold. + # Ps = 4 -> Underlined. + # Ps = 5 -> Blink (appears as Bold). + # Ps = 7 -> Inverse. + # Ps = 8 -> Invisible, i.e., hidden (VT300). + # Ps = 2 2 -> Normal (neither bold nor faint). + # Ps = 2 4 -> Not underlined. + # Ps = 2 5 -> Steady (not blinking). + # Ps = 2 7 -> Positive (not inverse). + # Ps = 2 8 -> Visible, i.e., not hidden (VT300). + # Ps = 3 0 -> Set foreground color to Black. + # Ps = 3 1 -> Set foreground color to Red. + # Ps = 3 2 -> Set foreground color to Green. + # Ps = 3 3 -> Set foreground color to Yellow. + # Ps = 3 4 -> Set foreground color to Blue. + # Ps = 3 5 -> Set foreground color to Magenta. + # Ps = 3 6 -> Set foreground color to Cyan. + # Ps = 3 7 -> Set foreground color to White. + # Ps = 3 9 -> Set foreground color to default (original). + # Ps = 4 0 -> Set background color to Black. + # Ps = 4 1 -> Set background color to Red. + # Ps = 4 2 -> Set background color to Green. + # Ps = 4 3 -> Set background color to Yellow. + # Ps = 4 4 -> Set background color to Blue. + # Ps = 4 5 -> Set background color to Magenta. + # Ps = 4 6 -> Set background color to Cyan. + # Ps = 4 7 -> Set background color to White. + # Ps = 4 9 -> Set background color to default (original). + + # If 16-color support is compiled, the following apply. Assume + # that xterm's resources are set so that the ISO color codes are + # the first 8 of a set of 16. Then the aixterm colors are the + # bright versions of the ISO colors: + # Ps = 9 0 -> Set foreground color to Black. + # Ps = 9 1 -> Set foreground color to Red. + # Ps = 9 2 -> Set foreground color to Green. + # Ps = 9 3 -> Set foreground color to Yellow. + # Ps = 9 4 -> Set foreground color to Blue. + # Ps = 9 5 -> Set foreground color to Magenta. + # Ps = 9 6 -> Set foreground color to Cyan. + # Ps = 9 7 -> Set foreground color to White. + # Ps = 1 0 0 -> Set background color to Black. + # Ps = 1 0 1 -> Set background color to Red. + # Ps = 1 0 2 -> Set background color to Green. + # Ps = 1 0 3 -> Set background color to Yellow. + # Ps = 1 0 4 -> Set background color to Blue. + # Ps = 1 0 5 -> Set background color to Magenta. + # Ps = 1 0 6 -> Set background color to Cyan. + # Ps = 1 0 7 -> Set background color to White. + + # If xterm is compiled with the 16-color support disabled, it + # supports the following, from rxvt: + # Ps = 1 0 0 -> Set foreground and background color to + # default. + + # If 88- or 256-color support is compiled, the following apply. + # Ps = 3 8 ; 5 ; Ps -> Set foreground color to the second + # Ps. + # Ps = 4 8 ; 5 ; Ps -> Set background color to the second + # Ps. + charAttributes: (params) -> + # Optimize a single SGR0. + if params.length is 1 and params[0] is 0 + @curAttr = @defAttr + return + flags = @curAttr >> 18 + + fg = (@curAttr >> 9) & 0x1ff + bg = @curAttr & 0x1ff + + l = params.length + i = 0 + while i < l + p = params[i] + if p >= 30 and p <= 37 + # fg color 8 + fg = p - 30 + else if p >= 40 and p <= 47 + # bg color 8 + bg = p - 40 + else if p >= 90 and p <= 97 + # fg color 16 + p += 8 + fg = p - 90 + else if p >= 100 and p <= 107 + # bg color 16 + p += 8 + bg = p - 100 + else if p is 0 + # default + flags = @defAttr >> 18 + fg = (@defAttr >> 9) & 0x1ff + bg = @defAttr & 0x1ff + + # flags = 0; + # fg = 0x1ff; + # bg = 0x1ff; + else if p is 1 + # bold text + flags |= 1 + else if p is 4 + # underlined text + flags |= 2 + else if p is 5 + # blink + flags |= 4 + else if p is 7 + # inverse and positive + # test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m' + flags |= 8 + else if p is 8 + # invisible + flags |= 16 + else if p is 22 + # not bold + flags &= ~1 + else if p is 24 + # not underlined + flags &= ~2 + else if p is 25 + # not blink + flags &= ~4 + else if p is 27 + # not inverse + flags &= ~8 + else if p is 28 + # not invisible + flags &= ~16 + else if p is 39 + # reset fg + fg = (@defAttr >> 9) & 0x1ff + else if p is 49 + # reset bg + bg = @defAttr & 0x1ff + else if p is 38 + if params[i + 1] is 2 + # fg color 2^24 + i += 2 + fg = "#" + params[i] & 0xff + + params[i + 1] & 0xff + + params[i + 2] & 0xff + i += 2 + else if params[i + 1] is 5 + # fg color 256 + i += 2 + fg = params[i] & 0xff + else if p is 48 + if params[i + 1] is 2 + # bg color 2^24 + i += 2 + bg = "#" + params[i] & 0xff + + params[i + 1] & 0xff + + params[i + 2] & 0xff + i += 2 + else if params[i + 1] is 5 + # bg color 256 + i += 2 + bg = params[i] & 0xff + else if p is 100 + # reset fg/bg + fg = (@defAttr >> 9) & 0x1ff + bg = @defAttr & 0x1ff + else + console.error "Unknown SGR attribute: %d.", p + i++ + @curAttr = (flags << 18) | (fg << 9) | bg + + + # CSI Ps n Device Status Report (DSR). + # Ps = 5 -> Status Report. Result (``OK'') is + # CSI 0 n + # Ps = 6 -> Report Cursor Position (CPR) [row;column]. + # Result is + # CSI r ; c R + # CSI ? Ps n + # Device Status Report (DSR, DEC-specific). + # Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI + # ? r ; c R (assumes page is zero). + # Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready). + # or CSI ? 1 1 n (not ready). + # Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked) + # or CSI ? 2 1 n (locked). + # Ps = 2 6 -> Report Keyboard status as + # CSI ? 2 7 ; 1 ; 0 ; 0 n (North American). + # The last two parameters apply to VT400 & up, and denote key- + # board ready and LK01 respectively. + # Ps = 5 3 -> Report Locator status as + # CSI ? 5 3 n Locator available, if compiled-in, or + # CSI ? 5 0 n No Locator, if not. + deviceStatus: (params) -> + unless @prefix + switch params[0] + when 5 + # status report + @send "\x1b[0n" + when 6 + # cursor position + @send "\x1b[" + (@y + 1) + ";" + (@x + 1) + "R" + else if @prefix is "?" + # modern xterm doesnt seem to + # respond to any of these except ?6, 6, and 5 + if params[0] is 6 + # cursor position + @send "\x1b[?" + (@y + 1) + ";" + (@x + 1) + "R" + + + ## Additions ## + + # CSI Ps @ + # Insert Ps (Blank) Character(s) (default = 1) (ICH). + insertChars: (params) -> + param = params[0] + param = 1 if param < 1 + row = @y + @ybase + j = @x + # xterm + ch = [@eraseAttr(), " "] + while param-- and j < @cols + @lines[row].splice j++, 0, ch + @lines[row].pop() + + + # CSI Ps E + # Cursor Next Line Ps Times (default = 1) (CNL). + # same as CSI Ps B ? + cursorNextLine: (params) -> + param = params[0] + param = 1 if param < 1 + @y += param + @y = @rows - 1 if @y >= @rows + @x = 0 + + + # CSI Ps F + # Cursor Preceding Line Ps Times (default = 1) (CNL). + # reuse CSI Ps A ? + cursorPrecedingLine: (params) -> + param = params[0] + param = 1 if param < 1 + @y -= param + @y = 0 if @y < 0 + @x = 0 + + + # CSI Ps G + # Cursor Character Absolute [column] (default = [row,1]) (CHA). + cursorCharAbsolute: (params) -> + param = params[0] + param = 1 if param < 1 + @x = param - 1 + + # CSI Ps L + # Insert Ps Line(s) (default = 1) (IL). + insertLines: (params) -> + param = params[0] + param = 1 if param < 1 + row = @y + @ybase + j = @rows - 1 - @scrollBottom + j = @rows - 1 + @ybase - j + 1 + while param-- + # test: echo -e '\e[44m\e[1L\e[0m' + # blankLine(true) - xterm/linux behavior + @lines.splice row, 0, @blankLine(true) + @lines.splice j, 1 + + @updateRange @y + @updateRange @scrollBottom + + + # CSI Ps M + # Delete Ps Line(s) (default = 1) (DL). + deleteLines: (params) -> + param = params[0] + param = 1 if param < 1 + row = @y + @ybase + j = @rows - 1 - @scrollBottom + j = @rows - 1 + @ybase - j + while param-- + # test: echo -e '\e[44m\e[1M\e[0m' + # blankLine(true) - xterm/linux behavior + @lines.splice j + 1, 0, @blankLine(true) + @lines.splice row, 1 + + @updateRange @y + @updateRange @scrollBottom + + + # CSI Ps P + # Delete Ps Character(s) (default = 1) (DCH). + deleteChars: (params) -> + param = params[0] + param = 1 if param < 1 + row = @y + @ybase + # xterm + ch = [@eraseAttr(), " "] + while param-- + @lines[row].splice @x, 1 + @lines[row].push ch + + + # CSI Ps X + # Erase Ps Character(s) (default = 1) (ECH). + eraseChars: (params) -> + param = params[0] + param = 1 if param < 1 + row = @y + @ybase + j = @x + # xterm + ch = [@eraseAttr(), " "] + @lines[row][j++] = ch while param-- and j < @cols + + + # CSI Pm ` Character Position Absolute + # [column] (default = [row,1]) (HPA). + charPosAbsolute: (params) -> + param = params[0] + param = 1 if param < 1 + @x = param - 1 + @x = @cols - 1 if @x >= @cols + + + # 141 61 a * HPR - + # Horizontal Position Relative + # reuse CSI Ps C ? + HPositionRelative: (params) -> + param = params[0] + param = 1 if param < 1 + @x += param + @x = @cols - 1 if @x >= @cols + + + # CSI Ps c Send Device Attributes (Primary DA). + # Ps = 0 or omitted -> request attributes from terminal. The + # response depends on the decTerminalID resource setting. + # -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'') + # -> CSI ? 1 ; 0 c (``VT101 with No Options'') + # -> CSI ? 6 c (``VT102'') + # -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'') + # The VT100-style response parameters do not mean anything by + # themselves. VT220 parameters do, telling the host what fea- + # tures the terminal supports: + # Ps = 1 -> 132-columns. + # Ps = 2 -> Printer. + # Ps = 6 -> Selective erase. + # Ps = 8 -> User-defined keys. + # Ps = 9 -> National replacement character sets. + # Ps = 1 5 -> Technical characters. + # Ps = 2 2 -> ANSI color, e.g., VT525. + # Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode). + # CSI > Ps c + # Send Device Attributes (Secondary DA). + # Ps = 0 or omitted -> request the terminal's identification + # code. The response depends on the decTerminalID resource set- + # ting. It should apply only to VT220 and up, but xterm extends + # this to VT100. + # -> CSI > Pp ; Pv ; Pc c + # where Pp denotes the terminal type + # Pp = 0 -> ``VT100''. + # Pp = 1 -> ``VT220''. + # and Pv is the firmware version (for xterm, this was originally + # the XFree86 patch number, starting with 95). In a DEC termi- + # nal, Pc indicates the ROM cartridge registration number and is + # always zero. + # More information: + # xterm/charproc.c - line 2012, for more information. + # vim responds with ^[[?0c or ^[[?1c after the terminal's response (?) + sendDeviceAttributes: (params) -> + return if params[0] > 0 + unless @prefix + if @isterm("xterm") or @isterm("rxvt-unicode") or @isterm("screen") + @send "\x1b[?1;2c" + else @send "\x1b[?6c" if @isterm("linux") + + else if @prefix is ">" + # xterm and urxvt + # seem to spit this + # out around ~370 times (?). + if @isterm("xterm") + @send "\x1b[>0;276;0c" + else if @isterm("rxvt-unicode") + @send "\x1b[>85;95;0c" + else if @isterm("linux") + # not supported by linux console. + # linux console echoes parameters. + @send params[0] + "c" + else @send "\x1b[>83;40003;0c" if @isterm("screen") + + + # CSI Pm d + # Line Position Absolute [row] (default = [1,column]) (VPA). + linePosAbsolute: (params) -> + param = params[0] + param = 1 if param < 1 + @y = param - 1 + @y = @rows - 1 if @y >= @rows + + + # 145 65 e * VPR - Vertical Position Relative + # reuse CSI Ps B ? + VPositionRelative: (params) -> + param = params[0] + param = 1 if param < 1 + @y += param + @y = @rows - 1 if @y >= @rows + + + # CSI Ps ; Ps f + # Horizontal and Vertical Position [row;column] (default = + # [1,1]) (HVP). + HVPosition: (params) -> + params[0] = 1 if params[0] < 1 + params[1] = 1 if params[1] < 1 + @y = params[0] - 1 + @y = @rows - 1 if @y >= @rows + @x = params[1] - 1 + @x = @cols - 1 if @x >= @cols + + + # CSI Pm h Set Mode (SM). + # Ps = 2 -> Keyboard Action Mode (AM). + # Ps = 4 -> Insert Mode (IRM). + # Ps = 1 2 -> Send/receive (SRM). + # Ps = 2 0 -> Automatic Newline (LNM). + # CSI ? Pm h + # DEC Private Mode Set (DECSET). + # Ps = 1 -> Application Cursor Keys (DECCKM). + # Ps = 2 -> Designate USASCII for character sets G0-G3 + # (DECANM), and set VT100 mode. + # Ps = 3 -> 132 Column Mode (DECCOLM). + # Ps = 4 -> Smooth (Slow) Scroll (DECSCLM). + # Ps = 5 -> Reverse Video (DECSCNM). + # Ps = 6 -> Origin Mode (DECOM). + # Ps = 7 -> Wraparound Mode (DECAWM). + # Ps = 8 -> Auto-repeat Keys (DECARM). + # Ps = 9 -> Send Mouse X & Y on button press. See the sec- + # tion Mouse Tracking. + # Ps = 1 0 -> Show toolbar (rxvt). + # Ps = 1 2 -> Start Blinking Cursor (att610). + # Ps = 1 8 -> Print form feed (DECPFF). + # Ps = 1 9 -> Set print extent to full screen (DECPEX). + # Ps = 2 5 -> Show Cursor (DECTCEM). + # Ps = 3 0 -> Show scrollbar (rxvt). + # Ps = 3 5 -> Enable font-shifting functions (rxvt). + # Ps = 3 8 -> Enter Tektronix Mode (DECTEK). + # Ps = 4 0 -> Allow 80 -> 132 Mode. + # Ps = 4 1 -> more(1) fix (see curses resource). + # Ps = 4 2 -> Enable Nation Replacement Character sets (DECN- + # RCM). + # Ps = 4 4 -> Turn On Margin Bell. + # Ps = 4 5 -> Reverse-wraparound Mode. + # Ps = 4 6 -> Start Logging. This is normally disabled by a + # compile-time option. + # Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis- + # abled by the titeInhibit resource). + # Ps = 6 6 -> Application keypad (DECNKM). + # Ps = 6 7 -> Backarrow key sends backspace (DECBKM). + # Ps = 1 0 0 0 -> Send Mouse X & Y on button press and + # release. See the section Mouse Tracking. + # Ps = 1 0 0 1 -> Use Hilite Mouse Tracking. + # Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking. + # Ps = 1 0 0 3 -> Use All Motion Mouse Tracking. + # Ps = 1 0 0 4 -> Send FocusIn/FocusOut events. + # Ps = 1 0 0 5 -> Enable Extended Mouse Mode. + # Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt). + # Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt). + # Ps = 1 0 3 4 -> Interpret "meta" key, sets eighth bit. + # (enables the eightBitInput resource). + # Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num- + # Lock keys. (This enables the numLock resource). + # Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This + # enables the metaSendsEscape resource). + # Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete + # key. + # Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This + # enables the altSendsEscape resource). + # Ps = 1 0 4 0 -> Keep selection even if not highlighted. + # (This enables the keepSelection resource). + # Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables + # the selectToClipboard resource). + # Ps = 1 0 4 2 -> Enable Urgency window manager hint when + # Control-G is received. (This enables the bellIsUrgent + # resource). + # Ps = 1 0 4 3 -> Enable raising of the window when Control-G + # is received. (enables the popOnBell resource). + # Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be + # disabled by the titeInhibit resource). + # Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis- + # abled by the titeInhibit resource). + # Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate + # Screen Buffer, clearing it first. (This may be disabled by + # the titeInhibit resource). This combines the effects of the 1 + # 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based + # applications rather than the 4 7 mode. + # Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode. + # Ps = 1 0 5 1 -> Set Sun function-key mode. + # Ps = 1 0 5 2 -> Set HP function-key mode. + # Ps = 1 0 5 3 -> Set SCO function-key mode. + # Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6). + # Ps = 1 0 6 1 -> Set VT220 keyboard emulation. + # Ps = 2 0 0 4 -> Set bracketed paste mode. + # Modes: + # http://vt100.net/docs/vt220-rm/chapter4.html + setMode: (params) -> + if typeof params is "object" + l = params.length + i = 0 + while i < l + @setMode params[i] + i++ + return + if @prefix is "?" + switch params + when 1 + @applicationCursor = true + when 2 + @setgCharset 0, Terminal::charsets.US + @setgCharset 1, Terminal::charsets.US + @setgCharset 2, Terminal::charsets.US + @setgCharset 3, Terminal::charsets.US + # set VT100 mode here + when 3 # 132 col mode + @savedCols = @cols + @resize 132, @rows + when 6 + @originMode = true + when 7 + @wraparoundMode = true + when 66 + @applicationKeypad = true + # X10 Mouse + # no release, no motion, no wheel, no modifiers. + when 9, 1000, 1002, 1003 # any event mouse + # any event - sends motion events, + # even if there is no button held down. + @x10Mouse = params is 9 + @vt200Mouse = params is 1000 + @normalMouse = params > 1000 + @mouseEvents = true + @element.style.cursor = 'pointer' + when 1004 # send focusin/focusout events + # focusin: ^[[I + # focusout: ^[[O + @sendFocus = true + when 1005 # utf8 ext mode mouse + @utfMouse = true + # for wide terminals + # simply encodes large values as utf8 characters + when 1006 # sgr ext mode mouse + @sgrMouse = true + # for wide terminals + # does not add 32 to fields + # press: ^[[ Keyboard Action Mode (AM). + # Ps = 4 -> Replace Mode (IRM). + # Ps = 1 2 -> Send/receive (SRM). + # Ps = 2 0 -> Normal Linefeed (LNM). + # CSI ? Pm l + # DEC Private Mode Reset (DECRST). + # Ps = 1 -> Normal Cursor Keys (DECCKM). + # Ps = 2 -> Designate VT52 mode (DECANM). + # Ps = 3 -> 80 Column Mode (DECCOLM). + # Ps = 4 -> Jump (Fast) Scroll (DECSCLM). + # Ps = 5 -> Normal Video (DECSCNM). + # Ps = 6 -> Normal Cursor Mode (DECOM). + # Ps = 7 -> No Wraparound Mode (DECAWM). + # Ps = 8 -> No Auto-repeat Keys (DECARM). + # Ps = 9 -> Don't send Mouse X & Y on button press. + # Ps = 1 0 -> Hide toolbar (rxvt). + # Ps = 1 2 -> Stop Blinking Cursor (att610). + # Ps = 1 8 -> Don't print form feed (DECPFF). + # Ps = 1 9 -> Limit print to scrolling region (DECPEX). + # Ps = 2 5 -> Hide Cursor (DECTCEM). + # Ps = 3 0 -> Don't show scrollbar (rxvt). + # Ps = 3 5 -> Disable font-shifting functions (rxvt). + # Ps = 4 0 -> Disallow 80 -> 132 Mode. + # Ps = 4 1 -> No more(1) fix (see curses resource). + # Ps = 4 2 -> Disable Nation Replacement Character sets (DEC- + # NRCM). + # Ps = 4 4 -> Turn Off Margin Bell. + # Ps = 4 5 -> No Reverse-wraparound Mode. + # Ps = 4 6 -> Stop Logging. (This is normally disabled by a + # compile-time option). + # Ps = 4 7 -> Use Normal Screen Buffer. + # Ps = 6 6 -> Numeric keypad (DECNKM). + # Ps = 6 7 -> Backarrow key sends delete (DECBKM). + # Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and + # release. See the section Mouse Tracking. + # Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking. + # Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking. + # Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking. + # Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events. + # Ps = 1 0 0 5 -> Disable Extended Mouse Mode. + # Ps = 1 0 1 0 -> Don't scroll to bottom on tty output + # (rxvt). + # Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt). + # Ps = 1 0 3 4 -> Don't interpret "meta" key. (This disables + # the eightBitInput resource). + # Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num- + # Lock keys. (This disables the numLock resource). + # Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key. + # (This disables the metaSendsEscape resource). + # Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad + # Delete key. + # Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key. + # (This disables the altSendsEscape resource). + # Ps = 1 0 4 0 -> Do not keep selection when not highlighted. + # (This disables the keepSelection resource). + # Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables + # the selectToClipboard resource). + # Ps = 1 0 4 2 -> Disable Urgency window manager hint when + # Control-G is received. (This disables the bellIsUrgent + # resource). + # Ps = 1 0 4 3 -> Disable raising of the window when Control- + # G is received. (This disables the popOnBell resource). + # Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen + # first if in the Alternate Screen. (This may be disabled by + # the titeInhibit resource). + # Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be + # disabled by the titeInhibit resource). + # Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor + # as in DECRC. (This may be disabled by the titeInhibit + # resource). This combines the effects of the 1 0 4 7 and 1 0 + # 4 8 modes. Use this with terminfo-based applications rather + # than the 4 7 mode. + # Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode. + # Ps = 1 0 5 1 -> Reset Sun function-key mode. + # Ps = 1 0 5 2 -> Reset HP function-key mode. + # Ps = 1 0 5 3 -> Reset SCO function-key mode. + # Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6). + # Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style. + # Ps = 2 0 0 4 -> Reset bracketed paste mode. + resetMode: (params) -> + if typeof params is "object" + l = params.length + i = 0 + while i < l + @resetMode params[i] + i++ + return + + if @prefix is "?" + switch params + when 1 + @applicationCursor = false + when 3 + @resize @savedCols, @rows if @cols is 132 and @savedCols + delete @savedCols + when 6 + @originMode = false + when 7 + @wraparoundMode = false + when 66 + @applicationKeypad = false + when 9, 1000, 1002 , 1003 # any event mouse + @x10Mouse = false + @vt200Mouse = false + @normalMouse = false + @mouseEvents = false + @element.style.cursor = "" + when 1004 # send focusin/focusout events + @sendFocus = false + when 1005 # utf8 ext mode mouse + @utfMouse = false + when 1006 # sgr ext mode mouse + @sgrMouse = false + when 1015 # urxvt ext mode mouse + @urxvtMouse = false + when 25 # hide cursor + @cursorHidden = true + when 1049, 47, 1047 # normal screen buffer - clearing it first + if @normal + @lines = @normal.lines + @ybase = @normal.ybase + @ydisp = @normal.ydisp + @x = @normal.x + @y = @normal.y + @scrollTop = @normal.scrollTop + @scrollBottom = @normal.scrollBottom + @tabs = @normal.tabs + @normal = null + @refresh 0, @rows - 1 + @showCursor() + + + # CSI Ps ; Ps r + # Set Scrolling Region [top;bottom] (default = full size of win- + # dow) (DECSTBM). + # CSI ? Pm r + setScrollRegion: (params) -> + return if @prefix + @scrollTop = (params[0] or 1) - 1 + @scrollBottom = (params[1] or @rows) - 1 + @x = 0 + @y = 0 + + + # CSI s + # Save cursor (ANSI.SYS). + saveCursor: (params) -> + @savedX = @x + @savedY = @y + + + # CSI u + # Restore cursor (ANSI.SYS). + restoreCursor: (params) -> + @x = @savedX or 0 + @y = @savedY or 0 + + ## Lesser Used ## + + # CSI Ps I + # Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). + cursorForwardTab: (params) -> + param = params[0] or 1 + @x = @nextStop() while param-- + + + # CSI Ps S Scroll up Ps lines (default = 1) (SU). + scrollUp: (params) -> + param = params[0] or 1 + while param-- + @lines.splice @ybase + @scrollTop, 1 + @lines.splice @ybase + @scrollBottom, 0, @blankLine() + + @updateRange @scrollTop + @updateRange @scrollBottom + + + # CSI Ps T Scroll down Ps lines (default = 1) (SD). + scrollDown: (params) -> + param = params[0] or 1 + while param-- + @lines.splice @ybase + @scrollBottom, 1 + @lines.splice @ybase + @scrollTop, 0, @blankLine() + + @updateRange @scrollTop + @updateRange @scrollBottom + + + # CSI Ps ; Ps ; Ps ; Ps ; Ps T + # Initiate highlight mouse tracking. Parameters are + # [func;startx;starty;firstrow;lastrow]. See the section Mouse + # Tracking. + initMouseTracking: (params) -> + + # Relevant: DECSET 1001 + + # CSI > Ps; Ps T + # Reset one or more features of the title modes to the default + # value. Normally, "reset" disables the feature. It is possi- + # ble to disable the ability to reset features by compiling a + # different default for the title modes into xterm. + # Ps = 0 -> Do not set window/icon labels using hexadecimal. + # Ps = 1 -> Do not query window/icon labels using hexadeci- + # mal. + # Ps = 2 -> Do not set window/icon labels using UTF-8. + # Ps = 3 -> Do not query window/icon labels using UTF-8. + # (See discussion of "Title Modes"). + resetTitleModes: (params) -> + + + # CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). + cursorBackwardTab: (params) -> + param = params[0] or 1 + @x = @prevStop() while param-- + + + # CSI Ps b Repeat the preceding graphic character Ps times (REP). + repeatPrecedingCharacter: (params) -> + param = params[0] or 1 + line = @lines[@ybase + @y] + ch = line[@x - 1] or [@defAttr, " "] + line[@x++] = ch while param-- + + + # CSI Ps g Tab Clear (TBC). + # Ps = 0 -> Clear Current Column (default). + # Ps = 3 -> Clear All. + # Potentially: + # Ps = 2 -> Clear Stops on Line. + # http://vt100.net/annarbor/aaa-ug/section6.html + tabClear: (params) -> + param = params[0] + if param <= 0 + delete @tabs[@x] + else + @tabs = {} if param is 3 + + # CSI Pm i Media Copy (MC). + # Ps = 0 -> Print screen (default). + # Ps = 4 -> Turn off printer controller mode. + # Ps = 5 -> Turn on printer controller mode. + # CSI ? Pm i + # Media Copy (MC, DEC-specific). + # Ps = 1 -> Print line containing cursor. + # Ps = 4 -> Turn off autoprint mode. + # Ps = 5 -> Turn on autoprint mode. + # Ps = 1 0 -> Print composed display, ignores DECPEX. + # Ps = 1 1 -> Print all pages. + mediaCopy: (params) -> + + + # CSI > Ps; Ps m + # Set or reset resource-values used by xterm to decide whether + # to construct escape sequences holding information about the + # modifiers pressed with a given key. The first parameter iden- + # tifies the resource to set/reset. The second parameter is the + # value to assign to the resource. If the second parameter is + # omitted, the resource is reset to its initial value. + # Ps = 1 -> modifyCursorKeys. + # Ps = 2 -> modifyFunctionKeys. + # Ps = 4 -> modifyOtherKeys. + # If no parameters are given, all resources are reset to their + # initial values. + setResources: (params) -> + + + # CSI > Ps n + # Disable modifiers which may be enabled via the CSI > Ps; Ps m + # sequence. This corresponds to a resource value of "-1", which + # cannot be set with the other sequence. The parameter identi- + # fies the resource to be disabled: + # Ps = 1 -> modifyCursorKeys. + # Ps = 2 -> modifyFunctionKeys. + # Ps = 4 -> modifyOtherKeys. + # If the parameter is omitted, modifyFunctionKeys is disabled. + # When modifyFunctionKeys is disabled, xterm uses the modifier + # keys to make an extended sequence of functions rather than + # adding a parameter to each function key to denote the modi- + # fiers. + disableModifiers: (params) -> + + + # CSI > Ps p + # Set resource value pointerMode. This is used by xterm to + # decide whether to hide the pointer cursor as the user types. + # Valid values for the parameter: + # Ps = 0 -> never hide the pointer. + # Ps = 1 -> hide if the mouse tracking mode is not enabled. + # Ps = 2 -> always hide the pointer. If no parameter is + # given, xterm uses the default, which is 1 . + setPointerMode: (params) -> + + + # CSI ! p Soft terminal reset (DECSTR). + # http://vt100.net/docs/vt220-rm/table4-10.html + softReset: (params) -> + @cursorHidden = false + @insertMode = false + @originMode = false + @wraparoundMode = false # autowrap + @applicationKeypad = false # ? + @applicationCursor = false + @scrollTop = 0 + @scrollBottom = @rows - 1 + @curAttr = @defAttr + @x = @y = 0 # ? + @charset = null + @glevel = 0 # ?? + @charsets = [null] # ?? + + + # CSI Ps$ p + # Request ANSI mode (DECRQM). For VT300 and up, reply is + # CSI Ps; Pm$ y + # where Ps is the mode number as in RM, and Pm is the mode + # value: + # 0 - not recognized + # 1 - set + # 2 - reset + # 3 - permanently set + # 4 - permanently reset + requestAnsiMode: (params) -> + + + # CSI ? Ps$ p + # Request DEC private mode (DECRQM). For VT300 and up, reply is + # CSI ? Ps; Pm$ p + # where Ps is the mode number as in DECSET, Pm is the mode value + # as in the ANSI DECRQM. + requestPrivateMode: (params) -> + + + # CSI Ps ; Ps " p + # Set conformance level (DECSCL). Valid values for the first + # parameter: + # Ps = 6 1 -> VT100. + # Ps = 6 2 -> VT200. + # Ps = 6 3 -> VT300. + # Valid values for the second parameter: + # Ps = 0 -> 8-bit controls. + # Ps = 1 -> 7-bit controls (always set for VT100). + # Ps = 2 -> 8-bit controls. + setConformanceLevel: (params) -> + + + # CSI Ps q Load LEDs (DECLL). + # Ps = 0 -> Clear all LEDS (default). + # Ps = 1 -> Light Num Lock. + # Ps = 2 -> Light Caps Lock. + # Ps = 3 -> Light Scroll Lock. + # Ps = 2 1 -> Extinguish Num Lock. + # Ps = 2 2 -> Extinguish Caps Lock. + # Ps = 2 3 -> Extinguish Scroll Lock. + loadLEDs: (params) -> + + + # CSI Ps SP q + # Set cursor style (DECSCUSR, VT520). + # Ps = 0 -> blinking block. + # Ps = 1 -> blinking block (default). + # Ps = 2 -> steady block. + # Ps = 3 -> blinking underline. + # Ps = 4 -> steady underline. + setCursorStyle: (params) -> + + + # CSI Ps " q + # Select character protection attribute (DECSCA). Valid values + # for the parameter: + # Ps = 0 -> DECSED and DECSEL can erase (default). + # Ps = 1 -> DECSED and DECSEL cannot erase. + # Ps = 2 -> DECSED and DECSEL can erase. + setCharProtectionAttr: (params) -> + + + # CSI ? Pm r + # Restore DEC Private Mode Values. The value of Ps previously + # saved is restored. Ps values are the same as for DECSET. + restorePrivateValues: (params) -> + + + # CSI Pt; Pl; Pb; Pr; Ps$ r + # Change Attributes in Rectangular Area (DECCARA), VT400 and up. + # Pt; Pl; Pb; Pr denotes the rectangle. + # Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7. + # NOTE: xterm doesn't enable this code by default. + setAttrInRectangle: (params) -> + t = params[0] + l = params[1] + b = params[2] + r = params[3] + attr = params[4] + while t < b + 1 + line = @lines[@ybase + t] + i = l + while i < r + line[i] = [attr, line[i][1]] + i++ + t++ + + @updateRange params[0] + @updateRange params[2] + + + # CSI ? Pm s + # Save DEC Private Mode Values. Ps values are the same as for + # DECSET. + savePrivateValues: (params) -> + + + # CSI Ps ; Ps ; Ps t + # Window manipulation (from dtterm, as well as extensions). + # These controls may be disabled using the allowWindowOps + # resource. Valid values for the first (and any additional + # parameters) are: + # Ps = 1 -> De-iconify window. + # Ps = 2 -> Iconify window. + # Ps = 3 ; x ; y -> Move window to [x, y]. + # Ps = 4 ; height ; width -> Resize the xterm window to + # height and width in pixels. + # Ps = 5 -> Raise the xterm window to the front of the stack- + # ing order. + # Ps = 6 -> Lower the xterm window to the bottom of the + # stacking order. + # Ps = 7 -> Refresh the xterm window. + # Ps = 8 ; height ; width -> Resize the text area to + # [height;width] in characters. + # Ps = 9 ; 0 -> Restore maximized window. + # Ps = 9 ; 1 -> Maximize window (i.e., resize to screen + # size). + # Ps = 1 0 ; 0 -> Undo full-screen mode. + # Ps = 1 0 ; 1 -> Change to full-screen. + # Ps = 1 1 -> Report xterm window state. If the xterm window + # is open (non-iconified), it returns CSI 1 t . If the xterm + # window is iconified, it returns CSI 2 t . + # Ps = 1 3 -> Report xterm window position. Result is CSI 3 + # ; x ; y t + # Ps = 1 4 -> Report xterm window in pixels. Result is CSI + # 4 ; height ; width t + # Ps = 1 8 -> Report the size of the text area in characters. + # Result is CSI 8 ; height ; width t + # Ps = 1 9 -> Report the size of the screen in characters. + # Result is CSI 9 ; height ; width t + # Ps = 2 0 -> Report xterm window's icon label. Result is + # OSC L label ST + # Ps = 2 1 -> Report xterm window's title. Result is OSC l + # label ST + # Ps = 2 2 ; 0 -> Save xterm icon and window title on + # stack. + # Ps = 2 2 ; 1 -> Save xterm icon title on stack. + # Ps = 2 2 ; 2 -> Save xterm window title on stack. + # Ps = 2 3 ; 0 -> Restore xterm icon and window title from + # stack. + # Ps = 2 3 ; 1 -> Restore xterm icon title from stack. + # Ps = 2 3 ; 2 -> Restore xterm window title from stack. + # Ps >= 2 4 -> Resize to Ps lines (DECSLPP). + manipulateWindow: (params) -> + + + # CSI Pt; Pl; Pb; Pr; Ps$ t + # Reverse Attributes in Rectangular Area (DECRARA), VT400 and + # up. + # Pt; Pl; Pb; Pr denotes the rectangle. + # Ps denotes the attributes to reverse, i.e., 1, 4, 5, 7. + # NOTE: xterm doesn't enable this code by default. + reverseAttrInRectangle: (params) -> + + + # CSI > Ps; Ps t + # Set one or more features of the title modes. Each parameter + # enables a single feature. + # Ps = 0 -> Set window/icon labels using hexadecimal. + # Ps = 1 -> Query window/icon labels using hexadecimal. + # Ps = 2 -> Set window/icon labels using UTF-8. + # Ps = 3 -> Query window/icon labels using UTF-8. (See dis- + # cussion of "Title Modes") + setTitleModeFeature: (params) -> + + + # CSI Ps SP t + # Set warning-bell volume (DECSWBV, VT520). + # Ps = 0 or 1 -> off. + # Ps = 2 , 3 or 4 -> low. + # Ps = 5 , 6 , 7 , or 8 -> high. + setWarningBellVolume: (params) -> + + + # CSI Ps SP u + # Set margin-bell volume (DECSMBV, VT520). + # Ps = 1 -> off. + # Ps = 2 , 3 or 4 -> low. + # Ps = 0 , 5 , 6 , 7 , or 8 -> high. + setMarginBellVolume: (params) -> + + + # CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v + # Copy Rectangular Area (DECCRA, VT400 and up). + # Pt; Pl; Pb; Pr denotes the rectangle. + # Pp denotes the source page. + # Pt; Pl denotes the target location. + # Pp denotes the target page. + # NOTE: xterm doesn't enable this code by default. + copyRectangle: (params) -> + + + # CSI Pt ; Pl ; Pb ; Pr ' w + # Enable Filter Rectangle (DECEFR), VT420 and up. + # Parameters are [top;left;bottom;right]. + # Defines the coordinates of a filter rectangle and activates + # it. Anytime the locator is detected outside of the filter + # rectangle, an outside rectangle event is generated and the + # rectangle is disabled. Filter rectangles are always treated + # as "one-shot" events. Any parameters that are omitted default + # to the current locator position. If all parameters are omit- + # ted, any locator motion will be reported. DECELR always can- + # cels any prevous rectangle definition. + enableFilterRectangle: (params) -> + + + # CSI Ps x Request Terminal Parameters (DECREQTPARM). + # if Ps is a "0" (default) or "1", and xterm is emulating VT100, + # the control sequence elicits a response of the same form whose + # parameters describe the terminal: + # Ps -> the given Ps incremented by 2. + # Pn = 1 <- no parity. + # Pn = 1 <- eight bits. + # Pn = 1 <- 2 8 transmit 38.4k baud. + # Pn = 1 <- 2 8 receive 38.4k baud. + # Pn = 1 <- clock multiplier. + # Pn = 0 <- STP flags. + requestParameters: (params) -> + + + # CSI Ps x Select Attribute Change Extent (DECSACE). + # Ps = 0 -> from start to end position, wrapped. + # Ps = 1 -> from start to end position, wrapped. + # Ps = 2 -> rectangle (exact). + selectChangeExtent: (params) -> + + + # CSI Pc; Pt; Pl; Pb; Pr$ x + # Fill Rectangular Area (DECFRA), VT420 and up. + # Pc is the character to use. + # Pt; Pl; Pb; Pr denotes the rectangle. + # NOTE: xterm doesn't enable this code by default. + fillRectangle: (params) -> + ch = params[0] + t = params[1] + l = params[2] + b = params[3] + r = params[4] + while t < b + 1 + line = @lines[@ybase + t] + i = l + while i < r + line[i] = [line[i][0], String.fromCharCode(ch)] + i++ + t++ + + @updateRange params[1] + @updateRange params[3] + + + # CSI Ps ; Pu ' z + # Enable Locator Reporting (DECELR). + # Valid values for the first parameter: + # Ps = 0 -> Locator disabled (default). + # Ps = 1 -> Locator enabled. + # Ps = 2 -> Locator enabled for one report, then disabled. + # The second parameter specifies the coordinate unit for locator + # reports. + # Valid values for the second parameter: + # Pu = 0 <- or omitted -> default to character cells. + # Pu = 1 <- device physical pixels. + # Pu = 2 <- character cells. + enableLocatorReporting: (params) -> + val = params[0] > 0 + + + # CSI Pt; Pl; Pb; Pr$ z + # Erase Rectangular Area (DECERA), VT400 and up. + # Pt; Pl; Pb; Pr denotes the rectangle. + # NOTE: xterm doesn't enable this code by default. + eraseRectangle: (params) -> + t = params[0] + l = params[1] + b = params[2] + r = params[3] + ch = [@eraseAttr(), " "] + while t < b + 1 + line = @lines[@ybase + t] + i = l + while i < r + line[i] = ch + i++ + t++ + + @updateRange params[0] + @updateRange params[2] + + + # CSI Pm ' { + # Select Locator Events (DECSLE). + # Valid values for the first (and any additional parameters) + # are: + # Ps = 0 -> only respond to explicit host requests (DECRQLP). + # (This is default). It also cancels any filter + # rectangle. + # Ps = 1 -> report button down transitions. + # Ps = 2 -> do not report button down transitions. + # Ps = 3 -> report button up transitions. + # Ps = 4 -> do not report button up transitions. + setLocatorEvents: (params) -> + + + # CSI Pt; Pl; Pb; Pr$ { + # Selective Erase Rectangular Area (DECSERA), VT400 and up. + # Pt; Pl; Pb; Pr denotes the rectangle. + selectiveEraseRectangle: (params) -> + + + # CSI Ps ' | + # Request Locator Position (DECRQLP). + # Valid values for the parameter are: + # Ps = 0 , 1 or omitted -> transmit a single DECLRP locator + # report. + + # If Locator Reporting has been enabled by a DECELR, xterm will + # respond with a DECLRP Locator Report. This report is also + # generated on button up and down events if they have been + # enabled with a DECSLE, or when the locator is detected outside + # of a filter rectangle, if filter rectangles have been enabled + # with a DECEFR. + + # -> CSI Pe ; Pb ; Pr ; Pc ; Pp & w + + # Parameters are [event;button;row;column;page]. + # Valid values for the event: + # Pe = 0 -> locator unavailable - no other parameters sent. + # Pe = 1 -> request - xterm received a DECRQLP. + # Pe = 2 -> left button down. + # Pe = 3 -> left button up. + # Pe = 4 -> middle button down. + # Pe = 5 -> middle button up. + # Pe = 6 -> right button down. + # Pe = 7 -> right button up. + # Pe = 8 -> M4 button down. + # Pe = 9 -> M4 button up. + # Pe = 1 0 -> locator outside filter rectangle. + # ``button'' parameter is a bitmask indicating which buttons are + # pressed: + # Pb = 0 <- no buttons down. + # Pb & 1 <- right button down. + # Pb & 2 <- middle button down. + # Pb & 4 <- left button down. + # Pb & 8 <- M4 button down. + # ``row'' and ``column'' parameters are the coordinates of the + # locator position in the xterm window, encoded as ASCII deci- + # mal. + # The ``page'' parameter is not used by xterm, and will be omit- + # ted. + requestLocatorPosition: (params) -> + + + # CSI P m SP } + # Insert P s Column(s) (default = 1) (DECIC), VT420 and up. + # NOTE: xterm doesn't enable this code by default. + insertColumns: -> + param = params[0] + l = @ybase + @rows + ch = [@eraseAttr(), " "] + while param-- + i = @ybase + while i < l + @lines[i].splice @x + 1, 0, ch + @lines[i].pop() + i++ + @maxRange() + + + # CSI P m SP ~ + # Delete P s Column(s) (default = 1) (DECDC), VT420 and up + # NOTE: xterm doesn't enable this code by default. + deleteColumns: -> + param = params[0] + l = @ybase + @rows + ch = [@eraseAttr(), " "] + while param-- + i = @ybase + while i < l + @lines[i].splice @x, 1 + @lines[i].push ch + i++ + @maxRange() + + + get_html_height_in_lines: (html) -> + temp_node = document.createElement("div") + temp_node.innerHTML = html + @element.appendChild temp_node + html_height = temp_node.getBoundingClientRect().height + @element.removeChild temp_node + Math.ceil(html_height / @char_size.height) + + # DEC Special Character and Line Drawing Set. + # http://vt100.net/docs/vt102-ug/table5-13.html + # A lot of curses apps use this if they see TERM=xterm. + # testing: echo -e '\e(0a\e(B' + # The xterm output sometimes seems to conflict with the + # reference above. xterm seems in line with the reference + # when running vttest however. + # The table below now uses xterm's output from vttest. + charsets: + SCLD:# (0 + "`": "◆" # '◆' + a: "▒" # '▒' + b: "\t" # '\t' + c: "\f" # '\f' + d: "\r" # '\r' + e: "\n" # '\n' + f: "°" # '°' + g: "±" # '±' + h: "␤" # '\u2424' (NL) + i: "\x0b" # '\v' + j: "┘" # '┘' + k: "┐" # '┐' + l: "┌" # '┌' + m: "└" # '└' + n: "┼" # '┼' + o: "⎺" # '⎺' + p: "⎻" # '⎻' + q: "─" # '─' + r: "⎼" # '⎼' + s: "⎽" # '⎽' + t: "├" # '├' + u: "┤" # '┤' + v: "┴" # '┴' + w: "┬" # '┬' + x: "│" # '│' + y: "≤" # '≤' + z: "≥" # '≥' + "{": "π" # 'π' + "|": "≠" # '≠' + "}": "£" # '£' + "~": "·" # '·' + UK: null # (A + US: null # (B (USASCII) + Dutch: null # (4 + Finnish: null # (C or (5 + French: null # (R + FrenchCanadian: null # (Q + German: null # (K + Italian: null # (Y + NorwegianDanish: null # (E or (6 + Spanish: null # (Z + Swedish: null # (H or (7 + Swiss: null # (= + ISOLatin: null # /A diff --git a/coffees/virtual_input.coffee b/coffees/virtual_input.coffee index 43e2116..99d08ff 100644 --- a/coffees/virtual_input.coffee +++ b/coffees/virtual_input.coffee @@ -16,64 +16,65 @@ # along with this program. If not, see . -if /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test navigator.userAgent - ctrl = false - alt = false - first = true - virtual_input = document.createElement 'input' - virtual_input.type = 'password' - virtual_input.style.position = 'fixed' - virtual_input.style.top = 0 - virtual_input.style.left = 0 - virtual_input.style.border = 'none' - virtual_input.style.outline = 'none' - virtual_input.style.opacity = 0 - virtual_input.value = '0' - document.body.appendChild virtual_input +if /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i +.test navigator.userAgent + ctrl = false + alt = false + first = true + virtual_input = document.createElement 'input' + virtual_input.type = 'password' + virtual_input.style.position = 'fixed' + virtual_input.style.top = 0 + virtual_input.style.left = 0 + virtual_input.style.border = 'none' + virtual_input.style.outline = 'none' + virtual_input.style.opacity = 0 + virtual_input.value = '0' + document.body.appendChild virtual_input - virtual_input.addEventListener 'blur', -> - setTimeout((=> @focus()), 10) + virtual_input.addEventListener 'blur', -> + setTimeout((=> @focus()), 10) - addEventListener 'click', -> - virtual_input.focus() + addEventListener 'click', -> + virtual_input.focus() - addEventListener 'touchstart', (e) -> - if e.touches.length == 2 - ctrl = true - else if e.touches.length == 3 - ctrl = false - alt = true - else if e.touches.length == 4 - ctrl = true - alt = true + addEventListener 'touchstart', (e) -> + if e.touches.length == 2 + ctrl = true + else if e.touches.length == 3 + ctrl = false + alt = true + else if e.touches.length == 4 + ctrl = true + alt = true - virtual_input.addEventListener 'keydown', (e) -> - term.keyDown(e) - return true + virtual_input.addEventListener 'keydown', (e) -> + term.keyDown(e) + return true - virtual_input.addEventListener 'input', (e) -> - len = @value.length + virtual_input.addEventListener 'input', (e) -> + len = @value.length - if len == 0 - e.keyCode = 8 - term.keyDown e - @value = '0' - return true + if len == 0 + e.keyCode = 8 + term.keyDown e + @value = '0' + return true - e.keyCode = @value.charAt(1).charCodeAt(0) + e.keyCode = @value.charAt(1).charCodeAt(0) - if (ctrl or alt) and not first - e.keyCode = @value.charAt(1).charCodeAt(0) - e.ctrlKey = ctrl - e.altKey = alt - if e.keyCode >= 97 && e.keyCode <= 122 - e.keyCode -= 32 - term.keyDown e - @value = '0' - ctrl = alt = false - return true + if (ctrl or alt) and not first + e.keyCode = @value.charAt(1).charCodeAt(0) + e.ctrlKey = ctrl + e.altKey = alt + if e.keyCode >= 97 && e.keyCode <= 122 + e.keyCode -= 32 + term.keyDown e + @value = '0' + ctrl = alt = false + return true - term.keyPress e - first = false - @value = '0' - true + term.keyPress e + first = false + @value = '0' + true diff --git a/dev.py b/dev.py deleted file mode 100755 index d8f2157..0000000 --- a/dev.py +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env python -from multiprocessing import Process -from subprocess import Popen -from glob import glob -import time -import sys -import shlex - -commands = [ - 'coffee -wcb -j butterfly/static/javascripts/main.js ' + - 'butterfly/static/coffees/term.coffee ' + - 'butterfly/static/coffees/selection.coffee ' + - 'butterfly/static/coffees/virtual_input.coffee ' + - 'butterfly/static/coffees/main.coffee ', - 'compass watch butterfly/static', - 'python butterfly.server.py ' + ' '.join(sys.argv[1:]) -] - - -class Run(Process): - daemon = True - - def __init__(self, command, *args, **kwargs): - super(Run, self).__init__(*args, **kwargs) - self.cmd = command - - def run(self): - try: - while True: - self.proc = Popen(shlex.split(self.cmd)) - self.proc.wait() - print(self.cmd + ' exited. Relaunching in 250ms') - time.sleep(.25) - except KeyboardInterrupt: - pass - -process = [Run(cmd) for cmd in commands] -for proc in process: - print('Lauching %s' % proc.cmd.split(' ')[0]) - proc.start() - -try: - for proc in process: - proc.join() - print('Joined') -except KeyboardInterrupt: - print('\nGot [ctrl]+[c] -- bye bye') diff --git a/sass/main.sass b/sass/main.sass index b7166e6..fca6da6 100644 --- a/sass/main.sass +++ b/sass/main.sass @@ -1,29 +1,29 @@ -/* *-* coding: utf-8 *-* -/* This file is part of butterfly -/* -/* butterfly Copyright (C) 2014 Florian Mounier -/* This program is free software: you can redistribute it and/or modify -/* it under the terms of the GNU General Public License as published by -/* the Free Software Foundation, either version 3 of the License, or -/* (at your option) any later version. -/* -/* This program is distributed in the hope that it will be useful, -/* but WITHOUT ANY WARRANTY; without even the implied warranty of -/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -/* GNU General Public License for more details. -/* -/* You should have received a copy of the GNU General Public License -/* along with this program. If not, see . +/* *-* coding: utf-8 *-* */ +/* This file is part of butterfly */ -@import compass/css3 +/* butterfly Copyright (C) 2014 Florian Mounier */ +/* This program is free software: you can redistribute it and/or modify */ +/* it under the terms of the GNU General Public License as published by */ +/* the Free Software Foundation, either version 3 of the License, or */ +/* (at your option) any later version. */ -+font-face("SourceCodePro", font-files("SourceCodePro-ExtraLight.otf"), "", 100, normal) -+font-face("SourceCodePro", font-files("SourceCodePro-Light.otf"), "", 300, normal) -+font-face("SourceCodePro", font-files("SourceCodePro-Regular.otf"), "", 400, normal) -+font-face("SourceCodePro", font-files("SourceCodePro-Medium.otf"), "", 500, normal) -+font-face("SourceCodePro", font-files("SourceCodePro-Semibold.otf"), "", 600, normal) -+font-face("SourceCodePro", font-files("SourceCodePro-Bold.otf"), "", 700, normal) -+font-face("SourceCodePro", font-files("SourceCodePro-Black.otf"), "", 900, normal) +/* This program is distributed in the hope that it will be useful, */ +/* but WITHOUT ANY WARRANTY; without even the implied warranty of */ +/* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the */ +/* GNU General Public License for more details. */ + +/* You should have received a copy of the GNU General Public License */ +/* along with this program. If not, see . */ + +$weights: (ExtraLight 100) (Light 300) (Regular 400) (Medium 500) (Semibold 600) (Bold 700) (Black 900) + +@each $weight in $weights + $weight_name: nth($weight, 1) + + @font-face + font-family: "SourceCodePro" + src: url("fonts/SourceCodePro-#{$weight_name}.otf") format("woff") + font-weight: nth($weight, 2) $bg: #110f13 $fg: #f4ead5 @@ -50,16 +50,19 @@ html, body background-color: $bg color: $fg text-shadow: 0 0 $shadow rgba($fg, $shadow-alpha) - +transition(200ms) + transition: 200ms &.bell - +filter(blur(2px)) + -webkit-filter: blur(2px) &.skip - +filter(sepia(1)) + -webkit-filter: sepia(1) &.selection - +filter(saturate(2)) + -webkit-filter: unquote("saturate(2)") + + &.dead + -webkit-filter: unquote("grayscale(1)") .line overflow: visible @@ -69,12 +72,12 @@ html, body .focus .cursor - +transition(300ms) + transition: 300ms .cursor.reverse-video box-shadow: 0 0 10px $fg -/* Terminal styles +/* Terminal styles */ .bold font-weight: bold @@ -138,6 +141,6 @@ $st: 00, 95, 135, 175, 215, 255 +termcolor($i + 232, rgb($l, $l, $l)) -/* ?? +/* ?? */ +termcolor(256, $bg) +termcolor(257, $fg)