').addClass('terminal-output').attr('role', 'log')\n .appendTo(wrapper);\n self.addClass('terminal');\n // before login event\n if (settings.login && fire_event('onBeforeLogin') === false) {\n autologin = false;\n }\n // create json-rpc authentication function\n var base_interpreter;\n if (typeof init_interpreter === 'string') {\n base_interpreter = init_interpreter;\n } else if (is_array(init_interpreter)) {\n // first JSON-RPC\n for (var i = 0, len = init_interpreter.length; i < len; ++i) {\n if (typeof init_interpreter[i] === 'string') {\n base_interpreter = init_interpreter[i];\n break;\n }\n }\n }\n var global_login_fn;\n if (is_function(settings.login)) {\n global_login_fn = settings.login;\n } else if (base_interpreter &&\n (typeof settings.login === 'string' || settings.login === true)) {\n global_login_fn = make_json_rpc_login(base_interpreter, settings.login);\n }\n terminals.append(self);\n function focus_terminal() {\n if (old_enabled) {\n self.focus();\n }\n }\n function blur_terminal() {\n old_enabled = enabled;\n self.disable().find('.cmd textarea').trigger('blur', [true]);\n }\n function context_callback_proxy(fn, type) {\n if (fn.proxy) {\n return fn;\n }\n var wrapper = function(callback) {\n var ret = fn.call(self, callback, self);\n if (ret && is_function(ret.then)) {\n ret.then(function(string) {\n if (typeof string === type) {\n callback(string);\n }\n });\n }\n };\n wrapper.proxy = true;\n return wrapper;\n }\n // paste event is not testable in node\n // istanbul ignore next\n function paste_event(e) {\n e = e.originalEvent;\n // we don't care about browser that don't support clipboard data\n // those browser simple will not have this feature normal paste\n // is cross-browser and it's handled by cmd plugin\n function is_type(item, type) {\n return item.type.indexOf(type) !== -1;\n }\n function echo_image(image) {\n self.echo('
![](\"')
', {raw: true});\n }\n function data_uri(blob) {\n var URL = window.URL || window.webkitURL;\n return URL.createObjectURL(blob);\n }\n function echo(object, ignoreEvents) {\n if (!ignoreEvents && is_function(settings.onPaste)) {\n var event = {\n target: self\n };\n if (typeof object === 'string') {\n event['text'] = object;\n } else if (object instanceof Blob) {\n event['image'] = data_uri(object);\n }\n var ret = fire_event('onPaste', [event]);\n if (ret) {\n if (is_function(ret.then)) {\n return ret.then(function(ret) {\n echo(ret, true);\n });\n } else {\n echo(ret, true);\n }\n } else {\n echo(event.image || event.text, true);\n }\n } else if (object instanceof Blob) {\n echo_image(data_uri(object));\n } else if (typeof object === 'string') {\n if (object.match(/^(data:|blob:)/)) {\n echo_image(object);\n } else {\n self.insert(object);\n }\n }\n }\n if (e.clipboardData) {\n if (self.enabled()) {\n var items = e.clipboardData.items;\n if (items) {\n for (var i = 0; i < items.length; i++) {\n if (is_type(items[i], 'image') && settings.pasteImage) {\n var blob = items[i].getAsFile();\n echo(blob);\n } else if (is_type(items[i], 'text/plain')) {\n items[i].getAsString(echo);\n }\n }\n } else if (e.clipboardData.getData) {\n var text = e.clipboardData.getData('text/plain');\n echo(text);\n }\n return false;\n }\n }\n }\n $(document).on('paste.terminal_' + self.id(), paste_event);\n var new_keymap = $.extend(\n {},\n keymap,\n $.omap(settings.keymap || {}, function(key, fn) {\n if (!keymap[key]) {\n return fn.bind(self);\n }\n return function(e, original) {\n // new keymap function will get default as 2nd argument\n return fn.call(self, e, function() {\n return keymap[key](e, original);\n });\n };\n })\n );\n make_interpreter(init_interpreter, settings.login, function(interpreter) {\n if (settings.completion && typeof settings.completion !== 'boolean' ||\n !settings.completion) {\n // overwrite interpreter completion by global setting #224\n // we use string to indicate that it need to be taken from settings\n // so we are able to change it using option API method\n interpreter.completion = 'settings';\n }\n var prompt = settings.prompt;\n if (is_function(prompt)) {\n prompt = context_callback_proxy(prompt, 'string');\n }\n interpreters = new Stack($.extend({}, settings.extra, {\n name: settings.name,\n prompt: prompt,\n keypress: settings.keypress,\n keydown: settings.keydown,\n resize: settings.onResize,\n greetings: settings.greetings,\n mousewheel: settings.mousewheel,\n history: settings.history,\n keymap: new_keymap\n }, interpreter));\n // CREATE COMMAND LINE\n command_line = $('
').appendTo(wrapper).cmd({\n tabindex: settings.tabindex,\n mobileIngoreAutoSpace: settings.mobileIngoreAutoSpace,\n prompt: global_login_fn ? false : prompt,\n history: settings.memory ? 'memory' : settings.history,\n historyFilter: settings.historyFilter,\n historySize: settings.historySize,\n caseSensitiveSearch: settings.caseSensitiveSearch,\n onPaste: settings.onPaste,\n width: '100%',\n enabled: false,\n char_width: char_size.width,\n keydown: key_down,\n keymap: new_keymap,\n clickTimeout: settings.clickTimeout,\n holdTimeout: settings.holdTimeout,\n holdRepeatTimeout: settings.holdRepeatTimeout,\n repeatTimeoutKeys: settings.repeatTimeoutKeys,\n keypress: key_press,\n tabs: settings.tabs,\n onPositionChange: function() {\n var args = [].slice.call(arguments);\n make_cursor_visible();\n fire_event('onPositionChange', args);\n },\n onCommandChange: function(command) {\n // resize is not triggered when insert called just after init\n // and scrollbar appear\n if (old_width !== fill.width()) {\n // resizer handler will update old_width\n self.resizer();\n }\n fire_event('onCommandChange', [command]);\n make_cursor_visible();\n },\n commands: commands\n });\n function disable(e) {\n e = e.originalEvent;\n if (e) {\n // e.terget is body when click outside of context menu to close it\n // even if you click on terminal\n var node = document.elementFromPoint(e.clientX, e.clientY);\n if (!$(node).closest('.terminal').length && self.enabled()) {\n // we only need to disable when click outside of terminal\n // click on other terminal is handled by focus event\n self.disable();\n }\n }\n }\n self.oneTime(100, function() {\n $(document).bind('click.terminal_' + self.id(), disable).\n bind('contextmenu.terminal_' + self.id(), disable);\n });\n var $win = $(window);\n // cordova application, if keyboard was open and we resume, it will be\n // closed so we need to disable terminal so you can enable it with tap\n document.addEventListener(\"resume\", function() {\n self.disable();\n });\n // istanbul ignore next\n if (is_mobile) {\n self.click(function() {\n if (!frozen) {\n if (!self.enabled()) {\n self.focus();\n command_line.enable();\n } else {\n self.disable();\n }\n }\n });\n } else {\n // work weird on mobile\n $win.on('focus.terminal_' + self.id(), focus_terminal).\n on('blur.terminal_' + self.id(), blur_terminal);\n // detect mouse drag\n (function() {\n var count = 0;\n var $target;\n var name = 'click_' + self.id();\n var textarea = self.find('.cmd textarea');\n function click() {\n if ($target.is('.terminal') ||\n $target.is('.terminal-wrapper')) {\n var len = self.get_command().length;\n self.set_position(len);\n } else if ($target.closest('.cmd-prompt').length) {\n self.set_position(0);\n }\n if (!textarea.is(':focus')) {\n textarea.focus();\n }\n reset();\n }\n function reset() {\n count = 0;\n $target = null;\n }\n var ignore_elements = '.terminal-output textarea,' +\n '.terminal-output input';\n self.mousedown(function(e) {\n if (!scrollbar_event(e, fill)) {\n $target = $(e.target);\n }\n }).mouseup(function() {\n if ($target && $target.closest(ignore_elements).length) {\n if (enabled) {\n self.disable();\n }\n } else if (get_selected_html() === '' && $target) {\n if (++count === 1) {\n if (!frozen) {\n if (!enabled) {\n self.focus();\n } else {\n var timeout = settings.clickTimeout;\n self.oneTime(timeout, name, click);\n return;\n }\n }\n } else {\n self.stopTime(name);\n }\n }\n reset();\n }).dblclick(function() {\n reset();\n self.stopTime(name);\n });\n })();\n (function() {\n var clip = self.find('.cmd textarea');\n function is_context_event(e) {\n return e.type === 'mousedown' && e.buttons === 2 ||\n e.type === 'contextmenu';\n }\n self.on('contextmenu.terminal mousedown.terminal', function(e) {\n if (get_selected_html() === '' && is_context_event(e)) {\n if (!$(e.target).is('img,value,audio,object,canvas,a')) {\n if (!self.enabled()) {\n self.enable();\n }\n var offset = command_line.offset();\n wrapper.css('overflow', 'hidden');\n clip.css({\n left: e.pageX - offset.left - 20,\n top: e.pageY - offset.top - 20,\n width: '5em',\n height: '4em'\n });\n if (!clip.is(':focus')) {\n clip.focus();\n }\n self.stopTime('textarea');\n self.oneTime(100, 'textarea', function() {\n var props = {\n left: '',\n top: '',\n width: '',\n height: ''\n };\n if (!is_css_variables_supported) {\n var in_line = self.find('.cmd .cmd-cursor-line')\n .prevUntil('.cmd-prompt').length;\n props.top = in_line * 14 + 'px';\n }\n clip.css(props);\n wrapper.css('overflow', '');\n });\n self.stopTime('selection');\n self.everyTime(20, 'selection', function() {\n if (clip[0].selection !== clip[0].value) {\n if (get_textarea_selection(clip[0])) {\n clear_textarea_selection(clip[0]);\n select(\n self.find('.terminal-output')[0],\n self.find('.cmd div:last-of-type')[0]\n );\n self.stopTime('selection');\n }\n }\n });\n }\n }\n });\n })();\n }\n self.on('click', 'a', function(e) {\n var $this = $(this);\n if ($this.closest('.terminal-exception').length) {\n var href = $this.attr('href');\n if (href.match(/:[0-9]+$/)) { // display line if specified\n e.preventDefault();\n print_line(href);\n }\n }\n // refocus because links have tabindex in case where user want\n // tab change urls, we can ignore this function on click\n if (enabled) {\n self.find('.cmd textarea').focus();\n }\n });\n function calculate_char_size() {\n var width = char_size.width;\n char_size = get_char_size(self);\n if (width !== char_size.width) {\n command_line.option('char_width', char_size.width).refresh();\n }\n }\n resize();\n function resize() {\n if (self.is(':visible')) {\n var width = fill.width();\n var height = fill.height();\n // prevent too many calculations in IE\n if (old_height !== height || old_width !== width) {\n self.resize();\n }\n old_height = height;\n old_width = width;\n }\n }\n function create_resizers() {\n var options = {\n prefix: 'terminal-'\n };\n self.resizer('unbind').resizer(resize, options);\n font_resizer.resizer('unbind').resizer(function() {\n calculate_char_size();\n self.resize();\n }, options);\n }\n if (self.is(':visible')) {\n create_resizers();\n }\n function observe_visibility() {\n if (visibility_observer) {\n if (visibility_observer.unobserve) {\n visibility_observer.unobserve(self[0]);\n } else {\n clearInterval(visibility_observer);\n }\n }\n var was_enabled = self.enabled();\n var visible = self.is(':visible');\n if (was_enabled && !visible) {\n self.disable();\n }\n if (visible) {\n create_resizers();\n } else {\n // hide terminal content until it's resized (and num chars calculated)\n wrapper.css('visibility', 'hidden');\n }\n function visibility_checker() {\n if (self.is(':visible') && !visible) {\n visible = true;\n create_resizers();\n calculate_char_size();\n resize();\n if (was_enabled) {\n self.enable();\n }\n wrapper.css('visibility', '');\n } else if (visible && !self.is(':visible')) {\n visible = false;\n was_enabled = $.terminal.active() === self && self.enabled();\n self.disable();\n wrapper.css('visibility', 'hidden');\n }\n }\n if (window.IntersectionObserver && self.css('position') !== 'fixed') {\n visibility_observer = new IntersectionObserver(visibility_checker, {\n root: null\n });\n visibility_observer.observe(self[0]);\n } else {\n visibility_observer = setInterval(visibility_checker, 100);\n }\n }\n var in_dom = !!self.closest('body').length;\n var MutationObsrv = window.MutationObserver || window.WebKitMutationObserver;\n if (MutationObsrv) {\n mutation_observer = new MutationObsrv(function() {\n if (self.closest('body').length) {\n if (!in_dom) {\n self.scroll_to_bottom();\n if (window.IntersectionObserver) {\n observe_visibility();\n }\n resize();\n }\n in_dom = true;\n } else if (in_dom) {\n in_dom = false;\n }\n });\n mutation_observer.observe(document.body, {childList: true});\n }\n if (in_dom) {\n // check if element is in the DOM if not running IntersectionObserver\n // don't make sense\n observe_visibility();\n }\n command_queue.resolve();\n // touch devices need touch event to get virtual keyboard\n if (enabled && self.is(':visible') && !is_mobile) {\n self.focus(undefined, true);\n } else {\n self.disable();\n }\n // -------------------------------------------------------------\n // Run Login\n if (is_function(global_login_fn)) {\n self.login(global_login_fn, true, initialize);\n } else {\n initialize();\n }\n // -------------------------------------------------------------\n // :: helper\n function exec_spec(spec) {\n var terminal = terminals.get()[spec[0]];\n // execute if belong to this terminal\n if (terminal && terminal_id === terminal.id()) {\n if (!spec[2]) {\n defer.resolve();\n return defer.promise();\n } else if (paused) {\n var defer = $.Deferred();\n resume_callbacks.push(function() {\n return terminal.exec(spec[2]).done(function() {\n terminal.save_state(spec[2], true, spec[1]);\n defer.resolve();\n });\n });\n return defer.promise();\n } else {\n return terminal.exec(spec[2]).done(function() {\n terminal.save_state(spec[2], true, spec[1]);\n });\n }\n }\n }\n // exec from hash called in each terminal instance\n if (settings.execHash) {\n if (location.hash) {\n // wait until login is initialized\n setTimeout(function() {\n try {\n var hash = location.hash.replace(/^#/, '');\n // yes no var - local inside terminal\n hash_commands = JSON.parse(decodeURIComponent(hash));\n var i = 0;\n (function recur() {\n var spec = hash_commands[i++];\n if (spec) {\n exec_spec(spec).done(recur);\n } else {\n change_hash = true;\n }\n })();// */\n } catch (e) {\n // invalid json - ignore\n }\n });\n } else {\n change_hash = true;\n }\n } else {\n change_hash = true; // if enabled later\n }\n // change_hash = true; // exec can now change hash\n // -------------------------------------------------------------\n /* istanbul ignore next */\n (function() {\n var shift = false;\n $(document).bind('keydown.terminal_' + self.id(), function(e) {\n if (e.shiftKey) {\n shift = true;\n }\n }).bind('keyup.terminal_' + self.id(), function(e) {\n // in Google Chromium/Linux shiftKey is false\n if (e.shiftKey || e.which === 16) {\n shift = false;\n }\n });\n // this could work without calling scroll on wheel event but we\n // need it for cases where you have mouse wheel work differently\n // like with less command that scroll text\n function mousewheel(event, delta) {\n if (!shift) {\n var interpreter = interpreters.top();\n var ret;\n if (is_function(interpreter.mousewheel)) {\n ret = interpreter.mousewheel(event, delta, self);\n } else if (is_function(settings.mousewheel)) {\n ret = settings.mousewheel(event, delta, self);\n }\n if (ret === true) {\n return;\n }\n if ((have_scrollbar() || ret === false) && !event.ctrlKey) {\n event.stopPropagation();\n event.preventDefault();\n }\n if (ret === false) {\n return false;\n }\n if (delta > 0) {\n self.scroll(-40);\n } else {\n self.scroll(40);\n }\n }\n }\n if ($.event.special.mousewheel) {\n // we keep mousewheel plugin just in case\n self.on('mousewheel', mousewheel);\n } else {\n // detection take from:\n // https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n var event;\n var div = document.createElement(\"div\");\n if (\"onwheel\" in div) {\n event = \"wheel\"; // Modern browsers support \"wheel\"\n } else if (document.onmousewheel !== undefined) {\n // Webkit and IE support at least \"mousewheel\"\n event = \"mousewheel\";\n } else {\n // let's assume that remaining browsers are older Firefox\n event = \"DOMMouseScroll\";\n }\n div = null;\n self.on(event, function(e) {\n var delta;\n if (event === 'mousewheel') {\n delta = - 1 / 40 * e.originalEvent.wheelDelta;\n } else {\n delta = e.originalEvent.deltaY || e.originalEvent.detail;\n }\n mousewheel(e, -delta);\n });\n }\n })();\n }); // make_interpreter\n return self;\n }; // terminal plugin\n});\n"]}
\ No newline at end of file
+{"version":3,"sources":["jquery.terminal.js"],"names":["ctx","sprintf","cache","hasOwnProperty","arguments","parse","format","call","parse_tree","argv","cursor","tree_length","length","node_type","arg","output","i","k","match","pad","pad_character","pad_length","get_type","push","test","toString","String","fromCharCode","parseInt","toExponential","parseFloat","toFixed","slice","toUpperCase","charAt","str_repeat","join","fmt","_fmt","arg_names","exec","field_list","replacement_field","field_match","vsprintf","_argv","splice","apply","variable","Object","prototype","toLowerCase","input","multiplier","global","window","factory","undefined","root","define","amd","module","exports","jQuery","wcwidth","require","$","debug","str","terminal","active","echo","DelayQueue","callbacks","Callbacks","resolved","this","resolve","fire","add","fn","omap","o","result","each","v","text_length","map","text","get","reduce","a","b","Clone","clone_object","object","tmp","isArray","clone_array","key","array","is_function","Array","Error","item","bind","clone","localStorage","hasLS","testKey","storage","setItem","removeItem","error","hasCookies","document","cookie","split","e","isLS","wls","n","c","wc","dt","Date","setTime","getTime","toGMTString","rls","rc","nn","ca","indexOf","dls","dc","extend","Storage","set","remove","debounce","FUNC_ERROR_TEXT","isObject","value","type","now","func","wait","options","nativeMax","Math","max","nativeMin","min","lastArgs","lastThis","maxWait","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","TypeError","invokeFunc","time","args","thisArg","leadingEdge","setTimeout","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","timeWaiting","shouldInvoke","trailingEdge","cancel","clearTimeout","flush","debounced","isInvoking","everyTime","interval","label","times","belay","timer","oneTime","stopTime","guid","regex","powers","ms","cs","ds","s","das","hs","ks","timeParse","trim","num","mult","element","counter","isFunction","isNaN","constructor","Number","$timers","$timerID","handler","inProgress","setInterval","timers","ret","lab","clearInterval","_fn","navigator","userAgent","one","els","undef","nativeSplit","compliantExecNpcg","self","separator","limit","flags","ignoreCase","multiline","extended","sticky","lastLastIndex","separator2","lastIndex","lastLength","RegExp","source","index","replace","caret","pos","target","isContentEditable","contentEditable","getSelection","focus","range1","getRangeAt","range2","cloneRange","selectNodeContents","setEnd","endContainer","endOffset","selectionStart","selection","createRange","body","createTextRange","moveToElementText","setEndPoint","range","duplicate","bookmark","getBookmark","moveToBookmark","moveStart","collapse","firstChild","setSelectionRange","select","is","resizer","callback","settings","prefix","trigger","unbind","$this","iframe","resize_handler","data","has","removeData","ResizeObserver","observer","unobserve","find","contentWindow","off","first","observe","on","addClass","appendTo","jquery_resolve","defer","Deferred","promise","is_fully_in_viewport","is_visible","node","container","box","getBoundingClientRect","viewport","top","bottom","height","IntersectionObserver","item_observer","entries","isIntersecting","ratio","combine_chr_re","astral_symbols_re","emoji_re","entity_re","mobile_re","tablet_re","format_split_re","format_parts_re","format_re","format_exist_re","format_full_re","format_begin_re","format_start_re","format_end_re","self_closing_re","color_hex_re","url_re","url_nf_re","email_re","url_full_re","email_full_re","command_re","extended_command_re","format_exec_re","float_re","re_re","string_re","unclosed_strings_re","animation_supported","animation","domPrefixes","elm","createElement","style","animationName","name","agent","is_IE","is_IEMobile","is_ch_unit_supported","div","width","is_css_variables_supported","CSS","supports","is_android","is_key_native","KeyboardEvent","proto","getOwnPropertyDescriptor","is_mobile","check","substr","vendor","opera","ch_unit_bug","base","ch","space","a11y_hide","attr","role","aria-hidden","excepctions","alert_exception","Exception","message","exception_message","scrollbar_event","left","offset","outerWidth","clientX","fileName","Cycle","rotate","skip","init","defined","filter","append","front","restart","Boolean","forEach","Stack","is_array","size","pop","concat","History","memory","enabled","storage_key","JSON","stringify","new_data","reset","last","end","position","current","next","old","previous","clear","purge","enable","disable","toggle","cmd_index","cmd","defaults","mask","caseSensitiveSearch","historySize","prompt","history","onPositionChange","noop","onCommandChange","inputStyle","mobileDelete","onPaste","clickTimeout","holdTimeout","holdRepeatTimeout","mobileIngoreAutoSpace","repeatTimeoutKeys","tabindex","tabs","mobile_ignore_key","maybe_data","id","wrapper","clip","autocapitalize","spellcheck","val","num_chars","char_width","last_rendered_prompt","prompt_last_line","prompt_len","prompt_node","reverse_search","rev_search_str","reverse_search_position","backup_prompt","command","last_command","kill_text","formatted_position","restart_animation","paste_count","line_marker","line_marker_re","get_char_pos","closest","parent","prevAll","prevUntil","nextUntil","key_mapping","SPACEBAR","UP","DOWN","LEFT","RIGHT","DEL","MULTIPLY","DIVIDE","SUBTRACT","ADD","get_key","combo","ctrlKey","metaKey","shiftKey","altKey","keycodes","3","6","8","9","12","13","16","17","18","19","20","27","28","29","30","31","32","33","34","35","36","37","38","39","40","41","42","43","44","45","46","48","49","50","51","52","53","54","55","56","57","91","93","144","145","181","182","183","186","187","188","189","190","191","192","219","220","221","222","224","225","246","247","248","249","250","251","letter","reversed_keycodes","keys","which","keymap","default_keymap","ALT+D","delete_forward","clipboard","HOLD+ALT+D","hold","HOLD+DELETE","HOLD+SHIFT+DELETE","ENTER","historyFilter","prev_command","no_keydown","commands","then","draw_prompt","SHIFT+ENTER","insert","BACKSPACE","backspace_key","SHIFT+BACKSPACE","TAB","CTRL+D","DELETE","HOLD+ARROWUP","up_arrow","ARROWUP","CTRL+P","prev_history","ARROWDOWN","down_arrow","HOLD+ARROWDOWN","CTRL+N","next_history","ARROWLEFT","HOLD+ARROWLEFT","CTRL+B","CTRL+ARROWLEFT","len","CTRL+R","reverse_history_search","draw_reverse_prompt","redraw","CTRL+G","ARROWRIGHT","right","HOLD+ARROWRIGHT","CTRL+F","CTRL+ARROWRIGHT","re","F12","return_true","END","CTRL+END","CTRL+E","HOME","home","CTRL+HOME","CTRL+A","SHIFT+INSERT","paste_event","CTRL+SHIFT+T","CTRL+W","delete_backward","HOLD+BACKSPACE","HOLD+SHIFT+BACKSPACE","CTRL+H","CTRL+X","CTRL+C","CTRL+T","CTRL+Y","CTRL+V","META+V","CTRL+K","text_to_clipboard","CTRL+U","CTRL+TAB","META+`","META+R","META+L","delete_character_forward","delete_word_forward","substring","m","delete_character_backward","delete_word_backward","isenabled","paste","fix_textarea","first_up_history","have_newlines","string","match_column","col","before","column","after","new_pos","bare_text","line","lastIndexOf","lines","sum","mobile_focus","fix_cursor","getComputedStyle","getPropertyValue","_class","className","position_only","removeClass","new_cursor","insertBefore","animating","blink","toggleClass","clear_reverse_state","history_data","save_string","j","escape_regex","get_char_width","$prompt","html","get_num_chars","floor","get_splitted_command_line","split_equal","skip_empty","strip","escape_brackets","first_len","strlen","splitted","formatting","skip_formatted_position","escape_formatting","unixFormattingEscapeBrackets","formatted","apply_formatters","normalize","stack","encoded","encode","wrap","is_formatting","start","prev","cursor_line","draw_cursor_line","end_line","cursor_end_line","before_str","c_before","cursor_len","setProperty","lines_after","last_ins","insertAfter","lines_before","css","original_string","from_last","last_len","line_index","current_len","msg","strings","redrawError","in_line","find_position","cmp","search_pos","opts","guess","codepoint_len","binary_search","chars","split_characters","prev_prompt_data","crlf","encoded_last_line","last_line","fire_change_command","clean","option","delete","stay","removed","silent","new_keymap","original","bare_command","destroy","doc","keypress_event","keydown_event","input_event","include_prompt","user_prompt","relative","refresh","display_position","command_len","new_formatted_pos","visible","show","resize","new_num_chars","invoke_key","shortcut","ctrl","shift","alt","meta","Event","documentElement","keyCode","new_mask","skip_keypress","dead_key","single_key","no_keypress","no_key","backspace","process","hold_pause","skip_insert","prev_key","is_backspace","is_single","clear_reverse_search_key","skip_keydown","fake","exception","keydown","clear_hold","is_terminal_selected","keypress","normalized","inArray","event","chr","skip_input","get_next_character","keycode","charCodeAt","abs","was_down","count","$target","down","button","originalEvent","get_selected_html","safe","char_len","match_entity","match_emoji","match_combo","normalize_position","acc","char_width_prop","extra_css","bare","wide_characters","specs","arr","spec","compare_fn","mid","startContainer","parentNode","term","sel","rangeCount","appendChild","cloneContents","innerHTML","with_selection","ranges","removeAllRanges","addRange","process_selected_line","$self","hasClass","process_div","process_selected_html","stdout","$html","$cmd_lines","queryCommandSupported","$textarea","had_focus","execCommand","get_textarea_selection","textarea","selectionEnd","clear_textarea_selection","common_string","matchCase","string_case","candidate","candidateLower","currentLower","trigger_terminal_change","terminals","onTerminalChange","setBaseAndExtent","setStart","childNodes","process_command","quotes","rest","args_quotes","version","date","color_names","valid_color","color","unclosed_strings","special","have_formatting","format_split","tracking_replace","rex","replacement","new_string","rep_string","new_position","last_index","c0","iterate_formatting","is_space","is_open_formatting","is_escape_bracket","is_text","not_formatting","opening","in_text","space_count","prev_space","braket","char","start_index","end_index","start_formatting","end_formatting","prev_index","_","semicolons","amp","keep_words","prev_format","first_index","line_length","last_char","last_bracket","last_iteraction","can_break","stripped","text_len","new_index","closed_formatting","matched","sp","nested_formatting","get_inherit_style","ignore","__inherit__","test_lengths","formatter","__no_warn__","warn","formatters","apply_function_formatter","__meta__","found_position","partials","this_len","length_before","loop","position_partial","partial","linksNoReferrer","linksNoFollow","allowedAttributes","escape","anyLinks","filter_attr_names","names","allowed","filters","clean_data","add_attrs","attrs","rel_attr","rel","unshift","background","data_text","style_str","text_decoration","extra","unescape_brackets","columns","cols","no_formatting","lengths","column_limit","whole","bracket","last_id","parse_argument","strict","parse_string","quote","parse_arguments","split_arguments","parse_command","split_command","parse_options","boolean","token","single","extended_command","invokeMethods","change_hash","obj","eval","done","iterator","Symbol","replacer","search","new_formatter","Terminal_Exception","hidden","warnings","console","log","ids","jrpc","url","method","params","success","deferred","isPlainObject","validJSONRPC","response","isNumeric","request","jsonrpc","ajax","beforeSend","jxhr","status","jqXHR","content_type","getResponseHeader","json","reject","contentType","dataType","async","terminal_ready","get_char_size","rect","visiblity","temp","char_size","get_num_rows","all","same","same_case","version_set","copyright","version_string","reg","name_ver","signatures","exit","maskChar","checkArity","raw","exceptionHandler","pauseEvents","softPause","cancelableAjax","processArguments","processRPCResponse","completionEscape","convertLinks","scrollObject","historyState","importHistory","echoCommand","scrollOnEcho","login","outputLimit","onAjaxError","pasteImage","scrollBottomOffset","wordAutocomplete","caseSensitiveAutocomplete","describe","onRPCError","doubleTab","doubleTabEchoCommand","completion","onInit","onClear","onBlur","onFocus","onExit","onPush","onPop","onAfterRedraw","onEchoCommand","onFlush","onBeforeCommand","onAfterCommand","onBeforeEcho","onAfterEcho","onBeforeLogin","onAfterLogout","onBeforeLogout","comletionParameters","wrongPasswordTryAgain","wrongPassword","ajaxAbortError","wrongArity","commandNotFound","oneRPCWithIgnore","oneInterpreterFunction","loginFunctionMissing","noTokenError","serverResponse","wrongGreetings","notWhileLogin","loginIsNotAFunction","canExitError","invalidCompletion","invalidSelector","invalidTerminalId","password","recursiveCall","notAString","invalidStrings","defunctTerminal","requests","save_state","hash_commands","fire_hash_change","first_instance","init_interpreter","StorageHelper","get_processed_command","display_object","print_line","url_spec","pause","file","code","resume","display_json_rpc_error","at","make_basic_json_rpc","auth","interpreter","display_exception","ajax_error","make_object_interpreter","arity","fallback","user_command","onCommandNotFound","xhr","responseText","make_json_rpc_object","jrpc_success","jrpc_request","jrpc_response","procs","field","interpreter_object","proc","args_len","help","found","make_interpreter","user_intrp","finalize","rpc_count","fn_interpreter","recur","interpreters","new_obj","make_json_rpc_login","user","passwd","push_line","output_buffer","NEW_LINE","buffer_line","format_options","words","keepWords","newline","links","escaped","process_line","line_settings","is_fn","parseObject","parts","prev_cmd","update","scroll","command_line","detached_output","empty","detach","lines_to_show","rows","fire_event","limit_lines","$lines","for_remove","parents","show_greetings","greetings","signature","echo_command","get_command","have_scrollbar","innerWidth","clientWidth","fill","restore_state","command_idx","import_view","export_view","maybe_update_hash","location","hash","first_command","resume_callbacks","init_state","execHash","after_exec","saved_change_hash","invoke","force_awake","when","paused","ghost","level","logout","in_login","get_token","set_token","global_logout","clear_loging_storage","global_login_fn","initialize","prefix_name","maybe_append_name","interpreter_name","prepare_top_interpreter","login_name","context_callback_proxy","fun","init_queue","onStart","skip_local","scroll_to_view","scroll_to","it","make_cursor_visible","hashchange","decodeURIComponent","was_paused","onPause","user_key_down","get_position","set_command","CTRL+L","orignal","caseSensitive","before_cursor","complete","word","scroll_to_bottom","PAGEDOWN","PAGEUP","key_down","tab_count","r","readyState","abort","key_press","ready","queue","selector","terminal_id","scrollTop","user_export","get_prompt","view","when_ready","set_prompt","ignore_hash","state","d","cmd_ready","delayed_commands","autologin","infinite","logins","popUserPass","login_callback","set_mask","pass","cmd_strings","double_quotes","single_quote","prev_string","sensitive","slash","matched_strings","pre","post","to_insert","set_position","reverse","common","set_interpreter","overwrite_interpreter","numChars","numRows","num_rows","history_state","run","setImmediate","clear_history_state","x","animate","freeze","frozen","lenghts","is_bottom","get_output","new_num_rows","replaceWith","e1","e2","remove_line","arg_defined","locals","lineNumber","trace","amount","round","prop","local","local_name","intrp","read","infiniteLogin","push_settings","object_or_name","font_resizer","blur_terminal","focus_terminal","visibility_observer","mutation_observer","disconnect","defunct","elem","scrollHeight","scroll_height","scroll_top","outerHeight","command_queue","old_width","old_height","old_enabled","ignoreSystemDescribe","base_interpreter","proxy","is_type","echo_image","image","data_uri","blob","URL","webkitURL","createObjectURL","ignoreEvents","Blob","clipboardData","items","getAsFile","getAsString","getData","onResize","mousewheel","elementFromPoint","clientY","$win","addEventListener","click","ignore_elements","mousedown","mouseup","timeout","dblclick","is_context_event","buttons","pageX","pageY","props","href","preventDefault","calculate_char_size","create_resizers","observe_visibility","was_enabled","visibility_checker","in_dom","MutationObsrv","MutationObserver","WebKitMutationObserver","childList","exec_spec","delta","stopPropagation","onmousewheel","wheelDelta","deltaY","detail"],"mappings":"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","sourcesContent":["/**@license\n * __ _____ ________ __\n * / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ / /\n * __ / // // // // // _ // _// // / / // _ // _// // // \\/ // _ \\/ /\n * / / // // // // // ___// / / // / / // ___// / / / / // // /\\ // // / /__\n * \\___//____ \\\\___//____//_/ _\\_ / /_//____//_/ /_/ /_//_//_/ /_/ \\__\\_\\___/\n * \\/ /____/ version DEV\n *\n * This file is part of jQuery Terminal. https://terminal.jcubic.pl\n *\n * Copyright (c) 2010-2019 Jakub T. Jankiewicz
\n * Released under the MIT license\n *\n * Contains:\n *\n * Storage plugin Distributed under the MIT License\n * modified to work from Data URIs that block storage and cookies in Chrome\n * Copyright (c) 2010 Dave Schindler\n *\n * jQuery Timers licenced with the WTFPL\n * \n *\n * Cross-Browser Split 1.1.1\n * Copyright 2007-2012 Steven Levithan \n * Available under the MIT License\n *\n * jQuery Caret\n * Copyright (c) 2009, Gideon Sireling\n * 3 clause BSD License\n *\n * sprintf.js\n * Copyright (c) 2007-2013 Alexandru Marasteanu \n * licensed under 3 clause BSD license\n *\n * debounce function from Lodash\n * Copyright JS Foundation and other contributors \n * The MIT License\n *\n * emoji regex v7.0.1 by Mathias Bynens\n * MIT license\n *\n * Date: Thu, 29 Aug 2019 15:16:20 +0000\n */\n/* global location, setTimeout, window, global, sprintf, setImmediate,\n IntersectionObserver, ResizeObserver, module, require, define,\n setInterval, clearInterval, clearTimeout, Blob */\n/* eslint-disable */\n/* istanbul ignore next */\n(function(ctx) {\n var sprintf = function() {\n if (!sprintf.cache.hasOwnProperty(arguments[0])) {\n sprintf.cache[arguments[0]] = sprintf.parse(arguments[0]);\n }\n return sprintf.format.call(null, sprintf.cache[arguments[0]], arguments);\n };\n sprintf.format = function(parse_tree, argv) {\n var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length;\n for (i = 0; i < tree_length; i++) {\n node_type = get_type(parse_tree[i]);\n if (node_type === 'string') {\n output.push(parse_tree[i]);\n }\n else if (node_type === 'array') {\n match = parse_tree[i]; // convenience purposes only\n if (match[2]) { // keyword argument\n arg = argv[cursor];\n for (k = 0; k < match[2].length; k++) {\n if (!arg.hasOwnProperty(match[2][k])) {\n throw(sprintf('[sprintf] property \"%s\" does not exist', match[2][k]));\n }\n arg = arg[match[2][k]];\n }\n }\n else if (match[1]) { // positional argument (explicit)\n arg = argv[match[1]];\n }\n else { // positional argument (implicit)\n arg = argv[cursor++];\n }\n\n if (/[^s]/.test(match[8]) && (get_type(arg) !== 'number')) {\n throw(sprintf('[sprintf] expecting number but found %s', get_type(arg)));\n }\n switch (match[8]) {\n case 'b': arg = arg.toString(2); break;\n case 'c': arg = String.fromCharCode(arg); break;\n case 'd': arg = parseInt(arg, 10); break;\n case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break;\n case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break;\n case 'o': arg = arg.toString(8); break;\n case 's': arg = ((arg = String(arg)) && match[7] ? arg.slice(0, match[7]) : arg); break;\n case 'u': arg = arg >>> 0; break;\n case 'x': arg = arg.toString(16); break;\n case 'X': arg = arg.toString(16).toUpperCase(); break;\n }\n arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? ' +' + arg : arg);\n pad_character = match[4] ? match[4] === '0' ? '0' : match[4].charAt(1) : ' ';\n pad_length = match[6] - String(arg).length;\n pad = match[6] ? str_repeat(pad_character, pad_length) : '';\n output.push(match[5] ? arg + pad : pad + arg);\n }\n }\n return output.join('');\n };\n\n sprintf.cache = {};\n\n sprintf.parse = function(fmt) {\n var _fmt = fmt, match = [], parse_tree = [], arg_names = 0;\n while (_fmt) {\n if ((match = /^[^\\x25]+/.exec(_fmt)) !== null) {\n parse_tree.push(match[0]);\n }\n else if ((match = /^\\x25{2}/.exec(_fmt)) !== null) {\n parse_tree.push('%');\n }\n else if ((match = /^\\x25(?:([1-9]\\d*)\\$|\\(([^\\)]+)\\))?(\\+)?(0|'[^$])?(-)?(\\d+)?(?:\\.(\\d+))?([b-fosuxX])/.exec(_fmt)) !== null) {\n if (match[2]) {\n arg_names |= 1;\n var field_list = [], replacement_field = match[2], field_match = [];\n if ((field_match = /^([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1]);\n while ((replacement_field = replacement_field.slice(field_match[0].length)) !== '') {\n if ((field_match = /^\\.([a-z_][a-z_\\d]*)/i.exec(replacement_field)) !== null) {\n field_list.push(field_match[1]);\n }\n else if ((field_match = /^\\[(\\d+)\\]/.exec(replacement_field)) !== null) {\n field_list.push(field_match[1]);\n }\n else {\n throw('[sprintf] huh?');\n }\n }\n }\n else {\n throw('[sprintf] huh?');\n }\n match[2] = field_list;\n }\n else {\n arg_names |= 2;\n }\n if (arg_names === 3) {\n throw('[sprintf] mixing positional and named placeholders is not (yet) supported');\n }\n parse_tree.push(match);\n }\n else {\n throw('[sprintf] huh?');\n }\n _fmt = _fmt.slice(match[0].length);\n }\n return parse_tree;\n };\n\n var vsprintf = function(fmt, argv, _argv) {\n _argv = argv.slice(0);\n _argv.splice(0, 0, fmt);\n return sprintf.apply(null, _argv);\n };\n\n /**\n * helpers\n */\n function get_type(variable) {\n return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase();\n }\n\n function str_repeat(input, multiplier) {\n for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */}\n return output.join('');\n }\n\n /**\n * export to either browser or node.js\n */\n ctx.sprintf = sprintf;\n ctx.vsprintf = vsprintf;\n})(typeof global !== \"undefined\" ? global : window);\n// -----------------------------------------------------------------------\n/* eslint-enable */\n// UMD taken from https://github.com/umdjs/umd\n(function(factory, undefined) {\n var root = typeof window !== 'undefined' ? window : global;\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n // istanbul ignore next\n define(['jquery', 'wcwidth'], factory);\n } else if (typeof module === 'object' && module.exports) {\n // Node/CommonJS\n module.exports = function(root, jQuery, wcwidth) {\n if (jQuery === undefined) {\n // require('jQuery') returns a factory that requires window to\n // build a jQuery instance, we normalize how we use modules\n // that require this pattern but the window provided is a noop\n // if it's defined (how jquery works)\n if (window !== undefined) {\n jQuery = require('jquery');\n } else {\n jQuery = require('jquery')(root);\n }\n }\n if (wcwidth === undefined) {\n wcwidth = require('wcwidth');\n }\n factory(jQuery, wcwidth);\n return jQuery;\n };\n } else {\n // Browser\n // istanbul ignore next\n factory(root.jQuery, root.wcwidth);\n }\n})(function($, wcwidth, undefined) {\n 'use strict';\n // -----------------------------------------------------------------------\n // :: debug functions\n // -----------------------------------------------------------------------\n /* eslint-disable */\n /* istanbul ignore next */\n function debug(str) {\n if (false) {\n $.terminal.active().echo(str);\n }\n }\n /* eslint-enable */\n // -----------------------------------------------------------------------\n // :: Replacemenet for jQuery 2 deferred objects\n // -----------------------------------------------------------------------\n function DelayQueue() {\n var callbacks = $.Callbacks();\n var resolved = false;\n this.resolve = function() {\n callbacks.fire();\n resolved = true;\n };\n this.add = function(fn) {\n if (resolved) {\n fn();\n } else {\n callbacks.add(fn);\n }\n };\n }\n // -----------------------------------------------------------------------\n // :: map object to object\n // -----------------------------------------------------------------------\n $.omap = function(o, fn) {\n var result = {};\n $.each(o, function(k, v) {\n result[k] = fn.call(o, k, v);\n });\n return result;\n };\n $.fn.text_length = function() {\n return this.map(function() {\n return $(this).text().length;\n }).get().reduce(function(a, b) {\n return a + b;\n }, 0);\n };\n // -----------------------------------------------------------------------\n // :: Deep clone of objects and arrays\n // -----------------------------------------------------------------------\n var Clone = {\n clone_object: function(object) {\n var tmp = {};\n if (typeof object === 'object') {\n if ($.isArray(object)) {\n return this.clone_array(object);\n } else if (object === null) {\n return object;\n } else {\n for (var key in object) {\n if ($.isArray(object[key])) {\n tmp[key] = this.clone_array(object[key]);\n } else if (typeof object[key] === 'object') {\n tmp[key] = this.clone_object(object[key]);\n } else {\n tmp[key] = object[key];\n }\n }\n }\n }\n return tmp;\n },\n clone_array: function(array) {\n if (!is_function(Array.prototype.map)) {\n throw new Error(\"Your browser don't support ES5 array map \" +\n 'use es5-shim');\n }\n return array.slice(0).map(function(item) {\n if (typeof item === 'object') {\n return this.clone_object(item);\n } else {\n return item;\n }\n }.bind(this));\n }\n };\n var clone = function(object) {\n return Clone.clone_object(object);\n };\n\n /* eslint-disable */\n // -----------------------------------------------------------------------\n // :: Storage plugin\n // -----------------------------------------------------------------------\n var localStorage;\n /* istanbul ignore next */\n (function() {\n var hasLS = function() {\n try {\n var testKey = 'test', storage = window.localStorage;\n storage.setItem(testKey, '1');\n storage.removeItem(testKey);\n return true;\n } catch (error) {\n return false;\n }\n };\n var hasCookies = function() {\n try {\n document.cookie.split(';');\n return true;\n } catch (e) {\n return false;\n }\n };\n // Private data\n var isLS = hasLS();\n // Private functions\n function wls(n, v) {\n var c;\n if (typeof n === 'string' && typeof v === 'string') {\n localStorage[n] = v;\n return true;\n } else if (typeof n === 'object' && typeof v === 'undefined') {\n for (c in n) {\n if (n.hasOwnProperty(c)) {\n localStorage[c] = n[c];\n }\n }\n return true;\n }\n return false;\n }\n function wc(n, v) {\n var dt, e, c;\n dt = new Date();\n dt.setTime(dt.getTime() + 31536000000);\n e = '; expires=' + dt.toGMTString();\n if (typeof n === 'string' && typeof v === 'string') {\n document.cookie = n + '=' + v + e + '; path=/';\n return true;\n } else if (typeof n === 'object' && typeof v === 'undefined') {\n for (c in n) {\n if (n.hasOwnProperty(c)) {\n document.cookie = c + '=' + n[c] + e + '; path=/';\n }\n }\n return true;\n }\n return false;\n }\n function rls(n) {\n return localStorage[n];\n }\n function rc(n) {\n var nn, ca, i, c;\n nn = n + '=';\n ca = document.cookie.split(';');\n for (i = 0; i < ca.length; i++) {\n c = ca[i];\n while (c.charAt(0) === ' ') {\n c = c.slice(1, c.length);\n }\n if (c.indexOf(nn) === 0) {\n return c.slice(nn.length, c.length);\n }\n }\n return null;\n }\n function dls(n) {\n return delete localStorage[n];\n }\n function dc(n) {\n return wc(n, '', -1);\n }\n /**\n * Public API\n * $.Storage.set(\"name\", \"value\")\n * $.Storage.set({\"name1\":\"value1\", \"name2\":\"value2\", etc})\n * $.Storage.get(\"name\")\n * $.Storage.remove(\"name\")\n */\n if (!hasCookies() && !isLS) {\n localStorage = {};\n $.extend({\n Storage: {\n set: wls,\n get: rls,\n remove: dls\n }\n });\n } else {\n if (isLS) {\n localStorage = window.localStorage;\n }\n $.extend({\n Storage: {\n set: isLS ? wls : wc,\n get: isLS ? rls : rc,\n remove: isLS ? dls : dc\n }\n });\n }\n })();\n // -----------------------------------------------------------------------\n // :: Debounce from Lodash\n // -----------------------------------------------------------------------\n /* istanbul ignore next */\n var debounce = (function() {\n var FUNC_ERROR_TEXT = 'Expected a function';\n function isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n }\n function now() {\n return Date.now();\n }\n return function debounce(func, wait, options) {\n var nativeMax = Math.max,\n nativeMin = Math.min;\n\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = wait || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(options.maxWait || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n timeWaiting = wait - timeSinceLastCall;\n\n return maxing\n ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)\n : timeWaiting;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n };\n })();\n // -----------------------------------------------------------------------\n // :: jQuery Timers\n // -----------------------------------------------------------------------\n var jQuery = $;\n /* istanbul ignore next */\n (function($) {\n jQuery.fn.extend({\n everyTime: function(interval, label, fn, times, belay) {\n return this.each(function() {\n jQuery.timer.add(this, interval, label, fn, times, belay);\n });\n },\n oneTime: function(interval, label, fn) {\n return this.each(function() {\n jQuery.timer.add(this, interval, label, fn, 1);\n });\n },\n stopTime: function(label, fn) {\n return this.each(function() {\n jQuery.timer.remove(this, label, fn);\n });\n }\n });\n\n jQuery.extend({\n timer: {\n guid: 1,\n global: {},\n regex: /^([0-9]+)\\s*(.*s)?$/,\n powers: {\n // Yeah this is major overkill...\n 'ms': 1,\n 'cs': 10,\n 'ds': 100,\n 's': 1000,\n 'das': 10000,\n 'hs': 100000,\n 'ks': 1000000\n },\n timeParse: function(value) {\n if (value === undefined || value === null) {\n return null;\n }\n var result = this.regex.exec(jQuery.trim(value.toString()));\n if (result[2]) {\n var num = parseInt(result[1], 10);\n var mult = this.powers[result[2]] || 1;\n return num * mult;\n } else {\n return value;\n }\n },\n add: function(element, interval, label, fn, times, belay) {\n var counter = 0;\n\n if (jQuery.isFunction(label)) {\n if (!times) {\n times = fn;\n }\n fn = label;\n label = interval;\n }\n\n interval = jQuery.timer.timeParse(interval);\n\n if (typeof interval !== 'number' ||\n isNaN(interval) ||\n interval <= 0) {\n return;\n }\n if (times && times.constructor !== Number) {\n belay = !!times;\n times = 0;\n }\n\n times = times || 0;\n belay = belay || false;\n\n if (!element.$timers) {\n element.$timers = {};\n }\n if (!element.$timers[label]) {\n element.$timers[label] = {};\n }\n fn.$timerID = fn.$timerID || this.guid++;\n\n var handler = function() {\n if (belay && handler.inProgress) {\n return;\n }\n handler.inProgress = true;\n if ((++counter > times && times !== 0) ||\n fn.call(element, counter) === false) {\n jQuery.timer.remove(element, label, fn);\n }\n handler.inProgress = false;\n };\n\n handler.$timerID = fn.$timerID;\n\n if (!element.$timers[label][fn.$timerID]) {\n element.$timers[label][fn.$timerID] = window.setInterval(handler, interval);\n }\n\n if (!this.global[label]) {\n this.global[label] = [];\n }\n this.global[label].push(element);\n\n },\n remove: function(element, label, fn) {\n var timers = element.$timers, ret;\n\n if (timers) {\n\n if (!label) {\n for (var lab in timers) {\n if (timers.hasOwnProperty(lab)) {\n this.remove(element, lab, fn);\n }\n }\n } else if (timers[label]) {\n if (fn) {\n if (fn.$timerID) {\n window.clearInterval(timers[label][fn.$timerID]);\n delete timers[label][fn.$timerID];\n }\n } else {\n for (var _fn in timers[label]) {\n if (timers[label].hasOwnProperty(_fn)) {\n window.clearInterval(timers[label][_fn]);\n delete timers[label][_fn];\n }\n }\n }\n\n for (ret in timers[label]) {\n if (timers[label].hasOwnProperty(ret)) {\n break;\n }\n }\n if (!ret) {\n ret = null;\n delete timers[label];\n }\n }\n\n for (ret in timers) {\n if (timers.hasOwnProperty(ret)) {\n break;\n }\n }\n if (!ret) {\n element.$timers = null;\n }\n }\n }\n }\n });\n if (/(msie) ([\\w.]+)/.exec(navigator.userAgent.toLowerCase())) {\n $(window).one('unload', function() {\n var global = jQuery.timer.global;\n for (var label in global) {\n if (global.hasOwnProperty(label)) {\n var els = global[label], i = els.length;\n while (--i) {\n jQuery.timer.remove(els[i], label);\n }\n }\n }\n });\n }\n })(jQuery);\n // -----------------------------------------------------------------------\n // :: CROSS BROWSER SPLIT\n // -----------------------------------------------------------------------\n /* istanbul ignore next */\n (function(undef) {\n\n // prevent double include\n\n if (!String.prototype.split.toString().match(/\\[native/)) {\n return;\n }\n\n var nativeSplit = String.prototype.split,\n compliantExecNpcg = /()??/.exec(\"\")[1] === undef, // NPCG: nonparticipating capturing group\n self;\n\n self = function(str, separator, limit) {\n // If `separator` is not a regex, use `nativeSplit`\n if (Object.prototype.toString.call(separator) !== \"[object RegExp]\") {\n return nativeSplit.call(str, separator, limit);\n }\n var output = [],\n flags = (separator.ignoreCase ? \"i\" : \"\") +\n (separator.multiline ? \"m\" : \"\") +\n (separator.extended ? \"x\" : \"\") + // Proposed for ES6\n (separator.sticky ? \"y\" : \"\"), // Firefox 3+\n lastLastIndex = 0,\n // Make `global` and avoid `lastIndex` issues by working with a copy\n separator2, match, lastIndex, lastLength;\n separator = new RegExp(separator.source, flags + \"g\");\n str += \"\"; // Type-convert\n if (!compliantExecNpcg) {\n // Doesn't need flags gy, but they don't hurt\n separator2 = new RegExp(\"^\" + separator.source + \"$(?!\\\\s)\", flags);\n }\n /* Values for `limit`, per the spec:\n * If undefined: 4294967295 // Math.pow(2, 32) - 1\n * If 0, Infinity, or NaN: 0\n * If positive number: limit = Math.floor(limit); if (limit > 4294967295) limit -= 4294967296;\n * If negative number: 4294967296 - Math.floor(Math.abs(limit))\n * If other: Type-convert, then use the above rules\n */\n // ? Math.pow(2, 32) - 1 : ToUint32(limit)\n limit = limit === undef ? -1 >>> 0 : limit >>> 0;\n while (match = separator.exec(str)) {\n // `separator.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0].length;\n if (lastIndex > lastLastIndex) {\n output.push(str.slice(lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for\n // nonparticipating capturing groups\n if (!compliantExecNpcg && match.length > 1) {\n match[0].replace(separator2, function() {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undef) {\n match[i] = undef;\n }\n }\n });\n }\n if (match.length > 1 && match.index < str.length) {\n Array.prototype.push.apply(output, match.slice(1));\n }\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= limit) {\n break;\n }\n }\n if (separator.lastIndex === match.index) {\n separator.lastIndex++; // Avoid an infinite loop\n }\n }\n if (lastLastIndex === str.length) {\n if (lastLength || !separator.test(\"\")) {\n output.push(\"\");\n }\n } else {\n output.push(str.slice(lastLastIndex));\n }\n return output.length > limit ? output.slice(0, limit) : output;\n };\n\n // For convenience\n String.prototype.split = function(separator, limit) {\n return self(this, separator, limit);\n };\n\n return self;\n\n })();\n // -----------------------------------------------------------------------\n // :: jQuery Caret\n // -----------------------------------------------------------------------\n /* istanbul ignore next */\n $.fn.caret = function(pos) {\n var target = this[0];\n var isContentEditable = target.contentEditable === 'true';\n //get\n if (arguments.length === 0) {\n //HTML5\n if (window.getSelection) {\n //contenteditable\n if (isContentEditable) {\n target.focus();\n var range1 = window.getSelection().getRangeAt(0),\n range2 = range1.cloneRange();\n range2.selectNodeContents(target);\n range2.setEnd(range1.endContainer, range1.endOffset);\n return range2.toString().length;\n }\n //textarea\n return target.selectionStart;\n }\n //IE<9\n if (document.selection) {\n target.focus();\n //contenteditable\n if (isContentEditable) {\n var range1 = document.selection.createRange(),\n range2 = document.body.createTextRange();\n range2.moveToElementText(target);\n range2.setEndPoint('EndToEnd', range1);\n return range2.text.length;\n }\n //textarea\n var pos = 0,\n range = target.createTextRange(),\n range2 = document.selection.createRange().duplicate(),\n bookmark = range2.getBookmark();\n range.moveToBookmark(bookmark);\n while (range.moveStart('character', -1) !== 0) pos++;\n return pos;\n }\n //not supported\n return 0;\n }\n //set\n if (pos === -1)\n pos = this[isContentEditable? 'text' : 'val']().length;\n //HTML5\n if (window.getSelection) {\n //contenteditable\n if (isContentEditable) {\n target.focus();\n window.getSelection().collapse(target.firstChild, pos);\n }\n //textarea\n else\n target.setSelectionRange(pos, pos);\n }\n //IE<9\n else if (document.body.createTextRange) {\n var range = document.body.createTextRange();\n range.moveToElementText(target);\n range.moveStart('character', pos);\n range.collapse(true);\n range.select();\n }\n if (!isContentEditable && !this.is(':focus')) {\n target.focus();\n }\n return pos;\n };\n /* eslint-enable */\n // -----------------------------------------------------------------------\n // :: Cross-browser resize element plugin using sentinel iframe or\n // :: resizeObserver\n // -----------------------------------------------------------------------\n $.fn.resizer = function(callback, options) {\n var settings = $.extend({}, {\n prefix: ''\n }, options);\n var trigger = arguments.length === 0;\n var unbind = arguments[0] === \"unbind\";\n if (!trigger && !unbind && !is_function(callback)) {\n throw new Error('Invalid argument, it need to a function or string ' +\n '\"unbind\" or no arguments.');\n }\n if (unbind) {\n callback = is_function(arguments[1]) ? arguments[1] : null;\n }\n return this.each(function() {\n var $this = $(this);\n var iframe;\n var callbacks;\n function resize_handler() {\n callbacks.fire();\n }\n if (trigger || unbind) {\n callbacks = $this.data('callbacks');\n if (trigger) {\n callbacks && callbacks.fire();\n } else {\n if (callback && callbacks) {\n callbacks.remove(callback);\n if (!callbacks.has()) {\n callbacks = null;\n }\n } else {\n callbacks = null;\n }\n if (!callbacks) {\n $this.removeData('callbacks');\n if (window.ResizeObserver) {\n var observer = $this.data('observer');\n if (observer) {\n observer.unobserve(this);\n $this.removeData('observer');\n }\n } else {\n iframe = $this.find('> iframe');\n if (iframe.length) {\n // just in case of memory leaks in IE\n $(iframe[0].contentWindow).off('resize').remove();\n iframe.remove();\n } else if ($this.is('body')) {\n $(window).off('resize.resizer');\n }\n }\n }\n }\n } else if ($this.data('callbacks')) {\n $(this).data('callbacks').add(callback);\n } else {\n callbacks = $.Callbacks();\n callbacks.add(callback);\n $this.data('callbacks', callbacks);\n var resizer;\n var first = true;\n if (window.ResizeObserver) {\n resizer = new ResizeObserver(function() {\n if (!first) {\n resize_handler();\n }\n first = false;\n });\n resizer.observe(this);\n $this.data('observer', resizer);\n } else if ($this.is('body')) {\n $(window).on('resize.resizer', resize_handler);\n } else {\n iframe = $('').addClass(settings.prefix + 'resizer')\n .appendTo(this)[0];\n\n $(iframe.contentWindow).on('resize', resize_handler);\n }\n }\n });\n };\n // -----------------------------------------------------------------------\n function jquery_resolve(value) {\n var defer = jQuery.Deferred();\n defer.resolve(value);\n return defer.promise();\n }\n // -----------------------------------------------------------------------\n // :: based on https://github.com/zeusdeux/isInViewport\n // :: work only vertically and on dom elements\n // -----------------------------------------------------------------------\n $.fn.is_fully_in_viewport = (function() {\n function is_visible(node, container) {\n var box = node.getBoundingClientRect();\n var viewport = container[0].getBoundingClientRect();\n var top = box.top - viewport.top;\n var bottom = box.bottom - viewport.top;\n var height = container.height();\n return bottom > 0 && top <= height;\n }\n if (window.IntersectionObserver) {\n return function(container) {\n var node = this[0];\n var defer = jQuery.Deferred();\n var item_observer = new window.IntersectionObserver(function(entries) {\n defer.resolve(entries[0].isIntersecting && entries[0].ratio === 1);\n item_observer.unobserve(node);\n }, {\n root: container[0]\n });\n item_observer.observe(node);\n return defer.promise();\n };\n } else {\n return function(container) {\n return jquery_resolve(is_visible(this[0], container));\n };\n }\n })();\n \n // -------------------------------------------------------------------------\n /* eslint-disable */\n // regex that match single character at begining and folowing combine character\n // https://en.wikipedia.org/wiki/Combining_character\n var combine_chr_re = /^(.(?:[\\u0300-\\u036F]|[\\u1AB0-\\u1abE]|[\\u1DC0-\\u1DF9]|[\\u1DFB-\\u1DFF]|[\\u20D0-\\u20F0]|[\\uFE20-\\uFE2F])+)/;\n // source: https://mathiasbynens.be/notes/javascript-unicode\n var astral_symbols_re = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n // source: https://github.com/mathiasbynens/emoji-regex\n var emoji_re = /^(\\uD83C\\uDFF4(?:\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74)\\uDB40\\uDC7F|\\u200D\\u2620\\uFE0F)|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC68(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDB0-\\uDDB3])|(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDB0-\\uDDB3]))|\\uD83D\\uDC69\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDB0-\\uDDB3])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2695\\u2696\\u2708]|\\uD83D\\uDC68(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83D\\uDC69\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83D\\uDC68(?:\\u200D(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83D[\\uDC66\\uDC67])|\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDB0-\\uDDB3])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83C\\uDDF6\\uD83C\\uDDE6|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDD1-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDEEB\\uDEEC\\uDEF4-\\uDEF9]|\\uD83E[\\uDD10-\\uDD3A\\uDD3C-\\uDD3E\\uDD40-\\uDD45\\uDD47-\\uDD70\\uDD73-\\uDD76\\uDD7A\\uDD7C-\\uDDA2\\uDDB0-\\uDDB9\\uDDC0-\\uDDC2\\uDDD0-\\uDDFF])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEF9]|\\uD83E[\\uDD10-\\uDD3A\\uDD3C-\\uDD3E\\uDD40-\\uDD45\\uDD47-\\uDD70\\uDD73-\\uDD76\\uDD7A\\uDD7C-\\uDDA2\\uDDB0-\\uDDB9\\uDDC0-\\uDDC2\\uDDD0-\\uDDFF])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC69\\uDC6E\\uDC70-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3D\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDD1-\\uDDDD]))/;\n var entity_re = /^(&(?:[a-z\\d]+|#\\d+|#x[a-f\\d]+);)/i;\n // https://stackoverflow.com/questions/11381673/detecting-a-mobile-browser\n var mobile_re = /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino|android|ipad|playbook|silk/i;\n var tablet_re = /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i;\n var format_split_re = /(\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\](?:[^\\]\\\\]*(?:\\\\\\\\)*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)\\]?)/i;\n var format_parts_re = /\\[\\[((?:-?[@!gbiuso])*);([^;]*);([^;\\]]*);?([^;\\]]*);?([^\\]]*)\\]([^\\]\\\\]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]+)\\]?/gi;\n var format_re = /\\[\\[((?:-?[@!gbiuso])*;[^;\\]]*;[^;\\]]*(?:;|[^\\]()]*);?[^\\]]*)\\]([^\\]]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)\\]?/gi;\n var format_exist_re = /\\[\\[((?:-?[@!gbiuso])*;[^;\\]]*;[^;\\]]*(?:;|[^\\]()]*);?[^\\]]*)\\]([^\\]]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)\\]/gi;\n var format_full_re = /^\\[\\[((?:-?[@!gbiuso])*;[^;\\]]*;[^;\\]]*(?:;|[^\\]()]*);?[^\\]]*)\\]([^\\]]*\\\\\\][^\\]]*|[^\\]]*|[^[]*\\[[^\\]]*)\\]$/gi;\n var format_begin_re = /(\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\])/i;\n var format_start_re = /^(\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\])/i;\n var format_end_re = /\\[\\[(?:-?[@!gbiuso])*;[^;]*;[^\\]]*\\]?$/i;\n var self_closing_re = /^(?:\\[\\[)?[^;]*@[^;]*;/;\n var color_hex_re = /^#([0-9a-f]{3}|[0-9a-f]{6})$/i;\n var url_re = /(\\bhttps?:\\/\\/(?:(?:(?!&[^;]+;)|(?=&))[^\\s\"'<>\\][)])+)/gi;\n var url_nf_re = /\\b(?![^\\s[\\]]*])(https?:\\/\\/(?:(?:(?!&[^;]+;)|(?=&))[^\\s\"'<>\\][)])+)/gi;\n var email_re = /((([^<>('\")[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,})))/g;\n var url_full_re = /^(https?:\\/\\/(?:(?:(?!&[^;]+;)|(?=&))[^\\s\"'<>\\][)])+)$/gi;\n var email_full_re = /^((([^<>('\")[\\]\\\\.,;:\\s@\"]+(\\.[^<>()[\\]\\\\.,;:\\s@\"]+)*)|(\".+\"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,})))$/g;\n var command_re = /((?:\"[^\"\\\\]*(?:\\\\[\\S\\s][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[\\S\\s][^'\\\\]*)*'|\\/[^\\/\\\\]*(?:\\\\[\\S\\s][^\\/\\\\]*)*\\/[gimsuy]*(?=\\s|$)|(?:\\\\\\s|\\S))+)(?=\\s|$)/gi;\n var extended_command_re = /^\\s*((terminal|cmd)::([a-z_]+)\\(([\\s\\S]*)\\))\\s*$/;\n var format_exec_re = /(\\[\\[(?:[^\\][]|\\\\\\])+\\]\\])/;\n var float_re = /^[-+]?[0-9]*\\.?[0-9]+([eE][-+]?[0-9]+)?$/;\n var re_re = /^\\/((?:\\\\\\/|[^/]|\\[[^\\]]*\\/[^\\]]*\\])+)\\/([gimsuy]*)$/;\n var string_re = /(\"(?:[^\"\\\\]|\\\\(?:\\\\\\\\)*\"|\\\\\\\\)*\"|'(?:[^'\\\\]|\\\\(?:\\\\\\\\)*'|\\\\\\\\)*')/;\n var unclosed_strings_re = /^(?=((?:[^\"']+|\"[^\"\\\\]*(?:\\\\[^][^\"\\\\]*)*\"|'[^'\\\\]*(?:\\\\[^][^'\\\\]*)*')*))\\1./;\n /* eslint-enable */\n // -------------------------------------------------------------------------\n // :: features flags\n // -------------------------------------------------------------------------\n // taken from https://hacks.mozilla.org/2011/09/detecting-and-generating-\n // css-animations-in-javascript/\n var animation_supported = (function() {\n var animation = false,\n domPrefixes = 'Webkit Moz O ms Khtml'.split(' '),\n elm = document.createElement('div');\n if (elm.style.animationName) {\n animation = true;\n }\n if (animation === false) {\n for (var i = 0; i < domPrefixes.length; i++) {\n var name = domPrefixes[i] + 'AnimationName';\n if (elm.style[name] !== undefined) {\n animation = true;\n break;\n }\n }\n }\n elm = null;\n return animation;\n })();\n // -------------------------------------------------------------------------\n var agent = window.navigator.userAgent;\n var is_IE = /MSIE|Trident/.test(agent) || /rv:11.0/i.test(agent);\n var is_IEMobile = /IEMobile/.test(agent);\n // -------------------------------------------------------------------------\n var is_ch_unit_supported = (function() {\n if (is_IE && !is_IEMobile) {\n return false;\n }\n var div = document.createElement('div');\n div.style.width = '1ch';\n return div.style.width === '1ch';\n })();\n // -------------------------------------------------------------------------\n var is_css_variables_supported = window.CSS && window.CSS.supports &&\n window.CSS.supports('--fake-var', 0);\n // -------------------------------------------------------------------------\n var is_android = navigator.userAgent.toLowerCase().indexOf('android') !== -1;\n // -------------------------------------------------------------------------\n var is_key_native = (function is_key_native() {\n if (!('KeyboardEvent' in window && 'key' in window.KeyboardEvent.prototype)) {\n return false;\n }\n var proto = window.KeyboardEvent.prototype;\n var get = Object.getOwnPropertyDescriptor(proto, 'key').get;\n return !!get.toString().match(/\\[native code\\]/);\n })();\n // -------------------------------------------------------------------------\n var is_mobile = (function(a) {\n var check = false;\n if (mobile_re.test(a) || tablet_re.test(a.substr(0, 4))) {\n check = true;\n }\n return check;\n })(navigator.userAgent || navigator.vendor || window.opera);\n\n // -------------------------------------------------------------------------\n // IE ch unit bug detection - better that UserAgent that can be changed\n // -------------------------------------------------------------------------\n var ch_unit_bug = false;\n $(function() {\n function width(e) {\n return e[0].getBoundingClientRect().width;\n }\n var base = ' ').appendTo('body');\n var space = $(base + '\"> ').appendTo('body');\n ch_unit_bug = width(ch) !== width(space);\n ch.remove();\n space.remove();\n });\n // -----------------------------------------------------------------------\n // :: hide elements from screen readers\n // -----------------------------------------------------------------------\n function a11y_hide(element) {\n element.attr({\n role: 'presentation',\n 'aria-hidden': 'true'\n });\n }\n // ---------------------------------------------------------------------\n // :: alert only first exception of type\n // ---------------------------------------------------------------------\n var excepctions = [];\n function alert_exception(label, e) {\n if (arguments[0] instanceof $.terminal.Exception) {\n label = arguments[0].type;\n e = arguments[0];\n }\n var message = (label ? label + ': ' : '') + exception_message(e);\n if (excepctions.indexOf(message) === -1) {\n excepctions.push(message);\n setTimeout(function() {\n throw e;\n }, 0);\n //alert(message + (e.stack ? '\\n' + e.stack : ''));\n }\n }\n // ---------------------------------------------------------------------\n // :; detect if mouse event happen on scrollbar\n // ---------------------------------------------------------------------\n function scrollbar_event(e, node) {\n var left = node.offset().left;\n return node.outerWidth() <= e.clientX - left;\n }\n // ---------------------------------------------------------------------\n // :: Return exception message as string\n // ---------------------------------------------------------------------\n function exception_message(e) {\n if (typeof e === 'string') {\n return e;\n } else if (typeof e.fileName === 'string') {\n return e.fileName + ': ' + e.message;\n } else {\n return e.message;\n }\n }\n // -----------------------------------------------------------------------\n // :: CYCLE DATA STRUCTURE\n // -----------------------------------------------------------------------\n function Cycle() {\n var data = [].slice.call(arguments);\n var pos = 0;\n $.extend(this, {\n get: function() {\n return data;\n },\n index: function() {\n return pos;\n },\n rotate: function(skip, init) {\n if (init === undefined) {\n init = pos;\n } else if (init === pos) {\n return;\n }\n if (!skip) {\n var defined = data.filter(function(item) {\n return typeof item !== 'undefined';\n });\n if (!defined.length) {\n return;\n }\n }\n if (!data.length) {\n return;\n }\n if (data.length === 1) {\n return data[0];\n } else {\n if (pos === data.length - 1) {\n pos = 0;\n } else {\n ++pos;\n }\n if (typeof data[pos] !== 'undefined') {\n return data[pos];\n } else {\n return this.rotate(true, init);\n }\n }\n },\n length: function() {\n return data.length;\n },\n remove: function(index) {\n delete data[index];\n },\n set: function(item) {\n for (var i = data.length; i--;) {\n if (data[i] === item) {\n pos = i;\n return;\n }\n }\n this.append(item);\n pos = data.length - 1;\n },\n front: function() {\n if (data.length) {\n var index = pos;\n var restart = false;\n while (!data[index]) {\n index++;\n if (index > data.length) {\n if (restart) {\n break;\n }\n index = 0;\n restart = true;\n }\n }\n return data[index];\n }\n },\n map: function(fn) {\n return data.map(function(item, i) {\n if (typeof item !== 'undefined') {\n return fn(item, i);\n }\n return null;\n }).filter(Boolean);\n },\n forEach: function(fn) {\n return data.forEach(function(item, i) {\n if (typeof item !== 'undefined') {\n fn(item, i);\n }\n });\n },\n append: function(item) {\n data.push(item);\n }\n });\n }\n // -----------------------------------------------------------------------\n // :: STACK DATA STRUCTURE\n // -----------------------------------------------------------------------\n function Stack(init) {\n var data = is_array(init) ? init : init ? [init] : [];\n $.extend(this, {\n data: function() {\n return data;\n },\n map: function(fn) {\n return $.map(data, fn);\n },\n size: function() {\n return data.length;\n },\n pop: function() {\n if (data.length === 0) {\n return null;\n } else {\n var value = data[data.length - 1];\n data = data.slice(0, data.length - 1);\n return value;\n }\n },\n push: function(value) {\n data = data.concat([value]);\n return value;\n },\n top: function() {\n return data.length > 0 ? data[data.length - 1] : null;\n },\n clone: function() {\n return new Stack(data.slice(0));\n }\n });\n }\n // -------------------------------------------------------------------------\n // :: HISTORY CLASS\n // -------------------------------------------------------------------------\n function History(name, size, memory) {\n var enabled = true;\n var storage_key = '';\n if (typeof name === 'string' && name !== '') {\n storage_key = name + '_';\n }\n storage_key += 'commands';\n var data;\n if (memory) {\n data = [];\n } else {\n data = $.Storage.get(storage_key);\n data = data ? JSON.parse(data) : [];\n }\n var pos = data.length - 1;\n $.extend(this, {\n append: function(item) {\n if (enabled) {\n if (data[data.length - 1] !== item) {\n data.push(item);\n if (size && data.length > size) {\n data = data.slice(-size);\n }\n pos = data.length - 1;\n if (!memory) {\n $.Storage.set(storage_key, JSON.stringify(data));\n }\n }\n }\n },\n set: function(new_data) {\n if (is_array(new_data)) {\n data = new_data;\n if (!memory) {\n $.Storage.set(storage_key, JSON.stringify(data));\n }\n }\n },\n data: function() {\n return data;\n },\n reset: function() {\n pos = data.length - 1;\n },\n last: function() {\n return data[data.length - 1];\n },\n end: function() {\n return pos === data.length - 1;\n },\n position: function() {\n return pos;\n },\n current: function() {\n return data[pos];\n },\n next: function() {\n var old = pos;\n if (pos < data.length - 1) {\n ++pos;\n }\n if (old !== pos) {\n return data[pos];\n }\n },\n previous: function() {\n var old = pos;\n if (pos > 0) {\n --pos;\n }\n if (old !== pos) {\n return data[pos];\n }\n },\n clear: function() {\n data = [];\n this.purge();\n },\n enabled: function() {\n return enabled;\n },\n enable: function() {\n enabled = true;\n },\n purge: function() {\n if (!memory) {\n $.Storage.remove(storage_key);\n }\n },\n disable: function() {\n enabled = false;\n },\n toggle: function(value) {\n if (typeof value === 'undefined') {\n enabled = !enabled;\n } else {\n enabled = value;\n }\n }\n });\n }\n // -------------------------------------------------------------------------\n // :: COMMAND LINE PLUGIN\n // -------------------------------------------------------------------------\n var cmd_index = 0;\n $.cmd = {\n defaults: {\n mask: false,\n caseSensitiveSearch: true,\n historySize: 60,\n prompt: '> ',\n enabled: true,\n history: true,\n onPositionChange: $.noop,\n onCommandChange: $.noop,\n inputStyle: 'textarea',\n mobileDelete: is_mobile,\n onPaste: $.noop,\n clickTimeout: 200,\n holdTimeout: 400,\n holdRepeatTimeout: 200,\n mobileIngoreAutoSpace: [],\n repeatTimeoutKeys: ['HOLD+BACKSPACE'],\n tabindex: 1,\n tabs: 4\n }\n };\n $.fn.cmd = function(options) {\n var settings = $.extend({}, $.cmd.defaults, options);\n function mobile_ignore_key(key) {\n return settings.mobileIngoreAutoSpace.length &&\n settings.mobileIngoreAutoSpace.indexOf(key) !== -1 && is_android;\n }\n var self = this;\n var maybe_data = self.data('cmd');\n if (maybe_data) {\n return maybe_data;\n }\n var id = cmd_index++;\n self.addClass('cmd');\n var wrapper = $('').appendTo(self);\n wrapper.append('
');\n wrapper.append('
' +\n '' +\n '' +\n ' ' +\n '' +\n '
');\n // a11y: don't read command it's in textarea that's in focus\n a11y_hide(wrapper.find('.cmd-cursor-line'));\n // on mobile the only way to hide textarea on desktop it's needed because\n // textarea show up after focus\n //self.append('
');\n var clip = $('';\n }\n return result;\n }\n if (typeof str === 'string') {\n // support for formating foo[[u;;]bar]baz[[b;#fff;]quux]zzz\n var splitted = $.terminal.format_split(str);\n str = $.map(splitted, function(text) {\n if (text === '') {\n return text;\n } else if ($.terminal.is_formatting(text)) {\n // fix inside formatting because encode is called\n // before format\n text = text.replace(/\\[\\[[^\\]]+\\]/, function(text) {\n return text.replace(/ /g, ' ');\n });\n return text.replace(format_parts_re, format);\n } else {\n text = safe(text);\n text = text.replace(/\\\\\\]/, ']');\n var extra = extra_css(text, options);\n if (extra.length) {\n text = wide_characters(text, options);\n return '
' + text + '';\n } else {\n return '
' + text + '';\n }\n }\n }).join('');\n return str.replace(/
<\\/span>/gi, '
');\n } else {\n return '';\n }\n },\n // ---------------------------------------------------------------------\n // :: Replace brackets with html entities\n // ---------------------------------------------------------------------\n escape_brackets: function escape_brackets(string) {\n return string.replace(/\\[/g, '[').replace(/\\]/g, ']');\n },\n // ---------------------------------------------------------------------\n // :: complmentary function\n // ---------------------------------------------------------------------\n unescape_brackets: function unescape_brackets(string) {\n return string.replace(/[/g, '[').replace(/]/g, ']');\n },\n // ---------------------------------------------------------------------\n // :: return number of characters without formatting\n // ---------------------------------------------------------------------\n length: function(string) {\n return $.terminal.split_characters(text(string)).length;\n },\n // ---------------------------------------------------------------------\n // :: split characters handling emoji, surogate pairs and combine chars\n // ---------------------------------------------------------------------\n split_characters: function split_characters(string) {\n var result = [];\n while (string.length) {\n var chr = get_next_character(string);\n string = string.slice(chr.length);\n result.push(chr);\n }\n return result;\n },\n // ---------------------------------------------------------------------\n // :: return string where array items are in columns padded spaces\n // :: after adding align tabs arr.join('\\t\\t') looks much better\n // ---------------------------------------------------------------------\n columns: function(array, cols, space) {\n var no_formatting = array.map(function(string) {\n return $.terminal.strip(string);\n });\n var lengths = no_formatting.map(function(string) {\n return strlen(string);\n });\n if (typeof space === 'undefined') {\n space = 4;\n }\n var length = Math.max.apply(null, lengths) + space;\n // we need value - 1 because index starts from 0\n var column_limit = Math.floor(cols / length) - 1;\n if (column_limit < 1) {\n return array.join('\\n');\n }\n var lines = [];\n for (var i = 0, len = array.length; i < len; i += column_limit) {\n var line = array.slice(i, i + column_limit);\n var last = line.pop();\n lines.push(line.reduce(function(acc, string) {\n var stripped = $.terminal.strip(string);\n var pad = new Array(length - stripped.length + 1).join(' ');\n acc.push(string + pad);\n return acc;\n }, []).join('') + last);\n }\n return lines.join('\\n');\n },\n // ---------------------------------------------------------------------\n // :: Remove formatting from text\n // ---------------------------------------------------------------------\n strip: function strip(str) {\n str = str.replace(format_parts_re, '$6');\n return str.replace(/\\\\([[\\]])/g, function(whole, bracket) {\n return bracket;\n });\n },\n // ---------------------------------------------------------------------\n // :: Return active terminal\n // ---------------------------------------------------------------------\n active: function active() {\n return terminals.front();\n },\n // ---------------------------------------------------------------------\n // :: Implmentation detail id is always length of terminals Cycle\n // ---------------------------------------------------------------------\n last_id: function last_id() {\n var len = terminals.length();\n return len - 1;\n },\n // ---------------------------------------------------------------------\n // :: Function that works with strings like 'asd' 'asd\\' asd' \"asd asd\"\n // :: asd\\ 123 -n -b / [^ ]+ / /\\s+/ asd\\ a it creates a regex and\n // :: numbers and replaces escape characters in double quotes\n // :: if strict is set to false it only strips single and double quotes\n // :: and escapes spaces\n // ---------------------------------------------------------------------\n parse_argument: function parse_argument(arg, strict) {\n function parse_string(string) {\n // split string to string literals and non-strings\n return string.split(string_re).map(function(string) {\n // remove quotes if before are even number of slashes\n // we don't remove slases becuase they are handled by JSON.parse\n if (string.match(/^['\"]/)) {\n // fixing regex to match empty string is not worth it\n if (string === '\"\"' || string === \"''\") {\n return '';\n }\n var quote = string[0];\n var re = new RegExp(\"(^|(?:\\\\\\\\(?:\\\\\\\\)*)?)\" + quote, \"g\");\n string = string.replace(re, \"$1\");\n }\n string = '\"' + string + '\"';\n // use build in function to parse rest of escaped characters\n return JSON.parse(string);\n }).join('');\n }\n if (strict === false) {\n if (arg[0] === \"'\" && arg[arg.length - 1] === \"'\") {\n return arg.replace(/^'|'$/g, '');\n } else if (arg[0] === '\"' && arg[arg.length - 1] === '\"') {\n return arg.replace(/^\"|\"$/g, '').replace(/\\\\([\" ])/g, '$1');\n } else if (arg.match(/\\/.*\\/[gimy]*$/)) {\n return arg;\n } else if (arg.match(/['\"]]/)) {\n // part of arg is in quote\n return parse_string(arg);\n } else {\n return arg.replace(/\\\\ /g, ' ');\n }\n }\n var regex = arg.match(re_re);\n if (regex) {\n return new RegExp(regex[1], regex[2]);\n } else if (arg.match(/['\"]/)) {\n return parse_string(arg);\n } else if (arg.match(/^-?[0-9]+$/)) {\n return parseInt(arg, 10);\n } else if (arg.match(float_re)) {\n return parseFloat(arg);\n } else {\n return arg.replace(/\\\\(['\"() ])/g, '$1');\n }\n },\n // ---------------------------------------------------------------------\n // :: function split and parse arguments\n // ---------------------------------------------------------------------\n parse_arguments: function parse_arguments(string) {\n return $.map(string.match(command_re) || [], $.terminal.parse_argument);\n },\n // ---------------------------------------------------------------------\n // :: Function split and strips single and double quotes\n // :: and escapes spaces\n // ---------------------------------------------------------------------\n split_arguments: function split_arguments(string) {\n return $.map(string.match(command_re) || [], function(arg) {\n return $.terminal.parse_argument(arg, false);\n });\n },\n // ---------------------------------------------------------------------\n // :: Function that returns an object {name,args}. Arguments are parsed\n // :: using the function parse_arguments\n // ---------------------------------------------------------------------\n parse_command: function parse_command(string) {\n return process_command(string, $.terminal.parse_argument);\n },\n // ---------------------------------------------------------------------\n // :: Same as parse_command but arguments are parsed using split_arguments\n // ---------------------------------------------------------------------\n split_command: function split_command(string) {\n return process_command(string, function(arg) {\n return $.terminal.parse_argument(arg, false);\n });\n },\n // ---------------------------------------------------------------------\n // :; function that parse arguments like yargs library\n // ---------------------------------------------------------------------\n parse_options: function parse_options(arg, options) {\n var settings = $.extend({}, {\n boolean: []\n }, options);\n if (typeof arg === 'string') {\n return parse_options($.terminal.split_arguments(arg), options);\n }\n var result = {\n _: []\n };\n function token(value) {\n this.value = value;\n }\n var rest = arg.reduce(function(acc, arg) {\n if (typeof arg !== 'string') {\n arg = String(arg);\n }\n if (arg.match(/^-/) && acc instanceof token) {\n result[acc.value] = true;\n }\n if (arg.match(/^--/)) {\n var name = arg.replace(/^--/, '');\n if (settings.boolean.indexOf(name) === -1) {\n return new token(name);\n } else {\n result[name] = true;\n }\n } else if (arg.match(/^-/)) {\n var single = arg.replace(/^-/, '').split('');\n if (settings.boolean.indexOf(single.slice(-1)[0]) === -1) {\n var last = single.pop();\n }\n single.forEach(function(single) {\n result[single] = true;\n });\n if (last) {\n return new token(last);\n }\n } else if (acc instanceof token) {\n result[acc.value] = arg;\n } else if (arg) {\n result._.push(arg);\n }\n return null;\n }, null);\n if (rest instanceof token) {\n result[rest.value] = true;\n }\n return result;\n },\n // ---------------------------------------------------------------------\n // :: function executed for each text inside [[ .... ]] in echo\n // ---------------------------------------------------------------------\n extended_command: function extended_command(term, string, options) {\n var settings = $.extend({\n invokeMethods: false\n }, options);\n try {\n change_hash = false;\n var m = string.match(extended_command_re);\n if (m) {\n if (!settings.invokeMethods) {\n warn('To invoke terminal or cmd methods you need to enable ' +\n 'invokeMethods option');\n return;\n }\n string = m[1];\n var obj = m[2] === 'terminal' ? term : term.cmd();\n var fn = m[3];\n try {\n var args = eval('[' + m[4] + ']');\n if (!obj[fn]) {\n term.error('Unknow function ' + fn);\n } else {\n obj[fn].apply(term, args);\n }\n } catch (e) {\n term.error('Invalid invocation in ' +\n $.terminal.escape_brackets(string));\n }\n } else {\n term.exec(string, true).done(function() {\n change_hash = true;\n });\n }\n } catch (e) {\n // error is process in exec\n }\n },\n // ---------------------------------------------------------------------\n // :: ES6 iterator for a given string that handle emoji and formatting\n // ---------------------------------------------------------------------\n iterator: function(string) {\n function formatting(string) {\n if ($.terminal.is_formatting(string)) {\n if (string.match(/\\]\\\\\\]/)) {\n string = string.replace(/\\]\\\\\\]/g, ']\\\\\\\\]');\n }\n }\n return string;\n }\n if (typeof Symbol === 'function' && typeof Symbol.iterator === 'symbol') {\n var len = $.terminal.length(string);\n var i = 0;\n var obj = {};\n obj[Symbol.iterator] = function() {\n return {\n next: function() {\n if (i < len) {\n var text = $.terminal.substring(string, i, i + 1);\n i++;\n return {\n value: formatting(text)\n };\n } else {\n return {\n done: true\n };\n }\n }\n };\n };\n return obj;\n }\n },\n // ---------------------------------------------------------------------\n // :: object that can be used in string methods intead of regex\n // ---------------------------------------------------------------------\n formatter: new (function() {\n try {\n this[Symbol.split] = function(string) {\n return $.terminal.format_split(string);\n };\n this[Symbol.match] = function(string) {\n return string.match(format_re);\n };\n this[Symbol.replace] = function(string, replacer) {\n return string.replace(format_parts_re, replacer);\n };\n this[Symbol.search] = function(string) {\n return string.search(format_re);\n };\n } catch (e) {\n }\n })(),\n // ---------------------------------------------------------------------\n // :: helper function that add formatter before nested_formatting\n // ---------------------------------------------------------------------\n new_formatter: function(formatter) {\n var formatters = $.terminal.defaults.formatters;\n for (var i = 0; i < formatters.length; ++i) {\n if (formatters[i] === $.terminal.nested_formatting) {\n formatters.splice(i, 0, formatter);\n return;\n }\n }\n formatters.push(formatter);\n }\n };\n // -------------------------------------------------------------------------\n $.terminal.Exception = function Terminal_Exception(type, message, stack) {\n if (arguments.length === 1) {\n this.message = arguments[0];\n this.type = 'TERMINAL';\n } else {\n this.type = type;\n this.message = message;\n if (stack) {\n this.stack = stack;\n }\n }\n };\n $.terminal.Exception.prototype = new Error();\n $.terminal.Exception.prototype.toString = function() {\n return this.message + '\\n' + this.stack;\n };\n // -----------------------------------------------------------------------\n // Helper plugins and functions\n // -----------------------------------------------------------------------\n $.fn.visible = function() {\n return this.css('visibility', 'visible');\n };\n $.fn.hidden = function() {\n return this.css('visibility', 'hidden');\n };\n // -----------------------------------------------------------------------\n var warnings = [];\n function warn(msg) {\n msg = '[jQuery Terminal] ' + msg;\n if (warnings.indexOf(msg) === -1) {\n warnings.push(msg);\n /* eslint-disable */\n if (console) {\n if (console.warn) {\n console.warn(msg);\n } else if (console.log) {\n console.log(msg);\n }\n /* eslint-enable */\n } else {\n // prevent catching in outer try..catch\n setTimeout(function() {\n throw new Error('WARN: ' + msg);\n }, 0);\n }\n }\n }\n // -----------------------------------------------------------------------\n // JSON-RPC CALL\n // -----------------------------------------------------------------------\n var ids = {}; // list of url based ids of JSON-RPC\n $.jrpc = function(url, method, params, success, error) {\n var deferred = new $.Deferred();\n var options;\n if ($.isPlainObject(url)) {\n options = url;\n } else {\n options = {\n url: url,\n method: method,\n params: params,\n success: success,\n error: error\n };\n }\n function validJSONRPC(response) {\n return $.isNumeric(response.id) &&\n (typeof response.result !== 'undefined' ||\n typeof response.error !== 'undefined');\n }\n ids[options.url] = ids[options.url] || 0;\n var request = {\n 'jsonrpc': '2.0',\n 'method': options.method,\n 'params': options.params,\n 'id': ++ids[options.url]\n };\n $.ajax({\n url: options.url,\n beforeSend: function beforeSend(jxhr, settings) {\n if (is_function(options.request)) {\n options.request(jxhr, request);\n }\n settings.data = JSON.stringify(request);\n },\n success: function success(response, status, jqXHR) {\n var content_type = jqXHR.getResponseHeader('Content-Type');\n if (!content_type.match(/(application|text)\\/json/)) {\n warn('Response Content-Type is neither application/json' +\n ' nor text/json');\n }\n var json;\n try {\n json = JSON.parse(response);\n } catch (e) {\n if (options.error) {\n options.error(jqXHR, 'Invalid JSON', e);\n } else {\n throw new $.terminal.Exception('JSON', 'Invalid JSON', e.stack);\n }\n deferred.reject({message: 'Invalid JSON', response: response});\n return;\n }\n if (is_function(options.response)) {\n options.response(jqXHR, json);\n }\n if (validJSONRPC(json) || options.method === 'system.describe') {\n // don't catch errors in success callback\n if (options.success) {\n options.success(json, status, jqXHR);\n }\n deferred.resolve(json);\n } else {\n if (options.error) {\n options.error(jqXHR, 'Invalid JSON-RPC');\n }\n deferred.reject({message: 'Invalid JSON-RPC', response: response});\n }\n },\n error: options.error,\n contentType: 'application/json',\n dataType: 'text',\n async: true,\n cache: false,\n // timeout: 1,\n type: 'POST'\n });\n return deferred.promise();\n };\n\n // -----------------------------------------------------------------------\n /*\n function is_scrolled_into_view(elem) {\n var docViewTop = $(window).scrollTop();\n var docViewBottom = docViewTop + $(window).height();\n\n var elemTop = $(elem).offset().top;\n var elemBottom = elemTop + $(elem).height();\n\n return ((elemBottom >= docViewTop) && (elemTop <= docViewBottom));\n }\n */\n // -----------------------------------------------------------------------\n function terminal_ready(term) {\n return !!(term.closest('body').length &&\n term.is(':visible') &&\n term.find('.cmd-prompt').length);\n }\n // -----------------------------------------------------------------------\n // :: Create fake terminal to calcualte the dimention of one character\n // :: this will make terminal work if terminal div is not added to the\n // :: DOM at init like with:\n // :: $('').terminal().echo('foo bar').appendTo('body');\n // -----------------------------------------------------------------------\n function get_char_size(term) {\n var rect;\n if (terminal_ready(term)) {\n var $prompt = term.find('.cmd-prompt').clone().css({\n visiblity: 'hidden',\n position: 'absolute'\n });\n $prompt.appendTo(term.find('.cmd')).html(' ');\n rect = $prompt[0].getBoundingClientRect();\n $prompt.remove();\n } else {\n var temp = $('').appendTo('body');\n temp.addClass(term.attr('class')).attr('id', term.attr('id'));\n if (term) {\n var style = term.attr('style');\n if (style) {\n style = style.split(/\\s*;\\s*/).filter(function(s) {\n return !s.match(/display\\s*:\\s*none/i);\n }).join(';');\n temp.attr('style', style);\n }\n }\n rect = temp.find('.terminal-line')[0].getBoundingClientRect();\n }\n var result = {\n width: rect.width,\n height: rect.height\n };\n if (temp) {\n temp.remove();\n }\n return result;\n }\n // -----------------------------------------------------------------------\n // :: calculate numbers of characters\n // -----------------------------------------------------------------------\n function get_num_chars(terminal, char_size) {\n var width = terminal.find('.terminal-fill').width();\n var result = Math.floor(width / char_size.width);\n // random number to not get NaN in node.js but big enough to\n // not wrap exception\n return result || 1000;\n }\n // -----------------------------------------------------------------------\n // :: Calculate number of lines that fit without scroll\n // -----------------------------------------------------------------------\n function get_num_rows(terminal, char_size) {\n return Math.floor(terminal.find('.terminal-fill').height() / char_size.height);\n }\n // -----------------------------------------------------------------------\n function all(array, fn) {\n var same = array.filter(function(item) {\n return item[fn]() === item;\n });\n return same.length === array.length;\n }\n // -----------------------------------------------------------------------\n function string_case(string) {\n var array = string.split('');\n if (all(array, 'toLowerCase')) {\n return 'lower';\n } else if (all(array, 'toUpperCase')) {\n return 'upper';\n } else {\n return 'mixed';\n }\n }\n // -----------------------------------------------------------------------\n function same_case(string) {\n return string_case(string) !== 'mixed';\n }\n // -----------------------------------------------------------------------\n // fix for jQuery bug\n function is_function(object) {\n return get_type(object) === 'function';\n }\n // -----------------------------------------------------------------------\n function is_array(object) {\n return get_type(object) === 'array';\n }\n // -----------------------------------------------------------------------\n function get_type(object) {\n return typeof object === 'function' ? 'function' : $.type(object);\n }\n // -----------------------------------------------------------------------\n // :: TERMINAL PLUGIN CODE\n // -----------------------------------------------------------------------\n var version_set = !$.terminal.version.match(/^\\{\\{/);\n var copyright = 'Copyright (c) 2011-2019 Jakub T. Jankiewicz ' +\n '
';\n var version_string = version_set ? ' v. ' + $.terminal.version : ' ';\n // regex is for placing version string aligned to the right\n var reg = new RegExp(' {' + version_string.length + '}$');\n var name_ver = 'jQuery Terminal Emulator' +\n (version_set ? version_string : '');\n // -----------------------------------------------------------------------\n // :: Terminal Signatures\n // -----------------------------------------------------------------------\n var signatures = [\n ['jQuery Terminal', '(c) 2011-2019 jcubic'],\n [name_ver, copyright.replace(/^Copyright | *<.*>/g, '')],\n [name_ver, copyright.replace(/^Copyright /, '')],\n [\n ' _______ ________ __',\n ' / / _ /_ ____________ _/__ ___/______________ _____ / /',\n ' __ / / // / // / _ / _/ // / / / _ / _/ / / \\\\/ / _ \\\\/ /',\n '/ / / // / // / ___/ // // / / / ___/ // / / / / /\\\\ / // / /__',\n '\\\\___/____ \\\\\\\\__/____/_/ \\\\__ / /_/____/_//_/_/_/_/_/ \\\\/\\\\__\\\\_\\\\___/',\n ' \\\\/ /____/ '\n .replace(reg, ' ') + version_string,\n copyright\n ],\n [\n ' __ _____ ________ ' +\n ' __',\n ' / // _ /__ __ _____ ___ __ _/__ ___/__ ___ ______ __ __ __ ___ ' +\n ' / /',\n ' __ / // // // // // _ // _// // / / // _ // _// // // \\\\/ // _ ' +\n '\\\\/ /',\n '/ / // // // // // ___// / / // / / // ___// / / / / // // /\\\\ // // ' +\n '/ /__',\n '\\\\___//____ \\\\\\\\___//____//_/ _\\\\_ / /_//____//_/ /_/ /_//_//_/ /_/ \\\\' +\n '__\\\\_\\\\___/',\n (' \\\\/ /____/ ' +\n ' ').replace(reg, '') + version_string,\n copyright\n ]\n ];\n // -----------------------------------------------------------------------\n // :: Default options\n // -----------------------------------------------------------------------\n $.terminal.nested_formatting.__meta__ = true;\n // if set to true nested formatting will inherit styles from styles outside\n $.terminal.nested_formatting.__inherit__ = false;\n // nested formatting will always return different length so we silent the warning\n $.terminal.nested_formatting.__no_warn__ = true;\n $.terminal.defaults = {\n prompt: '> ',\n history: true,\n exit: true,\n clear: true,\n enabled: true,\n maskChar: '*',\n wrap: true,\n checkArity: true,\n raw: false,\n tabindex: 1,\n invokeMethods: false,\n exceptionHandler: null,\n pauseEvents: true,\n softPause: false,\n memory: false,\n cancelableAjax: true,\n processArguments: true,\n linksNoReferrer: false,\n anyLinks: false,\n linksNoFollow: false,\n processRPCResponse: null,\n completionEscape: true,\n onCommandChange: null,\n onPositionChange: null,\n convertLinks: true,\n extra: {},\n tabs: 4,\n historySize: 60,\n scrollObject: null,\n historyState: false,\n importHistory: false,\n historyFilter: null,\n echoCommand: true,\n scrollOnEcho: true,\n login: null,\n outputLimit: -1,\n formatters: [$.terminal.nested_formatting],\n onAjaxError: null,\n pasteImage: true,\n scrollBottomOffset: 20,\n wordAutocomplete: true,\n caseSensitiveAutocomplete: true,\n caseSensitiveSearch: true,\n clickTimeout: 200,\n holdTimeout: 400,\n holdRepeatTimeout: 200,\n repeatTimeoutKeys: ['HOLD+BACKSPACE'],\n mobileIngoreAutoSpace: [],\n request: $.noop,\n response: $.noop,\n describe: 'procs',\n onRPCError: null,\n doubleTab: null,\n doubleTabEchoCommand: false,\n completion: false,\n onInit: $.noop,\n onClear: $.noop,\n onBlur: $.noop,\n onFocus: $.noop,\n onTerminalChange: $.noop,\n onExit: $.noop,\n onPush: $.noop,\n onPop: $.noop,\n keypress: $.noop,\n keydown: $.noop,\n onAfterRedraw: $.noop,\n onEchoCommand: $.noop,\n onPaste: $.noop,\n onFlush: $.noop,\n onBeforeCommand: null,\n onAfterCommand: null,\n onBeforeEcho: null,\n onAfterEcho: null,\n onBeforeLogin: null,\n onAfterLogout: null,\n onBeforeLogout: null,\n allowedAttributes: ['title', /^aria-/, 'id', /^data-/],\n strings: {\n comletionParameters: 'From version 1.0.0 completion function need to' +\n ' have two arguments',\n wrongPasswordTryAgain: 'Wrong password try again!',\n wrongPassword: 'Wrong password!',\n ajaxAbortError: 'Error while aborting ajax call!',\n wrongArity: \"Wrong number of arguments. Function '%s' expects %s got\" +\n ' %s!',\n commandNotFound: \"Command '%s' Not Found!\",\n oneRPCWithIgnore: 'You can use only one rpc with describe == false ' +\n 'or rpc without system.describe',\n oneInterpreterFunction: \"You can't use more than one function (rpc \" +\n 'without system.describe or with option describe == false count' +\n 's as one)',\n loginFunctionMissing: \"You didn't specify a login function\",\n noTokenError: 'Access denied (no token)',\n serverResponse: 'Server responded',\n wrongGreetings: 'Wrong value of greetings parameter',\n notWhileLogin: \"You can't call `%s' function while in login\",\n loginIsNotAFunction: 'Authenticate must be a function',\n canExitError: \"You can't exit from main interpreter\",\n invalidCompletion: 'Invalid completion',\n invalidSelector: 'Sorry, but terminal said that you use invalid ' +\n 'selector!',\n invalidTerminalId: 'Invalid Terminal ID',\n login: 'login',\n password: 'password',\n recursiveCall: 'Recursive call detected, skip',\n notAString: '%s function: argument is not a string',\n redrawError: 'Internal error, wrong position in cmd redraw',\n invalidStrings: 'Command %s have unclosed strings',\n defunctTerminal: \"You can't call method on terminal that was destroyed\"\n }\n };\n // -------------------------------------------------------------------------\n // :: All terminal globals\n // -------------------------------------------------------------------------\n var requests = []; // for canceling on CTRL+D\n var terminals = new Cycle(); // list of terminals global in this scope\n // state for all terminals, terminals can't have own array fo state because\n // there is only one popstate event\n var save_state = []; // hold objects returned by export_view by history API\n var hash_commands;\n var change_hash = false; // don't change hash on Init\n var fire_hash_change = true;\n var first_instance = true; // used by history state\n $.fn.terminal = function(init_interpreter, options) {\n function StorageHelper(memory) {\n if (memory) {\n this.storage = {};\n }\n this.set = function(key, value) {\n if (memory) {\n this.storage[key] = value;\n } else {\n $.Storage.set(key, value);\n }\n };\n this.get = function(key) {\n if (memory) {\n return this.storage[key];\n } else {\n return $.Storage.get(key);\n }\n };\n this.remove = function(key) {\n if (memory) {\n delete this.storage[key];\n } else {\n $.Storage.remove(key);\n }\n };\n }\n // ---------------------------------------------------------------------\n // :: helper function\n // ---------------------------------------------------------------------\n function get_processed_command(command) {\n if ($.terminal.unclosed_strings(command)) {\n var string = $.terminal.escape_brackets(command);\n var message = sprintf(strings().invalidStrings, \"`\" + string + \"`\");\n throw new $.terminal.Exception(message);\n } else if (is_function(settings.processArguments)) {\n return process_command(command, settings.processArguments);\n } else if (settings.processArguments) {\n return $.terminal.parse_command(command);\n } else {\n return $.terminal.split_command(command);\n }\n }\n // ---------------------------------------------------------------------\n // :: Display object on terminal\n // ---------------------------------------------------------------------\n function display_object(object) {\n if (typeof object === 'string') {\n self.echo(object);\n } else if (is_array(object)) {\n self.echo($.map(object, function(object) {\n return JSON.stringify(object);\n }).join(' '));\n } else if (typeof object === 'object') {\n self.echo(JSON.stringify(object));\n } else {\n self.echo(object);\n }\n }\n // Display line code in the file if line numbers are present\n function print_line(url_spec) {\n var re = /(.*):([0-9]+):([0-9]+)$/;\n // google chrome have line and column after filename\n var m = url_spec.match(re);\n if (m) {\n // TODO: do we need to call pause/resume or return promise?\n self.pause(settings.softPause);\n $.get(m[1], function(response) {\n var file = m[1];\n self.echo('[[b;white;]' + file + ']');\n var code = response.split('\\n');\n var n = +m[2] - 1;\n self.echo(code.slice(n - 2, n + 3).map(function(line, i) {\n if (i === 2) {\n line = '[[;#f00;]' +\n $.terminal.escape_brackets(line) + ']';\n }\n return '[' + (n + i - 1) + ']: ' + line;\n }).join('\\n')).resume();\n }, 'text');\n }\n }\n // ---------------------------------------------------------------------\n // :: Helper function\n // ---------------------------------------------------------------------\n function display_json_rpc_error(error) {\n if (is_function(settings.onRPCError)) {\n settings.onRPCError.call(self, error);\n } else {\n self.error('[RPC] ' + error.message);\n if (error.error && error.error.message) {\n error = error.error;\n // more detailed error message\n var msg = '\\t' + error.message;\n if (error.file) {\n msg += ' in file \"' + error.file.replace(/.*\\//, '') + '\"';\n }\n if (error.at) {\n msg += ' at line ' + error.at;\n }\n self.error(msg);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Create interpreter function from url string\n // ---------------------------------------------------------------------\n function make_basic_json_rpc(url, auth) {\n var interpreter = function(method, params) {\n self.pause(settings.softPause);\n $.jrpc({\n url: url,\n method: method,\n params: params,\n request: function(jxhr, request) {\n try {\n settings.request.call(self, jxhr, request, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n response: function(jxhr, response) {\n try {\n settings.response.call(self, jxhr, response, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n success: function success(json) {\n if (json.error) {\n display_json_rpc_error(json.error);\n } else if (is_function(settings.processRPCResponse)) {\n settings.processRPCResponse.call(self, json.result, self);\n } else {\n display_object(json.result);\n }\n self.resume();\n },\n error: ajax_error\n });\n };\n // this is the interpreter function\n return function(command, terminal) {\n if (command === '') {\n return;\n }\n try {\n command = get_processed_command(command);\n } catch (e) {\n // exception can be thrown on invalid regex\n display_exception(e, 'TERMINAL (get_processed_command)');\n return;\n // throw e; // this will show stack in other try..catch\n }\n if (!auth || command.name === 'help') {\n // allows to call help without a token\n interpreter(command.name, command.args);\n } else {\n var token = terminal.token();\n if (token) {\n interpreter(command.name, [token].concat(command.args));\n } else {\n // should never happen\n terminal.error('[AUTH] ' + strings().noTokenError);\n }\n }\n };\n }\n // ---------------------------------------------------------------------\n // :: Create interpreter function from Object. If the value is object\n // :: it will create nested interpreters\n // ---------------------------------------------------------------------\n function make_object_interpreter(object, arity, login, fallback) {\n // function that maps commands to object methods\n // it keeps terminal context\n return function(user_command, terminal) {\n if (user_command === '') {\n return;\n }\n // command = split_command_line(command);\n var command;\n try {\n command = get_processed_command(user_command);\n } catch (e) {\n // exception can be thrown on invalid regex\n if (is_function(settings.exception)) {\n settings.exception(e, self);\n } else {\n self.error('Error: ' + (e.message || e));\n }\n return;\n // throw e; // this will show stack in other try..catch\n }\n /*\n if (login) {\n var token = self.token(true);\n if (token) {\n command.args = [token].concat(command.args);\n } else {\n terminal.error('[AUTH] ' + strings.noTokenError);\n return;\n }\n }*/\n var val = object[command.name];\n var type = get_type(val);\n if (type === 'function') {\n if (arity && val.length !== command.args.length) {\n self.error(\n '[Arity] ' +\n sprintf(\n strings().wrongArity,\n command.name,\n val.length,\n command.args.length\n )\n );\n } else {\n return val.apply(self, command.args);\n }\n } else if (type === 'object' || type === 'string') {\n var commands = [];\n if (type === 'object') {\n commands = Object.keys(val);\n val = make_object_interpreter(\n val,\n arity,\n login\n );\n }\n terminal.push(val, {\n prompt: command.name + '> ',\n name: command.name,\n completion: type === 'object' ? commands : undefined\n });\n } else if (is_function(fallback)) {\n fallback(user_command, self);\n } else if (is_function(settings.onCommandNotFound)) {\n settings.onCommandNotFound.call(self, user_command, self);\n } else {\n terminal.error(sprintf(strings().commandNotFound, command.name));\n }\n };\n }\n // ---------------------------------------------------------------------\n function ajax_error(xhr, status, error) {\n self.resume(); // onAjaxError can use pause/resume call it first\n if (is_function(settings.onAjaxError)) {\n settings.onAjaxError.call(self, xhr, status, error);\n } else if (status !== 'abort') {\n self.error('[AJAX] ' + status + ' - ' +\n strings().serverResponse + ':\\n' +\n $.terminal.escape_brackets(xhr.responseText));\n }\n }\n // ---------------------------------------------------------------------\n function make_json_rpc_object(url, auth, success) {\n function jrpc_success(json) {\n if (json.error) {\n display_json_rpc_error(json.error);\n } else if (is_function(settings.processRPCResponse)) {\n settings.processRPCResponse.call(self, json.result, self);\n } else {\n display_object(json.result);\n }\n self.resume();\n }\n function jrpc_request(jxhr, request) {\n try {\n settings.request.call(self, jxhr, request, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n }\n function jrpc_response(jxhr, response) {\n try {\n settings.response.call(self, jxhr, response, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n }\n function response(response) {\n var procs = response;\n // we check if it's false before we call this function but\n // it don't hurt to be explicit here\n if (settings.describe !== false && settings.describe !== '') {\n settings.describe.split('.').forEach(function(field) {\n procs = procs[field];\n });\n }\n if (procs && procs.length) {\n var interpreter_object = {};\n $.each(procs, function(_, proc) {\n if ($.isPlainObject(proc) && typeof proc.name === 'string') {\n interpreter_object[proc.name] = function() {\n var append = auth && proc.name !== 'help';\n var args = Array.prototype.slice.call(arguments);\n var args_len = args.length + (append ? 1 : 0);\n if (settings.checkArity && proc.params &&\n proc.params.length !== args_len) {\n self.error(\n '[Arity] ' +\n sprintf(\n strings().wrongArity,\n proc.name,\n proc.params.length,\n args_len\n )\n );\n } else {\n self.pause(settings.softPause);\n if (append) {\n var token = self.token(true);\n if (token) {\n args = [token].concat(args);\n } else {\n self.error('[AUTH] ' +\n strings().noTokenError);\n }\n }\n $.jrpc({\n url: url,\n method: proc.name,\n params: args,\n request: jrpc_request,\n response: jrpc_response,\n success: jrpc_success,\n error: ajax_error\n });\n }\n };\n }\n });\n var login = typeof auth === 'string' ? auth : 'login';\n interpreter_object.help = interpreter_object.help || function(fn) {\n if (typeof fn === 'undefined') {\n var names = procs.map(function(proc) {\n return proc.name;\n }).join(', ') + ', help';\n self.echo('Available commands: ' + names);\n } else {\n var found = false;\n $.each(procs, function(_, proc) {\n if (proc.name === fn) {\n found = true;\n var msg = '';\n msg += '[[bu;;]' + proc.name + ']';\n if (proc.params) {\n var params = proc.params;\n if (auth && proc.name !== login) {\n params = params.slice(1);\n }\n msg += ' ' + params.join(' ');\n }\n if (proc.help) {\n msg += '\\n' + proc.help;\n }\n self.echo(msg);\n return false;\n }\n });\n if (!found) {\n if (fn === 'help') {\n self.echo('[[bu;;]help] [method]\\ndisplay help ' +\n 'for the method or list of methods if not' +\n ' specified');\n } else {\n var msg = 'Method `' + fn + \"' not found \";\n self.error(msg);\n }\n }\n }\n };\n success(interpreter_object);\n } else {\n success(null);\n }\n }\n return $.jrpc({\n url: url,\n method: 'system.describe',\n params: [],\n success: response,\n request: jrpc_request,\n response: jrpc_response,\n error: function error() {\n success(null);\n }\n });\n }\n // ---------------------------------------------------------------------\n function make_interpreter(user_intrp, login, finalize) {\n finalize = finalize || $.noop;\n var type = get_type(user_intrp);\n var object;\n var result = {};\n var rpc_count = 0; // only one rpc can be use for array\n var fn_interpreter;\n if (type === 'array') {\n object = {};\n // recur will be called when previous acync call is finished\n (function recur(interpreters, success) {\n if (interpreters.length) {\n var first = interpreters[0];\n var rest = interpreters.slice(1);\n var type = get_type(first);\n if (type === 'string') {\n self.pause(settings.softPause);\n if (settings.describe === false) {\n if (++rpc_count === 1) {\n fn_interpreter = make_basic_json_rpc(first, login);\n } else {\n self.error(strings().oneRPCWithIgnore);\n }\n recur(rest, success);\n } else {\n make_json_rpc_object(first, login, function(new_obj) {\n if (new_obj) {\n $.extend(object, new_obj);\n } else if (++rpc_count === 1) {\n fn_interpreter = make_basic_json_rpc(\n first,\n login\n );\n } else {\n self.error(strings().oneRPCWithIgnore);\n }\n self.resume();\n recur(rest, success);\n });\n }\n } else if (type === 'function') {\n if (fn_interpreter) {\n self.error(strings().oneInterpreterFunction);\n } else {\n fn_interpreter = first;\n }\n recur(rest, success);\n } else if (type === 'object') {\n $.extend(object, first);\n recur(rest, success);\n }\n } else {\n success();\n }\n })(user_intrp, function() {\n finalize({\n interpreter: make_object_interpreter(\n object,\n false,\n login,\n fn_interpreter.bind(self)\n ),\n completion: Object.keys(object)\n });\n });\n } else if (type === 'string') {\n if (settings.describe === false) {\n object = {\n interpreter: make_basic_json_rpc(user_intrp, login)\n };\n if ($.isArray(settings.completion)) {\n object.completion = settings.completion;\n }\n finalize(object);\n } else {\n self.pause(settings.softPause);\n make_json_rpc_object(user_intrp, login, function(object) {\n if (object) {\n result.interpreter = make_object_interpreter(\n object,\n false,\n login\n );\n result.completion = Object.keys(object);\n } else {\n // no procs in system.describe\n result.interpreter = make_basic_json_rpc(user_intrp, login);\n }\n finalize(result);\n self.resume();\n });\n }\n } else if (type === 'object') {\n finalize({\n interpreter: make_object_interpreter(\n user_intrp,\n settings.checkArity,\n login\n ),\n completion: Object.keys(user_intrp)\n });\n } else {\n // allow $('').terminal();\n if (type === 'undefined') {\n user_intrp = $.noop;\n } else if (type !== 'function') {\n var msg = type + ' is invalid interpreter value';\n throw new $.terminal.Exception(msg);\n }\n // single function don't need bind\n finalize({\n interpreter: user_intrp,\n completion: settings.completion\n });\n }\n }\n // ---------------------------------------------------------------------\n // :: Create JSON-RPC authentication function\n // ---------------------------------------------------------------------\n function make_json_rpc_login(url, login) {\n var method = get_type(login) === 'boolean' ? 'login' : login;\n return function(user, passwd, callback) {\n self.pause(settings.softPause);\n $.jrpc({\n url: url,\n method: method,\n params: [user, passwd],\n request: function(jxhr, request) {\n try {\n settings.request.call(self, jxhr, request, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n response: function(jxhr, response) {\n try {\n settings.response.call(self, jxhr, response, self);\n } catch (e) {\n display_exception(e, 'USER');\n }\n },\n success: function success(response) {\n if (!response.error && response.result) {\n callback(response.result);\n } else {\n // null will trigger message that login fail\n callback(null);\n }\n self.resume();\n },\n error: ajax_error\n });\n };\n // default name is login so you can pass true\n }\n // ---------------------------------------------------------------------\n // :: display Exception on terminal\n // ---------------------------------------------------------------------\n function display_exception(e, label, silent) {\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, label);\n } else {\n self.exception(e, label);\n if (!silent) {\n setTimeout(function() {\n throw e;\n }, 0);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Draw line - can have line breaks and be longer than the width of\n // :: the terminal, there are 2 options raw and finalize\n // :: raw - will not encode the string and finalize if a function that\n // :: will have div container of the line as first argument\n // :: NOTE: it formats and appends lines to output_buffer. The actual\n // :: append to terminal output happens in the flush function\n // ---------------------------------------------------------------------\n function push_line(string) {\n output_buffer.push({line: string});\n }\n // ---------------------------------------------------------------------\n var output_buffer = [];\n var NEW_LINE = 1;\n function buffer_line(string, index, options) {\n // urls should always have formatting to keep url if split\n var i, len;\n output_buffer.push(NEW_LINE);\n if (!options.raw) {\n var format_options = {\n linksNoReferrer: settings.linksNoReferrer,\n linksNoFollow: settings.linksNoFollow,\n anyLinks: settings.anyLinks,\n char_width: char_size.width,\n escape: false,\n allowedAttributes: options.allowedAttributes || []\n };\n //string = $.terminal.normalize(string);\n var cols = self.cols();\n if ((strlen(text(string)) > cols ||\n string.match(/\\n/)) &&\n ((settings.wrap === true && options.wrap === undefined) ||\n settings.wrap === false && options.wrap === true)) {\n var words = options.keepWords;\n var array = $.terminal.split_equal(string, cols, words);\n for (i = 0, len = array.length; i < len; ++i) {\n if (array[i] === '' || array[i] === '\\r') {\n output_buffer.push({line: ''});\n } else {\n var data = {\n line: $.terminal.format(\n array[i],\n format_options\n )\n };\n if (i === len - 1) {\n data.newline = true;\n }\n output_buffer.push(data);\n }\n }\n } else {\n string = $.terminal.format(string, format_options);\n string.split(/\\n/).forEach(push_line);\n }\n } else {\n push_line(string);\n }\n output_buffer.push({\n finalize: options.finalize,\n index: index\n });\n }\n // ---------------------------------------------------------------------\n function links(string) {\n function format(_, style, color, background, _class, data, text) {\n function formatting(s, text) {\n return '[[' + [\n style + (s || ''),\n color,\n background,\n _class,\n data || text\n ].join(';') + ']';\n }\n function escaped(_) {\n return ']' + formatting('!', _) + _ + ']' + formatting();\n }\n if (!style.match(/!/)) {\n if (text.match(email_full_re) || text.match(url_full_re)) {\n return formatting('!', text) + text + ']';\n } else if (text.match(email_re) || text.match(url_nf_re)) {\n var output = text.replace(email_re, escaped)\n .replace(url_nf_re, escaped);\n return formatting('', data) + output + ']';\n }\n }\n return _;\n }\n if (!(string.match(email_re) || string.match(url_nf_re))) {\n return string;\n }\n if (!$.terminal.have_formatting(string)) {\n return string.replace(email_re, '[[!;;]$1]').\n replace(url_nf_re, '[[!;;]$1]');\n }\n return $.terminal.format_split(string).map(function(str) {\n if ($.terminal.is_formatting(str)) {\n return str.replace(format_parts_re, format);\n } else {\n return str.replace(email_re, '[[!;;]$1]').\n replace(url_nf_re, '[[!;;]$1]');\n }\n }).join('');\n }\n // ---------------------------------------------------------------------\n function process_line(line) {\n // prevent exception in display exception\n try {\n var line_settings = $.extend({\n exec: true,\n raw: false,\n finalize: $.noop,\n invokeMethods: false,\n convertLinks: settings.convertLinks\n }, line.options || {});\n var string;\n var arg = line.string;\n var is_fn = is_function(arg);\n if (is_fn) {\n arg = arg();\n }\n if (get_type(arg) !== 'string') {\n if (is_function(settings.parseObject)) {\n var ret = settings.parseObject(arg);\n if (get_type(ret) === 'string') {\n string = ret;\n }\n } else if (is_array(arg)) {\n string = $.terminal.columns(arg, self.cols(), settings.tabs);\n } else {\n string = String(arg);\n }\n } else {\n string = arg;\n }\n if (string !== '') {\n if (!line_settings.raw) {\n if (line_settings.formatters) {\n try {\n string = $.terminal.apply_formatters(\n string,\n settings\n );\n } catch (e) {\n display_exception(e, 'FORMATTING');\n }\n }\n if (line_settings.exec) {\n var parts = string.split(format_exec_re);\n string = $.map(parts, function(string) {\n if (string && string.match(format_exec_re) &&\n !$.terminal.is_formatting(string)) {\n // redraw should not execute commands and it have\n // and lines variable have all extended commands\n string = string.replace(/^\\[\\[|\\]\\]$/g, '');\n if (line_settings.exec) {\n var prev_cmd;\n if (prev_command) {\n prev_command = prev_command.command.trim();\n }\n if (prev_cmd === string.trim()) {\n self.error(strings().recursiveCall);\n } else {\n $.terminal.extended_command(self, string, {\n invokeMethods: line_settings.invokeMethods\n });\n }\n }\n return '';\n } else {\n return string;\n }\n }).join('');\n }\n if (string === '') {\n return;\n }\n if (line_settings.convertLinks) {\n string = links(string);\n }\n string = crlf($.terminal.normalize(string));\n string = $.terminal.encode(string, {\n tabs: settings.tabs\n });\n }\n }\n buffer_line(string, line.index, line_settings);\n } catch (e) {\n output_buffer = [];\n // don't display exception if exception throw in terminal\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, 'TERMINAL');\n } else {\n alert_exception('[Internal Exception(process_line)]', e);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Update terminal lines\n // ---------------------------------------------------------------------\n function redraw(options) {\n options = $.extend({}, {\n // should be used when single line is updated\n update: false,\n // should be used if you want to scroll to bottom after redraw\n scroll: true\n }, options || {});\n if (!options.update) {\n command_line.resize(num_chars);\n // we don't want reflow while processing lines\n var detached_output = output.empty().detach();\n }\n var lines_to_show = [];\n // Dead code\n if (settings.outputLimit >= 0) {\n // flush will limit lines but if there is lot of\n // lines we don't need to show them and then remove\n // them from terminal\n var limit;\n if (settings.outputLimit === 0) {\n limit = self.rows();\n } else {\n limit = settings.outputLimit;\n }\n lines.forEach(function(line, index) {\n var string = line[0];\n var options = line[1];\n if (get_type(string) === 'function') {\n string = string();\n }\n if (get_type(string) !== 'string') {\n string = String(string);\n }\n lines_to_show.push({\n string: string,\n index: index,\n options: options\n });\n });\n lines_to_show = lines_to_show.slice(lines_to_show.length - limit - 1);\n } else {\n lines_to_show = lines.map(function(line, index) {\n return {\n string: line[0],\n index: index,\n options: line[1]\n };\n });\n }\n try {\n output_buffer = [];\n $.each(lines_to_show, function(i, line) {\n process_line(line);\n });\n if (!options.update) {\n command_line.before(detached_output); // reinsert output\n }\n self.flush(options);\n fire_event('onAfterRedraw');\n } catch (e) {\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, 'TERMINAL (redraw)');\n } else {\n alert_exception('[redraw]', e);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Function limit output lines based on outputLimit option\n // ---------------------------------------------------------------------\n function limit_lines() {\n if (settings.outputLimit >= 0) {\n var limit;\n if (settings.outputLimit === 0) {\n limit = self.rows();\n } else {\n limit = settings.outputLimit;\n }\n var $lines = output.find('> div > div');\n if ($lines.length + 1 > limit) {\n var max = $lines.length - limit + 1;\n var for_remove = $lines.slice(0, max);\n // you can't get parent if you remove the\n // element so we first get the parent\n var parents = for_remove.parent();\n for_remove.remove();\n parents.each(function() {\n var $self = $(this);\n if ($self.is(':empty')) {\n // there can be divs inside parent that\n // was not removed\n $self.remove();\n }\n });\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Display user greetings or terminal signature\n // ---------------------------------------------------------------------\n function show_greetings() {\n if (settings.greetings === undefined) {\n // signature have ascii art so it's not suite for screen readers\n self.echo(self.signature, {finalize: a11y_hide, formatters: false});\n } else if (settings.greetings) {\n var type = typeof settings.greetings;\n if (type === 'string') {\n self.echo(settings.greetings);\n } else if (type === 'function') {\n try {\n settings.greetings.call(self, self.echo);\n } catch (e) {\n settings.greetings = null;\n display_exception(e, 'greetings');\n }\n } else {\n self.error(strings().wrongGreetings);\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: Display prompt and last command\n // ---------------------------------------------------------------------\n function echo_command(command) {\n if (typeof command === 'undefined') {\n command = self.get_command();\n }\n // true will return last rendered string\n var prompt = command_line.prompt(true);\n var mask = command_line.mask();\n switch (typeof mask) {\n case 'string':\n command = command.replace(/./g, mask);\n break;\n case 'boolean':\n if (mask) {\n command = command.replace(/./g, settings.maskChar);\n } else {\n command = $.terminal.escape_formatting(command);\n }\n break;\n }\n var options = {\n convertLinks: false,\n exec: false,\n finalize: function finalize(div) {\n a11y_hide(div.addClass('terminal-command'));\n fire_event('onEchoCommand', [div, command]);\n }\n };\n self.echo(prompt + command, options);\n }\n // ---------------------------------------------------------------------\n function have_scrollbar() {\n if (self.is('body')) {\n // source: https://stackoverflow.com/a/6639405/387194\n // from comment by Šime Vidas\n return window.innerWidth - document.documentElement.clientWidth > 0;\n }\n return fill.outerWidth() !== self.outerWidth();\n }\n // ---------------------------------------------------------------------\n // :: Helper function that restore state. Call import_view or exec\n // ---------------------------------------------------------------------\n function restore_state(spec) {\n // spec [terminal_id, state_index, command]\n var terminal = terminals.get()[spec[0]];\n if (!terminal) {\n throw new $.terminal.Exception(strings().invalidTerminalId);\n }\n var command_idx = spec[1];\n if (save_state[command_idx]) { // state exists\n terminal.import_view(save_state[command_idx]);\n } else {\n // restore state\n change_hash = false;\n var command = spec[2];\n if (command) {\n terminal.exec(command).done(function() {\n change_hash = true;\n save_state[command_idx] = terminal.export_view();\n });\n }\n }\n /*if (spec[3].length) {\n restore_state(spec[3]);\n }*/\n }\n // ---------------------------------------------------------------------\n // :: Helper function\n // ---------------------------------------------------------------------\n function maybe_update_hash() {\n if (change_hash) {\n fire_hash_change = false;\n location.hash = '#' + JSON.stringify(hash_commands);\n setTimeout(function() {\n fire_hash_change = true;\n }, 100);\n }\n }\n // ---------------------------------------------------------------------\n // :: Wrapper over interpreter, it implements exit and catches all\n // :: exeptions from user code and displays them on the terminal\n // ---------------------------------------------------------------------\n var first_command = true;\n var resume_callbacks = [];\n function commands(command, silent, exec) {\n function init_state() {\n // execHash need first empty command too\n if (settings.historyState || settings.execHash && exec) {\n if (!save_state.length) {\n // first command in first terminal don't have hash\n self.save_state();\n } else {\n self.save_state(null);\n }\n }\n }\n // -----------------------------------------------------------------\n function after_exec() {\n // variables defined later in commands\n if (!exec) {\n change_hash = true;\n if (settings.historyState) {\n self.save_state(command, false);\n }\n change_hash = saved_change_hash;\n }\n deferred.resolve();\n fire_event('onAfterCommand', [command]);\n }\n // -----------------------------------------------------------------\n function show(result) {\n if (typeof result !== 'undefined') {\n display_object(result);\n }\n after_exec();\n self.resume();\n }\n // -----------------------------------------------------------------\n function invoke() {\n // Call user interpreter function\n var result = interpreter.interpreter.call(self, command, self);\n if (result) {\n // auto pause/resume when user return promises\n // it should not pause when user return promise from read()\n if (!force_awake) {\n self.pause(settings.softPause);\n }\n force_awake = false;\n // when for native Promise object work only in jQuery 3.x\n if (is_function(result.done || result.then)) {\n (result.done || result.then).call(result, show);\n } else {\n return $.when(result).done(show);\n }\n } else if (paused) {\n resume_callbacks.push(function() {\n // exec with resume/pause in user code\n after_exec();\n });\n } else {\n after_exec();\n }\n }\n // -----------------------------------------------------------------\n // first command store state of the terminal before the command get\n // executed\n if (first_command) {\n first_command = false;\n init_state();\n }\n try {\n // this callback can disable commands\n if (fire_event('onBeforeCommand', [command]) === false) {\n return;\n }\n if (!exec) {\n prev_command = $.terminal.split_command(command);\n }\n if (!ghost()) {\n // exec execute this function wihout the help of cmd plugin\n // that add command to history on enter\n if (exec && (is_function(settings.historyFilter) &&\n settings.historyFilter(command) ||\n command.match(settings.historyFilter))) {\n command_line.history().append(command);\n }\n }\n var interpreter = interpreters.top();\n if (!silent && settings.echoCommand) {\n echo_command(command);\n }\n // new promise will be returned to exec that will resolve his\n // returned promise\n var deferred = new $.Deferred();\n // we need to save sate before commands is deleyd because\n // execute_extended_command disable it and it can be executed\n // after delay\n var saved_change_hash = change_hash;\n if (command.match(/^\\s*login\\s*$/) && self.token(true)) {\n if (self.level() > 1) {\n self.logout(true);\n } else {\n self.logout();\n }\n after_exec();\n } else if (settings.exit && command.match(/^\\s*exit\\s*$/) &&\n !in_login) {\n var level = self.level();\n if (level === 1 && self.get_token() || level > 1) {\n if (self.get_token(true)) {\n self.set_token(undefined, true);\n }\n self.pop();\n }\n after_exec();\n } else if (settings.clear && command.match(/^\\s*clear\\s*$/) &&\n !in_login) {\n self.clear();\n after_exec();\n } else {\n var ret = invoke();\n if (ret) {\n return ret;\n }\n }\n return deferred.promise();\n } catch (e) {\n display_exception(e, 'USER', exec);\n self.resume();\n if (exec) {\n throw e;\n }\n }\n }\n // ---------------------------------------------------------------------\n // :: The logout function removes Storage, disables history and runs\n // :: the login function. This function is called only when options.login\n // :: function is defined. The check for this is in the self.pop method\n // ---------------------------------------------------------------------\n function global_logout() {\n if (fire_event('onBeforeLogout', [], true) === false) {\n return;\n }\n clear_loging_storage();\n fire_event('onAfterlogout', [], true);\n self.login(global_login_fn, true, initialize);\n }\n // ---------------------------------------------------------------------\n function clear_loging_storage() {\n var name = self.prefix_name(true) + '_';\n storage.remove(name + 'token');\n storage.remove(name + 'login');\n }\n // ---------------------------------------------------------------------\n // :: Save the interpreter name for use with purge\n // ---------------------------------------------------------------------\n function maybe_append_name(interpreter_name) {\n var storage_key = self.prefix_name() + '_interpreters';\n var names = storage.get(storage_key);\n if (names) {\n names = JSON.parse(names);\n } else {\n names = [];\n }\n if ($.inArray(interpreter_name, names) === -1) {\n names.push(interpreter_name);\n storage.set(storage_key, JSON.stringify(names));\n }\n }\n // ---------------------------------------------------------------------\n // :: Function enables history, sets prompt, runs interpreter function\n // ---------------------------------------------------------------------\n function prepare_top_interpreter(silent) {\n var interpreter = interpreters.top();\n var name = self.prefix_name(true);\n if (!ghost()) {\n maybe_append_name(name);\n }\n var login = self.login_name(true);\n command_line.name(name + (login ? '_' + login : ''));\n var prompt = interpreter.prompt;\n if (is_function(prompt)) {\n prompt = context_callback_proxy(prompt, 'string');\n }\n if (prompt !== command_line.prompt()) {\n if (is_function(interpreter.prompt)) {\n // prevent flicker of old prompt until async prompt finishes\n command_line.prompt('');\n }\n command_line.prompt(interpreter.prompt);\n }\n if (typeof interpreter.history !== 'undefined') {\n self.history().toggle(interpreter.history);\n }\n if ($.isPlainObject(interpreter.keymap)) {\n command_line.keymap($.omap(interpreter.keymap, function(name, fun) {\n return function() {\n var args = [].slice.call(arguments);\n try {\n return fun.apply(self, args);\n } catch (e) {\n display_exception(e, 'USER KEYMAP');\n }\n };\n }));\n }\n command_line.set('');\n init_queue.resolve();\n if (!silent && is_function(interpreter.onStart)) {\n interpreter.onStart.call(self, self);\n }\n }\n // ---------------------------------------------------------------------\n function fire_event(name, args, skip_local) {\n args = (args || []).concat([self]); // create new array\n // even can be fired before interpreters is created\n var top = interpreters && interpreters.top();\n if (top && is_function(top[name]) && !skip_local) {\n try {\n return top[name].apply(self, args);\n } catch (e) {\n delete top[name];\n display_exception(e, name);\n }\n } else if (is_function(settings[name])) {\n try {\n return settings[name].apply(self, args);\n } catch (e) {\n settings[name] = null;\n display_exception(e, name);\n }\n }\n }\n var scroll_to_view = (function() {\n function scroll_to_view(visible) {\n if (!visible) {\n // try catch for Node.js unit tests\n try {\n self.scroll_to(self.find('.cmd-cursor'));\n return true;\n } catch (e) {\n return true;\n }\n }\n }\n // we don't want debounce in Unit Tests\n if (typeof global !== 'undefined' && typeof global.it === 'function') {\n return scroll_to_view;\n }\n return debounce(scroll_to_view, 100, {\n leading: true,\n trailing: false\n });\n })();\n // ---------------------------------------------------------------------\n function make_cursor_visible() {\n var cursor = self.find('.cmd-cursor-line');\n return cursor.is_fully_in_viewport(self).then(scroll_to_view);\n }\n // ---------------------------------------------------------------------\n function hashchange() {\n if (fire_hash_change && settings.execHash) {\n try {\n if (location.hash) {\n var hash = location.hash.replace(/^#/, '');\n hash_commands = JSON.parse(decodeURIComponent(hash));\n } else {\n hash_commands = [];\n }\n if (hash_commands.length) {\n restore_state(hash_commands[hash_commands.length - 1]);\n } else if (save_state[0]) {\n self.import_view(save_state[0]);\n }\n } catch (e) {\n display_exception(e, 'TERMINAL');\n }\n }\n }\n // ---------------------------------------------------------------------\n function initialize() {\n prepare_top_interpreter();\n show_greetings();\n if (lines.length) {\n self.refresh(); // for case when showing long error before init\n }\n // was_paused flag is workaround for case when user call exec before\n // login and pause in onInit, 3rd exec will have proper timing (will\n // execute after onInit resume)\n var was_paused = false;\n if (is_function(settings.onInit)) {\n onPause = function() { // local in terminal\n was_paused = true;\n };\n try {\n settings.onInit.call(self, self);\n } catch (e) {\n display_exception(e, 'OnInit');\n // throw e; // it will be catched by terminal\n } finally {\n onPause = $.noop;\n if (!was_paused && self.enabled()) {\n // resume login if user didn't call pause in onInit\n // if user pause in onInit wait with exec until it\n // resume\n self.resume(true);\n }\n }\n }\n if (first_instance) {\n first_instance = false;\n $(window).on('hashchange', hashchange);\n }\n }\n // ---------------------------------------------------------------------\n // :: If Ghost don't store anything in localstorage\n // ---------------------------------------------------------------------\n function ghost() {\n return in_login || command_line.mask() !== false;\n }\n // ---------------------------------------------------------------------\n // :: Keydown event handler\n // ---------------------------------------------------------------------\n function user_key_down(e) {\n var result, top = interpreters.top();\n if (is_function(top.keydown)) {\n result = top.keydown.call(self, e, self);\n if (result !== undefined) {\n return result;\n }\n } else if (is_function(settings.keydown)) {\n result = settings.keydown.call(self, e, self);\n if (result !== undefined) {\n return result;\n }\n }\n }\n var keymap = {\n 'CTRL+D': function(e, original) {\n if (!in_login) {\n if (command_line.get() === '') {\n if (interpreters.size() > 1 ||\n is_function(global_login_fn)) {\n self.pop('');\n } else {\n self.resume();\n self.echo('');\n }\n } else {\n original();\n }\n }\n return false;\n },\n 'CTRL+C': function() {\n with_selection(function(html) {\n if (html === '') {\n var command = self.get_command();\n var position = self.get_position();\n command = command.slice(0, position) + '^C' +\n command.slice(position + 2);\n echo_command(command);\n self.set_command('');\n } else {\n var clip = self.find('textarea');\n text_to_clipboard(clip, process_selected_html(html));\n }\n });\n return false;\n },\n 'CTRL+L': function() {\n self.clear();\n },\n 'TAB': function(e, orignal) {\n // TODO: move this to cmd plugin\n // add completion = array | function\n // !!! Problem complete more then one key need terminal\n var top = interpreters.top(), completion, caseSensitive;\n if (typeof top.caseSensitiveAutocomplete !== 'undefined') {\n caseSensitive = top.caseSensitiveAutocomplete;\n } else {\n caseSensitive = settings.caseSensitiveAutocomplete;\n }\n if (settings.completion &&\n get_type(settings.completion) !== 'boolean' &&\n top.completion === undefined) {\n completion = settings.completion;\n } else {\n completion = top.completion;\n }\n if (completion === 'settings') {\n completion = settings.completion;\n }\n function resolve(commands) {\n // local copy\n commands = commands.slice();\n // default commands should not match for arguments\n if (!self.before_cursor(false).match(/\\s/)) {\n if (settings.clear && $.inArray('clear', commands) === -1) {\n commands.push('clear');\n }\n if (settings.exit && $.inArray('exit', commands) === -1) {\n commands.push('exit');\n }\n }\n self.complete(commands, {\n echo: true,\n word: settings.wordAutocomplete,\n escape: settings.completionEscape,\n caseSensitive: caseSensitive,\n echoCommand: settings.doubleTabEchoCommand,\n doubleTab: settings.doubleTab\n });\n }\n if (completion) {\n switch (get_type(completion)) {\n case 'function':\n var string = self.before_cursor(settings.wordAutocomplete);\n if (completion.length === 3) {\n var error = new Error(strings().comletionParameters);\n display_exception(error, 'USER');\n return false;\n }\n var result = completion.call(self, string, resolve);\n if (result) {\n if (is_function(result.then)) {\n result.then(resolve);\n } else if (is_array(result)) {\n resolve(result);\n }\n }\n break;\n case 'array':\n resolve(completion);\n break;\n default:\n throw new $.terminal.Exception(strings().invalidCompletion);\n }\n } else {\n orignal();\n }\n return false;\n },\n 'CTRL+V': function(e, original) {\n original(e);\n self.oneTime(200, function() {\n self.scroll_to_bottom();\n });\n return true;\n },\n 'CTRL+TAB': function() {\n if (terminals.length() > 1) {\n self.focus(false);\n return false;\n }\n },\n 'PAGEDOWN': function() {\n self.scroll(self.height());\n },\n 'PAGEUP': function() {\n self.scroll(-self.height());\n }\n };\n // ---------------------------------------------------------------------\n function key_down(e) {\n // Prevent to be executed by cmd: CTRL+D, TAB, CTRL+TAB (if more\n // then one terminal)\n var result, i;\n if (self.enabled()) {\n if (!self.paused()) {\n result = user_key_down(e);\n if (result !== undefined) {\n return result;\n }\n if (e.which !== 9) { // not a TAB\n tab_count = 0;\n }\n } else {\n if (!settings.pauseEvents) {\n result = user_key_down(e);\n if (result !== undefined) {\n return result;\n }\n }\n if (e.which === 68 && e.ctrlKey) { // CTRL+D (if paused)\n if (settings.pauseEvents) {\n result = user_key_down(e);\n if (result !== undefined) {\n return result;\n }\n }\n if (requests.length) {\n for (i = requests.length; i--;) {\n var r = requests[i];\n if (r.readyState !== 4) {\n try {\n r.abort();\n } catch (error) {\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(\n self,\n e,\n 'AJAX ABORT'\n );\n } else {\n self.error(strings().ajaxAbortError);\n }\n }\n }\n }\n requests = [];\n }\n self.resume();\n }\n return false;\n }\n }\n }\n // ---------------------------------------------------------------------\n function key_press(e) {\n var top = interpreters.top();\n if (enabled && (!paused || !settings.pauseEvents)) {\n if (is_function(top.keypress)) {\n return top.keypress.call(self, e, self);\n } else if (is_function(settings.keypress)) {\n return settings.keypress.call(self, e, self);\n }\n }\n }\n // ---------------------------------------------------------------------\n function ready(queue) {\n return function(fun) {\n queue.add(fun);\n };\n }\n // ---------------------------------------------------------------------\n function strings() {\n return $.extend(\n {},\n $.terminal.defaults.strings,\n settings && settings.strings || {}\n );\n }\n // ---------------------------------------------------------------------\n var self = this;\n if (self.is('body,html')) {\n self = $('').appendTo('body');\n $('body').addClass('full-screen-terminal');\n }\n if (this.length > 1) {\n return this.each(function() {\n $.fn.terminal.call(\n $(this),\n init_interpreter,\n $.extend({name: self.selector}, options)\n );\n });\n }\n // terminal already exists\n if (self.data('terminal')) {\n return self.data('terminal');\n }\n // -----------------------------------------------------------------\n // TERMINAL METHODS\n // -----------------------------------------------------------------\n $.extend(self, $.omap({\n id: function() {\n return terminal_id;\n },\n // -------------------------------------------------------------\n // :: Clear the output\n // -------------------------------------------------------------\n clear: function() {\n lines = [];\n output.html('');\n fire_event('onClear');\n self.attr({scrollTop: 0});\n return self;\n },\n // -------------------------------------------------------------\n // :: Return an object that can be used with import_view to\n // :: restore the state\n // -------------------------------------------------------------\n export_view: function() {\n var user_export = fire_event('onExport');\n user_export = user_export || {};\n return $.extend({}, {\n focus: enabled,\n mask: command_line.mask(),\n prompt: self.get_prompt(),\n command: self.get_command(),\n position: command_line.position(),\n lines: clone(lines),\n interpreters: interpreters.clone(),\n history: command_line.history().data\n }, user_export);\n },\n // -------------------------------------------------------------\n // :: Restore the state of the previous exported view\n // -------------------------------------------------------------\n import_view: function(view) {\n if (in_login) {\n throw new Error(sprintf(strings().notWhileLogin, 'import_view'));\n }\n fire_event('onImport', [view]);\n when_ready(function ready() {\n self.set_prompt(view.prompt);\n self.set_command(view.command);\n command_line.position(view.position);\n command_line.mask(view.mask);\n if (view.focus) {\n self.focus();\n }\n lines = clone(view.lines).filter(function(line) {\n return line[0];\n });\n if (view.interpreters instanceof Stack) {\n interpreters = view.interpreters;\n }\n if (settings.importHistory) {\n command_line.history().set(view.history);\n }\n redraw();\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Store current terminal state\n // -------------------------------------------------------------\n save_state: function(command, ignore_hash, index) {\n // save_state.push({view:self.export_view(), join:[]});\n if (typeof index !== 'undefined') {\n save_state[index] = self.export_view();\n } else {\n save_state.push(self.export_view());\n }\n if (!$.isArray(hash_commands)) {\n hash_commands = [];\n }\n if (command !== undefined && !ignore_hash) {\n var state = [\n terminal_id,\n save_state.length - 1,\n command\n ];\n hash_commands.push(state);\n maybe_update_hash();\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Execute a command, it will handle commands that do AJAX\n // :: calls and have delays, if the second argument is set to\n // :: true it will not echo executed command\n // -------------------------------------------------------------\n exec: function(command, silent, deferred) {\n var d = deferred || new $.Deferred();\n cmd_ready(function ready() {\n if ($.isArray(command)) {\n (function recur() {\n var cmd = command.shift();\n if (cmd) {\n self.exec(cmd, silent).done(recur);\n } else {\n d.resolve();\n }\n })();\n } else if (paused) {\n // both commands executed here (resume will call Term::exec)\n // delay command multiple time\n delayed_commands.push([command, silent, d]);\n } else {\n // commands may return promise from user code\n // it will resolve exec promise when user promise\n // is resolved\n var ret = commands(command, silent, true);\n if (ret && (ret.done || ret.then)) {\n (ret.done || ret.then).call(ret, function() {\n d.resolve(self);\n });\n }\n }\n });\n // while testing it didn't executed last exec when using this\n // for resolved deferred\n return d.promise();\n },\n // -------------------------------------------------------------\n // :: bypass login function that wait untill you type user/pass\n // :: it hide implementation detail\n // -------------------------------------------------------------\n autologin: function(user, token, silent) {\n self.trigger('terminal.autologin', [user, token, silent]);\n return self;\n },\n // -------------------------------------------------------------\n // :: Function changes the prompt of the command line to login\n // :: with a password and calls the user login function with\n // :: the callback that expects a token. The login is successful\n // :: if the user calls it with value that is truthy\n // -------------------------------------------------------------\n login: function(auth, infinite, success, error) {\n logins.push([].slice.call(arguments));\n if (in_login) {\n throw new Error(sprintf(strings().notWhileLogin, 'login'));\n }\n if (!is_function(auth)) {\n throw new Error(strings().loginIsNotAFunction);\n }\n in_login = true;\n if (self.token() && self.level() === 1 && !autologin) {\n in_login = false; // logout will call login\n self.logout(true);\n } else if (self.token(true) && self.login_name(true)) {\n in_login = false;\n if (is_function(success)) {\n success();\n }\n return self;\n }\n // don't store login data in history\n if (settings.history) {\n command_line.history().disable();\n }\n function popUserPass() {\n while (self.level() > level) {\n self.pop(undefined, true);\n }\n if (settings.history) {\n command_line.history().enable();\n }\n }\n // so we know how many times call pop\n var level = self.level();\n function login_callback(user, token, silent) {\n if (token) {\n popUserPass();\n var name = self.prefix_name(true) + '_';\n storage.set(name + 'token', token);\n storage.set(name + 'login', user);\n in_login = false;\n fire_event('onAfterLogin', [user, token]);\n if (is_function(success)) {\n // will be used internaly since users know\n // when login success (they decide when\n // it happen by calling the callback -\n // this funtion)\n success();\n }\n } else {\n if (infinite) {\n if (!silent) {\n self.error(strings().wrongPasswordTryAgain);\n }\n self.pop(undefined, true).set_mask(false);\n } else {\n in_login = false;\n if (!silent) {\n self.error(strings().wrongPassword);\n }\n self.pop(undefined, true).pop(undefined, true);\n }\n // used only to call pop in push\n if (is_function(error)) {\n error();\n }\n }\n self.off('terminal.autologin');\n }\n self.on('terminal.autologin', function(event, user, token, silent) {\n if (fire_event('onBeforeLogin', [user, token]) === false) {\n return;\n }\n login_callback(user, token, silent);\n });\n self.push(function(user) {\n self.set_mask(settings.maskChar).push(function(pass) {\n try {\n if (fire_event('onBeforeLogin', [user, pass]) === false) {\n popUserPass();\n return;\n }\n var ret = auth.call(self, user, pass, function(\n token,\n silent) {\n login_callback(user, token, silent);\n });\n if (ret && is_function(ret.then)) {\n self.pause();\n ret.then(function(token) {\n login_callback(user, token);\n self.resume();\n });\n }\n } catch (e) {\n display_exception(e, 'AUTH');\n }\n }, {\n prompt: strings().password + ': ',\n name: 'password'\n });\n }, {\n prompt: strings().login + ': ',\n name: 'login'\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: User defined settings and defaults as well\n // -------------------------------------------------------------\n settings: function() {\n return settings;\n },\n // -------------------------------------------------------------\n // :: Get string before cursor\n // -------------------------------------------------------------\n before_cursor: function(word) {\n var pos = command_line.position();\n var command = command_line.get().slice(0, pos);\n var cmd_strings = command.split(' ');\n var string; // string before cursor that will be completed\n if (word) {\n if (cmd_strings.length === 1) {\n string = cmd_strings[0];\n } else {\n var m = command.match(/(\\\\?\")/g);\n var double_quotes = m ? m.filter(function(chr) {\n return !chr.match(/^\\\\/);\n }).length : 0;\n m = command.match(/'/g);\n var single_quote = m ? m.length : 0;\n if (single_quote % 2 === 1) {\n string = command.match(/('[^']*)$/)[0];\n } else if (double_quotes % 2 === 1) {\n string = command.match(/(\"(?:[^\"]|\\\\\")*)$/)[0];\n } else {\n string = cmd_strings[cmd_strings.length - 1];\n for (i = cmd_strings.length - 1; i > 0; i--) {\n // treat escape space as part of the string\n var prev_string = cmd_strings[i - 1];\n if (prev_string[prev_string.length - 1] === '\\\\') {\n string = cmd_strings[i - 1] + ' ' + string;\n } else {\n break;\n }\n }\n }\n }\n } else {\n string = command;\n }\n return string;\n },\n // -------------------------------------------------------------\n // :: complete word or command based on array of words\n // -------------------------------------------------------------\n complete: function(commands, options) {\n options = $.extend({\n word: true,\n echo: false,\n escape: true,\n echoCommand: false,\n caseSensitive: true,\n doubleTab: null\n }, options || {});\n var sensitive = options.caseSensitive;\n // cursor can be in the middle of the command\n // so we need to get the text before the cursor\n var string = self.before_cursor(options.word).replace(/\\\\\"/g, '\"');\n var quote = false;\n if (options.word) {\n if (string.match(/^\"/)) {\n quote = '\"';\n } else if (string.match(/^'/)) {\n quote = \"'\";\n }\n if (quote) {\n string = string.replace(/^[\"']/, '');\n }\n }\n if (tab_count % 2 === 0) {\n command = self.before_cursor(options.word);\n } else {\n var test = self.before_cursor(options.word);\n if (test !== command) {\n // command line changed between TABS - ignore\n return;\n }\n }\n var safe = $.terminal.escape_regex(string);\n if (options.escape) {\n safe = safe.replace(/(\\\\+)([\"'() ])/g, function(_, slash, chr) {\n if (chr.match(/[()]/)) {\n return slash + '\\\\?\\\\' + chr;\n } else {\n return slash + '?' + chr;\n }\n });\n }\n function escape(string) {\n if (quote === '\"') {\n string = string.replace(/\"/g, '\\\\\"');\n }\n if (!quote && options.escape) {\n string = string.replace(/([\"'() ])/g, '\\\\$1');\n }\n return string;\n }\n function matched_strings() {\n var matched = [];\n for (var i = commands.length; i--;) {\n if (commands[i].match(/\\n/) && options.word) {\n warn('If you use commands with newlines you ' +\n 'should use word option for complete or' +\n ' wordAutocomplete terminal option');\n }\n if (regex.test(commands[i])) {\n var match = escape(commands[i]);\n if (!sensitive && same_case(match)) {\n if (string.toLowerCase() === string) {\n match = match.toLowerCase();\n } else if (string.toUpperCase() === string) {\n match = match.toUpperCase();\n }\n }\n matched.push(match);\n }\n }\n return matched;\n }\n var flags = sensitive ? '' : 'i';\n var regex = new RegExp('^' + safe, flags);\n var matched = matched_strings();\n function replace(input, replacement) {\n var text = self.get_command();\n var pos = self.get_position();\n var re = new RegExp('^' + input, 'i');\n var pre = text.slice(0, pos);\n var post = text.slice(pos);\n var to_insert = replacement.replace(re, '') + (quote || '');\n self.set_command(pre + to_insert + post);\n self.set_position((pre + to_insert).length);\n }\n if (matched.length === 1) {\n if (options.escape) {\n replace(safe, matched[0]);\n } else {\n self.insert(matched[0].replace(regex, '') + (quote || ''));\n }\n command = self.before_cursor(options.word);\n return true;\n } else if (matched.length > 1) {\n if (++tab_count >= 2) {\n tab_count = 0;\n if (options.echo) {\n if (is_function(options.doubleTab)) {\n // new API old is keep for backward compatibility\n if (options.echoCommand) {\n echo_command();\n }\n var ret = options.doubleTab.call(\n self,\n string,\n matched,\n echo_command\n );\n if (typeof ret === 'undefined') {\n return true;\n } else {\n return ret;\n }\n } else if (options.doubleTab !== false) {\n echo_command();\n var text = matched.slice().reverse().join('\\t\\t');\n self.echo($.terminal.escape_brackets(text), {\n keepWords: true,\n formatters: false\n });\n }\n return true;\n }\n } else {\n var common = common_string(escape(string), matched, sensitive);\n if (common) {\n replace(safe, common);\n command = self.before_cursor(options.word);\n return true;\n }\n }\n }\n },\n // -------------------------------------------------------------\n // :: Return commands function from top interpreter\n // -------------------------------------------------------------\n commands: function() {\n return interpreters.top().interpreter;\n },\n // -------------------------------------------------------------\n // :: Low Level method that overwrites interpreter\n // -------------------------------------------------------------\n set_interpreter: function(user_intrp, login) {\n function overwrite_interpreter() {\n self.pause(settings.softPause);\n make_interpreter(user_intrp, login, function(result) {\n self.resume();\n var top = interpreters.top();\n $.extend(top, result);\n prepare_top_interpreter(true);\n });\n }\n if (is_function(login)) {\n self.login(login, true, overwrite_interpreter);\n } else if (get_type(user_intrp) === 'string' && login) {\n self.login(\n make_json_rpc_login(user_intrp, login),\n true,\n overwrite_interpreter\n );\n } else {\n overwrite_interpreter();\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Show user greetings or terminal signature\n // -------------------------------------------------------------\n greetings: function() {\n show_greetings();\n return self;\n },\n // -------------------------------------------------------------\n // :: Return true if terminal is paused false otherwise\n // -------------------------------------------------------------\n paused: function() {\n return paused;\n },\n // -------------------------------------------------------------\n // :: Pause the terminal, it should be used for ajax calls\n // -------------------------------------------------------------\n pause: function(visible) {\n cmd_ready(function ready() {\n onPause();\n paused = true;\n command_line.disable(visible || is_android);\n if (!visible) {\n command_line.find('.cmd-prompt').hidden();\n }\n fire_event('onPause');\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Resume the previously paused terminal\n // -------------------------------------------------------------\n resume: function(silent) {\n cmd_ready(function ready() {\n paused = false;\n if (enabled && terminals.front() === self) {\n command_line.enable(silent);\n }\n command_line.find('.cmd-prompt').visible();\n var original = delayed_commands;\n delayed_commands = [];\n for (var i = 0; i < original.length; ++i) {\n self.exec.apply(self, original[i]);\n }\n self.trigger('resume');\n var fn = resume_callbacks.shift();\n if (fn) {\n fn();\n }\n self.scroll_to_bottom();\n fire_event('onResume');\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Return the number of characters that fit into the width of\n // :: the terminal\n // -------------------------------------------------------------\n cols: function() {\n if (settings.numChars) {\n return settings.numChars;\n }\n if (typeof num_chars === 'undefined' || num_chars === 1000) {\n num_chars = get_num_chars(self, char_size);\n }\n return num_chars;\n },\n // -------------------------------------------------------------\n // :: Return the number of lines that fit into the height of the\n // :: terminal\n // -------------------------------------------------------------\n rows: function() {\n if (settings.numRows) {\n return settings.numRows;\n }\n if (typeof num_rows === 'undefined') {\n num_rows = get_num_rows(self, char_size);\n }\n return num_rows;\n },\n // -------------------------------------------------------------\n // :: Return the History object\n // -------------------------------------------------------------\n history: function() {\n return command_line.history();\n },\n // -------------------------------------------------------------\n // :: toggle recording of history state\n // -------------------------------------------------------------\n history_state: function(toggle) {\n function run() {\n settings.historyState = true;\n if (!save_state.length) {\n self.save_state();\n } else if (terminals.length() > 1) {\n self.save_state(null);\n }\n }\n if (toggle) {\n // if set to true and if set from user command we need\n // not to include the command\n if (typeof window.setImmediate === 'undefined') {\n setTimeout(run, 0);\n } else {\n setImmediate(run);\n }\n } else {\n settings.historyState = false;\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: clear the history state\n // -------------------------------------------------------------\n clear_history_state: function() {\n hash_commands = [];\n save_state = [];\n return self;\n },\n // -------------------------------------------------------------\n // :: Switch to the next terminal\n // -------------------------------------------------------------\n next: function() {\n if (terminals.length() === 1) {\n return self;\n } else {\n terminals.front().disable();\n var next = terminals.rotate().enable();\n // 50 provides buffer in viewport\n var x = next.offset().top - 50;\n $('html,body').animate({scrollTop: x}, 500);\n try {\n trigger_terminal_change(next);\n } catch (e) {\n display_exception(e, 'onTerminalChange');\n }\n return next;\n }\n },\n // -------------------------------------------------------------\n // :: Make the terminal in focus or blur depending on the first\n // :: argument. If there is more then one terminal it will\n // :: switch to next one, if the second argument is set to true\n // :: the events will be not fired. Used on init\n // -------------------------------------------------------------\n focus: function(toggle, silent) {\n cmd_ready(function ready() {\n if (terminals.length() === 1) {\n if (toggle === false) {\n self.disable(silent);\n } else {\n self.enable(silent);\n }\n } else if (toggle === false) {\n self.next();\n } else {\n var front = terminals.front();\n if (front !== self) {\n // there should be only from terminal enabled but tests\n // sometime fail because there where more them one\n // where cursor have blink class\n terminals.forEach(function(terminal) {\n if (terminal !== self && terminal.enabled()) {\n terminal.disable(silent);\n }\n });\n if (!silent) {\n try {\n trigger_terminal_change(self);\n } catch (e) {\n display_exception(e, 'onTerminalChange');\n }\n }\n }\n terminals.set(self);\n self.enable(silent);\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Disable/Enable terminal that can be enabled by click\n // -------------------------------------------------------------\n freeze: function(freeze) {\n when_ready(function ready() {\n if (freeze) {\n self.disable();\n frozen = true;\n } else {\n frozen = false;\n self.enable();\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: check if terminal is frozen\n // -------------------------------------------------------------\n frozen: function() {\n return frozen;\n },\n // -------------------------------------------------------------\n // :: Enable the terminal\n // -------------------------------------------------------------\n enable: function(silent) {\n if (!enabled && !frozen) {\n if (num_chars === undefined) {\n // enabling first time\n self.resize();\n }\n cmd_ready(function ready() {\n var ret;\n if (!silent && !enabled) {\n fire_event('onFocus');\n }\n if (!silent && ret === undefined || silent) {\n enabled = true;\n if (!self.paused()) {\n command_line.enable(true);\n }\n }\n });\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Disable the terminal\n // -------------------------------------------------------------\n disable: function(silent) {\n cmd_ready(function ready() {\n var ret;\n if (!silent && enabled) {\n ret = fire_event('onBlur');\n }\n if (!silent && ret === undefined || silent) {\n enabled = false;\n command_line.disable();\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: return true if the terminal is enabled\n // -------------------------------------------------------------\n enabled: function() {\n return enabled;\n },\n // -------------------------------------------------------------\n // :: Return the terminal signature depending on the size of the terminal\n // -------------------------------------------------------------\n signature: function() {\n var cols = self.cols();\n for (var i = signatures.length; i--;) {\n var lenghts = signatures[i].map(function(line) {\n return line.length;\n });\n if (Math.max.apply(null, lenghts) <= cols) {\n return signatures[i].join('\\n') + '\\n';\n }\n }\n return '';\n },\n // -------------------------------------------------------------\n // :: Return the version number\n // -------------------------------------------------------------\n version: function() {\n return $.terminal.version;\n },\n // -------------------------------------------------------------\n // :: Return actual command line object (jquery object with cmd\n // :: methods)\n // -------------------------------------------------------------\n cmd: function() {\n return command_line;\n },\n // -------------------------------------------------------------\n // :: Return the current command entered by terminal\n // -------------------------------------------------------------\n get_command: function() {\n return command_line.get();\n },\n // -------------------------------------------------------------\n // :: echo command and previous prompt (used by echo_newline.js)\n // -------------------------------------------------------------\n echo_command: function(command) {\n return echo_command(command);\n },\n // -------------------------------------------------------------\n // :: Change the command line to the new one\n // -------------------------------------------------------------\n set_command: function(command, silent) {\n when_ready(function ready() {\n // TODO: refactor to use options - breaking change\n if (typeof command !== 'string') {\n command = JSON.stringify(command);\n }\n command_line.set(command, undefined, silent);\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Change position of the command line\n // -------------------------------------------------------------\n set_position: function(position, relative) {\n when_ready(function ready() {\n command_line.position(position, relative);\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Return position of the command line\n // -------------------------------------------------------------\n get_position: function() {\n return command_line.position();\n },\n // -------------------------------------------------------------\n // :: Insert text into the command line after the cursor\n // -------------------------------------------------------------\n insert: function(string, stay) {\n if (typeof string === 'string') {\n when_ready(function ready() {\n var bottom = self.is_bottom();\n command_line.insert(string, stay);\n if (settings.scrollOnEcho || bottom) {\n self.scroll_to_bottom();\n }\n });\n return self;\n } else {\n throw new Error(sprintf(strings().notAString, 'insert'));\n }\n },\n // -------------------------------------------------------------\n // :: Set the prompt of the command line\n // -------------------------------------------------------------\n set_prompt: function(prompt) {\n when_ready(function ready() {\n if (is_function(prompt)) {\n command_line.prompt(function(callback) {\n prompt.call(self, callback, self);\n });\n } else {\n command_line.prompt(prompt);\n }\n interpreters.top().prompt = prompt;\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Return the prompt used by the terminal\n // -------------------------------------------------------------\n get_prompt: function() {\n return interpreters.top().prompt;\n // command_line.prompt(); - can be a wrapper\n //return command_line.prompt();\n },\n // -------------------------------------------------------------\n // :: Enable or Disable mask depedning on the passed argument\n // :: the mask can also be character (in fact it will work with\n // :: strings longer then one)\n // -------------------------------------------------------------\n set_mask: function(mask) {\n when_ready(function ready() {\n command_line.mask(mask === true ? settings.maskChar : mask);\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Return the ouput of the terminal as text\n // -------------------------------------------------------------\n get_output: function(raw) {\n if (raw) {\n return lines;\n } else {\n return $.map(lines, function(item) {\n return is_function(item[0]) ? item[0]() : item[0];\n }).join('\\n');\n }\n },\n // -------------------------------------------------------------\n // :: Recalculate and redraw everything\n // -------------------------------------------------------------\n resize: function(width, height) {\n if (!self.is(':visible')) {\n // delay resize if terminal not visible\n self.stopTime('resize');\n self.oneTime(500, 'resize', function() {\n self.resize(width, height);\n });\n } else {\n if (width && height) {\n self.width(width);\n self.height(height);\n }\n width = self.width();\n height = self.height();\n if (typeof settings.numChars !== 'undefined' ||\n typeof settings.numRows !== 'undefined') {\n command_line.resize(settings.numChars);\n self.refresh();\n fire_event('onResize');\n return;\n }\n var new_num_chars = get_num_chars(self, char_size);\n var new_num_rows = get_num_rows(self, char_size);\n // only if number of chars changed\n if (new_num_chars !== num_chars ||\n new_num_rows !== num_rows) {\n num_chars = new_num_chars;\n num_rows = new_num_rows;\n command_line.resize(num_chars);\n self.refresh();\n fire_event('onResize');\n }\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: redraw the terminal\n // -------------------------------------------------------------\n refresh: function() {\n if (char_size.width !== 0) {\n self[0].style.setProperty('--char-width', char_size.width);\n }\n redraw({\n scroll: false,\n update: true\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Flush the output to the terminal\n // -------------------------------------------------------------\n flush: function(options) {\n options = $.extend({}, {\n update: false,\n scroll: true\n }, options || {});\n try {\n var bottom = self.is_bottom();\n var wrapper;\n // print all lines\n // var output_buffer = lines.flush();\n $.each(output_buffer, function(i, data) {\n if (data === NEW_LINE) {\n wrapper = $('');\n } else if ($.isPlainObject(data) && is_function(data.finalize)) {\n // this is finalize function from echo\n if (options.update) {\n var selector = '> div[data-index=' + data.index + ']';\n var node = output.find(selector);\n if (node.html() !== wrapper.html()) {\n node.replaceWith(wrapper);\n }\n } else {\n wrapper.appendTo(output);\n }\n data.finalize(wrapper.attr('data-index', data.index));\n } else {\n var line = data.line;\n var div = $('').html(line)\n .appendTo(wrapper).width('100%');\n if (data.newline) {\n div.addClass('cmd-end-line');\n }\n }\n });\n limit_lines();\n fire_event('onFlush');\n //num_rows = get_num_rows(self, char_size);\n if ((settings.scrollOnEcho && options.scroll) || bottom) {\n self.scroll_to_bottom();\n }\n } catch (e1) {\n if (is_function(settings.exceptionHandler)) {\n try {\n settings.exceptionHandler.call(self, e1, 'TERMINAL (Flush)');\n } catch (e2) {\n settings.exceptionHandler = $.noop;\n alert_exception('[exceptionHandler]', e2);\n }\n } else {\n alert_exception('[Flush]', e1);\n }\n } finally {\n output_buffer = [];\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Update the output line - line number can be negative\n // -------------------------------------------------------------\n update: function(line, string, options) {\n when_ready(function ready() {\n if (line < 0) {\n line = lines.length + line; // yes +\n }\n if (!lines[line]) {\n self.error('Invalid line number ' + line);\n } else if (string === null) {\n lines.splice(line, 1);\n output.find('[data-index=' + line + ']').remove();\n } else {\n lines[line][0] = string;\n if (options) {\n lines[line][1] = options;\n }\n process_line({\n string: string,\n index: line,\n options: options\n });\n self.flush({\n scroll: false,\n update: true\n });\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: convenience method for removing selected line\n // -------------------------------------------------------------\n remove_line: function(line) {\n return self.update(line, null);\n },\n // -------------------------------------------------------------\n // :: return index of last line in case when you need to update\n // :: after something is echo on the terminal\n // -------------------------------------------------------------\n last_index: function() {\n return lines.length - 1;\n },\n // -------------------------------------------------------------\n // :: Print data to the terminal output. It can have options\n // :: * flush - indicate that arg should be send to DOM\n // :: * raw - indicate if it should handle input as html\n // :: * finalize - function call with container div\n // :: * keepWords - inform how to wrap text\n // :: * formatters - inform function if it should use formatters\n // :: on input string - good to prevent XSS when you want\n // :: advanced server side controling of terminal\n // :: you can echo: promise, function, strings array or string\n // -------------------------------------------------------------\n echo: function(arg, options) {\n var arg_defined = arguments.length > 0;\n function echo(arg) {\n try {\n var locals = $.extend({\n flush: true,\n exec: true,\n raw: settings.raw,\n finalize: $.noop,\n keepWords: false,\n invokeMethods: settings.invokeMethods,\n formatters: true,\n allowedAttributes: settings.allowedAttributes\n }, options || {});\n (function(finalize) {\n locals.finalize = function(div) {\n if (locals.raw) {\n div.addClass('raw');\n }\n try {\n if (is_function(finalize)) {\n finalize(div);\n }\n } catch (e) {\n display_exception(e, 'USER:echo(finalize)');\n finalize = null;\n }\n };\n })(locals.finalize);\n if (locals.flush) {\n // flush buffer if there was no flush after previous echo\n if (output_buffer.length) {\n self.flush();\n }\n }\n if (fire_event('onBeforeEcho', [arg]) === false) {\n return;\n }\n var value;\n if (typeof arg === 'function') {\n value = arg.bind(self);\n } else if (typeof arg === 'undefined') {\n if (arg_defined) {\n value = String(arg);\n } else {\n value = '';\n }\n } else {\n value = arg;\n }\n process_line({\n string: value,\n options: locals,\n index: lines.length\n });\n // extended commands should be processed only\n // once in echo and not on redraw\n lines.push([value, $.extend(locals, {\n exec: false\n })]);\n if (locals.flush) {\n self.flush();\n fire_event('onAfterEcho', [arg]);\n }\n } catch (e) {\n // if echo throw exception we can't use error to\n // display that exception\n if (is_function(settings.exceptionHandler)) {\n settings.exceptionHandler.call(self, e, 'TERMINAL (echo)');\n } else {\n alert_exception('[Terminal.echo]', e);\n }\n }\n }\n if (arg !== undefined && is_function(arg.then)) {\n $.when(arg).done(echo);\n } else {\n echo(arg);\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: echo red text\n // -------------------------------------------------------------\n error: function(message, options) {\n options = $.extend({}, options, {raw: false, formatters: false});\n function format(string) {\n if (typeof string !== 'string') {\n string = String(string);\n }\n // quick hack to fix trailing backslash\n var str = $.terminal.escape_brackets(string).\n replace(/\\\\$/, '\').\n replace(url_re, ']$1[[;;;terminal-error]');\n return '[[;;;terminal-error]' + str + ']';\n }\n if (typeof message === 'function') {\n return self.echo(function() {\n return format(message.call(self));\n }, options);\n }\n if (message && message.then) {\n message.then(function(string) {\n self.echo(format(string));\n });\n return self;\n }\n return self.echo(format(message), options);\n },\n // -------------------------------------------------------------\n // :: Display Exception on terminal\n // -------------------------------------------------------------\n exception: function(e, label) {\n var message = exception_message(e);\n if (label) {\n message = '[' + label + ']: ' + message;\n }\n if (message) {\n self.error(message, {\n finalize: function(div) {\n div.addClass('terminal-exception terminal-message');\n },\n keepWords: true\n });\n }\n if (typeof e.fileName === 'string') {\n // display filename and line which throw exeption\n self.pause(settings.softPause);\n $.get(e.fileName, function(file) {\n var num = e.lineNumber - 1;\n var line = file.split('\\n')[num];\n if (line) {\n self.error('[' + e.lineNumber + ']: ' + line);\n }\n self.resume();\n }, 'text');\n }\n if (e.stack) {\n var stack = $.terminal.escape_brackets(e.stack);\n self.echo(stack.split(/\\n/g).map(function(trace) {\n // nested formatting will handle urls but that formatting\n // can be removed - this code was created before\n // that formatting existed (see commit ce01c3f5)\n return '[[;;;terminal-error]' +\n trace.replace(url_re, function(url) {\n return ']' + url + '[[;;;terminal-error]';\n }) + ']';\n }).join('\\n'), {\n finalize: function(div) {\n div.addClass('terminal-exception terminal-stack-trace');\n },\n formatters: false\n });\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Scroll Div that holds the terminal\n // -------------------------------------------------------------\n scroll: function(amount) {\n var pos;\n amount = Math.round(amount);\n if (self.prop) { // work with jQuery > 1.6\n if (amount > self.prop('scrollTop') && amount > 0) {\n self.prop('scrollTop', 0);\n }\n pos = self.prop('scrollTop');\n self.scrollTop(pos + amount);\n } else {\n if (amount > self.attr('scrollTop') && amount > 0) {\n self.attr('scrollTop', 0);\n }\n pos = self.attr('scrollTop');\n self.scrollTop(pos + amount);\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Exit all interpreters and logout. The function will throw\n // :: exception if there is no login provided\n // -------------------------------------------------------------\n logout: function(local) {\n if (in_login) {\n throw new Error(sprintf(strings().notWhileLogin, 'logout'));\n }\n when_ready(function ready() {\n if (local) {\n var login = logins.pop();\n self.set_token(undefined, true);\n self.login.apply(self, login);\n } else if (interpreters.size() === 1 && self.token()) {\n self.logout(true);\n } else {\n while (interpreters.size() > 1) {\n // pop will call global_logout that will call login\n // and size will be > 0; this is workaround the problem\n if (self.token()) {\n self.logout(true).pop().pop();\n } else {\n self.pop();\n }\n }\n }\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Function returns the token returned by callback function\n // :: in login function. It does nothing (return undefined) if\n // :: there is no login\n // -------------------------------------------------------------\n token: function(local) {\n return storage.get(self.prefix_name(local) + '_token');\n },\n // -------------------------------------------------------------\n // :: Function sets the token to the supplied value. This function\n // :: works regardless of wherer settings.login is supplied\n // -------------------------------------------------------------\n set_token: function(token, local) {\n var name = self.prefix_name(local) + '_token';\n if (typeof token === 'undefined') {\n storage.remove(name);\n } else {\n storage.set(name, token);\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Function get the token either set by the login method or\n // :: by the set_token method.\n // -------------------------------------------------------------\n get_token: function(local) {\n return self.token(local);\n },\n // -------------------------------------------------------------\n // :: Function return Login name entered by the user\n // -------------------------------------------------------------\n login_name: function(local) {\n return storage.get(self.prefix_name(local) + '_login');\n },\n // -------------------------------------------------------------\n // :: Function returns the name of current interpreter\n // -------------------------------------------------------------\n name: function() {\n return interpreters.top().name;\n },\n // -------------------------------------------------------------\n // :: Function return prefix name for login/token\n // -------------------------------------------------------------\n prefix_name: function(local) {\n var name = (settings.name ? settings.name + '_' : '') +\n terminal_id;\n if (local && interpreters.size() > 1) {\n var local_name = interpreters.map(function(intrp) {\n return intrp.name || '';\n }).slice(1).join('_');\n if (local_name) {\n name += '_' + local_name;\n }\n }\n return name;\n },\n // -------------------------------------------------------------\n // :: wrapper for common use case\n // -------------------------------------------------------------\n read: function(message, success, cancel) {\n // return from read() should not pause terminal\n force_awake = true;\n var defer = jQuery.Deferred();\n var read = false;\n self.push(function(string) {\n read = true;\n defer.resolve(string);\n if (is_function(success)) {\n success(string);\n }\n self.pop();\n if (settings.history) {\n command_line.history().enable();\n }\n }, {\n name: 'read',\n history: false,\n prompt: message || '',\n onExit: function() {\n if (!read) {\n defer.reject();\n if (is_function(cancel)) {\n cancel();\n }\n }\n }\n });\n if (settings.history) {\n command_line.history().disable();\n }\n return defer.promise();\n },\n // -------------------------------------------------------------\n // :: Push a new interenter on the Stack\n // -------------------------------------------------------------\n push: function(interpreter, options) {\n cmd_ready(function ready() {\n options = options || {};\n var defaults = {\n infiniteLogin: false\n };\n var push_settings = $.extend({}, defaults, options);\n if (!push_settings.name && prev_command) {\n // push is called in login\n push_settings.name = prev_command.name;\n }\n if (push_settings.prompt === undefined) {\n push_settings.prompt = (push_settings.name || '>') + ' ';\n }\n // names.push(options.name);\n var top = interpreters.top();\n if (top) {\n top.mask = command_line.mask();\n }\n var was_paused = paused;\n function init() {\n fire_event('onPush', [top, interpreters.top()]);\n prepare_top_interpreter();\n }\n // self.pause();\n make_interpreter(interpreter, options.login, function(ret) {\n // result is object with interpreter and completion properties\n interpreters.push($.extend({}, ret, push_settings));\n if (push_settings.completion === true) {\n if ($.isArray(ret.completion)) {\n interpreters.top().completion = ret.completion;\n } else if (!ret.completion) {\n interpreters.top().completion = false;\n }\n }\n if (push_settings.login) {\n var error;\n var type = get_type(push_settings.login);\n if (type === 'function') {\n error = push_settings.infiniteLogin ? $.noop : self.pop;\n self.login(\n push_settings.login,\n push_settings.infiniteLogin,\n init,\n error\n );\n } else if (get_type(interpreter) === 'string' &&\n type === 'string' || type === 'boolean') {\n error = push_settings.infiniteLogin ? $.noop : self.pop;\n self.login(\n make_json_rpc_login(\n interpreter,\n push_settings.login\n ),\n push_settings.infiniteLogin,\n init,\n error\n );\n }\n } else {\n init();\n }\n if (!was_paused && self.enabled()) {\n self.resume();\n }\n });\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Remove the last interpreter from the Stack\n // -------------------------------------------------------------\n pop: function(string, silent) {\n if (string !== undefined) {\n echo_command(string);\n }\n var token = self.token(true);\n var top;\n if (interpreters.size() === 1) {\n top = interpreters.top();\n if (settings.login) {\n if (!silent) {\n fire_event('onPop', [top, null]);\n }\n global_logout();\n fire_event('onExit');\n } else {\n self.error(strings().canExitError);\n }\n } else {\n if (token) {\n clear_loging_storage();\n }\n var current = interpreters.pop();\n top = interpreters.top();\n prepare_top_interpreter();\n // restore mask\n self.set_mask(top.mask);\n if (!silent) {\n fire_event('onPop', [current, top]);\n }\n // we check in case if you don't pop from password interpreter\n if (in_login && self.get_prompt() !== strings().login + ': ') {\n in_login = false;\n }\n if (is_function(current.onExit)) {\n try {\n current.onExit.call(self, self);\n } catch (e) {\n current.onExit = $.noop;\n display_exception(e, 'onExit');\n }\n }\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: Change terminal option(s) at runtime\n // -------------------------------------------------------------\n option: function(object_or_name, value) {\n if (typeof value === 'undefined') {\n if (typeof object_or_name === 'string') {\n return settings[object_or_name];\n } else if (typeof object_or_name === 'object') {\n $.each(object_or_name, function(key, value) {\n settings[key] = value;\n });\n }\n } else {\n settings[object_or_name] = value;\n if (object_or_name.match(/^num(Chars|Rows)$/)) {\n redraw();\n }\n }\n return self;\n },\n // -------------------------------------------------------------\n // :: invoke keydown shorcut\n // -------------------------------------------------------------\n invoke_key: function(shortcut) {\n command_line.invoke_key(shortcut);\n return self;\n },\n // -------------------------------------------------------------\n // :: change terminal keymap at runtime\n // -------------------------------------------------------------\n keymap: function(keymap, fn) {\n if (arguments.length === 0) {\n return command_line.keymap();\n }\n if (typeof fn === 'undefined') {\n if (typeof keymap === 'string') {\n return command_line.keymap(keymap);\n } else if ($.isPlainObject(keymap)) {\n // argument is an object\n keymap = $.omap(keymap || {}, function(key, fn) {\n if (!new_keymap[key]) {\n return fn.bind(self);\n }\n return function(e, original) {\n // new keymap function will get default as 2nd argument\n return fn.call(self, e, function() {\n return new_keymap[key](e, original);\n });\n };\n });\n command_line.keymap(keymap);\n }\n } else if (typeof fn === 'function') {\n var key = keymap;\n if (!new_keymap[key]) {\n command_line.keymap(key, fn.bind(self));\n } else {\n command_line.keymap(key, function(e, original) {\n return fn.call(self, e, function() {\n return new_keymap[key](e, original);\n });\n });\n }\n }\n },\n // -------------------------------------------------------------\n // :: Return how deep you are in nested interpreters\n // -------------------------------------------------------------\n level: function() {\n return interpreters.size();\n },\n // -------------------------------------------------------------\n // :: Reinitialize the terminal\n // -------------------------------------------------------------\n reset: function() {\n when_ready(function ready() {\n self.clear();\n while (interpreters.size() > 1) {\n interpreters.pop();\n }\n initialize();\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Remove all local storage left by terminal, it will not\n // :: logout you until you refresh the browser\n // -------------------------------------------------------------\n purge: function() {\n when_ready(function ready() {\n var prefix = self.prefix_name() + '_';\n var names = storage.get(prefix + 'interpreters');\n if (names) {\n $.each(JSON.parse(names), function(_, name) {\n storage.remove(name + '_commands');\n storage.remove(name + '_token');\n storage.remove(name + '_login');\n });\n }\n command_line.purge();\n storage.remove(prefix + 'interpreters');\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: Remove all events and DOM nodes left by terminal, it will\n // :: not purge the terminal so you will have the same state\n // :: when you refresh the browser\n // -------------------------------------------------------------\n destroy: function() {\n when_ready(function ready() {\n command_line.destroy().remove();\n self.resizer('unbind');\n font_resizer.resizer('unbind').remove();\n $(document).unbind('.terminal_' + self.id());\n $(window).unbind('.terminal_' + self.id());\n self.unbind('click wheel mousewheel mousedown mouseup');\n self.removeData('terminal').removeClass('terminal').\n unbind('.terminal');\n if (settings.width) {\n self.css('width', '');\n }\n if (settings.height) {\n self.css('height', '');\n }\n $(window).off('blur', blur_terminal).\n off('focus', focus_terminal);\n self.find('.terminal-fill, .terminal-font').remove();\n self.stopTime();\n terminals.remove(terminal_id);\n if (visibility_observer) {\n if (visibility_observer.unobserve) {\n visibility_observer.unobserve(self[0]);\n } else {\n clearInterval(visibility_observer);\n }\n }\n if (mutation_observer) {\n mutation_observer.disconnect();\n }\n if (!terminals.length()) {\n $(window).off('hashchange');\n }\n output.remove();\n wrapper.remove();\n defunct = true;\n });\n return self;\n },\n // -------------------------------------------------------------\n // :: ref: https://stackoverflow.com/a/18927969/387194\n // -------------------------------------------------------------\n scroll_to: function(elem) {\n var scroll = self.scrollTop() - self.offset().top + $(elem).offset().top;\n self.scrollTop(scroll);\n return self;\n },\n // -------------------------------------------------------------\n scroll_to_bottom: function() {\n var scrollHeight;\n if (self.prop) {\n scrollHeight = self.prop('scrollHeight');\n } else {\n scrollHeight = self.attr('scrollHeight');\n }\n self.scrollTop(scrollHeight);\n return self;\n },\n // -------------------------------------------------------------\n // :: return true if terminal div or body is at the bottom\n // :: is use scrollBottomOffset option as margin for the check\n // -------------------------------------------------------------\n is_bottom: function() {\n if (settings.scrollBottomOffset === -1) {\n return false;\n } else {\n var scroll_height, scroll_top, height;\n scroll_height = self[0].scrollHeight;\n scroll_top = self.scrollTop();\n height = self.outerHeight();\n var limit = scroll_height - settings.scrollBottomOffset;\n return scroll_top + height > limit;\n }\n }\n }, function(name, fun) {\n // wrap all functions and display execptions\n return function() {\n if (defunct) {\n if (!settings.exceptionHandler) {\n throw new $.terminal.Exception(strings().defunctTerminal);\n }\n }\n try {\n return fun.apply(self, [].slice.apply(arguments));\n } catch (e) {\n // exec catch by command (resume call exec)\n if (name !== 'exec' && name !== 'resume') {\n display_exception(e, e.type || 'TERMINAL', true);\n }\n if (!settings.exceptionHandler) {\n throw e;\n }\n }\n };\n }));\n // -----------------------------------------------------------------\n // INIT CODE\n // -----------------------------------------------------------------\n if (self.length === 0) {\n var msg = sprintf(strings().invalidSelector);\n throw new $.terminal.Exception(msg);\n }\n self.data('terminal', self);\n // var names = []; // stack if interpreter names\n var prev_command; // used for name on the terminal if not defined\n var tab_count = 0; // for tab completion\n var output; // .terminal-output jquery object\n var terminal_id = terminals.length();\n var force_awake = false; // flag used to don't pause when user return read() call\n var num_chars; // numer of chars in line\n var num_rows; // number of lines that fit without scrollbar\n var command; // for tab completion\n var logins = new Stack(); // stack of logins\n var command_queue = new DelayQueue();\n var init_queue = new DelayQueue();\n var when_ready = ready(init_queue);\n var cmd_ready = ready(command_queue);\n var in_login = false;// some Methods should not be called when login\n // TODO: Try to use mutex like counter for pause/resume\n var onPause = $.noop;// used to indicate that user call pause onInit\n var old_width, old_height;\n var delayed_commands = []; // used when exec commands while paused\n var settings = $.extend(\n {},\n $.terminal.defaults,\n {\n name: self.selector,\n exit: !!(options && options.login || !options)\n },\n options || {}\n );\n if (typeof settings.width === 'number') {\n self.width(settings.width);\n }\n if (typeof settings.height === 'number') {\n self.height(settings.height);\n }\n var char_size = get_char_size(self);\n // so it's the same as in TypeScript definition for options\n delete settings.formatters;\n // used to throw error when calling methods on destroyed terminal\n var defunct = false;\n var lines = [];\n var storage = new StorageHelper(settings.memory);\n var enabled = settings.enabled;\n var frozen = false;\n var paused = false;\n var autologin = true; // set to false if onBeforeLogin return false\n var interpreters;\n var command_line;\n var old_enabled;\n var visibility_observer;\n var mutation_observer;\n // backward compatibility\n if (settings.ignoreSystemDescribe === true) {\n settings.describe = false;\n }\n // register ajaxSend for cancel requests on CTRL+D\n $(document).bind('ajaxSend.terminal_' + self.id(), function(e, xhr) {\n requests.push(xhr);\n });\n var wrapper = $('').appendTo(self);\n var font_resizer = $('
').appendTo(self);\n var fill = $('
').appendTo(self);\n output = $('
').addClass('terminal-output').attr('role', 'log')\n .appendTo(wrapper);\n self.addClass('terminal');\n // before login event\n if (settings.login && fire_event('onBeforeLogin') === false) {\n autologin = false;\n }\n // create json-rpc authentication function\n var base_interpreter;\n if (typeof init_interpreter === 'string') {\n base_interpreter = init_interpreter;\n } else if (is_array(init_interpreter)) {\n // first JSON-RPC\n for (var i = 0, len = init_interpreter.length; i < len; ++i) {\n if (typeof init_interpreter[i] === 'string') {\n base_interpreter = init_interpreter[i];\n break;\n }\n }\n }\n var global_login_fn;\n if (is_function(settings.login)) {\n global_login_fn = settings.login;\n } else if (base_interpreter &&\n (typeof settings.login === 'string' || settings.login === true)) {\n global_login_fn = make_json_rpc_login(base_interpreter, settings.login);\n }\n terminals.append(self);\n function focus_terminal() {\n if (old_enabled) {\n self.focus();\n }\n }\n function blur_terminal() {\n old_enabled = enabled;\n self.disable().find('.cmd textarea').trigger('blur', [true]);\n }\n function context_callback_proxy(fn, type) {\n if (fn.proxy) {\n return fn;\n }\n var wrapper = function(callback) {\n var ret = fn.call(self, callback, self);\n if (ret && is_function(ret.then)) {\n ret.then(function(string) {\n if (typeof string === type) {\n callback(string);\n }\n });\n }\n };\n wrapper.proxy = true;\n return wrapper;\n }\n // paste event is not testable in node\n // istanbul ignore next\n function paste_event(e) {\n e = e.originalEvent;\n // we don't care about browser that don't support clipboard data\n // those browser simple will not have this feature normal paste\n // is cross-browser and it's handled by cmd plugin\n function is_type(item, type) {\n return item.type.indexOf(type) !== -1;\n }\n function echo_image(image) {\n self.echo('
![](\"')
', {raw: true});\n }\n function data_uri(blob) {\n var URL = window.URL || window.webkitURL;\n return URL.createObjectURL(blob);\n }\n function echo(object, ignoreEvents) {\n if (!ignoreEvents && is_function(settings.onPaste)) {\n var event = {\n target: self\n };\n if (typeof object === 'string') {\n event['text'] = object;\n } else if (object instanceof Blob) {\n event['image'] = data_uri(object);\n }\n var ret = fire_event('onPaste', [event]);\n if (ret) {\n if (is_function(ret.then)) {\n return ret.then(function(ret) {\n echo(ret, true);\n });\n } else {\n echo(ret, true);\n }\n } else {\n echo(event.image || event.text, true);\n }\n } else if (object instanceof Blob) {\n echo_image(data_uri(object));\n } else if (typeof object === 'string') {\n if (object.match(/^(data:|blob:)/)) {\n echo_image(object);\n } else {\n self.insert(object);\n }\n }\n }\n if (e.clipboardData) {\n if (self.enabled()) {\n var items = e.clipboardData.items;\n if (items) {\n for (var i = 0; i < items.length; i++) {\n if (is_type(items[i], 'image') && settings.pasteImage) {\n var blob = items[i].getAsFile();\n echo(blob);\n } else if (is_type(items[i], 'text/plain')) {\n items[i].getAsString(echo);\n }\n }\n } else if (e.clipboardData.getData) {\n var text = e.clipboardData.getData('text/plain');\n echo(text);\n }\n return false;\n }\n }\n }\n $(document).on('paste.terminal_' + self.id(), paste_event);\n var new_keymap = $.extend(\n {},\n keymap,\n $.omap(settings.keymap || {}, function(key, fn) {\n if (!keymap[key]) {\n return fn.bind(self);\n }\n return function(e, original) {\n // new keymap function will get default as 2nd argument\n return fn.call(self, e, function() {\n return keymap[key](e, original);\n });\n };\n })\n );\n make_interpreter(init_interpreter, settings.login, function(interpreter) {\n if (settings.completion && typeof settings.completion !== 'boolean' ||\n !settings.completion) {\n // overwrite interpreter completion by global setting #224\n // we use string to indicate that it need to be taken from settings\n // so we are able to change it using option API method\n interpreter.completion = 'settings';\n }\n var prompt = settings.prompt;\n if (is_function(prompt)) {\n prompt = context_callback_proxy(prompt, 'string');\n }\n interpreters = new Stack($.extend({}, settings.extra, {\n name: settings.name,\n prompt: prompt,\n keypress: settings.keypress,\n keydown: settings.keydown,\n resize: settings.onResize,\n greetings: settings.greetings,\n mousewheel: settings.mousewheel,\n history: settings.history,\n keymap: new_keymap\n }, interpreter));\n // CREATE COMMAND LINE\n command_line = $('
').appendTo(wrapper).cmd({\n tabindex: settings.tabindex,\n mobileIngoreAutoSpace: settings.mobileIngoreAutoSpace,\n prompt: global_login_fn ? false : prompt,\n history: settings.memory ? 'memory' : settings.history,\n historyFilter: settings.historyFilter,\n historySize: settings.historySize,\n caseSensitiveSearch: settings.caseSensitiveSearch,\n onPaste: settings.onPaste,\n width: '100%',\n enabled: false,\n char_width: char_size.width,\n keydown: key_down,\n keymap: new_keymap,\n clickTimeout: settings.clickTimeout,\n holdTimeout: settings.holdTimeout,\n holdRepeatTimeout: settings.holdRepeatTimeout,\n repeatTimeoutKeys: settings.repeatTimeoutKeys,\n keypress: key_press,\n tabs: settings.tabs,\n onPositionChange: function() {\n var args = [].slice.call(arguments);\n make_cursor_visible();\n fire_event('onPositionChange', args);\n },\n onCommandChange: function(command) {\n // resize is not triggered when insert called just after init\n // and scrollbar appear\n if (old_width !== fill.width()) {\n // resizer handler will update old_width\n self.resizer();\n }\n fire_event('onCommandChange', [command]);\n make_cursor_visible();\n },\n commands: commands\n });\n function disable(e) {\n e = e.originalEvent;\n if (e) {\n // e.terget is body when click outside of context menu to close it\n // even if you click on terminal\n var node = document.elementFromPoint(e.clientX, e.clientY);\n if (!$(node).closest('.terminal').length && self.enabled()) {\n // we only need to disable when click outside of terminal\n // click on other terminal is handled by focus event\n self.disable();\n }\n }\n }\n self.oneTime(100, function() {\n $(document).bind('click.terminal_' + self.id(), disable).\n bind('contextmenu.terminal_' + self.id(), disable);\n });\n var $win = $(window);\n // cordova application, if keyboard was open and we resume, it will be\n // closed so we need to disable terminal so you can enable it with tap\n document.addEventListener(\"resume\", function() {\n self.disable();\n });\n // istanbul ignore next\n if (is_mobile) {\n self.click(function() {\n if (!frozen) {\n if (!self.enabled()) {\n self.focus();\n command_line.enable();\n } else {\n self.disable();\n }\n }\n });\n } else {\n // work weird on mobile\n $win.on('focus.terminal_' + self.id(), focus_terminal).\n on('blur.terminal_' + self.id(), blur_terminal);\n // detect mouse drag\n (function() {\n var count = 0;\n var $target;\n var name = 'click_' + self.id();\n var textarea = self.find('.cmd textarea');\n function click() {\n if ($target.is('.terminal') ||\n $target.is('.terminal-wrapper')) {\n var len = self.get_command().length;\n self.set_position(len);\n } else if ($target.closest('.cmd-prompt').length) {\n self.set_position(0);\n }\n if (!textarea.is(':focus')) {\n textarea.focus();\n }\n reset();\n }\n function reset() {\n count = 0;\n $target = null;\n }\n var ignore_elements = '.terminal-output textarea,' +\n '.terminal-output input';\n self.mousedown(function(e) {\n if (!scrollbar_event(e, fill)) {\n $target = $(e.target);\n }\n }).mouseup(function() {\n if ($target && $target.closest(ignore_elements).length) {\n if (enabled) {\n self.disable();\n }\n } else if (get_selected_html() === '' && $target) {\n if (++count === 1) {\n if (!frozen) {\n if (!enabled) {\n self.focus();\n } else {\n var timeout = settings.clickTimeout;\n self.oneTime(timeout, name, click);\n return;\n }\n }\n } else {\n self.stopTime(name);\n }\n }\n reset();\n }).dblclick(function() {\n reset();\n self.stopTime(name);\n });\n })();\n (function() {\n var clip = self.find('.cmd textarea');\n function is_context_event(e) {\n return e.type === 'mousedown' && e.buttons === 2 ||\n e.type === 'contextmenu';\n }\n self.on('contextmenu.terminal mousedown.terminal', function(e) {\n if (get_selected_html() === '' && is_context_event(e)) {\n if (!$(e.target).is('img,value,audio,object,canvas,a')) {\n if (!self.enabled()) {\n self.enable();\n }\n var offset = command_line.offset();\n wrapper.css('overflow', 'hidden');\n clip.css({\n left: e.pageX - offset.left - 20,\n top: e.pageY - offset.top - 20,\n width: '5em',\n height: '4em'\n });\n if (!clip.is(':focus')) {\n clip.focus();\n }\n self.stopTime('textarea');\n self.oneTime(100, 'textarea', function() {\n var props = {\n left: '',\n top: '',\n width: '',\n height: ''\n };\n if (!is_css_variables_supported) {\n var in_line = self.find('.cmd .cmd-cursor-line')\n .prevUntil('.cmd-prompt').length;\n props.top = in_line * 14 + 'px';\n }\n clip.css(props);\n wrapper.css('overflow', '');\n });\n self.stopTime('selection');\n self.everyTime(20, 'selection', function() {\n if (clip[0].selection !== clip[0].value) {\n if (get_textarea_selection(clip[0])) {\n clear_textarea_selection(clip[0]);\n select(\n self.find('.terminal-output')[0],\n self.find('.cmd div:last-of-type')[0]\n );\n self.stopTime('selection');\n }\n }\n });\n }\n }\n });\n })();\n }\n self.on('click', 'a', function(e) {\n var $this = $(this);\n if ($this.closest('.terminal-exception').length) {\n var href = $this.attr('href');\n if (href.match(/:[0-9]+$/)) { // display line if specified\n e.preventDefault();\n print_line(href);\n }\n }\n // refocus because links have tabindex in case where user want\n // tab change urls, we can ignore this function on click\n if (enabled) {\n self.find('.cmd textarea').focus();\n }\n });\n function calculate_char_size() {\n var width = char_size.width;\n char_size = get_char_size(self);\n if (width !== char_size.width) {\n command_line.option('char_width', char_size.width).refresh();\n }\n }\n resize();\n function resize() {\n if (self.is(':visible')) {\n var width = fill.width();\n var height = fill.height();\n // prevent too many calculations in IE\n if (old_height !== height || old_width !== width) {\n self.resize();\n }\n old_height = height;\n old_width = width;\n }\n }\n function create_resizers() {\n var options = {\n prefix: 'terminal-'\n };\n self.resizer('unbind').resizer(resize, options);\n font_resizer.resizer('unbind').resizer(function() {\n calculate_char_size();\n self.resize();\n }, options);\n }\n if (self.is(':visible')) {\n create_resizers();\n }\n function observe_visibility() {\n if (visibility_observer) {\n if (visibility_observer.unobserve) {\n visibility_observer.unobserve(self[0]);\n } else {\n clearInterval(visibility_observer);\n }\n }\n var was_enabled = self.enabled();\n var visible = self.is(':visible');\n if (was_enabled && !visible) {\n self.disable();\n }\n if (visible) {\n create_resizers();\n } else {\n // hide terminal content until it's resized (and num chars calculated)\n wrapper.css('visibility', 'hidden');\n }\n function visibility_checker() {\n if (self.is(':visible') && !visible) {\n visible = true;\n create_resizers();\n calculate_char_size();\n resize();\n if (was_enabled) {\n self.enable();\n }\n wrapper.css('visibility', '');\n } else if (visible && !self.is(':visible')) {\n visible = false;\n was_enabled = $.terminal.active() === self && self.enabled();\n self.disable();\n wrapper.css('visibility', 'hidden');\n }\n }\n if (window.IntersectionObserver && self.css('position') !== 'fixed') {\n visibility_observer = new IntersectionObserver(visibility_checker, {\n root: null\n });\n visibility_observer.observe(self[0]);\n } else {\n visibility_observer = setInterval(visibility_checker, 100);\n }\n }\n var in_dom = !!self.closest('body').length;\n var MutationObsrv = window.MutationObserver || window.WebKitMutationObserver;\n if (MutationObsrv) {\n mutation_observer = new MutationObsrv(function() {\n if (self.closest('body').length) {\n if (!in_dom) {\n self.scroll_to_bottom();\n if (window.IntersectionObserver) {\n observe_visibility();\n }\n resize();\n }\n in_dom = true;\n } else if (in_dom) {\n in_dom = false;\n }\n });\n mutation_observer.observe(document.body, {childList: true});\n }\n if (in_dom) {\n // check if element is in the DOM if not running IntersectionObserver\n // don't make sense\n observe_visibility();\n }\n command_queue.resolve();\n // touch devices need touch event to get virtual keyboard\n if (enabled && self.is(':visible') && !is_mobile) {\n self.focus(undefined, true);\n } else {\n self.disable();\n }\n // -------------------------------------------------------------\n // Run Login\n if (is_function(global_login_fn)) {\n self.login(global_login_fn, true, initialize);\n } else {\n initialize();\n }\n // -------------------------------------------------------------\n // :: helper\n function exec_spec(spec) {\n var terminal = terminals.get()[spec[0]];\n // execute if belong to this terminal\n if (terminal && terminal_id === terminal.id()) {\n if (!spec[2]) {\n defer.resolve();\n return defer.promise();\n } else if (paused) {\n var defer = $.Deferred();\n resume_callbacks.push(function() {\n return terminal.exec(spec[2]).done(function() {\n terminal.save_state(spec[2], true, spec[1]);\n defer.resolve();\n });\n });\n return defer.promise();\n } else {\n return terminal.exec(spec[2]).done(function() {\n terminal.save_state(spec[2], true, spec[1]);\n });\n }\n }\n }\n // exec from hash called in each terminal instance\n if (settings.execHash) {\n if (location.hash) {\n // wait until login is initialized\n setTimeout(function() {\n try {\n var hash = location.hash.replace(/^#/, '');\n // yes no var - local inside terminal\n hash_commands = JSON.parse(decodeURIComponent(hash));\n var i = 0;\n (function recur() {\n var spec = hash_commands[i++];\n if (spec) {\n exec_spec(spec).done(recur);\n } else {\n change_hash = true;\n }\n })();// */\n } catch (e) {\n // invalid json - ignore\n }\n });\n } else {\n change_hash = true;\n }\n } else {\n change_hash = true; // if enabled later\n }\n // change_hash = true; // exec can now change hash\n // -------------------------------------------------------------\n /* istanbul ignore next */\n (function() {\n var shift = false;\n $(document).bind('keydown.terminal_' + self.id(), function(e) {\n if (e.shiftKey) {\n shift = true;\n }\n }).bind('keyup.terminal_' + self.id(), function(e) {\n // in Google Chromium/Linux shiftKey is false\n if (e.shiftKey || e.which === 16) {\n shift = false;\n }\n });\n // this could work without calling scroll on wheel event but we\n // need it for cases where you have mouse wheel work differently\n // like with less command that scroll text\n function mousewheel(event, delta) {\n if (!shift) {\n var interpreter = interpreters.top();\n var ret;\n if (is_function(interpreter.mousewheel)) {\n ret = interpreter.mousewheel(event, delta, self);\n } else if (is_function(settings.mousewheel)) {\n ret = settings.mousewheel(event, delta, self);\n }\n if (ret === true) {\n return;\n }\n if ((have_scrollbar() || ret === false) && !event.ctrlKey) {\n event.stopPropagation();\n event.preventDefault();\n }\n if (ret === false) {\n return false;\n }\n if (delta > 0) {\n self.scroll(-40);\n } else {\n self.scroll(40);\n }\n }\n }\n if ($.event.special.mousewheel) {\n // we keep mousewheel plugin just in case\n self.on('mousewheel', mousewheel);\n } else {\n // detection take from:\n // https://developer.mozilla.org/en-US/docs/Web/Events/wheel\n var event;\n var div = document.createElement(\"div\");\n if (\"onwheel\" in div) {\n event = \"wheel\"; // Modern browsers support \"wheel\"\n } else if (document.onmousewheel !== undefined) {\n // Webkit and IE support at least \"mousewheel\"\n event = \"mousewheel\";\n } else {\n // let's assume that remaining browsers are older Firefox\n event = \"DOMMouseScroll\";\n }\n div = null;\n self.on(event, function(e) {\n var delta;\n if (event === 'mousewheel') {\n delta = - 1 / 40 * e.originalEvent.wheelDelta;\n } else {\n delta = e.originalEvent.deltaY || e.originalEvent.detail;\n }\n mousewheel(e, -delta);\n });\n }\n })();\n }); // make_interpreter\n return self;\n }; // terminal plugin\n});\n"]}
\ No newline at end of file