diff --git a/CyberCP/settings.py b/CyberCP/settings.py index b964f3b97..a3a37f83d 100644 --- a/CyberCP/settings.py +++ b/CyberCP/settings.py @@ -52,12 +52,12 @@ INSTALLED_APPS = [ 'databases', 'mailServer', 'serverLogs', - 'filemanager_app', 'firewall', 'backup', 'managePHP', 'manageSSL', 'api', + 'filemanager', ] MIDDLEWARE = [ diff --git a/CyberCP/settings.pyc b/CyberCP/settings.pyc index 155276b45..c8136530c 100644 Binary files a/CyberCP/settings.pyc and b/CyberCP/settings.pyc differ diff --git a/CyberCP/urls.py b/CyberCP/urls.py index c5bdb80c2..d44da2e97 100644 --- a/CyberCP/urls.py +++ b/CyberCP/urls.py @@ -35,4 +35,5 @@ urlpatterns = [ url(r'^managephp/',include('managePHP.urls')), url(r'^manageSSL/',include('manageSSL.urls')), url(r'^api/',include('api.urls')), + url(r'^filemanager/',include('filemanager.urls')), ] diff --git a/api/urls.py b/api/urls.py index ddee0c3e2..6be18a12f 100644 --- a/api/urls.py +++ b/api/urls.py @@ -23,4 +23,7 @@ urlpatterns = [ url(r'^cyberPanelVersion', views.cyberPanelVersion, name='cyberPanelVersion'), url(r'^putSSHkey', views.putSSHkey, name='putSSHkey'), + + url(r'^changeAdminPassword', views.changeAdminPassword, name='changeAdminPassword'), + ] \ No newline at end of file diff --git a/api/views.py b/api/views.py index 132da5e02..d5898b7c7 100644 --- a/api/views.py +++ b/api/views.py @@ -1,8 +1,7 @@ # -*- coding: utf-8 -*- from __future__ import unicode_literals -from websiteFunctions.models import Websites import json -from django.shortcuts import render,redirect +from django.shortcuts import redirect from django.http import HttpResponse from loginSystem.models import Administrator from plogical.virtualHostUtilities import virtualHostUtilities @@ -14,7 +13,6 @@ from plogical.mysqlUtilities import mysqlUtilities from databases.models import Databases from baseTemplate.views import renderBase from random import randint -import plogical.remoteBackup as rBackup from websiteFunctions.models import Websites,ChildDomains import os import signal @@ -338,23 +336,15 @@ def fetchSSHkey(request): admin = Administrator.objects.get(userName=username) if hashPassword.check_password(admin.password, password): - keyPath = "/home/cyberpanel/.ssh" - - if not os.path.exists(keyPath): - os.makedirs(keyPath) - command = "ssh-keygen -f " + keyPath + "/cyberpanel -t rsa -N ''" - cmd = shlex.split(command) - res = subprocess.call(cmd) - else: - if not os.path.exists(keyPath+"/cyberpanel"): - command = "ssh-keygen -f " + keyPath + "/cyberpanel -t rsa -N ''" - cmd = shlex.split(command) - res = subprocess.call(cmd) + keyPath = "/root/.ssh" pubKey = keyPath + "/cyberpanel.pub" - f = open(pubKey) - data = f.read() + execPath = "sudo cat " + pubKey + + + + data = subprocess.check_output(shlex.split(execPath)) data_ret = {'pubKeyStatus': 1, 'error_message': "None", "pubKey":data} @@ -382,23 +372,33 @@ def remoteTransfer(request): accountsToTransfer = data['accountsToTransfer'] admin = Administrator.objects.get(userName=username) + if hashPassword.check_password(admin.password, password): dir = str(randint(1000, 9999)) + ## - transferRequest = rBackup.remoteBackup.remoteTransfer(ipAddress, dir,accountsToTransfer) + accountsToTransfer = ','.join(accountsToTransfer) - if transferRequest[0] == 1: - return HttpResponse(json.dumps({"transferStatus": 1, "dir": dir})) - else: - data_ret = {'transferStatus': 0, 'error_message': transferRequest[1]} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) + execPath = "sudo python " + virtualHostUtilities.cyberPanel + "/plogical/remoteTransferUtilities.py" + + execPath = execPath + " remoteTransfer --ipAddress " + ipAddress + " --dir " + dir + " --accountsToTransfer " + accountsToTransfer + + + + subprocess.Popen(shlex.split(execPath)) + + return HttpResponse(json.dumps({"transferStatus": 1, "dir": dir})) + + ## else: data_ret = {'transferStatus': 0, 'error_message': "Invalid Credentials"} json_data = json.dumps(data_ret) return HttpResponse(json_data) + + + except BaseException, msg: data = {'transferStatus': 0,'error_message': str(msg)} json_data = json.dumps(data) @@ -457,20 +457,24 @@ def FetchRemoteTransferStatus(request): password = data['password'] dir = "/home/backup/transfer-"+str(data['dir'])+"/backup_log" - statusFile = open(dir,'r') - status = statusFile.read() - statusFile.close() + try: + command = "sudo cat "+ dir + status = subprocess.check_output(shlex.split(command)) - admin = Administrator.objects.get(userName=username) - if hashPassword.check_password(admin.password, password): - - final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "status": status}) + admin = Administrator.objects.get(userName=username) + if hashPassword.check_password(admin.password, password): + final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "status": status}) + return HttpResponse(final_json) + else: + data_ret = {'fetchStatus': 0, 'error_message': "Invalid Credentials"} + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + except: + final_json = json.dumps({'fetchStatus': 1, 'error_message': "None", "status": "Just started.."}) return HttpResponse(final_json) - else: - data_ret = {'fetchStatus': 0, 'error_message': "Invalid Credentials"} - json_data = json.dumps(data_ret) - return HttpResponse(json_data) + + except BaseException, msg: data = {'fetchStatus': 0,'error_message': str(msg)} @@ -624,4 +628,38 @@ def putSSHkey(request): json_data = json.dumps(data_ret) return HttpResponse(json_data) +def changeAdminPassword(request): + try: + + data = json.loads(request.body) + + adminPass = data['password'] + randomFile = data['randomFile'] + + if os.path.exists(randomFile): + os.remove(randomFile) + admin = Administrator.objects.get(userName="admin") + admin.password = hashPassword.hash_password(adminPass) + admin.save() + data_ret = {"changed": 1, + 'error_message': "None"} + + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + else: + data_ret = {"changed": 0, + 'error_message': "Failed to authorize access to change password!"} + + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + + + + except BaseException, msg: + data_ret = {"changed": 0, + 'error_message': "Failed to authorize access to change password!"} + + json_data = json.dumps(data_ret) + return HttpResponse(json_data) + diff --git a/backup/static/backup/backup.js b/backup/static/backup/backup.js index f0b47e5c5..10cd6dcd9 100644 --- a/backup/static/backup/backup.js +++ b/backup/static/backup/backup.js @@ -6,9 +6,6 @@ app.controller('backupWebsiteControl', function($scope,$http,$timeout) { - // variable to stop updating running status data - - var runningStatus = 1; $scope.destination = true; $scope.backupButton = true; $scope.backupLoading = true; @@ -43,6 +40,7 @@ app.controller('backupWebsiteControl', function($scope,$http,$timeout) { getBackupStatus(); populateCurrentRecords(); $scope.destination = false; + $scope.runningBackup = true; }; @@ -75,24 +73,9 @@ app.controller('backupWebsiteControl', function($scope,$http,$timeout) { if(response.data.backupStatus == 1){ - if(response.data.status != 0){ + if(response.data.abort === 1){ - if (runningStatus == 1){ - $scope.destination = true; - $scope.backupButton = true; - $scope.runningBackup = false; - $scope.cancelButton = false; - - $scope.fileName = response.data.fileName; - $scope.status = response.data.status; - $timeout(getBackupStatus, 2000); - console.log(response.data.fileName); - } - } - else if(response.data.status === "Aborted, please check CyberPanel main log file." || response.data.status === "Aborted manually."){ - runningStatus = 0; $timeout.cancel(); - populateCurrentRecords(); $scope.backupLoadingBottom = true; $scope.destination = false; $scope.runningBackup = false; @@ -101,18 +84,20 @@ app.controller('backupWebsiteControl', function($scope,$http,$timeout) { $scope.backupLoading = true; $scope.fileName = response.data.fileName; $scope.status = response.data.status; - + populateCurrentRecords(); + return; } else{ - $scope.destination = false; - $scope.runningBackup = true; - $scope.cancelButton = true; - $scope.backupLoading = true; - $timeout.cancel(); - populateCurrentRecords(); + $scope.destination = true; + $scope.backupButton = true; + $scope.runningBackup = false; + $scope.cancelButton = false; + + $scope.fileName = response.data.fileName; + $scope.status = response.data.status; + $timeout(getBackupStatus, 2000); + } - - } else{ $timeout.cancel(); @@ -211,21 +196,11 @@ app.controller('backupWebsiteControl', function($scope,$http,$timeout) { if(response.data.metaStatus == 1){ - - console.log("meta generated") getBackupStatus(); - - - } - else{ - } } - function cantLoadInitialDatas(response) { - - - } + function cantLoadInitialDatas(response) {} }; @@ -295,6 +270,10 @@ app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { $scope.backupError = true; $scope.siteExists = true; + // check to start time of status function + + var check = 1; + $scope.fetchDetails = function () { $scope.restoreLoading = false; @@ -304,8 +283,6 @@ app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { function getRestoreStatus(){ - $scope.restoreButton = true; - var backupFile = $scope.backupFile; url = "/backup/restoreStatus"; @@ -328,39 +305,10 @@ app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { function ListInitialDatas(response) { - if(response.data.restoreStatus == 1){ + if(response.data.restoreStatus === 1){ - $scope.restoreLoading = true; - - - if(response.data.status=="Done"){ - $scope.restoreButton=false; - $scope.status = response.data.status; - $scope.restoreFinished = true; - $scope.running = "Completed"; - $scope.restoreLoading = true; - $timeout.cancel(); - } - else if(response.data.status=="Website already exists"){ - $scope.siteExists = false; - $scope.restoreButton = true; - $scope.runningRestore = true; - $scope.restoreLoading = true; - $scope.running = "Running"; - $scope.fileName = $scope.backupFile; - $timeout.cancel(); - - } - else if(response.data.status==0){ - $scope.running = "Running"; - $scope.fileName = $scope.backupFile; - $scope.restoreButton=false; - $scope.restoreLoading = true; - $timeout.cancel(); - } - else if(response.data.status == "Not able to create Account and databases, aborting."){ - - $scope.running = "Aborted"; + if(response.data.abort === 1){ + $scope.running = response.data.running; $scope.fileName = $scope.backupFile; $scope.restoreLoading = true; $scope.status = response.data.status; @@ -368,22 +316,17 @@ app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { $scope.restoreButton=false; $scope.restoreFinished = true; $timeout.cancel(); - + return; } - else if(response.data.status != 0){ - - $scope.running = "Running"; + else{ + $scope.running = response.data.running; $scope.fileName = $scope.backupFile; $scope.restoreLoading = false; $scope.status = response.data.status; $scope.runningRestore = false; + $scope.restoreButton = true; $timeout(getRestoreStatus, 2000); - } - - } - else{ - } } @@ -398,6 +341,7 @@ app.controller('restoreWebsiteControl', function($scope,$http,$timeout) { $scope.restoreBackup = function(){ var backupFile = $scope.backupFile; + $scope.running = "Lets start.." url = "/backup/submitRestore"; @@ -1070,6 +1014,7 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { }; $scope.addRemoveWebsite = function (website,websiteStatus) { + if(websiteStatus==true) { var check = 1; @@ -1432,11 +1377,11 @@ app.controller('remoteBackupControl', function($scope, $http, $timeout) { if(response.data.complete == 0){ $scope.backupStatus = false; - $scope.requestData = response.data.status; + $scope.restoreData = response.data.status; $timeout(localRestoreStatus, 2000); } else{ - $scope.requestData = response.data.status; + $scope.restoreData = response.data.status; $timeout.cancel(); $scope.backupLoading = true; $scope.startTransferbtn = false; diff --git a/backup/templates/backup/backup.html b/backup/templates/backup/backup.html index 77fed0d35..9393807ba 100644 --- a/backup/templates/backup/backup.html +++ b/backup/templates/backup/backup.html @@ -1,3 +1,4 @@ + {% extends "baseTemplate/index.html" %} {% load i18n %} {% block title %}{% trans "Back up Website" %}{% endblock %} @@ -113,7 +114,7 @@


| + | {% trans "Condition" %} | {% trans "File Name" %} | {% trans "Status" %} ![]() |
|---|
| Setting | Value |
|---|---|
| ", desc[option], " | "); + table.push(""); + renderOption(table, option, optionValues[option], editor.getOption(option)); + table.push(" |
\n\ + ${1}\n\ +\n\ +snippet body\n\ + \n\ + ${1}\n\ + \n\ +snippet br\n\ +
${1}\n\
+snippet col\n\
+ ${1}
\n\ +snippet param\n\ + ${3}\n\ +snippet pre\n\ +\n\
+ ${1}\n\
+ \n\
+snippet progress\n\
+ \n\
+snippet q\n\
+ ${1}\n\ +snippet rp\n\ + \n\ +snippet rt\n\ + \n\ +snippet ruby\n\ + \n\ + \n\ + \n\ +snippet s\n\ +
'; var_dump(${1}); echo '';\n\
+# pre_dump(); die();\n\
+snippet pdd\n\
+ echo ''; var_dump(${1}); echo ''; die(${2:});\n\
+snippet vd\n\
+ var_dump(${1});\n\
+snippet vdd\n\
+ var_dump(${1}); die(${2:});\n\
+snippet http_redirect\n\
+ header (\"HTTP/1.1 301 Moved Permanently\"); \n\
+ header (\"Location: \".URL); \n\
+ exit();\n\
+# Getters & Setters\n\
+snippet gs\n\
+ /**\n\
+ * Gets the value of ${1:foo}\n\
+ *\n\
+ * @return ${2:$1}\n\
+ */\n\
+ public function get${3:$2}()\n\
+ {\n\
+ return $this->${4:$1};\n\
+ }\n\
+\n\
+ /**\n\
+ * Sets the value of $1\n\
+ *\n\
+ * @param $2 $$1 ${5:description}\n\
+ *\n\
+ * @return ${6:$FILENAME}\n\
+ */\n\
+ public function set$3(${7:$2 }$$1)\n\
+ {\n\
+ $this->$4 = $$1;\n\
+ return $this;\n\
+ }${8}\n\
+# anotation, get, and set, useful for doctrine\n\
+snippet ags\n\
+ /**\n\
+ * ${1:description}\n\
+ * \n\
+ * @${7}\n\
+ */\n\
+ ${2:protected} $${3:foo};\n\
+\n\
+ public function get${4:$3}()\n\
+ {\n\
+ return $this->$3;\n\
+ }\n\
+\n\
+ public function set$4(${5:$4 }$${6:$3})\n\
+ {\n\
+ $this->$3 = $$6;\n\
+ return $this;\n\
+ }\n\
+snippet rett\n\
+ return true;\n\
+snippet retf\n\
+ return false;\n\
+";
+exports.scope = "php";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/pig.js b/filemanager/static/filemanager/js/ace/snippets/pig.js
new file mode 100755
index 000000000..479a03bc9
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/pig.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/pig",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "pig";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/plain_text.js b/filemanager/static/filemanager/js/ace/snippets/plain_text.js
new file mode 100755
index 000000000..24223a662
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/plain_text.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/plain_text",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "plain_text";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/powershell.js b/filemanager/static/filemanager/js/ace/snippets/powershell.js
new file mode 100755
index 000000000..a8e7310a1
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/powershell.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/powershell",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "powershell";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/praat.js b/filemanager/static/filemanager/js/ace/snippets/praat.js
new file mode 100755
index 000000000..dcf682677
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/praat.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/praat",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "praat";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/prolog.js b/filemanager/static/filemanager/js/ace/snippets/prolog.js
new file mode 100755
index 000000000..2d63cb83a
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/prolog.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/prolog",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "prolog";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/properties.js b/filemanager/static/filemanager/js/ace/snippets/properties.js
new file mode 100755
index 000000000..44c1ada78
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/properties.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/properties",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "properties";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/protobuf.js b/filemanager/static/filemanager/js/ace/snippets/protobuf.js
new file mode 100755
index 000000000..d00d57afd
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/protobuf.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/protobuf",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "";
+exports.scope = "protobuf";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/python.js b/filemanager/static/filemanager/js/ace/snippets/python.js
new file mode 100755
index 000000000..182b34067
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/python.js
@@ -0,0 +1,165 @@
+ace.define("ace/snippets/python",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "snippet #!\n\
+ #!/usr/bin/env python\n\
+snippet imp\n\
+ import ${1:module}\n\
+snippet from\n\
+ from ${1:package} import ${2:module}\n\
+# Module Docstring\n\
+snippet docs\n\
+ '''\n\
+ File: ${1:FILENAME:file_name}\n\
+ Author: ${2:author}\n\
+ Description: ${3}\n\
+ '''\n\
+snippet wh\n\
+ while ${1:condition}:\n\
+ ${2:# TODO: write code...}\n\
+# dowh - does the same as do...while in other languages\n\
+snippet dowh\n\
+ while True:\n\
+ ${1:# TODO: write code...}\n\
+ if ${2:condition}:\n\
+ break\n\
+snippet with\n\
+ with ${1:expr} as ${2:var}:\n\
+ ${3:# TODO: write code...}\n\
+# New Class\n\
+snippet cl\n\
+ class ${1:ClassName}(${2:object}):\n\
+ \"\"\"${3:docstring for $1}\"\"\"\n\
+ def __init__(self, ${4:arg}):\n\
+ ${5:super($1, self).__init__()}\n\
+ self.$4 = $4\n\
+ ${6}\n\
+# New Function\n\
+snippet def\n\
+ def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\n\
+ \"\"\"${3:docstring for $1}\"\"\"\n\
+ ${4:# TODO: write code...}\n\
+snippet deff\n\
+ def ${1:fname}(${2:`indent('.') ? 'self' : ''`}):\n\
+ ${3:# TODO: write code...}\n\
+# New Method\n\
+snippet defs\n\
+ def ${1:mname}(self, ${2:arg}):\n\
+ ${3:# TODO: write code...}\n\
+# New Property\n\
+snippet property\n\
+ def ${1:foo}():\n\
+ doc = \"${2:The $1 property.}\"\n\
+ def fget(self):\n\
+ ${3:return self._$1}\n\
+ def fset(self, value):\n\
+ ${4:self._$1 = value}\n\
+# Ifs\n\
+snippet if\n\
+ if ${1:condition}:\n\
+ ${2:# TODO: write code...}\n\
+snippet el\n\
+ else:\n\
+ ${1:# TODO: write code...}\n\
+snippet ei\n\
+ elif ${1:condition}:\n\
+ ${2:# TODO: write code...}\n\
+# For\n\
+snippet for\n\
+ for ${1:item} in ${2:items}:\n\
+ ${3:# TODO: write code...}\n\
+# Encodes\n\
+snippet cutf8\n\
+ # -*- coding: utf-8 -*-\n\
+snippet clatin1\n\
+ # -*- coding: latin-1 -*-\n\
+snippet cascii\n\
+ # -*- coding: ascii -*-\n\
+# Lambda\n\
+snippet ld\n\
+ ${1:var} = lambda ${2:vars} : ${3:action}\n\
+snippet .\n\
+ self.\n\
+snippet try Try/Except\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+snippet try Try/Except/Else\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+ else:\n\
+ ${5:# TODO: write code...}\n\
+snippet try Try/Except/Finally\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+ finally:\n\
+ ${5:# TODO: write code...}\n\
+snippet try Try/Except/Else/Finally\n\
+ try:\n\
+ ${1:# TODO: write code...}\n\
+ except ${2:Exception}, ${3:e}:\n\
+ ${4:raise $3}\n\
+ else:\n\
+ ${5:# TODO: write code...}\n\
+ finally:\n\
+ ${6:# TODO: write code...}\n\
+# if __name__ == '__main__':\n\
+snippet ifmain\n\
+ if __name__ == '__main__':\n\
+ ${1:main()}\n\
+# __magic__\n\
+snippet _\n\
+ __${1:init}__${2}\n\
+# python debugger (pdb)\n\
+snippet pdb\n\
+ import pdb; pdb.set_trace()\n\
+# ipython debugger (ipdb)\n\
+snippet ipdb\n\
+ import ipdb; ipdb.set_trace()\n\
+# ipython debugger (pdbbb)\n\
+snippet pdbbb\n\
+ import pdbpp; pdbpp.set_trace()\n\
+snippet pprint\n\
+ import pprint; pprint.pprint(${1})${2}\n\
+snippet \"\n\
+ \"\"\"\n\
+ ${1:doc}\n\
+ \"\"\"\n\
+# test function/method\n\
+snippet test\n\
+ def test_${1:description}(${2:self}):\n\
+ ${3:# TODO: write code...}\n\
+# test case\n\
+snippet testcase\n\
+ class ${1:ExampleCase}(unittest.TestCase):\n\
+ \n\
+ def test_${2:description}(self):\n\
+ ${3:# TODO: write code...}\n\
+snippet fut\n\
+ from __future__ import ${1}\n\
+#getopt\n\
+snippet getopt\n\
+ try:\n\
+ # Short option syntax: \"hv:\"\n\
+ # Long option syntax: \"help\" or \"verbose=\"\n\
+ opts, args = getopt.getopt(sys.argv[1:], \"${1:short_options}\", [${2:long_options}])\n\
+ \n\
+ except getopt.GetoptError, err:\n\
+ # Print debug info\n\
+ print str(err)\n\
+ ${3:error_action}\n\
+\n\
+ for option, argument in opts:\n\
+ if option in (\"-h\", \"--help\"):\n\
+ ${4}\n\
+ elif option in (\"-v\", \"--verbose\"):\n\
+ verbose = argument\n\
+";
+exports.scope = "python";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/r.js b/filemanager/static/filemanager/js/ace/snippets/r.js
new file mode 100755
index 000000000..24c02a0c6
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/r.js
@@ -0,0 +1,128 @@
+ace.define("ace/snippets/r",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "snippet #!\n\
+ #!/usr/bin/env Rscript\n\
+\n\
+# includes\n\
+snippet lib\n\
+ library(${1:package})\n\
+snippet req\n\
+ require(${1:package})\n\
+snippet source\n\
+ source('${1:file}')\n\
+\n\
+# conditionals\n\
+snippet if\n\
+ if (${1:condition}) {\n\
+ ${2:code}\n\
+ }\n\
+snippet el\n\
+ else {\n\
+ ${1:code}\n\
+ }\n\
+snippet ei\n\
+ else if (${1:condition}) {\n\
+ ${2:code}\n\
+ }\n\
+\n\
+# functions\n\
+snippet fun\n\
+ ${1:name} = function (${2:variables}) {\n\
+ ${3:code}\n\
+ }\n\
+snippet ret\n\
+ return(${1:code})\n\
+\n\
+# dataframes, lists, etc\n\
+snippet df\n\
+ ${1:name}[${2:rows}, ${3:cols}]\n\
+snippet c\n\
+ c(${1:items})\n\
+snippet li\n\
+ list(${1:items})\n\
+snippet mat\n\
+ matrix(${1:data}, nrow=${2:rows}, ncol=${3:cols})\n\
+\n\
+# apply functions\n\
+snippet apply\n\
+ apply(${1:array}, ${2:margin}, ${3:function})\n\
+snippet lapply\n\
+ lapply(${1:list}, ${2:function})\n\
+snippet sapply\n\
+ sapply(${1:list}, ${2:function})\n\
+snippet vapply\n\
+ vapply(${1:list}, ${2:function}, ${3:type})\n\
+snippet mapply\n\
+ mapply(${1:function}, ${2:...})\n\
+snippet tapply\n\
+ tapply(${1:vector}, ${2:index}, ${3:function})\n\
+snippet rapply\n\
+ rapply(${1:list}, ${2:function})\n\
+\n\
+# plyr functions\n\
+snippet dd\n\
+ ddply(${1:frame}, ${2:variables}, ${3:function})\n\
+snippet dl\n\
+ dlply(${1:frame}, ${2:variables}, ${3:function})\n\
+snippet da\n\
+ daply(${1:frame}, ${2:variables}, ${3:function})\n\
+snippet d_\n\
+ d_ply(${1:frame}, ${2:variables}, ${3:function})\n\
+\n\
+snippet ad\n\
+ adply(${1:array}, ${2:margin}, ${3:function})\n\
+snippet al\n\
+ alply(${1:array}, ${2:margin}, ${3:function})\n\
+snippet aa\n\
+ aaply(${1:array}, ${2:margin}, ${3:function})\n\
+snippet a_\n\
+ a_ply(${1:array}, ${2:margin}, ${3:function})\n\
+\n\
+snippet ld\n\
+ ldply(${1:list}, ${2:function})\n\
+snippet ll\n\
+ llply(${1:list}, ${2:function})\n\
+snippet la\n\
+ laply(${1:list}, ${2:function})\n\
+snippet l_\n\
+ l_ply(${1:list}, ${2:function})\n\
+\n\
+snippet md\n\
+ mdply(${1:matrix}, ${2:function})\n\
+snippet ml\n\
+ mlply(${1:matrix}, ${2:function})\n\
+snippet ma\n\
+ maply(${1:matrix}, ${2:function})\n\
+snippet m_\n\
+ m_ply(${1:matrix}, ${2:function})\n\
+\n\
+# plot functions\n\
+snippet pl\n\
+ plot(${1:x}, ${2:y})\n\
+snippet ggp\n\
+ ggplot(${1:data}, aes(${2:aesthetics}))\n\
+snippet img\n\
+ ${1:(jpeg,bmp,png,tiff)}(filename=\"${2:filename}\", width=${3}, height=${4}, unit=\"${5}\")\n\
+ ${6:plot}\n\
+ dev.off()\n\
+\n\
+# statistical test functions\n\
+snippet fis\n\
+ fisher.test(${1:x}, ${2:y})\n\
+snippet chi\n\
+ chisq.test(${1:x}, ${2:y})\n\
+snippet tt\n\
+ t.test(${1:x}, ${2:y})\n\
+snippet wil\n\
+ wilcox.test(${1:x}, ${2:y})\n\
+snippet cor\n\
+ cor.test(${1:x}, ${2:y})\n\
+snippet fte\n\
+ var.test(${1:x}, ${2:y})\n\
+snippet kvt \n\
+ kv.test(${1:x}, ${2:y})\n\
+";
+exports.scope = "r";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/razor.js b/filemanager/static/filemanager/js/ace/snippets/razor.js
new file mode 100755
index 000000000..78fdf8c3e
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/razor.js
@@ -0,0 +1,10 @@
+ace.define("ace/snippets/razor",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "snippet if\n\
+(${1} == ${2}) {\n\
+ ${3}\n\
+}";
+exports.scope = "razor";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/rdoc.js b/filemanager/static/filemanager/js/ace/snippets/rdoc.js
new file mode 100755
index 000000000..956de47aa
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/rdoc.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/rdoc",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "rdoc";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/red.js b/filemanager/static/filemanager/js/ace/snippets/red.js
new file mode 100755
index 000000000..efdb3ecfc
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/red.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/red",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = " ";
+exports.scope = "red";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/rhtml.js b/filemanager/static/filemanager/js/ace/snippets/rhtml.js
new file mode 100755
index 000000000..e62ce87f7
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/rhtml.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/rhtml",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "rhtml";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/rst.js b/filemanager/static/filemanager/js/ace/snippets/rst.js
new file mode 100755
index 000000000..db6c960f6
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/rst.js
@@ -0,0 +1,29 @@
+ace.define("ace/snippets/rst",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "# rst\n\
+\n\
+snippet :\n\
+ :${1:field name}: ${2:field body}\n\
+snippet *\n\
+ *${1:Emphasis}*\n\
+snippet **\n\
+ **${1:Strong emphasis}**\n\
+snippet _\n\
+ \\`${1:hyperlink-name}\\`_\n\
+ .. _\\`$1\\`: ${2:link-block}\n\
+snippet =\n\
+ ${1:Title}\n\
+ =====${2:=}\n\
+ ${3}\n\
+snippet -\n\
+ ${1:Title}\n\
+ -----${2:-}\n\
+ ${3}\n\
+snippet cont:\n\
+ .. contents::\n\
+ \n\
+";
+exports.scope = "rst";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/ruby.js b/filemanager/static/filemanager/js/ace/snippets/ruby.js
new file mode 100755
index 000000000..18bc409f4
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/ruby.js
@@ -0,0 +1,935 @@
+ace.define("ace/snippets/ruby",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "########################################\n\
+# Ruby snippets - for Rails, see below #\n\
+########################################\n\
+\n\
+# encoding for Ruby 1.9\n\
+snippet enc\n\
+ # encoding: utf-8\n\
+\n\
+# #!/usr/bin/env ruby\n\
+snippet #!\n\
+ #!/usr/bin/env ruby\n\
+ # encoding: utf-8\n\
+\n\
+# New Block\n\
+snippet =b\n\
+ =begin rdoc\n\
+ ${1}\n\
+ =end\n\
+snippet y\n\
+ :yields: ${1:arguments}\n\
+snippet rb\n\
+ #!/usr/bin/env ruby -wKU\n\
+snippet beg\n\
+ begin\n\
+ ${3}\n\
+ rescue ${1:Exception} => ${2:e}\n\
+ end\n\
+\n\
+snippet req require\n\
+ require \"${1}\"${2}\n\
+snippet #\n\
+ # =>\n\
+snippet end\n\
+ __END__\n\
+snippet case\n\
+ case ${1:object}\n\
+ when ${2:condition}\n\
+ ${3}\n\
+ end\n\
+snippet when\n\
+ when ${1:condition}\n\
+ ${2}\n\
+snippet def\n\
+ def ${1:method_name}\n\
+ ${2}\n\
+ end\n\
+snippet deft\n\
+ def test_${1:case_name}\n\
+ ${2}\n\
+ end\n\
+snippet if\n\
+ if ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet ife\n\
+ if ${1:condition}\n\
+ ${2}\n\
+ else\n\
+ ${3}\n\
+ end\n\
+snippet elsif\n\
+ elsif ${1:condition}\n\
+ ${2}\n\
+snippet unless\n\
+ unless ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet while\n\
+ while ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet for\n\
+ for ${1:e} in ${2:c}\n\
+ ${3}\n\
+ end\n\
+snippet until\n\
+ until ${1:condition}\n\
+ ${2}\n\
+ end\n\
+snippet cla class .. end\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ ${2}\n\
+ end\n\
+snippet cla class .. initialize .. end\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ def initialize(${2:args})\n\
+ ${3}\n\
+ end\n\
+ end\n\
+snippet cla class .. < ParentClass .. initialize .. end\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} < ${2:ParentClass}\n\
+ def initialize(${3:args})\n\
+ ${4}\n\
+ end\n\
+ end\n\
+snippet cla ClassName = Struct .. do .. end\n\
+ ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} = Struct.new(:${2:attr_names}) do\n\
+ def ${3:method_name}\n\
+ ${4}\n\
+ end\n\
+ end\n\
+snippet cla class BlankSlate .. initialize .. end\n\
+ class ${1:BlankSlate}\n\
+ instance_methods.each { |meth| undef_method(meth) unless meth =~ /\\A__/ }\n\
+ end\n\
+snippet cla class << self .. end\n\
+ class << ${1:self}\n\
+ ${2}\n\
+ end\n\
+# class .. < DelegateClass .. initialize .. end\n\
+snippet cla-\n\
+ class ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`} < DelegateClass(${2:ParentClass})\n\
+ def initialize(${3:args})\n\
+ super(${4:del_obj})\n\
+\n\
+ ${5}\n\
+ end\n\
+ end\n\
+snippet mod module .. end\n\
+ module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ ${2}\n\
+ end\n\
+snippet mod module .. module_function .. end\n\
+ module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ module_function\n\
+\n\
+ ${2}\n\
+ end\n\
+snippet mod module .. ClassMethods .. end\n\
+ module ${1:`substitute(Filename(), '\\(_\\|^\\)\\(.\\)', '\\u\\2', 'g')`}\n\
+ module ClassMethods\n\
+ ${2}\n\
+ end\n\
+\n\
+ module InstanceMethods\n\
+\n\
+ end\n\
+\n\
+ def self.included(receiver)\n\
+ receiver.extend ClassMethods\n\
+ receiver.send :include, InstanceMethods\n\
+ end\n\
+ end\n\
+# attr_reader\n\
+snippet r\n\
+ attr_reader :${1:attr_names}\n\
+# attr_writer\n\
+snippet w\n\
+ attr_writer :${1:attr_names}\n\
+# attr_accessor\n\
+snippet rw\n\
+ attr_accessor :${1:attr_names}\n\
+snippet atp\n\
+ attr_protected :${1:attr_names}\n\
+snippet ata\n\
+ attr_accessible :${1:attr_names}\n\
+# include Enumerable\n\
+snippet Enum\n\
+ include Enumerable\n\
+\n\
+ def each(&block)\n\
+ ${1}\n\
+ end\n\
+# include Comparable\n\
+snippet Comp\n\
+ include Comparable\n\
+\n\
+ def <=>(other)\n\
+ ${1}\n\
+ end\n\
+# extend Forwardable\n\
+snippet Forw-\n\
+ extend Forwardable\n\
+# def self\n\
+snippet defs\n\
+ def self.${1:class_method_name}\n\
+ ${2}\n\
+ end\n\
+# def method_missing\n\
+snippet defmm\n\
+ def method_missing(meth, *args, &blk)\n\
+ ${1}\n\
+ end\n\
+snippet defd\n\
+ def_delegator :${1:@del_obj}, :${2:del_meth}, :${3:new_name}\n\
+snippet defds\n\
+ def_delegators :${1:@del_obj}, :${2:del_methods}\n\
+snippet am\n\
+ alias_method :${1:new_name}, :${2:old_name}\n\
+snippet app\n\
+ if __FILE__ == $PROGRAM_NAME\n\
+ ${1}\n\
+ end\n\
+# usage_if()\n\
+snippet usai\n\
+ if ARGV.${1}\n\
+ abort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\n\
+ end\n\
+# usage_unless()\n\
+snippet usau\n\
+ unless ARGV.${1}\n\
+ abort \"Usage: #{$PROGRAM_NAME} ${2:ARGS_GO_HERE}\"${3}\n\
+ end\n\
+snippet array\n\
+ Array.new(${1:10}) { |${2:i}| ${3} }\n\
+snippet hash\n\
+ Hash.new { |${1:hash}, ${2:key}| $1[$2] = ${3} }\n\
+snippet file File.foreach() { |line| .. }\n\
+ File.foreach(${1:\"path/to/file\"}) { |${2:line}| ${3} }\n\
+snippet file File.read()\n\
+ File.read(${1:\"path/to/file\"})${2}\n\
+snippet Dir Dir.global() { |file| .. }\n\
+ Dir.glob(${1:\"dir/glob/*\"}) { |${2:file}| ${3} }\n\
+snippet Dir Dir[\"..\"]\n\
+ Dir[${1:\"glob/**/*.rb\"}]${2}\n\
+snippet dir\n\
+ Filename.dirname(__FILE__)\n\
+snippet deli\n\
+ delete_if { |${1:e}| ${2} }\n\
+snippet fil\n\
+ fill(${1:range}) { |${2:i}| ${3} }\n\
+# flatten_once()\n\
+snippet flao\n\
+ inject(Array.new) { |${1:arr}, ${2:a}| $1.push(*$2)}${3}\n\
+snippet zip\n\
+ zip(${1:enums}) { |${2:row}| ${3} }\n\
+# downto(0) { |n| .. }\n\
+snippet dow\n\
+ downto(${1:0}) { |${2:n}| ${3} }\n\
+snippet ste\n\
+ step(${1:2}) { |${2:n}| ${3} }\n\
+snippet tim\n\
+ times { |${1:n}| ${2} }\n\
+snippet upt\n\
+ upto(${1:1.0/0.0}) { |${2:n}| ${3} }\n\
+snippet loo\n\
+ loop { ${1} }\n\
+snippet ea\n\
+ each { |${1:e}| ${2} }\n\
+snippet ead\n\
+ each do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet eab\n\
+ each_byte { |${1:byte}| ${2} }\n\
+snippet eac- each_char { |chr| .. }\n\
+ each_char { |${1:chr}| ${2} }\n\
+snippet eac- each_cons(..) { |group| .. }\n\
+ each_cons(${1:2}) { |${2:group}| ${3} }\n\
+snippet eai\n\
+ each_index { |${1:i}| ${2} }\n\
+snippet eaid\n\
+ each_index do |${1:i}|\n\
+ ${2}\n\
+ end\n\
+snippet eak\n\
+ each_key { |${1:key}| ${2} }\n\
+snippet eakd\n\
+ each_key do |${1:key}|\n\
+ ${2}\n\
+ end\n\
+snippet eal\n\
+ each_line { |${1:line}| ${2} }\n\
+snippet eald\n\
+ each_line do |${1:line}|\n\
+ ${2}\n\
+ end\n\
+snippet eap\n\
+ each_pair { |${1:name}, ${2:val}| ${3} }\n\
+snippet eapd\n\
+ each_pair do |${1:name}, ${2:val}|\n\
+ ${3}\n\
+ end\n\
+snippet eas-\n\
+ each_slice(${1:2}) { |${2:group}| ${3} }\n\
+snippet easd-\n\
+ each_slice(${1:2}) do |${2:group}|\n\
+ ${3}\n\
+ end\n\
+snippet eav\n\
+ each_value { |${1:val}| ${2} }\n\
+snippet eavd\n\
+ each_value do |${1:val}|\n\
+ ${2}\n\
+ end\n\
+snippet eawi\n\
+ each_with_index { |${1:e}, ${2:i}| ${3} }\n\
+snippet eawid\n\
+ each_with_index do |${1:e},${2:i}|\n\
+ ${3}\n\
+ end\n\
+snippet reve\n\
+ reverse_each { |${1:e}| ${2} }\n\
+snippet reved\n\
+ reverse_each do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet inj\n\
+ inject(${1:init}) { |${2:mem}, ${3:var}| ${4} }\n\
+snippet injd\n\
+ inject(${1:init}) do |${2:mem}, ${3:var}|\n\
+ ${4}\n\
+ end\n\
+snippet map\n\
+ map { |${1:e}| ${2} }\n\
+snippet mapd\n\
+ map do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet mapwi-\n\
+ enum_with_index.map { |${1:e}, ${2:i}| ${3} }\n\
+snippet sor\n\
+ sort { |a, b| ${1} }\n\
+snippet sorb\n\
+ sort_by { |${1:e}| ${2} }\n\
+snippet ran\n\
+ sort_by { rand }\n\
+snippet all\n\
+ all? { |${1:e}| ${2} }\n\
+snippet any\n\
+ any? { |${1:e}| ${2} }\n\
+snippet cl\n\
+ classify { |${1:e}| ${2} }\n\
+snippet col\n\
+ collect { |${1:e}| ${2} }\n\
+snippet cold\n\
+ collect do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet det\n\
+ detect { |${1:e}| ${2} }\n\
+snippet detd\n\
+ detect do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet fet\n\
+ fetch(${1:name}) { |${2:key}| ${3} }\n\
+snippet fin\n\
+ find { |${1:e}| ${2} }\n\
+snippet find\n\
+ find do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet fina\n\
+ find_all { |${1:e}| ${2} }\n\
+snippet finad\n\
+ find_all do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet gre\n\
+ grep(${1:/pattern/}) { |${2:match}| ${3} }\n\
+snippet sub\n\
+ ${1:g}sub(${2:/pattern/}) { |${3:match}| ${4} }\n\
+snippet sca\n\
+ scan(${1:/pattern/}) { |${2:match}| ${3} }\n\
+snippet scad\n\
+ scan(${1:/pattern/}) do |${2:match}|\n\
+ ${3}\n\
+ end\n\
+snippet max\n\
+ max { |a, b| ${1} }\n\
+snippet min\n\
+ min { |a, b| ${1} }\n\
+snippet par\n\
+ partition { |${1:e}| ${2} }\n\
+snippet pard\n\
+ partition do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet rej\n\
+ reject { |${1:e}| ${2} }\n\
+snippet rejd\n\
+ reject do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet sel\n\
+ select { |${1:e}| ${2} }\n\
+snippet seld\n\
+ select do |${1:e}|\n\
+ ${2}\n\
+ end\n\
+snippet lam\n\
+ lambda { |${1:args}| ${2} }\n\
+snippet doo\n\
+ do\n\
+ ${1}\n\
+ end\n\
+snippet dov\n\
+ do |${1:variable}|\n\
+ ${2}\n\
+ end\n\
+snippet :\n\
+ :${1:key} => ${2:\"value\"}${3}\n\
+snippet ope\n\
+ open(${1:\"path/or/url/or/pipe\"}, \"${2:w}\") { |${3:io}| ${4} }\n\
+# path_from_here()\n\
+snippet fpath\n\
+ File.join(File.dirname(__FILE__), *%2[${1:rel path here}])${2}\n\
+# unix_filter {}\n\
+snippet unif\n\
+ ARGF.each_line${1} do |${2:line}|\n\
+ ${3}\n\
+ end\n\
+# option_parse {}\n\
+snippet optp\n\
+ require \"optparse\"\n\
+\n\
+ options = {${1:default => \"args\"}}\n\
+\n\
+ ARGV.options do |opts|\n\
+ opts.banner = \"Usage: #{File.basename($PROGRAM_NAME)}\n\
+snippet opt\n\
+ opts.on( \"-${1:o}\", \"--${2:long-option-name}\", ${3:String},\n\
+ \"${4:Option description.}\") do |${5:opt}|\n\
+ ${6}\n\
+ end\n\
+snippet tc\n\
+ require \"test/unit\"\n\
+\n\
+ require \"${1:library_file_name}\"\n\
+\n\
+ class Test${2:$1} < Test::Unit::TestCase\n\
+ def test_${3:case_name}\n\
+ ${4}\n\
+ end\n\
+ end\n\
+snippet ts\n\
+ require \"test/unit\"\n\
+\n\
+ require \"tc_${1:test_case_file}\"\n\
+ require \"tc_${2:test_case_file}\"${3}\n\
+snippet as\n\
+ assert ${1:test}, \"${2:Failure message.}\"${3}\n\
+snippet ase\n\
+ assert_equal ${1:expected}, ${2:actual}${3}\n\
+snippet asne\n\
+ assert_not_equal ${1:unexpected}, ${2:actual}${3}\n\
+snippet asid\n\
+ assert_in_delta ${1:expected_float}, ${2:actual_float}, ${3:2 ** -20}${4}\n\
+snippet asio\n\
+ assert_instance_of ${1:ExpectedClass}, ${2:actual_instance}${3}\n\
+snippet asko\n\
+ assert_kind_of ${1:ExpectedKind}, ${2:actual_instance}${3}\n\
+snippet asn\n\
+ assert_nil ${1:instance}${2}\n\
+snippet asnn\n\
+ assert_not_nil ${1:instance}${2}\n\
+snippet asm\n\
+ assert_match /${1:expected_pattern}/, ${2:actual_string}${3}\n\
+snippet asnm\n\
+ assert_no_match /${1:unexpected_pattern}/, ${2:actual_string}${3}\n\
+snippet aso\n\
+ assert_operator ${1:left}, :${2:operator}, ${3:right}${4}\n\
+snippet asr\n\
+ assert_raise ${1:Exception} { ${2} }\n\
+snippet asrd\n\
+ assert_raise ${1:Exception} do\n\
+ ${2}\n\
+ end\n\
+snippet asnr\n\
+ assert_nothing_raised ${1:Exception} { ${2} }\n\
+snippet asnrd\n\
+ assert_nothing_raised ${1:Exception} do\n\
+ ${2}\n\
+ end\n\
+snippet asrt\n\
+ assert_respond_to ${1:object}, :${2:method}${3}\n\
+snippet ass assert_same(..)\n\
+ assert_same ${1:expected}, ${2:actual}${3}\n\
+snippet ass assert_send(..)\n\
+ assert_send [${1:object}, :${2:message}, ${3:args}]${4}\n\
+snippet asns\n\
+ assert_not_same ${1:unexpected}, ${2:actual}${3}\n\
+snippet ast\n\
+ assert_throws :${1:expected} { ${2} }\n\
+snippet astd\n\
+ assert_throws :${1:expected} do\n\
+ ${2}\n\
+ end\n\
+snippet asnt\n\
+ assert_nothing_thrown { ${1} }\n\
+snippet asntd\n\
+ assert_nothing_thrown do\n\
+ ${1}\n\
+ end\n\
+snippet fl\n\
+ flunk \"${1:Failure message.}\"${2}\n\
+# Benchmark.bmbm do .. end\n\
+snippet bm-\n\
+ TESTS = ${1:10_000}\n\
+ Benchmark.bmbm do |results|\n\
+ ${2}\n\
+ end\n\
+snippet rep\n\
+ results.report(\"${1:name}:\") { TESTS.times { ${2} }}\n\
+# Marshal.dump(.., file)\n\
+snippet Md\n\
+ File.open(${1:\"path/to/file.dump\"}, \"wb\") { |${2:file}| Marshal.dump(${3:obj}, $2) }${4}\n\
+# Mashal.load(obj)\n\
+snippet Ml\n\
+ File.open(${1:\"path/to/file.dump\"}, \"rb\") { |${2:file}| Marshal.load($2) }${3}\n\
+# deep_copy(..)\n\
+snippet deec\n\
+ Marshal.load(Marshal.dump(${1:obj_to_copy}))${2}\n\
+snippet Pn-\n\
+ PStore.new(${1:\"file_name.pstore\"})${2}\n\
+snippet tra\n\
+ transaction(${1:true}) { ${2} }\n\
+# xmlread(..)\n\
+snippet xml-\n\
+ REXML::Document.new(File.read(${1:\"path/to/file\"}))${2}\n\
+# xpath(..) { .. }\n\
+snippet xpa\n\
+ elements.each(${1:\"//Xpath\"}) do |${2:node}|\n\
+ ${3}\n\
+ end\n\
+# class_from_name()\n\
+snippet clafn\n\
+ split(\"::\").inject(Object) { |par, const| par.const_get(const) }\n\
+# singleton_class()\n\
+snippet sinc\n\
+ class << self; self end\n\
+snippet nam\n\
+ namespace :${1:`Filename()`} do\n\
+ ${2}\n\
+ end\n\
+snippet tas\n\
+ desc \"${1:Task description}\"\n\
+ task :${2:task_name => [:dependent, :tasks]} do\n\
+ ${3}\n\
+ end\n\
+# block\n\
+snippet b\n\
+ { |${1:var}| ${2} }\n\
+snippet begin\n\
+ begin\n\
+ raise 'A test exception.'\n\
+ rescue Exception => e\n\
+ puts e.message\n\
+ puts e.backtrace.inspect\n\
+ else\n\
+ # other exception\n\
+ ensure\n\
+ # always executed\n\
+ end\n\
+\n\
+#debugging\n\
+snippet debug\n\
+ require 'ruby-debug'; debugger; true;\n\
+snippet pry\n\
+ require 'pry'; binding.pry\n\
+\n\
+#############################################\n\
+# Rails snippets - for pure Ruby, see above #\n\
+#############################################\n\
+snippet art\n\
+ assert_redirected_to ${1::action => \"${2:index}\"}\n\
+snippet artnp\n\
+ assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1}, ${4:@$2})\n\
+snippet artnpp\n\
+ assert_redirected_to ${1:parent}_${2:child}_path(${3:@$1})\n\
+snippet artp\n\
+ assert_redirected_to ${1:model}_path(${2:@$1})\n\
+snippet artpp\n\
+ assert_redirected_to ${1:model}s_path\n\
+snippet asd\n\
+ assert_difference \"${1:Model}.${2:count}\", $1 do\n\
+ ${3}\n\
+ end\n\
+snippet asnd\n\
+ assert_no_difference \"${1:Model}.${2:count}\" do\n\
+ ${3}\n\
+ end\n\
+snippet asre\n\
+ assert_response :${1:success}, @response.body${2}\n\
+snippet asrj\n\
+ assert_rjs :${1:replace}, \"${2:dom id}\"\n\
+snippet ass assert_select(..)\n\
+ assert_select '${1:path}', :${2:text} => '${3:inner_html' ${4:do}\n\
+snippet bf\n\
+ before_filter :${1:method}\n\
+snippet bt\n\
+ belongs_to :${1:association}\n\
+snippet crw\n\
+ cattr_accessor :${1:attr_names}\n\
+snippet defcreate\n\
+ def create\n\
+ @${1:model_class_name} = ${2:ModelClassName}.new(params[:$1])\n\
+\n\
+ respond_to do |wants|\n\
+ if @$1.save\n\
+ flash[:notice] = '$2 was successfully created.'\n\
+ wants.html { redirect_to(@$1) }\n\
+ wants.xml { render :xml => @$1, :status => :created, :location => @$1 }\n\
+ else\n\
+ wants.html { render :action => \"new\" }\n\
+ wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\
+ end\n\
+ end\n\
+ end${3}\n\
+snippet defdestroy\n\
+ def destroy\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+ @$1.destroy\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html { redirect_to($1s_url) }\n\
+ wants.xml { head :ok }\n\
+ end\n\
+ end${3}\n\
+snippet defedit\n\
+ def edit\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+ end\n\
+snippet defindex\n\
+ def index\n\
+ @${1:model_class_name} = ${2:ModelClassName}.all\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html # index.html.erb\n\
+ wants.xml { render :xml => @$1s }\n\
+ end\n\
+ end${3}\n\
+snippet defnew\n\
+ def new\n\
+ @${1:model_class_name} = ${2:ModelClassName}.new\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html # new.html.erb\n\
+ wants.xml { render :xml => @$1 }\n\
+ end\n\
+ end${3}\n\
+snippet defshow\n\
+ def show\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+\n\
+ respond_to do |wants|\n\
+ wants.html # show.html.erb\n\
+ wants.xml { render :xml => @$1 }\n\
+ end\n\
+ end${3}\n\
+snippet defupdate\n\
+ def update\n\
+ @${1:model_class_name} = ${2:ModelClassName}.find(params[:id])\n\
+\n\
+ respond_to do |wants|\n\
+ if @$1.update_attributes(params[:$1])\n\
+ flash[:notice] = '$2 was successfully updated.'\n\
+ wants.html { redirect_to(@$1) }\n\
+ wants.xml { head :ok }\n\
+ else\n\
+ wants.html { render :action => \"edit\" }\n\
+ wants.xml { render :xml => @$1.errors, :status => :unprocessable_entity }\n\
+ end\n\
+ end\n\
+ end${3}\n\
+snippet flash\n\
+ flash[:${1:notice}] = \"${2}\"\n\
+snippet habtm\n\
+ has_and_belongs_to_many :${1:object}, :join_table => \"${2:table_name}\", :foreign_key => \"${3}_id\"${4}\n\
+snippet hm\n\
+ has_many :${1:object}\n\
+snippet hmd\n\
+ has_many :${1:other}s, :class_name => \"${2:$1}\", :foreign_key => \"${3:$1}_id\", :dependent => :destroy${4}\n\
+snippet hmt\n\
+ has_many :${1:object}, :through => :${2:object}\n\
+snippet ho\n\
+ has_one :${1:object}\n\
+snippet i18\n\
+ I18n.t('${1:type.key}')${2}\n\
+snippet ist\n\
+ <%= image_submit_tag(\"${1:agree.png}\", :id => \"${2:id}\"${3} %>\n\
+snippet log\n\
+ Rails.logger.${1:debug} ${2}\n\
+snippet log2\n\
+ RAILS_DEFAULT_LOGGER.${1:debug} ${2}\n\
+snippet logd\n\
+ logger.debug { \"${1:message}\" }${2}\n\
+snippet loge\n\
+ logger.error { \"${1:message}\" }${2}\n\
+snippet logf\n\
+ logger.fatal { \"${1:message}\" }${2}\n\
+snippet logi\n\
+ logger.info { \"${1:message}\" }${2}\n\
+snippet logw\n\
+ logger.warn { \"${1:message}\" }${2}\n\
+snippet mapc\n\
+ ${1:map}.${2:connect} '${3:controller/:action/:id}'\n\
+snippet mapca\n\
+ ${1:map}.catch_all \"*${2:anything}\", :controller => \"${3:default}\", :action => \"${4:error}\"${5}\n\
+snippet mapr\n\
+ ${1:map}.resource :${2:resource}\n\
+snippet maprs\n\
+ ${1:map}.resources :${2:resource}\n\
+snippet mapwo\n\
+ ${1:map}.with_options :${2:controller} => '${3:thing}' do |$3|\n\
+ ${4}\n\
+ end\n\
+snippet mbs\n\
+ before_save :${1:method}\n\
+snippet mcht\n\
+ change_table :${1:table_name} do |t|\n\
+ ${2}\n\
+ end\n\
+snippet mp\n\
+ map(&:${1:id})\n\
+snippet mrw\n\
+ mattr_accessor :${1:attr_names}\n\
+snippet oa\n\
+ order(\"${1:field}\")\n\
+snippet od\n\
+ order(\"${1:field} DESC\")\n\
+snippet pa\n\
+ params[:${1:id}]${2}\n\
+snippet ra\n\
+ render :action => \"${1:action}\"\n\
+snippet ral\n\
+ render :action => \"${1:action}\", :layout => \"${2:layoutname}\"\n\
+snippet rest\n\
+ respond_to do |wants|\n\
+ wants.${1:html} { ${2} }\n\
+ end\n\
+snippet rf\n\
+ render :file => \"${1:filepath}\"\n\
+snippet rfu\n\
+ render :file => \"${1:filepath}\", :use_full_path => ${2:false}\n\
+snippet ri\n\
+ render :inline => \"${1:<%= 'hello' %>}\"\n\
+snippet ril\n\
+ render :inline => \"${1:<%= 'hello' %>}\", :locals => { ${2::name} => \"${3:value}\"${4} }\n\
+snippet rit\n\
+ render :inline => \"${1:<%= 'hello' %>}\", :type => ${2::rxml}\n\
+snippet rjson\n\
+ render :json => ${1:text to render}\n\
+snippet rl\n\
+ render :layout => \"${1:layoutname}\"\n\
+snippet rn\n\
+ render :nothing => ${1:true}\n\
+snippet rns\n\
+ render :nothing => ${1:true}, :status => ${2:401}\n\
+snippet rp\n\
+ render :partial => \"${1:item}\"\n\
+snippet rpc\n\
+ render :partial => \"${1:item}\", :collection => ${2:@$1s}\n\
+snippet rpl\n\
+ render :partial => \"${1:item}\", :locals => { :${2:$1} => ${3:@$1}\n\
+snippet rpo\n\
+ render :partial => \"${1:item}\", :object => ${2:@$1}\n\
+snippet rps\n\
+ render :partial => \"${1:item}\", :status => ${2:500}\n\
+snippet rt\n\
+ render :text => \"${1:text to render}\"\n\
+snippet rtl\n\
+ render :text => \"${1:text to render}\", :layout => \"${2:layoutname}\"\n\
+snippet rtlt\n\
+ render :text => \"${1:text to render}\", :layout => ${2:true}\n\
+snippet rts\n\
+ render :text => \"${1:text to render}\", :status => ${2:401}\n\
+snippet ru\n\
+ render :update do |${1:page}|\n\
+ $1.${2}\n\
+ end\n\
+snippet rxml\n\
+ render :xml => ${1:text to render}\n\
+snippet sc\n\
+ scope :${1:name}, :where(:@${2:field} => ${3:value})\n\
+snippet sl\n\
+ scope :${1:name}, lambda do |${2:value}|\n\
+ where(\"${3:field = ?}\", ${4:bind var})\n\
+ end\n\
+snippet sha1\n\
+ Digest::SHA1.hexdigest(${1:string})\n\
+snippet sweeper\n\
+ class ${1:ModelClassName}Sweeper < ActionController::Caching::Sweeper\n\
+ observe $1\n\
+\n\
+ def after_save(${2:model_class_name})\n\
+ expire_cache($2)\n\
+ end\n\
+\n\
+ def after_destroy($2)\n\
+ expire_cache($2)\n\
+ end\n\
+\n\
+ def expire_cache($2)\n\
+ expire_page\n\
+ end\n\
+ end\n\
+snippet tcb\n\
+ t.boolean :${1:title}\n\
+ ${2}\n\
+snippet tcbi\n\
+ t.binary :${1:title}, :limit => ${2:2}.megabytes\n\
+ ${3}\n\
+snippet tcd\n\
+ t.decimal :${1:title}, :precision => ${2:10}, :scale => ${3:2}\n\
+ ${4}\n\
+snippet tcda\n\
+ t.date :${1:title}\n\
+ ${2}\n\
+snippet tcdt\n\
+ t.datetime :${1:title}\n\
+ ${2}\n\
+snippet tcf\n\
+ t.float :${1:title}\n\
+ ${2}\n\
+snippet tch\n\
+ t.change :${1:name}, :${2:string}, :${3:limit} => ${4:80}\n\
+ ${5}\n\
+snippet tci\n\
+ t.integer :${1:title}\n\
+ ${2}\n\
+snippet tcl\n\
+ t.integer :lock_version, :null => false, :default => 0\n\
+ ${1}\n\
+snippet tcr\n\
+ t.references :${1:taggable}, :polymorphic => { :default => '${2:Photo}' }\n\
+ ${3}\n\
+snippet tcs\n\
+ t.string :${1:title}\n\
+ ${2}\n\
+snippet tct\n\
+ t.text :${1:title}\n\
+ ${2}\n\
+snippet tcti\n\
+ t.time :${1:title}\n\
+ ${2}\n\
+snippet tcts\n\
+ t.timestamp :${1:title}\n\
+ ${2}\n\
+snippet tctss\n\
+ t.timestamps\n\
+ ${1}\n\
+snippet va\n\
+ validates_associated :${1:attribute}\n\
+snippet vao\n\
+ validates_acceptance_of :${1:terms}\n\
+snippet vc\n\
+ validates_confirmation_of :${1:attribute}\n\
+snippet ve\n\
+ validates_exclusion_of :${1:attribute}, :in => ${2:%w( mov avi )}\n\
+snippet vf\n\
+ validates_format_of :${1:attribute}, :with => /${2:regex}/\n\
+snippet vi\n\
+ validates_inclusion_of :${1:attribute}, :in => %w(${2: mov avi })\n\
+snippet vl\n\
+ validates_length_of :${1:attribute}, :within => ${2:3}..${3:20}\n\
+snippet vn\n\
+ validates_numericality_of :${1:attribute}\n\
+snippet vpo\n\
+ validates_presence_of :${1:attribute}\n\
+snippet vu\n\
+ validates_uniqueness_of :${1:attribute}\n\
+snippet wants\n\
+ wants.${1:js|xml|html} { ${2} }\n\
+snippet wc\n\
+ where(${1:\"conditions\"}${2:, bind_var})\n\
+snippet wh\n\
+ where(${1:field} => ${2:value})\n\
+snippet xdelete\n\
+ xhr :delete, :${1:destroy}, :id => ${2:1}${3}\n\
+snippet xget\n\
+ xhr :get, :${1:show}, :id => ${2:1}${3}\n\
+snippet xpost\n\
+ xhr :post, :${1:create}, :${2:object} => { ${3} }\n\
+snippet xput\n\
+ xhr :put, :${1:update}, :id => ${2:1}, :${3:object} => { ${4} }${5}\n\
+snippet test\n\
+ test \"should ${1:do something}\" do\n\
+ ${2}\n\
+ end\n\
+#migrations\n\
+snippet mac\n\
+ add_column :${1:table_name}, :${2:column_name}, :${3:data_type}\n\
+snippet mrc\n\
+ remove_column :${1:table_name}, :${2:column_name}\n\
+snippet mrnc\n\
+ rename_column :${1:table_name}, :${2:old_column_name}, :${3:new_column_name}\n\
+snippet mcc\n\
+ change_column :${1:table}, :${2:column}, :${3:type}\n\
+snippet mccc\n\
+ t.column :${1:title}, :${2:string}\n\
+snippet mct\n\
+ create_table :${1:table_name} do |t|\n\
+ t.column :${2:name}, :${3:type}\n\
+ end\n\
+snippet migration\n\
+ class ${1:class_name} < ActiveRecord::Migration\n\
+ def self.up\n\
+ ${2}\n\
+ end\n\
+\n\
+ def self.down\n\
+ end\n\
+ end\n\
+\n\
+snippet trc\n\
+ t.remove :${1:column}\n\
+snippet tre\n\
+ t.rename :${1:old_column_name}, :${2:new_column_name}\n\
+ ${3}\n\
+snippet tref\n\
+ t.references :${1:model}\n\
+\n\
+#rspec\n\
+snippet it\n\
+ it \"${1:spec_name}\" do\n\
+ ${2}\n\
+ end\n\
+snippet itp\n\
+ it \"${1:spec_name}\"\n\
+ ${2}\n\
+snippet desc\n\
+ describe ${1:class_name} do\n\
+ ${2}\n\
+ end\n\
+snippet cont\n\
+ context \"${1:message}\" do\n\
+ ${2}\n\
+ end\n\
+snippet bef\n\
+ before :${1:each} do\n\
+ ${2}\n\
+ end\n\
+snippet aft\n\
+ after :${1:each} do\n\
+ ${2}\n\
+ end\n\
+";
+exports.scope = "ruby";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/rust.js b/filemanager/static/filemanager/js/ace/snippets/rust.js
new file mode 100755
index 000000000..0411c63e1
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/rust.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/rust",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "rust";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/sass.js b/filemanager/static/filemanager/js/ace/snippets/sass.js
new file mode 100755
index 000000000..b9adc9d8c
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/sass.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/sass",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "sass";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/scad.js b/filemanager/static/filemanager/js/ace/snippets/scad.js
new file mode 100755
index 000000000..998a98ac6
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/scad.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/scad",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "scad";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/scala.js b/filemanager/static/filemanager/js/ace/snippets/scala.js
new file mode 100755
index 000000000..4051d9888
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/scala.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/scala",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "scala";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/scheme.js b/filemanager/static/filemanager/js/ace/snippets/scheme.js
new file mode 100755
index 000000000..202d07415
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/scheme.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/scheme",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "scheme";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/scss.js b/filemanager/static/filemanager/js/ace/snippets/scss.js
new file mode 100755
index 000000000..fbd98f74c
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/scss.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/scss",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "scss";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/sh.js b/filemanager/static/filemanager/js/ace/snippets/sh.js
new file mode 100755
index 000000000..0f1f6d8e1
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/sh.js
@@ -0,0 +1,90 @@
+ace.define("ace/snippets/sh",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "# Shebang. Executing bash via /usr/bin/env makes scripts more portable.\n\
+snippet #!\n\
+ #!/usr/bin/env bash\n\
+ \n\
+snippet if\n\
+ if [[ ${1:condition} ]]; then\n\
+ ${2:#statements}\n\
+ fi\n\
+snippet elif\n\
+ elif [[ ${1:condition} ]]; then\n\
+ ${2:#statements}\n\
+snippet for\n\
+ for (( ${2:i} = 0; $2 < ${1:count}; $2++ )); do\n\
+ ${3:#statements}\n\
+ done\n\
+snippet fori\n\
+ for ${1:needle} in ${2:haystack} ; do\n\
+ ${3:#statements}\n\
+ done\n\
+snippet wh\n\
+ while [[ ${1:condition} ]]; do\n\
+ ${2:#statements}\n\
+ done\n\
+snippet until\n\
+ until [[ ${1:condition} ]]; do\n\
+ ${2:#statements}\n\
+ done\n\
+snippet case\n\
+ case ${1:word} in\n\
+ ${2:pattern})\n\
+ ${3};;\n\
+ esac\n\
+snippet go \n\
+ while getopts '${1:o}' ${2:opts} \n\
+ do \n\
+ case $$2 in\n\
+ ${3:o0})\n\
+ ${4:#staments};;\n\
+ esac\n\
+ done\n\
+# Set SCRIPT_DIR variable to directory script is located.\n\
+snippet sdir\n\
+ SCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" && pwd )\"\n\
+# getopt\n\
+snippet getopt\n\
+ __ScriptVersion=\"${1:version}\"\n\
+\n\
+ #=== FUNCTION ================================================================\n\
+ # NAME: usage\n\
+ # DESCRIPTION: Display usage information.\n\
+ #===============================================================================\n\
+ function usage ()\n\
+ {\n\
+ cat <<- EOT\n\
+\n\
+ Usage : $${0:0} [options] [--] \n\
+\n\
+ Options: \n\
+ -h|help Display this message\n\
+ -v|version Display script version\n\
+\n\
+ EOT\n\
+ } # ---------- end of function usage ----------\n\
+\n\
+ #-----------------------------------------------------------------------\n\
+ # Handle command line arguments\n\
+ #-----------------------------------------------------------------------\n\
+\n\
+ while getopts \":hv\" opt\n\
+ do\n\
+ case $opt in\n\
+\n\
+ h|help ) usage; exit 0 ;;\n\
+\n\
+ v|version ) echo \"$${0:0} -- Version $__ScriptVersion\"; exit 0 ;;\n\
+\n\
+ \\? ) echo -e \"\\n Option does not exist : $OPTARG\\n\"\n\
+ usage; exit 1 ;;\n\
+\n\
+ esac # --- end of case ---\n\
+ done\n\
+ shift $(($OPTIND-1))\n\
+\n\
+";
+exports.scope = "sh";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/sjs.js b/filemanager/static/filemanager/js/ace/snippets/sjs.js
new file mode 100755
index 000000000..cf39a34ec
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/sjs.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/sjs",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "sjs";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/smarty.js b/filemanager/static/filemanager/js/ace/snippets/smarty.js
new file mode 100755
index 000000000..47319a259
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/smarty.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/smarty",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "smarty";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/snippets.js b/filemanager/static/filemanager/js/ace/snippets/snippets.js
new file mode 100755
index 000000000..b81605ccd
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/snippets.js
@@ -0,0 +1,16 @@
+ace.define("ace/snippets/snippets",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "# snippets for making snippets :)\n\
+snippet snip\n\
+ snippet ${1:trigger}\n\
+ ${2}\n\
+snippet msnip\n\
+ snippet ${1:trigger} ${2:description}\n\
+ ${3}\n\
+snippet v\n\
+ {VISUAL}\n\
+";
+exports.scope = "snippets";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/soy_template.js b/filemanager/static/filemanager/js/ace/snippets/soy_template.js
new file mode 100755
index 000000000..908f5fdf6
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/soy_template.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/soy_template",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "soy_template";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/space.js b/filemanager/static/filemanager/js/ace/snippets/space.js
new file mode 100755
index 000000000..302b84e00
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/space.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/space",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "space";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/sparql.js b/filemanager/static/filemanager/js/ace/snippets/sparql.js
new file mode 100755
index 000000000..2c87bbfe9
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/sparql.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/sparql",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/sql.js b/filemanager/static/filemanager/js/ace/snippets/sql.js
new file mode 100755
index 000000000..1822126ba
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/sql.js
@@ -0,0 +1,33 @@
+ace.define("ace/snippets/sql",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "snippet tbl\n\
+ create table ${1:table} (\n\
+ ${2:columns}\n\
+ );\n\
+snippet col\n\
+ ${1:name} ${2:type} ${3:default ''} ${4:not null}\n\
+snippet ccol\n\
+ ${1:name} varchar2(${2:size}) ${3:default ''} ${4:not null}\n\
+snippet ncol\n\
+ ${1:name} number ${3:default 0} ${4:not null}\n\
+snippet dcol\n\
+ ${1:name} date ${3:default sysdate} ${4:not null}\n\
+snippet ind\n\
+ create index ${3:$1_$2} on ${1:table}(${2:column});\n\
+snippet uind\n\
+ create unique index ${1:name} on ${2:table}(${3:column});\n\
+snippet tblcom\n\
+ comment on table ${1:table} is '${2:comment}';\n\
+snippet colcom\n\
+ comment on column ${1:table}.${2:column} is '${3:comment}';\n\
+snippet addcol\n\
+ alter table ${1:table} add (${2:column} ${3:type});\n\
+snippet seq\n\
+ create sequence ${1:name} start with ${2:1} increment by ${3:1} minvalue ${4:1};\n\
+snippet s*\n\
+ select * from ${1:table}\n\
+";
+exports.scope = "sql";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/sqlserver.js b/filemanager/static/filemanager/js/ace/snippets/sqlserver.js
new file mode 100755
index 000000000..7dfa2d049
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/sqlserver.js
@@ -0,0 +1,76 @@
+ace.define("ace/snippets/sqlserver",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "# ISNULL\n\
+snippet isnull\n\
+ ISNULL(${1:check_expression}, ${2:replacement_value})\n\
+# FORMAT\n\
+snippet format\n\
+ FORMAT(${1:value}, ${2:format})\n\
+# CAST\n\
+snippet cast\n\
+ CAST(${1:expression} AS ${2:data_type})\n\
+# CONVERT\n\
+snippet convert\n\
+ CONVERT(${1:data_type}, ${2:expression})\n\
+# DATEPART\n\
+snippet datepart\n\
+ DATEPART(${1:datepart}, ${2:date})\n\
+# DATEDIFF\n\
+snippet datediff\n\
+ DATEDIFF(${1:datepart}, ${2:startdate}, ${3:enddate})\n\
+# DATEADD\n\
+snippet dateadd\n\
+ DATEADD(${1:datepart}, ${2:number}, ${3:date})\n\
+# DATEFROMPARTS \n\
+snippet datefromparts\n\
+ DATEFROMPARTS(${1:year}, ${2:month}, ${3:day})\n\
+# OBJECT_DEFINITION\n\
+snippet objectdef\n\
+ SELECT OBJECT_DEFINITION(OBJECT_ID('${1:sys.server_permissions /*object name*/}'))\n\
+# STUFF XML\n\
+snippet stuffxml\n\
+ STUFF((SELECT ', ' + ${1:ColumnName}\n\
+ FROM ${2:TableName}\n\
+ WHERE ${3:WhereClause}\n\
+ FOR XML PATH('')), 1, 1, '') AS ${4:Alias}\n\
+ ${5:/*https://msdn.microsoft.com/en-us/library/ms188043.aspx*/}\n\
+# Create Procedure\n\
+snippet createproc\n\
+ -- =============================================\n\
+ -- Author: ${1:Author}\n\
+ -- Create date: ${2:Date}\n\
+ -- Description: ${3:Description}\n\
+ -- =============================================\n\
+ CREATE PROCEDURE ${4:Procedure_Name}\n\
+ ${5:/*Add the parameters for the stored procedure here*/}\n\
+ AS\n\
+ BEGIN\n\
+ -- SET NOCOUNT ON added to prevent extra result sets from interfering with SELECT statements.\n\
+ SET NOCOUNT ON;\n\
+ \n\
+ ${6:/*Add the T-SQL statements to compute the return value here*/}\n\
+ \n\
+ END\n\
+ GO\n\
+# Create Scalar Function\n\
+snippet createfn\n\
+ -- =============================================\n\
+ -- Author: ${1:Author}\n\
+ -- Create date: ${2:Date}\n\
+ -- Description: ${3:Description}\n\
+ -- =============================================\n\
+ CREATE FUNCTION ${4:Scalar_Function_Name}\n\
+ -- Add the parameters for the function here\n\
+ RETURNS ${5:Function_Data_Type}\n\
+ AS\n\
+ BEGIN\n\
+ DECLARE @Result ${5:Function_Data_Type}\n\
+ \n\
+ ${6:/*Add the T-SQL statements to compute the return value here*/}\n\
+ \n\
+ END\n\
+ GO";
+exports.scope = "sqlserver";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/stylus.js b/filemanager/static/filemanager/js/ace/snippets/stylus.js
new file mode 100755
index 000000000..5f700bae3
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/stylus.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/stylus",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "stylus";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/svg.js b/filemanager/static/filemanager/js/ace/snippets/svg.js
new file mode 100755
index 000000000..69a3408ec
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/svg.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/svg",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "svg";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/swift.js b/filemanager/static/filemanager/js/ace/snippets/swift.js
new file mode 100755
index 000000000..55226ba0c
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/swift.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/swift",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "swift";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/swig.js b/filemanager/static/filemanager/js/ace/snippets/swig.js
new file mode 100755
index 000000000..1eee03347
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/swig.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/swig",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "swig";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/tcl.js b/filemanager/static/filemanager/js/ace/snippets/tcl.js
new file mode 100755
index 000000000..4d116da82
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/tcl.js
@@ -0,0 +1,99 @@
+ace.define("ace/snippets/tcl",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "# #!/usr/bin/env tclsh\n\
+snippet #!\n\
+ #!/usr/bin/env tclsh\n\
+ \n\
+# Process\n\
+snippet pro\n\
+ proc ${1:function_name} {${2:args}} {\n\
+ ${3:#body ...}\n\
+ }\n\
+#xif\n\
+snippet xif\n\
+ ${1:expr}? ${2:true} : ${3:false}\n\
+# Conditional\n\
+snippet if\n\
+ if {${1}} {\n\
+ ${2:# body...}\n\
+ }\n\
+# Conditional if..else\n\
+snippet ife\n\
+ if {${1}} {\n\
+ ${2:# body...}\n\
+ } else {\n\
+ ${3:# else...}\n\
+ }\n\
+# Conditional if..elsif..else\n\
+snippet ifee\n\
+ if {${1}} {\n\
+ ${2:# body...}\n\
+ } elseif {${3}} {\n\
+ ${4:# elsif...}\n\
+ } else {\n\
+ ${5:# else...}\n\
+ }\n\
+# If catch then\n\
+snippet ifc\n\
+ if { [catch {${1:#do something...}} ${2:err}] } {\n\
+ ${3:# handle failure...}\n\
+ }\n\
+# Catch\n\
+snippet catch\n\
+ catch {${1}} ${2:err} ${3:options}\n\
+# While Loop\n\
+snippet wh\n\
+ while {${1}} {\n\
+ ${2:# body...}\n\
+ }\n\
+# For Loop\n\
+snippet for\n\
+ for {set ${2:var} 0} {$$2 < ${1:count}} {${3:incr} $2} {\n\
+ ${4:# body...}\n\
+ }\n\
+# Foreach Loop\n\
+snippet fore\n\
+ foreach ${1:x} {${2:#list}} {\n\
+ ${3:# body...}\n\
+ }\n\
+# after ms script...\n\
+snippet af\n\
+ after ${1:ms} ${2:#do something}\n\
+# after cancel id\n\
+snippet afc\n\
+ after cancel ${1:id or script}\n\
+# after idle\n\
+snippet afi\n\
+ after idle ${1:script}\n\
+# after info id\n\
+snippet afin\n\
+ after info ${1:id}\n\
+# Expr\n\
+snippet exp\n\
+ expr {${1:#expression here}}\n\
+# Switch\n\
+snippet sw\n\
+ switch ${1:var} {\n\
+ ${3:pattern 1} {\n\
+ ${4:#do something}\n\
+ }\n\
+ default {\n\
+ ${2:#do something}\n\
+ }\n\
+ }\n\
+# Case\n\
+snippet ca\n\
+ ${1:pattern} {\n\
+ ${2:#do something}\n\
+ }${3}\n\
+# Namespace eval\n\
+snippet ns\n\
+ namespace eval ${1:path} {${2:#script...}}\n\
+# Namespace current\n\
+snippet nsc\n\
+ namespace current\n\
+";
+exports.scope = "tcl";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/tex.js b/filemanager/static/filemanager/js/ace/snippets/tex.js
new file mode 100755
index 000000000..2bd3f1034
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/tex.js
@@ -0,0 +1,197 @@
+ace.define("ace/snippets/tex",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "#PREAMBLE\n\
+#newcommand\n\
+snippet nc\n\
+ \\newcommand{\\${1:cmd}}[${2:opt}]{${3:realcmd}}${4}\n\
+#usepackage\n\
+snippet up\n\
+ \\usepackage[${1:[options}]{${2:package}}\n\
+#newunicodechar\n\
+snippet nuc\n\
+ \\newunicodechar{${1}}{${2:\\ensuremath}${3:tex-substitute}}}\n\
+#DeclareMathOperator\n\
+snippet dmo\n\
+ \\DeclareMathOperator{${1}}{${2}}\n\
+\n\
+#DOCUMENT\n\
+# \\begin{}...\\end{}\n\
+snippet begin\n\
+ \\begin{${1:env}}\n\
+ ${2}\n\
+ \\end{$1}\n\
+# Tabular\n\
+snippet tab\n\
+ \\begin{${1:tabular}}{${2:c}}\n\
+ ${3}\n\
+ \\end{$1}\n\
+snippet thm\n\
+ \\begin[${1:author}]{${2:thm}}\n\
+ ${3}\n\
+ \\end{$1}\n\
+snippet center\n\
+ \\begin{center}\n\
+ ${1}\n\
+ \\end{center}\n\
+# Align(ed)\n\
+snippet ali\n\
+ \\begin{align${1:ed}}\n\
+ ${2}\n\
+ \\end{align$1}\n\
+# Gather(ed)\n\
+snippet gat\n\
+ \\begin{gather${1:ed}}\n\
+ ${2}\n\
+ \\end{gather$1}\n\
+# Equation\n\
+snippet eq\n\
+ \\begin{equation}\n\
+ ${1}\n\
+ \\end{equation}\n\
+# Equation\n\
+snippet eq*\n\
+ \\begin{equation*}\n\
+ ${1}\n\
+ \\end{equation*}\n\
+# Unnumbered Equation\n\
+snippet \\\n\
+ \\[\n\
+ ${1}\n\
+ \\]\n\
+# Enumerate\n\
+snippet enum\n\
+ \\begin{enumerate}\n\
+ \\item ${1}\n\
+ \\end{enumerate}\n\
+# Itemize\n\
+snippet itemize\n\
+ \\begin{itemize}\n\
+ \\item ${1}\n\
+ \\end{itemize}\n\
+# Description\n\
+snippet desc\n\
+ \\begin{description}\n\
+ \\item[${1}] ${2}\n\
+ \\end{description}\n\
+# Matrix\n\
+snippet mat\n\
+ \\begin{${1:p/b/v/V/B/small}matrix}\n\
+ ${2}\n\
+ \\end{$1matrix}\n\
+# Cases\n\
+snippet cas\n\
+ \\begin{cases}\n\
+ ${1:equation}, &\\text{ if }${2:case}\\\\\n\
+ ${3}\n\
+ \\end{cases}\n\
+# Split\n\
+snippet spl\n\
+ \\begin{split}\n\
+ ${1}\n\
+ \\end{split}\n\
+# Part\n\
+snippet part\n\
+ \\part{${1:part name}} % (fold)\n\
+ \\label{prt:${2:$1}}\n\
+ ${3}\n\
+ % part $2 (end)\n\
+# Chapter\n\
+snippet cha\n\
+ \\chapter{${1:chapter name}}\n\
+ \\label{cha:${2:$1}}\n\
+ ${3}\n\
+# Section\n\
+snippet sec\n\
+ \\section{${1:section name}}\n\
+ \\label{sec:${2:$1}}\n\
+ ${3}\n\
+# Sub Section\n\
+snippet sub\n\
+ \\subsection{${1:subsection name}}\n\
+ \\label{sub:${2:$1}}\n\
+ ${3}\n\
+# Sub Sub Section\n\
+snippet subs\n\
+ \\subsubsection{${1:subsubsection name}}\n\
+ \\label{ssub:${2:$1}}\n\
+ ${3}\n\
+# Paragraph\n\
+snippet par\n\
+ \\paragraph{${1:paragraph name}}\n\
+ \\label{par:${2:$1}}\n\
+ ${3}\n\
+# Sub Paragraph\n\
+snippet subp\n\
+ \\subparagraph{${1:subparagraph name}}\n\
+ \\label{subp:${2:$1}}\n\
+ ${3}\n\
+#References\n\
+snippet itd\n\
+ \\item[${1:description}] ${2:item}\n\
+snippet figure\n\
+ ${1:Figure}~\\ref{${2:fig:}}${3}\n\
+snippet table\n\
+ ${1:Table}~\\ref{${2:tab:}}${3}\n\
+snippet listing\n\
+ ${1:Listing}~\\ref{${2:list}}${3}\n\
+snippet section\n\
+ ${1:Section}~\\ref{${2:sec:}}${3}\n\
+snippet page\n\
+ ${1:page}~\\pageref{${2}}${3}\n\
+snippet index\n\
+ \\index{${1:index}}${2}\n\
+#Citations\n\
+snippet cite\n\
+ \\cite[${1}]{${2}}${3}\n\
+snippet fcite\n\
+ \\footcite[${1}]{${2}}${3}\n\
+#Formating text: italic, bold, underline, small capital, emphase ..\n\
+snippet it\n\
+ \\textit{${1:text}}\n\
+snippet bf\n\
+ \\textbf{${1:text}}\n\
+snippet under\n\
+ \\underline{${1:text}}\n\
+snippet emp\n\
+ \\emph{${1:text}}\n\
+snippet sc\n\
+ \\textsc{${1:text}}\n\
+#Choosing font\n\
+snippet sf\n\
+ \\textsf{${1:text}}\n\
+snippet rm\n\
+ \\textrm{${1:text}}\n\
+snippet tt\n\
+ \\texttt{${1:text}}\n\
+#misc\n\
+snippet ft\n\
+ \\footnote{${1:text}}\n\
+snippet fig\n\
+ \\begin{figure}\n\
+ \\begin{center}\n\
+ \\includegraphics[scale=${1}]{Figures/${2}}\n\
+ \\end{center}\n\
+ \\caption{${3}}\n\
+ \\label{fig:${4}}\n\
+ \\end{figure}\n\
+snippet tikz\n\
+ \\begin{figure}\n\
+ \\begin{center}\n\
+ \\begin{tikzpicture}[scale=${1:1}]\n\
+ ${2}\n\
+ \\end{tikzpicture}\n\
+ \\end{center}\n\
+ \\caption{${3}}\n\
+ \\label{fig:${4}}\n\
+ \\end{figure}\n\
+#math\n\
+snippet stackrel\n\
+ \\stackrel{${1:above}}{${2:below}} ${3}\n\
+snippet frac\n\
+ \\frac{${1:num}}{${2:denom}}\n\
+snippet sum\n\
+ \\sum^{${1:n}}_{${2:i=1}}{${3}}";
+exports.scope = "tex";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/text.js b/filemanager/static/filemanager/js/ace/snippets/text.js
new file mode 100755
index 000000000..57b897bf6
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/text.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/text",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "text";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/textile.js b/filemanager/static/filemanager/js/ace/snippets/textile.js
new file mode 100755
index 000000000..a6fd711ef
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/textile.js
@@ -0,0 +1,37 @@
+ace.define("ace/snippets/textile",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "# Jekyll post header\n\
+snippet header\n\
+ ---\n\
+ title: ${1:title}\n\
+ layout: post\n\
+ date: ${2:date} ${3:hour:minute:second} -05:00\n\
+ ---\n\
+\n\
+# Image\n\
+snippet img\n\
+ !${1:url}(${2:title}):${3:link}!\n\
+\n\
+# Table\n\
+snippet |\n\
+ |${1}|${2}\n\
+\n\
+# Link\n\
+snippet link\n\
+ \"${1:link text}\":${2:url}\n\
+\n\
+# Acronym\n\
+snippet (\n\
+ (${1:Expand acronym})${2}\n\
+\n\
+# Footnote\n\
+snippet fn\n\
+ [${1:ref number}] ${3}\n\
+\n\
+ fn$1. ${2:footnote}\n\
+ \n\
+";
+exports.scope = "textile";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/toml.js b/filemanager/static/filemanager/js/ace/snippets/toml.js
new file mode 100755
index 000000000..0c1a857bb
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/toml.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/toml",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "toml";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/tsx.js b/filemanager/static/filemanager/js/ace/snippets/tsx.js
new file mode 100755
index 000000000..7946297ea
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/tsx.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/tsx",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "tsx";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/turtle.js b/filemanager/static/filemanager/js/ace/snippets/turtle.js
new file mode 100755
index 000000000..5e104b22f
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/turtle.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/turtle",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/twig.js b/filemanager/static/filemanager/js/ace/snippets/twig.js
new file mode 100755
index 000000000..ccc6073cf
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/twig.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/twig",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "twig";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/typescript.js b/filemanager/static/filemanager/js/ace/snippets/typescript.js
new file mode 100755
index 000000000..5f6217d01
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/typescript.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/typescript",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "typescript";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/vala.js b/filemanager/static/filemanager/js/ace/snippets/vala.js
new file mode 100755
index 000000000..3b493422e
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/vala.js
@@ -0,0 +1,193 @@
+ace.define("ace/snippets/vala",["require","exports","module"], function(require, exports, module) {
+"use strict";
+exports.snippets = [
+ {
+ "content": "case ${1:condition}:\n\t$0\n\tbreak;\n",
+ "name": "case",
+ "scope": "vala",
+ "tabTrigger": "case"
+ },
+ {
+ "content": "/**\n * ${6}\n */\n${1:public} class ${2:MethodName}${3: : GLib.Object} {\n\n\t/**\n\t * ${7}\n\t */\n\tpublic ${2}(${4}) {\n\t\t${5}\n\t}\n\n\t$0\n}",
+ "name": "class",
+ "scope": "vala",
+ "tabTrigger": "class"
+ },
+ {
+ "content": "(${1}) => {\n\t${0}\n}\n",
+ "name": "closure",
+ "scope": "vala",
+ "tabTrigger": "=>"
+ },
+ {
+ "content": "/*\n * $0\n */",
+ "name": "Comment (multiline)",
+ "scope": "vala",
+ "tabTrigger": "/*"
+ },
+ {
+ "content": "Console.WriteLine($1);\n$0",
+ "name": "Console.WriteLine (writeline)",
+ "scope": "vala",
+ "tabTrigger": "writeline"
+ },
+ {
+ "content": "[DBus(name = \"$0\")]",
+ "name": "DBus annotation",
+ "scope": "vala",
+ "tabTrigger": "[DBus"
+ },
+ {
+ "content": "delegate ${1:void} ${2:DelegateName}($0);",
+ "name": "delegate",
+ "scope": "vala",
+ "tabTrigger": "delegate"
+ },
+ {
+ "content": "do {\n\t$0\n} while ($1);\n",
+ "name": "do while",
+ "scope": "vala",
+ "tabTrigger": "dowhile"
+ },
+ {
+ "content": "/**\n * $0\n */",
+ "name": "DocBlock",
+ "scope": "vala",
+ "tabTrigger": "/**"
+ },
+ {
+ "content": "else if ($1) {\n\t$0\n}\n",
+ "name": "else if (elseif)",
+ "scope": "vala",
+ "tabTrigger": "elseif"
+ },
+ {
+ "content": "else {\n\t$0\n}",
+ "name": "else",
+ "scope": "vala",
+ "tabTrigger": "else"
+ },
+ {
+ "content": "enum {$1:EnumName} {\n\t$0\n}",
+ "name": "enum",
+ "scope": "vala",
+ "tabTrigger": "enum"
+ },
+ {
+ "content": "public errordomain ${1:Error} {\n\t$0\n}",
+ "name": "error domain",
+ "scope": "vala",
+ "tabTrigger": "errordomain"
+ },
+ {
+ "content": "for ($1;$2;$3) {\n\t$0\n}",
+ "name": "for",
+ "scope": "vala",
+ "tabTrigger": "for"
+ },
+ {
+ "content": "foreach ($1 in $2) {\n\t$0\n}",
+ "name": "foreach",
+ "scope": "vala",
+ "tabTrigger": "foreach"
+ },
+ {
+ "content": "Gee.ArrayList<${1:G}>($0);",
+ "name": "Gee.ArrayList",
+ "scope": "vala",
+ "tabTrigger": "ArrayList"
+ },
+ {
+ "content": "Gee.HashMap<${1:K},${2:V}>($0);",
+ "name": "Gee.HashMap",
+ "scope": "vala",
+ "tabTrigger": "HashMap"
+ },
+ {
+ "content": "Gee.HashSet<${1:G}>($0);",
+ "name": "Gee.HashSet",
+ "scope": "vala",
+ "tabTrigger": "HashSet"
+ },
+ {
+ "content": "if ($1) {\n\t$0\n}",
+ "name": "if",
+ "scope": "vala",
+ "tabTrigger": "if"
+ },
+ {
+ "content": "interface ${1:InterfaceName}{$2: : SuperInterface} {\n\t$0\n}",
+ "name": "interface",
+ "scope": "vala",
+ "tabTrigger": "interface"
+ },
+ {
+ "content": "public static int main(string [] argv) {\n\t${0}\n\treturn 0;\n}",
+ "name": "Main function",
+ "scope": "vala",
+ "tabTrigger": "main"
+ },
+ {
+ "content": "namespace $1 {\n\t$0\n}\n",
+ "name": "namespace (ns)",
+ "scope": "vala",
+ "tabTrigger": "ns"
+ },
+ {
+ "content": "stdout.printf($0);",
+ "name": "printf",
+ "scope": "vala",
+ "tabTrigger": "printf"
+ },
+ {
+ "content": "${1:public} ${2:Type} ${3:Name} {\n\tset {\n\t\t$0\n\t}\n\tget {\n\n\t}\n}",
+ "name": "property (prop)",
+ "scope": "vala",
+ "tabTrigger": "prop"
+ },
+ {
+ "content": "${1:public} ${2:Type} ${3:Name} {\n\tget {\n\t\t$0\n\t}\n}",
+ "name": "read-only property (roprop)",
+ "scope": "vala",
+ "tabTrigger": "roprop"
+ },
+ {
+ "content": "@\"${1:\\$var}\"",
+ "name": "String template (@)",
+ "scope": "vala",
+ "tabTrigger": "@"
+ },
+ {
+ "content": "struct ${1:StructName} {\n\t$0\n}",
+ "name": "struct",
+ "scope": "vala",
+ "tabTrigger": "struct"
+ },
+ {
+ "content": "switch ($1) {\n\t$0\n}",
+ "name": "switch",
+ "scope": "vala",
+ "tabTrigger": "switch"
+ },
+ {
+ "content": "try {\n\t$2\n} catch (${1:Error} e) {\n\t$0\n}",
+ "name": "try/catch",
+ "scope": "vala",
+ "tabTrigger": "try"
+ },
+ {
+ "content": "\"\"\"$0\"\"\";",
+ "name": "Verbatim string (\"\"\")",
+ "scope": "vala",
+ "tabTrigger": "verbatim"
+ },
+ {
+ "content": "while ($1) {\n\t$0\n}",
+ "name": "while",
+ "scope": "vala",
+ "tabTrigger": "while"
+ }
+];
+exports.scope = "";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/vbscript.js b/filemanager/static/filemanager/js/ace/snippets/vbscript.js
new file mode 100755
index 000000000..38ca68fb2
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/vbscript.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/vbscript",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "vbscript";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/velocity.js b/filemanager/static/filemanager/js/ace/snippets/velocity.js
new file mode 100755
index 000000000..e2b12a45e
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/velocity.js
@@ -0,0 +1,36 @@
+ace.define("ace/snippets/velocity",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "# macro\n\
+snippet #macro\n\
+ #macro ( ${1:macroName} ${2:\\$var1, [\\$var2, ...]} )\n\
+ ${3:## macro code}\n\
+ #end\n\
+# foreach\n\
+snippet #foreach\n\
+ #foreach ( ${1:\\$item} in ${2:\\$collection} )\n\
+ ${3:## foreach code}\n\
+ #end\n\
+# if\n\
+snippet #if\n\
+ #if ( ${1:true} )\n\
+ ${0}\n\
+ #end\n\
+# if ... else\n\
+snippet #ife\n\
+ #if ( ${1:true} )\n\
+ ${2}\n\
+ #else\n\
+ ${0}\n\
+ #end\n\
+#import\n\
+snippet #import\n\
+ #import ( \"${1:path/to/velocity/format}\" )\n\
+# set\n\
+snippet #set\n\
+ #set ( $${1:var} = ${0} )\n\
+";
+exports.scope = "velocity";
+exports.includeScopes = ["html", "javascript", "css"];
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/verilog.js b/filemanager/static/filemanager/js/ace/snippets/verilog.js
new file mode 100755
index 000000000..8103ff6f2
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/verilog.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/verilog",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "verilog";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/vhdl.js b/filemanager/static/filemanager/js/ace/snippets/vhdl.js
new file mode 100755
index 000000000..10d8ca09c
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/vhdl.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/vhdl",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "vhdl";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/wollok.js b/filemanager/static/filemanager/js/ace/snippets/wollok.js
new file mode 100755
index 000000000..31e62118d
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/wollok.js
@@ -0,0 +1,91 @@
+ace.define("ace/snippets/wollok",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "##\n\
+## Basic Java packages and import\n\
+snippet im\n\
+ import\n\
+snippet w.l\n\
+ wollok.lang\n\
+snippet w.i\n\
+ wollok.lib\n\
+\n\
+## Class and object\n\
+snippet cl\n\
+ class ${1:`Filename(\"\", \"untitled\")`} ${2}\n\
+snippet obj\n\
+ object ${1:`Filename(\"\", \"untitled\")`} ${2:inherits Parent}${3}\n\
+snippet te\n\
+ test ${1:`Filename(\"\", \"untitled\")`}\n\
+\n\
+##\n\
+## Enhancements\n\
+snippet inh\n\
+ inherits\n\
+\n\
+##\n\
+## Comments\n\
+snippet /*\n\
+ /*\n\
+ * ${1}\n\
+ */\n\
+\n\
+##\n\
+## Control Statements\n\
+snippet el\n\
+ else\n\
+snippet if\n\
+ if (${1}) ${2}\n\
+\n\
+##\n\
+## Create a Method\n\
+snippet m\n\
+ method ${1:method}(${2}) ${5}\n\
+\n\
+## \n\
+## Tests\n\
+snippet as\n\
+ assert.equals(${1:expected}, ${2:actual})\n\
+\n\
+##\n\
+## Exceptions\n\
+snippet ca\n\
+ catch ${1:e} : (${2:Exception} ) ${3}\n\
+snippet thr\n\
+ throw\n\
+snippet try\n\
+ try {\n\
+ ${3}\n\
+ } catch ${1:e} : ${2:Exception} {\n\
+ }\n\
+\n\
+##\n\
+## Javadocs\n\
+snippet /**\n\
+ /**\n\
+ * ${1}\n\
+ */\n\
+\n\
+##\n\
+## Print Methods\n\
+snippet print\n\
+ console.println(\"${1:Message}\")\n\
+\n\
+##\n\
+## Setter and Getter Methods\n\
+snippet set\n\
+ method set${1:}(${2:}) {\n\
+ $1 = $2\n\
+ }\n\
+snippet get\n\
+ method get${1:}() {\n\
+ return ${1:};\n\
+ }\n\
+\n\
+##\n\
+## Terminate Methods or Loops\n\
+snippet re\n\
+ return";
+exports.scope = "wollok";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/xml.js b/filemanager/static/filemanager/js/ace/snippets/xml.js
new file mode 100755
index 000000000..ee4b688a7
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/xml.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/xml",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "xml";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/xquery.js b/filemanager/static/filemanager/js/ace/snippets/xquery.js
new file mode 100755
index 000000000..c880abcf1
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/xquery.js
@@ -0,0 +1,68 @@
+ace.define("ace/snippets/xquery",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText = "snippet for\n\
+ for $${1:item} in ${2:expr}\n\
+snippet return\n\
+ return ${1:expr}\n\
+snippet import\n\
+ import module namespace ${1:ns} = \"${2:http://www.example.com/}\";\n\
+snippet some\n\
+ some $${1:varname} in ${2:expr} satisfies ${3:expr}\n\
+snippet every\n\
+ every $${1:varname} in ${2:expr} satisfies ${3:expr}\n\
+snippet if\n\
+ if(${1:true}) then ${2:expr} else ${3:true}\n\
+snippet switch\n\
+ switch(${1:\"foo\"})\n\
+ case ${2:\"foo\"}\n\
+ return ${3:true}\n\
+ default return ${4:false}\n\
+snippet try\n\
+ try { ${1:expr} } catch ${2:*} { ${3:expr} }\n\
+snippet tumbling\n\
+ for tumbling window $${1:varname} in ${2:expr}\n\
+ start at $${3:start} when ${4:expr}\n\
+ end at $${5:end} when ${6:expr}\n\
+ return ${7:expr}\n\
+snippet sliding\n\
+ for sliding window $${1:varname} in ${2:expr}\n\
+ start at $${3:start} when ${4:expr}\n\
+ end at $${5:end} when ${6:expr}\n\
+ return ${7:expr}\n\
+snippet let\n\
+ let $${1:varname} := ${2:expr}\n\
+snippet group\n\
+ group by $${1:varname} := ${2:expr}\n\
+snippet order\n\
+ order by ${1:expr} ${2:descending}\n\
+snippet stable\n\
+ stable order by ${1:expr}\n\
+snippet count\n\
+ count $${1:varname}\n\
+snippet ordered\n\
+ ordered { ${1:expr} }\n\
+snippet unordered\n\
+ unordered { ${1:expr} }\n\
+snippet treat \n\
+ treat as ${1:expr}\n\
+snippet castable\n\
+ castable as ${1:atomicType}\n\
+snippet cast\n\
+ cast as ${1:atomicType}\n\
+snippet typeswitch\n\
+ typeswitch(${1:expr})\n\
+ case ${2:type} return ${3:expr}\n\
+ default return ${4:expr}\n\
+snippet var\n\
+ declare variable $${1:varname} := ${2:expr};\n\
+snippet fn\n\
+ declare function ${1:ns}:${2:name}(){\n\
+ ${3:expr}\n\
+ };\n\
+snippet module\n\
+ module namespace ${1:ns} = \"${2:http://www.example.com}\";\n\
+";
+exports.scope = "xquery";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/snippets/yaml.js b/filemanager/static/filemanager/js/ace/snippets/yaml.js
new file mode 100755
index 000000000..1adceabee
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/snippets/yaml.js
@@ -0,0 +1,7 @@
+ace.define("ace/snippets/yaml",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.snippetText =undefined;
+exports.scope = "yaml";
+
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-ambiance.js b/filemanager/static/filemanager/js/ace/theme-ambiance.js
new file mode 100755
index 000000000..1e53ecd96
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-ambiance.js
@@ -0,0 +1,182 @@
+ace.define("ace/theme/ambiance",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-ambiance";
+exports.cssText = ".ace-ambiance .ace_gutter {\
+background-color: #3d3d3d;\
+background-image: -moz-linear-gradient(left, #3D3D3D, #333);\
+background-image: -ms-linear-gradient(left, #3D3D3D, #333);\
+background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#3D3D3D), to(#333));\
+background-image: -webkit-linear-gradient(left, #3D3D3D, #333);\
+background-image: -o-linear-gradient(left, #3D3D3D, #333);\
+background-image: linear-gradient(left, #3D3D3D, #333);\
+background-repeat: repeat-x;\
+border-right: 1px solid #4d4d4d;\
+text-shadow: 0px 1px 1px #4d4d4d;\
+color: #222;\
+}\
+.ace-ambiance .ace_gutter-layer {\
+background: repeat left top;\
+}\
+.ace-ambiance .ace_gutter-active-line {\
+background-color: #3F3F3F;\
+}\
+.ace-ambiance .ace_fold-widget {\
+text-align: center;\
+}\
+.ace-ambiance .ace_fold-widget:hover {\
+color: #777;\
+}\
+.ace-ambiance .ace_fold-widget.ace_start,\
+.ace-ambiance .ace_fold-widget.ace_end,\
+.ace-ambiance .ace_fold-widget.ace_closed{\
+background: none;\
+border: none;\
+box-shadow: none;\
+}\
+.ace-ambiance .ace_fold-widget.ace_start:after {\
+content: 'â–¾'\
+}\
+.ace-ambiance .ace_fold-widget.ace_end:after {\
+content: 'â–´'\
+}\
+.ace-ambiance .ace_fold-widget.ace_closed:after {\
+content: '‣'\
+}\
+.ace-ambiance .ace_print-margin {\
+border-left: 1px dotted #2D2D2D;\
+right: 0;\
+background: #262626;\
+}\
+.ace-ambiance .ace_scroller {\
+-webkit-box-shadow: inset 0 0 10px black;\
+-moz-box-shadow: inset 0 0 10px black;\
+-o-box-shadow: inset 0 0 10px black;\
+box-shadow: inset 0 0 10px black;\
+}\
+.ace-ambiance {\
+color: #E6E1DC;\
+background-color: #202020;\
+}\
+.ace-ambiance .ace_cursor {\
+border-left: 1px solid #7991E8;\
+}\
+.ace-ambiance .ace_overwrite-cursors .ace_cursor {\
+border: 1px solid #FFE300;\
+background: #766B13;\
+}\
+.ace-ambiance.normal-mode .ace_cursor-layer {\
+z-index: 0;\
+}\
+.ace-ambiance .ace_marker-layer .ace_selection {\
+background: rgba(221, 240, 255, 0.20);\
+}\
+.ace-ambiance .ace_marker-layer .ace_selected-word {\
+border-radius: 4px;\
+border: 8px solid #3f475d;\
+box-shadow: 0 0 4px black;\
+}\
+.ace-ambiance .ace_marker-layer .ace_step {\
+background: rgb(198, 219, 174);\
+}\
+.ace-ambiance .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(255, 255, 255, 0.25);\
+}\
+.ace-ambiance .ace_marker-layer .ace_active-line {\
+background: rgba(255, 255, 255, 0.031);\
+}\
+.ace-ambiance .ace_invisible {\
+color: #333;\
+}\
+.ace-ambiance .ace_paren {\
+color: #24C2C7;\
+}\
+.ace-ambiance .ace_keyword {\
+color: #cda869;\
+}\
+.ace-ambiance .ace_keyword.ace_operator {\
+color: #fa8d6a;\
+}\
+.ace-ambiance .ace_punctuation.ace_operator {\
+color: #fa8d6a;\
+}\
+.ace-ambiance .ace_identifier {\
+}\
+.ace-ambiance .ace-statement {\
+color: #cda869;\
+}\
+.ace-ambiance .ace_constant {\
+color: #CF7EA9;\
+}\
+.ace-ambiance .ace_constant.ace_language {\
+color: #CF7EA9;\
+}\
+.ace-ambiance .ace_constant.ace_library {\
+}\
+.ace-ambiance .ace_constant.ace_numeric {\
+color: #78CF8A;\
+}\
+.ace-ambiance .ace_invalid {\
+text-decoration: underline;\
+}\
+.ace-ambiance .ace_invalid.ace_illegal {\
+color:#F8F8F8;\
+background-color: rgba(86, 45, 86, 0.75);\
+}\
+.ace-ambiance .ace_invalid,\
+.ace-ambiance .ace_deprecated {\
+text-decoration: underline;\
+font-style: italic;\
+color: #D2A8A1;\
+}\
+.ace-ambiance .ace_support {\
+color: #9B859D;\
+}\
+.ace-ambiance .ace_support.ace_function {\
+color: #DAD085;\
+}\
+.ace-ambiance .ace_function.ace_buildin {\
+color: #9b859d;\
+}\
+.ace-ambiance .ace_string {\
+color: #8f9d6a;\
+}\
+.ace-ambiance .ace_string.ace_regexp {\
+color: #DAD085;\
+}\
+.ace-ambiance .ace_comment {\
+font-style: italic;\
+color: #555;\
+}\
+.ace-ambiance .ace_comment.ace_doc {\
+}\
+.ace-ambiance .ace_comment.ace_doc.ace_tag {\
+color: #666;\
+font-style: normal;\
+}\
+.ace-ambiance .ace_definition,\
+.ace-ambiance .ace_type {\
+color: #aac6e3;\
+}\
+.ace-ambiance .ace_variable {\
+color: #9999cc;\
+}\
+.ace-ambiance .ace_variable.ace_language {\
+color: #9b859d;\
+}\
+.ace-ambiance .ace_xml-pe {\
+color: #494949;\
+}\
+.ace-ambiance .ace_gutter-layer,\
+.ace-ambiance .ace_text-layer {\
+background-image: url(\"data:image/png;base64,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\");\
+}\
+.ace-ambiance .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-chaos.js b/filemanager/static/filemanager/js/ace/theme-chaos.js
new file mode 100755
index 000000000..97ec7fbdc
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-chaos.js
@@ -0,0 +1,156 @@
+ace.define("ace/theme/chaos",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-chaos";
+exports.cssText = ".ace-chaos .ace_gutter {\
+background: #141414;\
+color: #595959;\
+border-right: 1px solid #282828;\
+}\
+.ace-chaos .ace_gutter-cell.ace_warning {\
+background-image: none;\
+background: #FC0;\
+border-left: none;\
+padding-left: 0;\
+color: #000;\
+}\
+.ace-chaos .ace_gutter-cell.ace_error {\
+background-position: -6px center;\
+background-image: none;\
+background: #F10;\
+border-left: none;\
+padding-left: 0;\
+color: #000;\
+}\
+.ace-chaos .ace_print-margin {\
+border-left: 1px solid #555;\
+right: 0;\
+background: #1D1D1D;\
+}\
+.ace-chaos {\
+background-color: #161616;\
+color: #E6E1DC;\
+}\
+.ace-chaos .ace_cursor {\
+border-left: 2px solid #FFFFFF;\
+}\
+.ace-chaos .ace_cursor.ace_overwrite {\
+border-left: 0px;\
+border-bottom: 1px solid #FFFFFF;\
+}\
+.ace-chaos .ace_marker-layer .ace_selection {\
+background: #494836;\
+}\
+.ace-chaos .ace_marker-layer .ace_step {\
+background: rgb(198, 219, 174);\
+}\
+.ace-chaos .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #FCE94F;\
+}\
+.ace-chaos .ace_marker-layer .ace_active-line {\
+background: #333;\
+}\
+.ace-chaos .ace_gutter-active-line {\
+background-color: #222;\
+}\
+.ace-chaos .ace_invisible {\
+color: #404040;\
+}\
+.ace-chaos .ace_keyword {\
+color:#00698F;\
+}\
+.ace-chaos .ace_keyword.ace_operator {\
+color:#FF308F;\
+}\
+.ace-chaos .ace_constant {\
+color:#1EDAFB;\
+}\
+.ace-chaos .ace_constant.ace_language {\
+color:#FDC251;\
+}\
+.ace-chaos .ace_constant.ace_library {\
+color:#8DFF0A;\
+}\
+.ace-chaos .ace_constant.ace_numeric {\
+color:#58C554;\
+}\
+.ace-chaos .ace_invalid {\
+color:#FFFFFF;\
+background-color:#990000;\
+}\
+.ace-chaos .ace_invalid.ace_deprecated {\
+color:#FFFFFF;\
+background-color:#990000;\
+}\
+.ace-chaos .ace_support {\
+color: #999;\
+}\
+.ace-chaos .ace_support.ace_function {\
+color:#00AEEF;\
+}\
+.ace-chaos .ace_function {\
+color:#00AEEF;\
+}\
+.ace-chaos .ace_string {\
+color:#58C554;\
+}\
+.ace-chaos .ace_comment {\
+color:#555;\
+font-style:italic;\
+padding-bottom: 0px;\
+}\
+.ace-chaos .ace_variable {\
+color:#997744;\
+}\
+.ace-chaos .ace_meta.ace_tag {\
+color:#BE53E6;\
+}\
+.ace-chaos .ace_entity.ace_other.ace_attribute-name {\
+color:#FFFF89;\
+}\
+.ace-chaos .ace_markup.ace_underline {\
+text-decoration: underline;\
+}\
+.ace-chaos .ace_fold-widget {\
+text-align: center;\
+}\
+.ace-chaos .ace_fold-widget:hover {\
+color: #777;\
+}\
+.ace-chaos .ace_fold-widget.ace_start,\
+.ace-chaos .ace_fold-widget.ace_end,\
+.ace-chaos .ace_fold-widget.ace_closed{\
+background: none;\
+border: none;\
+box-shadow: none;\
+}\
+.ace-chaos .ace_fold-widget.ace_start:after {\
+content: 'â–¾'\
+}\
+.ace-chaos .ace_fold-widget.ace_end:after {\
+content: 'â–´'\
+}\
+.ace-chaos .ace_fold-widget.ace_closed:after {\
+content: '‣'\
+}\
+.ace-chaos .ace_indent-guide {\
+border-right:1px dotted #333;\
+margin-right:-1px;\
+}\
+.ace-chaos .ace_fold { \
+background: #222; \
+border-radius: 3px; \
+color: #7AF; \
+border: none; \
+}\
+.ace-chaos .ace_fold:hover {\
+background: #CCC; \
+color: #000;\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-chrome.js b/filemanager/static/filemanager/js/ace/theme-chrome.js
new file mode 100755
index 000000000..83742aa46
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-chrome.js
@@ -0,0 +1,128 @@
+ace.define("ace/theme/chrome",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-chrome";
+exports.cssText = ".ace-chrome .ace_gutter {\
+background: #ebebeb;\
+color: #333;\
+overflow : hidden;\
+}\
+.ace-chrome .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8;\
+}\
+.ace-chrome {\
+background-color: #FFFFFF;\
+color: black;\
+}\
+.ace-chrome .ace_cursor {\
+color: black;\
+}\
+.ace-chrome .ace_invisible {\
+color: rgb(191, 191, 191);\
+}\
+.ace-chrome .ace_constant.ace_buildin {\
+color: rgb(88, 72, 246);\
+}\
+.ace-chrome .ace_constant.ace_language {\
+color: rgb(88, 92, 246);\
+}\
+.ace-chrome .ace_constant.ace_library {\
+color: rgb(6, 150, 14);\
+}\
+.ace-chrome .ace_invalid {\
+background-color: rgb(153, 0, 0);\
+color: white;\
+}\
+.ace-chrome .ace_fold {\
+}\
+.ace-chrome .ace_support.ace_function {\
+color: rgb(60, 76, 114);\
+}\
+.ace-chrome .ace_support.ace_constant {\
+color: rgb(6, 150, 14);\
+}\
+.ace-chrome .ace_support.ace_type,\
+.ace-chrome .ace_support.ace_class\
+.ace-chrome .ace_support.ace_other {\
+color: rgb(109, 121, 222);\
+}\
+.ace-chrome .ace_variable.ace_parameter {\
+font-style:italic;\
+color:#FD971F;\
+}\
+.ace-chrome .ace_keyword.ace_operator {\
+color: rgb(104, 118, 135);\
+}\
+.ace-chrome .ace_comment {\
+color: #236e24;\
+}\
+.ace-chrome .ace_comment.ace_doc {\
+color: #236e24;\
+}\
+.ace-chrome .ace_comment.ace_doc.ace_tag {\
+color: #236e24;\
+}\
+.ace-chrome .ace_constant.ace_numeric {\
+color: rgb(0, 0, 205);\
+}\
+.ace-chrome .ace_variable {\
+color: rgb(49, 132, 149);\
+}\
+.ace-chrome .ace_xml-pe {\
+color: rgb(104, 104, 91);\
+}\
+.ace-chrome .ace_entity.ace_name.ace_function {\
+color: #0000A2;\
+}\
+.ace-chrome .ace_heading {\
+color: rgb(12, 7, 255);\
+}\
+.ace-chrome .ace_list {\
+color:rgb(185, 6, 144);\
+}\
+.ace-chrome .ace_marker-layer .ace_selection {\
+background: rgb(181, 213, 255);\
+}\
+.ace-chrome .ace_marker-layer .ace_step {\
+background: rgb(252, 255, 0);\
+}\
+.ace-chrome .ace_marker-layer .ace_stack {\
+background: rgb(164, 229, 101);\
+}\
+.ace-chrome .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgb(192, 192, 192);\
+}\
+.ace-chrome .ace_marker-layer .ace_active-line {\
+background: rgba(0, 0, 0, 0.07);\
+}\
+.ace-chrome .ace_gutter-active-line {\
+background-color : #dcdcdc;\
+}\
+.ace-chrome .ace_marker-layer .ace_selected-word {\
+background: rgb(250, 250, 255);\
+border: 1px solid rgb(200, 200, 250);\
+}\
+.ace-chrome .ace_storage,\
+.ace-chrome .ace_keyword,\
+.ace-chrome .ace_meta.ace_tag {\
+color: rgb(147, 15, 128);\
+}\
+.ace-chrome .ace_string.ace_regex {\
+color: rgb(255, 0, 0)\
+}\
+.ace-chrome .ace_string {\
+color: #1A1AA6;\
+}\
+.ace-chrome .ace_entity.ace_other.ace_attribute-name {\
+color: #994409;\
+}\
+.ace-chrome .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-clouds.js b/filemanager/static/filemanager/js/ace/theme-clouds.js
new file mode 100755
index 000000000..83d0d14d5
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-clouds.js
@@ -0,0 +1,95 @@
+ace.define("ace/theme/clouds",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-clouds";
+exports.cssText = ".ace-clouds .ace_gutter {\
+background: #ebebeb;\
+color: #333\
+}\
+.ace-clouds .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8\
+}\
+.ace-clouds {\
+background-color: #FFFFFF;\
+color: #000000\
+}\
+.ace-clouds .ace_cursor {\
+color: #000000\
+}\
+.ace-clouds .ace_marker-layer .ace_selection {\
+background: #BDD5FC\
+}\
+.ace-clouds.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #FFFFFF;\
+}\
+.ace-clouds .ace_marker-layer .ace_step {\
+background: rgb(255, 255, 0)\
+}\
+.ace-clouds .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #BFBFBF\
+}\
+.ace-clouds .ace_marker-layer .ace_active-line {\
+background: #FFFBD1\
+}\
+.ace-clouds .ace_gutter-active-line {\
+background-color : #dcdcdc\
+}\
+.ace-clouds .ace_marker-layer .ace_selected-word {\
+border: 1px solid #BDD5FC\
+}\
+.ace-clouds .ace_invisible {\
+color: #BFBFBF\
+}\
+.ace-clouds .ace_keyword,\
+.ace-clouds .ace_meta,\
+.ace-clouds .ace_support.ace_constant.ace_property-value {\
+color: #AF956F\
+}\
+.ace-clouds .ace_keyword.ace_operator {\
+color: #484848\
+}\
+.ace-clouds .ace_keyword.ace_other.ace_unit {\
+color: #96DC5F\
+}\
+.ace-clouds .ace_constant.ace_language {\
+color: #39946A\
+}\
+.ace-clouds .ace_constant.ace_numeric {\
+color: #46A609\
+}\
+.ace-clouds .ace_constant.ace_character.ace_entity {\
+color: #BF78CC\
+}\
+.ace-clouds .ace_invalid {\
+background-color: #FF002A\
+}\
+.ace-clouds .ace_fold {\
+background-color: #AF956F;\
+border-color: #000000\
+}\
+.ace-clouds .ace_storage,\
+.ace-clouds .ace_support.ace_class,\
+.ace-clouds .ace_support.ace_function,\
+.ace-clouds .ace_support.ace_other,\
+.ace-clouds .ace_support.ace_type {\
+color: #C52727\
+}\
+.ace-clouds .ace_string {\
+color: #5D90CD\
+}\
+.ace-clouds .ace_comment {\
+color: #BCC8BA\
+}\
+.ace-clouds .ace_entity.ace_name.ace_tag,\
+.ace-clouds .ace_entity.ace_other.ace_attribute-name {\
+color: #606060\
+}\
+.ace-clouds .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-clouds_midnight.js b/filemanager/static/filemanager/js/ace/theme-clouds_midnight.js
new file mode 100755
index 000000000..275e9f296
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-clouds_midnight.js
@@ -0,0 +1,96 @@
+ace.define("ace/theme/clouds_midnight",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-clouds-midnight";
+exports.cssText = ".ace-clouds-midnight .ace_gutter {\
+background: #232323;\
+color: #929292\
+}\
+.ace-clouds-midnight .ace_print-margin {\
+width: 1px;\
+background: #232323\
+}\
+.ace-clouds-midnight {\
+background-color: #191919;\
+color: #929292\
+}\
+.ace-clouds-midnight .ace_cursor {\
+color: #7DA5DC\
+}\
+.ace-clouds-midnight .ace_marker-layer .ace_selection {\
+background: #000000\
+}\
+.ace-clouds-midnight.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #191919;\
+}\
+.ace-clouds-midnight .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-clouds-midnight .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #BFBFBF\
+}\
+.ace-clouds-midnight .ace_marker-layer .ace_active-line {\
+background: rgba(215, 215, 215, 0.031)\
+}\
+.ace-clouds-midnight .ace_gutter-active-line {\
+background-color: rgba(215, 215, 215, 0.031)\
+}\
+.ace-clouds-midnight .ace_marker-layer .ace_selected-word {\
+border: 1px solid #000000\
+}\
+.ace-clouds-midnight .ace_invisible {\
+color: #666\
+}\
+.ace-clouds-midnight .ace_keyword,\
+.ace-clouds-midnight .ace_meta,\
+.ace-clouds-midnight .ace_support.ace_constant.ace_property-value {\
+color: #927C5D\
+}\
+.ace-clouds-midnight .ace_keyword.ace_operator {\
+color: #4B4B4B\
+}\
+.ace-clouds-midnight .ace_keyword.ace_other.ace_unit {\
+color: #366F1A\
+}\
+.ace-clouds-midnight .ace_constant.ace_language {\
+color: #39946A\
+}\
+.ace-clouds-midnight .ace_constant.ace_numeric {\
+color: #46A609\
+}\
+.ace-clouds-midnight .ace_constant.ace_character.ace_entity {\
+color: #A165AC\
+}\
+.ace-clouds-midnight .ace_invalid {\
+color: #FFFFFF;\
+background-color: #E92E2E\
+}\
+.ace-clouds-midnight .ace_fold {\
+background-color: #927C5D;\
+border-color: #929292\
+}\
+.ace-clouds-midnight .ace_storage,\
+.ace-clouds-midnight .ace_support.ace_class,\
+.ace-clouds-midnight .ace_support.ace_function,\
+.ace-clouds-midnight .ace_support.ace_other,\
+.ace-clouds-midnight .ace_support.ace_type {\
+color: #E92E2E\
+}\
+.ace-clouds-midnight .ace_string {\
+color: #5D90CD\
+}\
+.ace-clouds-midnight .ace_comment {\
+color: #3C403B\
+}\
+.ace-clouds-midnight .ace_entity.ace_name.ace_tag,\
+.ace-clouds-midnight .ace_entity.ace_other.ace_attribute-name {\
+color: #606060\
+}\
+.ace-clouds-midnight .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-cobalt.js b/filemanager/static/filemanager/js/ace/theme-cobalt.js
new file mode 100755
index 000000000..c5b6f267c
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-cobalt.js
@@ -0,0 +1,113 @@
+ace.define("ace/theme/cobalt",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-cobalt";
+exports.cssText = ".ace-cobalt .ace_gutter {\
+background: #011e3a;\
+color: rgb(128,145,160)\
+}\
+.ace-cobalt .ace_print-margin {\
+width: 1px;\
+background: #555555\
+}\
+.ace-cobalt {\
+background-color: #002240;\
+color: #FFFFFF\
+}\
+.ace-cobalt .ace_cursor {\
+color: #FFFFFF\
+}\
+.ace-cobalt .ace_marker-layer .ace_selection {\
+background: rgba(179, 101, 57, 0.75)\
+}\
+.ace-cobalt.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #002240;\
+}\
+.ace-cobalt .ace_marker-layer .ace_step {\
+background: rgb(127, 111, 19)\
+}\
+.ace-cobalt .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(255, 255, 255, 0.15)\
+}\
+.ace-cobalt .ace_marker-layer .ace_active-line {\
+background: rgba(0, 0, 0, 0.35)\
+}\
+.ace-cobalt .ace_gutter-active-line {\
+background-color: rgba(0, 0, 0, 0.35)\
+}\
+.ace-cobalt .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(179, 101, 57, 0.75)\
+}\
+.ace-cobalt .ace_invisible {\
+color: rgba(255, 255, 255, 0.15)\
+}\
+.ace-cobalt .ace_keyword,\
+.ace-cobalt .ace_meta {\
+color: #FF9D00\
+}\
+.ace-cobalt .ace_constant,\
+.ace-cobalt .ace_constant.ace_character,\
+.ace-cobalt .ace_constant.ace_character.ace_escape,\
+.ace-cobalt .ace_constant.ace_other {\
+color: #FF628C\
+}\
+.ace-cobalt .ace_invalid {\
+color: #F8F8F8;\
+background-color: #800F00\
+}\
+.ace-cobalt .ace_support {\
+color: #80FFBB\
+}\
+.ace-cobalt .ace_support.ace_constant {\
+color: #EB939A\
+}\
+.ace-cobalt .ace_fold {\
+background-color: #FF9D00;\
+border-color: #FFFFFF\
+}\
+.ace-cobalt .ace_support.ace_function {\
+color: #FFB054\
+}\
+.ace-cobalt .ace_storage {\
+color: #FFEE80\
+}\
+.ace-cobalt .ace_entity {\
+color: #FFDD00\
+}\
+.ace-cobalt .ace_string {\
+color: #3AD900\
+}\
+.ace-cobalt .ace_string.ace_regexp {\
+color: #80FFC2\
+}\
+.ace-cobalt .ace_comment {\
+font-style: italic;\
+color: #0088FF\
+}\
+.ace-cobalt .ace_heading,\
+.ace-cobalt .ace_markup.ace_heading {\
+color: #C8E4FD;\
+background-color: #001221\
+}\
+.ace-cobalt .ace_list,\
+.ace-cobalt .ace_markup.ace_list {\
+background-color: #130D26\
+}\
+.ace-cobalt .ace_variable {\
+color: #CCCCCC\
+}\
+.ace-cobalt .ace_variable.ace_language {\
+color: #FF80E1\
+}\
+.ace-cobalt .ace_meta.ace_tag {\
+color: #9EFFFF\
+}\
+.ace-cobalt .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHCLSvkPAAP3AgSDTRd4AAAAAElFTkSuQmCC) right repeat-y\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-crimson_editor.js b/filemanager/static/filemanager/js/ace/theme-crimson_editor.js
new file mode 100755
index 000000000..a18855252
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-crimson_editor.js
@@ -0,0 +1,118 @@
+ace.define("ace/theme/crimson_editor",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+exports.isDark = false;
+exports.cssText = ".ace-crimson-editor .ace_gutter {\
+background: #ebebeb;\
+color: #333;\
+overflow : hidden;\
+}\
+.ace-crimson-editor .ace_gutter-layer {\
+width: 100%;\
+text-align: right;\
+}\
+.ace-crimson-editor .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8;\
+}\
+.ace-crimson-editor {\
+background-color: #FFFFFF;\
+color: rgb(64, 64, 64);\
+}\
+.ace-crimson-editor .ace_cursor {\
+color: black;\
+}\
+.ace-crimson-editor .ace_invisible {\
+color: rgb(191, 191, 191);\
+}\
+.ace-crimson-editor .ace_identifier {\
+color: black;\
+}\
+.ace-crimson-editor .ace_keyword {\
+color: blue;\
+}\
+.ace-crimson-editor .ace_constant.ace_buildin {\
+color: rgb(88, 72, 246);\
+}\
+.ace-crimson-editor .ace_constant.ace_language {\
+color: rgb(255, 156, 0);\
+}\
+.ace-crimson-editor .ace_constant.ace_library {\
+color: rgb(6, 150, 14);\
+}\
+.ace-crimson-editor .ace_invalid {\
+text-decoration: line-through;\
+color: rgb(224, 0, 0);\
+}\
+.ace-crimson-editor .ace_fold {\
+}\
+.ace-crimson-editor .ace_support.ace_function {\
+color: rgb(192, 0, 0);\
+}\
+.ace-crimson-editor .ace_support.ace_constant {\
+color: rgb(6, 150, 14);\
+}\
+.ace-crimson-editor .ace_support.ace_type,\
+.ace-crimson-editor .ace_support.ace_class {\
+color: rgb(109, 121, 222);\
+}\
+.ace-crimson-editor .ace_keyword.ace_operator {\
+color: rgb(49, 132, 149);\
+}\
+.ace-crimson-editor .ace_string {\
+color: rgb(128, 0, 128);\
+}\
+.ace-crimson-editor .ace_comment {\
+color: rgb(76, 136, 107);\
+}\
+.ace-crimson-editor .ace_comment.ace_doc {\
+color: rgb(0, 102, 255);\
+}\
+.ace-crimson-editor .ace_comment.ace_doc.ace_tag {\
+color: rgb(128, 159, 191);\
+}\
+.ace-crimson-editor .ace_constant.ace_numeric {\
+color: rgb(0, 0, 64);\
+}\
+.ace-crimson-editor .ace_variable {\
+color: rgb(0, 64, 128);\
+}\
+.ace-crimson-editor .ace_xml-pe {\
+color: rgb(104, 104, 91);\
+}\
+.ace-crimson-editor .ace_marker-layer .ace_selection {\
+background: rgb(181, 213, 255);\
+}\
+.ace-crimson-editor .ace_marker-layer .ace_step {\
+background: rgb(252, 255, 0);\
+}\
+.ace-crimson-editor .ace_marker-layer .ace_stack {\
+background: rgb(164, 229, 101);\
+}\
+.ace-crimson-editor .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgb(192, 192, 192);\
+}\
+.ace-crimson-editor .ace_marker-layer .ace_active-line {\
+background: rgb(232, 242, 254);\
+}\
+.ace-crimson-editor .ace_gutter-active-line {\
+background-color : #dcdcdc;\
+}\
+.ace-crimson-editor .ace_meta.ace_tag {\
+color:rgb(28, 2, 255);\
+}\
+.ace-crimson-editor .ace_marker-layer .ace_selected-word {\
+background: rgb(250, 250, 255);\
+border: 1px solid rgb(200, 200, 250);\
+}\
+.ace-crimson-editor .ace_string.ace_regex {\
+color: rgb(192, 0, 192);\
+}\
+.ace-crimson-editor .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
+}";
+
+exports.cssClass = "ace-crimson-editor";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-dawn.js b/filemanager/static/filemanager/js/ace/theme-dawn.js
new file mode 100755
index 000000000..f3c15c92e
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-dawn.js
@@ -0,0 +1,108 @@
+ace.define("ace/theme/dawn",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-dawn";
+exports.cssText = ".ace-dawn .ace_gutter {\
+background: #ebebeb;\
+color: #333\
+}\
+.ace-dawn .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8\
+}\
+.ace-dawn {\
+background-color: #F9F9F9;\
+color: #080808\
+}\
+.ace-dawn .ace_cursor {\
+color: #000000\
+}\
+.ace-dawn .ace_marker-layer .ace_selection {\
+background: rgba(39, 95, 255, 0.30)\
+}\
+.ace-dawn.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #F9F9F9;\
+}\
+.ace-dawn .ace_marker-layer .ace_step {\
+background: rgb(255, 255, 0)\
+}\
+.ace-dawn .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(75, 75, 126, 0.50)\
+}\
+.ace-dawn .ace_marker-layer .ace_active-line {\
+background: rgba(36, 99, 180, 0.12)\
+}\
+.ace-dawn .ace_gutter-active-line {\
+background-color : #dcdcdc\
+}\
+.ace-dawn .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(39, 95, 255, 0.30)\
+}\
+.ace-dawn .ace_invisible {\
+color: rgba(75, 75, 126, 0.50)\
+}\
+.ace-dawn .ace_keyword,\
+.ace-dawn .ace_meta {\
+color: #794938\
+}\
+.ace-dawn .ace_constant,\
+.ace-dawn .ace_constant.ace_character,\
+.ace-dawn .ace_constant.ace_character.ace_escape,\
+.ace-dawn .ace_constant.ace_other {\
+color: #811F24\
+}\
+.ace-dawn .ace_invalid.ace_illegal {\
+text-decoration: underline;\
+font-style: italic;\
+color: #F8F8F8;\
+background-color: #B52A1D\
+}\
+.ace-dawn .ace_invalid.ace_deprecated {\
+text-decoration: underline;\
+font-style: italic;\
+color: #B52A1D\
+}\
+.ace-dawn .ace_support {\
+color: #691C97\
+}\
+.ace-dawn .ace_support.ace_constant {\
+color: #B4371F\
+}\
+.ace-dawn .ace_fold {\
+background-color: #794938;\
+border-color: #080808\
+}\
+.ace-dawn .ace_list,\
+.ace-dawn .ace_markup.ace_list,\
+.ace-dawn .ace_support.ace_function {\
+color: #693A17\
+}\
+.ace-dawn .ace_storage {\
+font-style: italic;\
+color: #A71D5D\
+}\
+.ace-dawn .ace_string {\
+color: #0B6125\
+}\
+.ace-dawn .ace_string.ace_regexp {\
+color: #CF5628\
+}\
+.ace-dawn .ace_comment {\
+font-style: italic;\
+color: #5A525F\
+}\
+.ace-dawn .ace_heading,\
+.ace-dawn .ace_markup.ace_heading {\
+color: #19356D\
+}\
+.ace-dawn .ace_variable {\
+color: #234A97\
+}\
+.ace-dawn .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLh/5+x/AAizA4hxNNsZAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-dracula.js b/filemanager/static/filemanager/js/ace/theme-dracula.js
new file mode 100755
index 000000000..d14b042b7
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-dracula.js
@@ -0,0 +1,121 @@
+ace.define("ace/theme/dracula",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-dracula";
+exports.cssText = "\
+ace-dracula .ace_gutter {\
+background: #282a36;\
+color: rgb(144,145,148)\
+}\
+.ace-dracula .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8\
+}\
+.ace-dracula {\
+background-color: #282a36;\
+color: #f8f8f2\
+}\
+.ace-dracula .ace_cursor {\
+color: #f8f8f0\
+}\
+.ace-dracula .ace_marker-layer .ace_selection {\
+background: #44475a\
+}\
+.ace-dracula.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #282a36;\
+border-radius: 2px\
+}\
+.ace-dracula .ace_marker-layer .ace_step {\
+background: rgb(198, 219, 174)\
+}\
+.ace-dracula .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #3B3A32\
+}\
+.ace-dracula .ace_marker-layer .ace_active-line {\
+background: #44475a\
+}\
+.ace-dracula .ace_gutter-active-line {\
+background-color: #44475a\
+}\
+.ace-dracula .ace_marker-layer .ace_selected-word {\
+border: 1px solid #44475a\
+}\
+.ace-dracula .ace_fold {\
+background-color: #50fa7b;\
+border-color: #f8f8f2\
+}\
+.ace-dracula .ace_keyword {\
+color: #ff79c6\
+}\
+.ace-dracula .ace_constant.ace_language {\
+color: #bd93f9\
+}\
+.ace-dracula .ace_constant.ace_numeric {\
+color: #bd93f9\
+}\
+.ace-dracula .ace_constant.ace_character {\
+color: #bd93f9\
+}\
+.ace-dracula .ace_constant.ace_character.ace_escape {\
+color: #ff79c6\
+}\
+.ace-dracula .ace_constant.ace_other {\
+color: #bd93f9\
+}\
+.ace-dracula .ace_support.ace_function {\
+color: #8be9fd\
+}\
+.ace-dracula .ace_support.ace_constant {\
+color: #6be5fd\
+}\
+.ace-dracula .ace_support.ace_class {\
+font-style: italic;\
+color: #66d9ef\
+}\
+.ace-dracula .ace_support.ace_type {\
+font-style: italic;\
+color: #66d9ef\
+}\
+.ace-dracula .ace_storage {\
+color: #ff79c6\
+}\
+.ace-dracula .ace_storage.ace_type {\
+font-style: italic;\
+color: #8be9fd\
+}\
+.ace-dracula .ace_invalid {\
+color: #F8F8F0;\
+background-color: #ff79c6\
+}\
+.ace-dracula .ace_invalid.ace_deprecated {\
+color: #F8F8F0;\
+background-color: #bd93f9\
+}\
+.ace-dracula .ace_string {\
+color: #f1fa8c\
+}\
+.ace-dracula .ace_comment {\
+color: #6272a4\
+}\
+.ace-dracula .ace_variable {\
+color: #50fa7b\
+}\
+.ace-dracula .ace_variable.ace_parameter {\
+font-style: italic;\
+color: #ffb86c\
+}\
+.ace-dracula .ace_entity.ace_other.ace_attribute-name {\
+color: #50fa7b\
+}\
+.ace-dracula .ace_entity.ace_name.ace_function {\
+color: #50fa7b\
+}\
+.ace-dracula .ace_entity.ace_name.ace_tag {\
+color: #ff79c6\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-dreamweaver.js b/filemanager/static/filemanager/js/ace/theme-dreamweaver.js
new file mode 100755
index 000000000..632b1ea9b
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-dreamweaver.js
@@ -0,0 +1,141 @@
+ace.define("ace/theme/dreamweaver",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+exports.isDark = false;
+exports.cssClass = "ace-dreamweaver";
+exports.cssText = ".ace-dreamweaver .ace_gutter {\
+background: #e8e8e8;\
+color: #333;\
+}\
+.ace-dreamweaver .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8;\
+}\
+.ace-dreamweaver {\
+background-color: #FFFFFF;\
+color: black;\
+}\
+.ace-dreamweaver .ace_fold {\
+background-color: #757AD8;\
+}\
+.ace-dreamweaver .ace_cursor {\
+color: black;\
+}\
+.ace-dreamweaver .ace_invisible {\
+color: rgb(191, 191, 191);\
+}\
+.ace-dreamweaver .ace_storage,\
+.ace-dreamweaver .ace_keyword {\
+color: blue;\
+}\
+.ace-dreamweaver .ace_constant.ace_buildin {\
+color: rgb(88, 72, 246);\
+}\
+.ace-dreamweaver .ace_constant.ace_language {\
+color: rgb(88, 92, 246);\
+}\
+.ace-dreamweaver .ace_constant.ace_library {\
+color: rgb(6, 150, 14);\
+}\
+.ace-dreamweaver .ace_invalid {\
+background-color: rgb(153, 0, 0);\
+color: white;\
+}\
+.ace-dreamweaver .ace_support.ace_function {\
+color: rgb(60, 76, 114);\
+}\
+.ace-dreamweaver .ace_support.ace_constant {\
+color: rgb(6, 150, 14);\
+}\
+.ace-dreamweaver .ace_support.ace_type,\
+.ace-dreamweaver .ace_support.ace_class {\
+color: #009;\
+}\
+.ace-dreamweaver .ace_support.ace_php_tag {\
+color: #f00;\
+}\
+.ace-dreamweaver .ace_keyword.ace_operator {\
+color: rgb(104, 118, 135);\
+}\
+.ace-dreamweaver .ace_string {\
+color: #00F;\
+}\
+.ace-dreamweaver .ace_comment {\
+color: rgb(76, 136, 107);\
+}\
+.ace-dreamweaver .ace_comment.ace_doc {\
+color: rgb(0, 102, 255);\
+}\
+.ace-dreamweaver .ace_comment.ace_doc.ace_tag {\
+color: rgb(128, 159, 191);\
+}\
+.ace-dreamweaver .ace_constant.ace_numeric {\
+color: rgb(0, 0, 205);\
+}\
+.ace-dreamweaver .ace_variable {\
+color: #06F\
+}\
+.ace-dreamweaver .ace_xml-pe {\
+color: rgb(104, 104, 91);\
+}\
+.ace-dreamweaver .ace_entity.ace_name.ace_function {\
+color: #00F;\
+}\
+.ace-dreamweaver .ace_heading {\
+color: rgb(12, 7, 255);\
+}\
+.ace-dreamweaver .ace_list {\
+color:rgb(185, 6, 144);\
+}\
+.ace-dreamweaver .ace_marker-layer .ace_selection {\
+background: rgb(181, 213, 255);\
+}\
+.ace-dreamweaver .ace_marker-layer .ace_step {\
+background: rgb(252, 255, 0);\
+}\
+.ace-dreamweaver .ace_marker-layer .ace_stack {\
+background: rgb(164, 229, 101);\
+}\
+.ace-dreamweaver .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgb(192, 192, 192);\
+}\
+.ace-dreamweaver .ace_marker-layer .ace_active-line {\
+background: rgba(0, 0, 0, 0.07);\
+}\
+.ace-dreamweaver .ace_gutter-active-line {\
+background-color : #DCDCDC;\
+}\
+.ace-dreamweaver .ace_marker-layer .ace_selected-word {\
+background: rgb(250, 250, 255);\
+border: 1px solid rgb(200, 200, 250);\
+}\
+.ace-dreamweaver .ace_meta.ace_tag {\
+color:#009;\
+}\
+.ace-dreamweaver .ace_meta.ace_tag.ace_anchor {\
+color:#060;\
+}\
+.ace-dreamweaver .ace_meta.ace_tag.ace_form {\
+color:#F90;\
+}\
+.ace-dreamweaver .ace_meta.ace_tag.ace_image {\
+color:#909;\
+}\
+.ace-dreamweaver .ace_meta.ace_tag.ace_script {\
+color:#900;\
+}\
+.ace-dreamweaver .ace_meta.ace_tag.ace_style {\
+color:#909;\
+}\
+.ace-dreamweaver .ace_meta.ace_tag.ace_table {\
+color:#099;\
+}\
+.ace-dreamweaver .ace_string.ace_regex {\
+color: rgb(255, 0, 0)\
+}\
+.ace-dreamweaver .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-eclipse.js b/filemanager/static/filemanager/js/ace/theme-eclipse.js
new file mode 100755
index 000000000..63aa334cf
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-eclipse.js
@@ -0,0 +1,98 @@
+ace.define("ace/theme/eclipse",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+"use strict";
+
+exports.isDark = false;
+exports.cssText = ".ace-eclipse .ace_gutter {\
+background: #ebebeb;\
+border-right: 1px solid rgb(159, 159, 159);\
+color: rgb(136, 136, 136);\
+}\
+.ace-eclipse .ace_print-margin {\
+width: 1px;\
+background: #ebebeb;\
+}\
+.ace-eclipse {\
+background-color: #FFFFFF;\
+color: black;\
+}\
+.ace-eclipse .ace_fold {\
+background-color: rgb(60, 76, 114);\
+}\
+.ace-eclipse .ace_cursor {\
+color: black;\
+}\
+.ace-eclipse .ace_storage,\
+.ace-eclipse .ace_keyword,\
+.ace-eclipse .ace_variable {\
+color: rgb(127, 0, 85);\
+}\
+.ace-eclipse .ace_constant.ace_buildin {\
+color: rgb(88, 72, 246);\
+}\
+.ace-eclipse .ace_constant.ace_library {\
+color: rgb(6, 150, 14);\
+}\
+.ace-eclipse .ace_function {\
+color: rgb(60, 76, 114);\
+}\
+.ace-eclipse .ace_string {\
+color: rgb(42, 0, 255);\
+}\
+.ace-eclipse .ace_comment {\
+color: rgb(113, 150, 130);\
+}\
+.ace-eclipse .ace_comment.ace_doc {\
+color: rgb(63, 95, 191);\
+}\
+.ace-eclipse .ace_comment.ace_doc.ace_tag {\
+color: rgb(127, 159, 191);\
+}\
+.ace-eclipse .ace_constant.ace_numeric {\
+color: darkblue;\
+}\
+.ace-eclipse .ace_tag {\
+color: rgb(25, 118, 116);\
+}\
+.ace-eclipse .ace_type {\
+color: rgb(127, 0, 127);\
+}\
+.ace-eclipse .ace_xml-pe {\
+color: rgb(104, 104, 91);\
+}\
+.ace-eclipse .ace_marker-layer .ace_selection {\
+background: rgb(181, 213, 255);\
+}\
+.ace-eclipse .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgb(192, 192, 192);\
+}\
+.ace-eclipse .ace_meta.ace_tag {\
+color:rgb(25, 118, 116);\
+}\
+.ace-eclipse .ace_invisible {\
+color: #ddd;\
+}\
+.ace-eclipse .ace_entity.ace_other.ace_attribute-name {\
+color:rgb(127, 0, 127);\
+}\
+.ace-eclipse .ace_marker-layer .ace_step {\
+background: rgb(255, 255, 0);\
+}\
+.ace-eclipse .ace_active-line {\
+background: rgb(232, 242, 254);\
+}\
+.ace-eclipse .ace_gutter-active-line {\
+background-color : #DADADA;\
+}\
+.ace-eclipse .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgb(181, 213, 255);\
+}\
+.ace-eclipse .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
+}";
+
+exports.cssClass = "ace-eclipse";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-github.js b/filemanager/static/filemanager/js/ace/theme-github.js
new file mode 100755
index 000000000..d19512c6e
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-github.js
@@ -0,0 +1,103 @@
+ace.define("ace/theme/github",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-github";
+exports.cssText = "\
+.ace-github .ace_gutter {\
+background: #e8e8e8;\
+color: #AAA;\
+}\
+.ace-github {\
+background: #fff;\
+color: #000;\
+}\
+.ace-github .ace_keyword {\
+font-weight: bold;\
+}\
+.ace-github .ace_string {\
+color: #D14;\
+}\
+.ace-github .ace_variable.ace_class {\
+color: teal;\
+}\
+.ace-github .ace_constant.ace_numeric {\
+color: #099;\
+}\
+.ace-github .ace_constant.ace_buildin {\
+color: #0086B3;\
+}\
+.ace-github .ace_support.ace_function {\
+color: #0086B3;\
+}\
+.ace-github .ace_comment {\
+color: #998;\
+font-style: italic;\
+}\
+.ace-github .ace_variable.ace_language {\
+color: #0086B3;\
+}\
+.ace-github .ace_paren {\
+font-weight: bold;\
+}\
+.ace-github .ace_boolean {\
+font-weight: bold;\
+}\
+.ace-github .ace_string.ace_regexp {\
+color: #009926;\
+font-weight: normal;\
+}\
+.ace-github .ace_variable.ace_instance {\
+color: teal;\
+}\
+.ace-github .ace_constant.ace_language {\
+font-weight: bold;\
+}\
+.ace-github .ace_cursor {\
+color: black;\
+}\
+.ace-github.ace_focus .ace_marker-layer .ace_active-line {\
+background: rgb(255, 255, 204);\
+}\
+.ace-github .ace_marker-layer .ace_active-line {\
+background: rgb(245, 245, 245);\
+}\
+.ace-github .ace_marker-layer .ace_selection {\
+background: rgb(181, 213, 255);\
+}\
+.ace-github.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px white;\
+}\
+.ace-github.ace_nobold .ace_line > span {\
+font-weight: normal !important;\
+}\
+.ace-github .ace_marker-layer .ace_step {\
+background: rgb(252, 255, 0);\
+}\
+.ace-github .ace_marker-layer .ace_stack {\
+background: rgb(164, 229, 101);\
+}\
+.ace-github .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgb(192, 192, 192);\
+}\
+.ace-github .ace_gutter-active-line {\
+background-color : rgba(0, 0, 0, 0.07);\
+}\
+.ace-github .ace_marker-layer .ace_selected-word {\
+background: rgb(250, 250, 255);\
+border: 1px solid rgb(200, 200, 250);\
+}\
+.ace-github .ace_invisible {\
+color: #BFBFBF\
+}\
+.ace-github .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8;\
+}\
+.ace-github .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
+}";
+
+ var dom = require("../lib/dom");
+ dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-gob.js b/filemanager/static/filemanager/js/ace/theme-gob.js
new file mode 100755
index 000000000..9023fba68
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-gob.js
@@ -0,0 +1,112 @@
+ace.define("ace/theme/gob",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-gob";
+exports.cssText = ".ace-gob .ace_gutter {\
+background: #0B1818;\
+color: #03EE03\
+}\
+.ace-gob .ace_print-margin {\
+width: 1px;\
+background: #131313\
+}\
+.ace-gob {\
+background-color: #0B0B0B;\
+color: #00FF00\
+}\
+.ace-gob .ace_cursor {\
+border-color: rgba(16, 248, 255, 0.90);\
+background-color: rgba(16, 240, 248, 0.70);\
+opacity: 0.4;\
+}\
+.ace-gob .ace_marker-layer .ace_selection {\
+background: rgba(221, 240, 255, 0.20)\
+}\
+.ace-gob.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #141414;\
+}\
+.ace-gob .ace_marker-layer .ace_step {\
+background: rgb(16, 128, 0)\
+}\
+.ace-gob .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(64, 255, 255, 0.25)\
+}\
+.ace-gob .ace_marker-layer .ace_active-line {\
+background: rgba(255, 255, 255, 0.04)\
+}\
+.ace-gob .ace_gutter-active-line {\
+background-color: rgba(255, 255, 255, 0.04)\
+}\
+.ace-gob .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(192, 240, 255, 0.20)\
+}\
+.ace-gob .ace_invisible {\
+color: rgba(255, 255, 255, 0.25)\
+}\
+.ace-gob .ace_keyword,\
+.ace-gob .ace_meta {\
+color: #10D8E8\
+}\
+.ace-gob .ace_constant,\
+.ace-gob .ace_constant.ace_character,\
+.ace-gob .ace_constant.ace_character.ace_escape,\
+.ace-gob .ace_constant.ace_other,\
+.ace-gob .ace_heading,\
+.ace-gob .ace_markup.ace_heading,\
+.ace-gob .ace_support.ace_constant {\
+color: #10F0A0\
+}\
+.ace-gob .ace_invalid.ace_illegal {\
+color: #F8F8F8;\
+background-color: rgba(86, 45, 86, 0.75)\
+}\
+.ace-gob .ace_invalid.ace_deprecated {\
+text-decoration: underline;\
+font-style: italic;\
+color: #20F8C0\
+}\
+.ace-gob .ace_support {\
+color: #20E8B0\
+}\
+.ace-gob .ace_fold {\
+background-color: #50B8B8;\
+border-color: #70F8F8\
+}\
+.ace-gob .ace_support.ace_function {\
+color: #00F800\
+}\
+.ace-gob .ace_list,\
+.ace-gob .ace_markup.ace_list,\
+.ace-gob .ace_storage {\
+color: #10FF98\
+}\
+.ace-gob .ace_entity.ace_name.ace_function,\
+.ace-gob .ace_meta.ace_tag,\
+.ace-gob .ace_variable {\
+color: #00F868\
+}\
+.ace-gob .ace_string {\
+color: #10F060\
+}\
+.ace-gob .ace_string.ace_regexp {\
+color: #20F090;\
+}\
+.ace-gob .ace_comment {\
+font-style: italic;\
+color: #00E060;\
+}\
+.ace-gob .ace_variable {\
+color: #00F888;\
+}\
+.ace-gob .ace_xml-pe {\
+color: #488858;\
+}\
+.ace-gob .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-gruvbox.js b/filemanager/static/filemanager/js/ace/theme-gruvbox.js
new file mode 100755
index 000000000..133ca6410
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-gruvbox.js
@@ -0,0 +1,82 @@
+ace.define("ace/theme/gruvbox",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-gruvbox";
+exports.cssText = ".ace-gruvbox .ace_gutter-active-line {\
+background-color: #3C3836;\
+}\
+.ace-gruvbox {\
+color: #EBDAB4;\
+background-color: #1D2021;\
+}\
+.ace-gruvbox .ace_invisible {\
+color: #504945;\
+}\
+.ace-gruvbox .ace_marker-layer .ace_selection {\
+background: rgba(179, 101, 57, 0.75)\
+}\
+.ace-gruvbox.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #002240;\
+}\
+.ace-gruvbox .ace_keyword {\
+color: #8ec07c;\
+}\
+.ace-gruvbox .ace_comment {\
+font-style: italic;\
+color: #928375;\
+}\
+.ace-gruvbox .ace-statement {\
+color: red;\
+}\
+.ace-gruvbox .ace_variable {\
+color: #84A598;\
+}\
+.ace-gruvbox .ace_variable.ace_language {\
+color: #D2879B;\
+}\
+.ace-gruvbox .ace_constant {\
+color: #C2859A;\
+}\
+.ace-gruvbox .ace_constant.ace_language {\
+color: #C2859A;\
+}\
+.ace-gruvbox .ace_constant.ace_numeric {\
+color: #C2859A;\
+}\
+.ace-gruvbox .ace_string {\
+color: #B8BA37;\
+}\
+.ace-gruvbox .ace_support {\
+color: #F9BC41;\
+}\
+.ace-gruvbox .ace_support.ace_function {\
+color: #F84B3C;\
+}\
+.ace-gruvbox .ace_storage {\
+color: #8FBF7F;\
+}\
+.ace-gruvbox .ace_keyword.ace_operator {\
+color: #EBDAB4;\
+}\
+.ace-gruvbox .ace_punctuation.ace_operator {\
+color: yellow;\
+}\
+.ace-gruvbox .ace_marker-layer .ace_active-line {\
+background: #3C3836;\
+}\
+.ace-gruvbox .ace_marker-layer .ace_selected-word {\
+border-radius: 4px;\
+border: 8px solid #3f475d;\
+}\
+.ace-gruvbox .ace_print-margin {\
+width: 5px;\
+background: #3C3836;\
+}\
+.ace-gruvbox .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQUFD4z6Crq/sfAAuYAuYl+7lfAAAAAElFTkSuQmCC\") right repeat-y;\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-idle_fingers.js b/filemanager/static/filemanager/js/ace/theme-idle_fingers.js
new file mode 100755
index 000000000..7fcf1cbdb
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-idle_fingers.js
@@ -0,0 +1,96 @@
+ace.define("ace/theme/idle_fingers",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-idle-fingers";
+exports.cssText = ".ace-idle-fingers .ace_gutter {\
+background: #3b3b3b;\
+color: rgb(153,153,153)\
+}\
+.ace-idle-fingers .ace_print-margin {\
+width: 1px;\
+background: #3b3b3b\
+}\
+.ace-idle-fingers {\
+background-color: #323232;\
+color: #FFFFFF\
+}\
+.ace-idle-fingers .ace_cursor {\
+color: #91FF00\
+}\
+.ace-idle-fingers .ace_marker-layer .ace_selection {\
+background: rgba(90, 100, 126, 0.88)\
+}\
+.ace-idle-fingers.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #323232;\
+}\
+.ace-idle-fingers .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-idle-fingers .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #404040\
+}\
+.ace-idle-fingers .ace_marker-layer .ace_active-line {\
+background: #353637\
+}\
+.ace-idle-fingers .ace_gutter-active-line {\
+background-color: #353637\
+}\
+.ace-idle-fingers .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(90, 100, 126, 0.88)\
+}\
+.ace-idle-fingers .ace_invisible {\
+color: #404040\
+}\
+.ace-idle-fingers .ace_keyword,\
+.ace-idle-fingers .ace_meta {\
+color: #CC7833\
+}\
+.ace-idle-fingers .ace_constant,\
+.ace-idle-fingers .ace_constant.ace_character,\
+.ace-idle-fingers .ace_constant.ace_character.ace_escape,\
+.ace-idle-fingers .ace_constant.ace_other,\
+.ace-idle-fingers .ace_support.ace_constant {\
+color: #6C99BB\
+}\
+.ace-idle-fingers .ace_invalid {\
+color: #FFFFFF;\
+background-color: #FF0000\
+}\
+.ace-idle-fingers .ace_fold {\
+background-color: #CC7833;\
+border-color: #FFFFFF\
+}\
+.ace-idle-fingers .ace_support.ace_function {\
+color: #B83426\
+}\
+.ace-idle-fingers .ace_variable.ace_parameter {\
+font-style: italic\
+}\
+.ace-idle-fingers .ace_string {\
+color: #A5C261\
+}\
+.ace-idle-fingers .ace_string.ace_regexp {\
+color: #CCCC33\
+}\
+.ace-idle-fingers .ace_comment {\
+font-style: italic;\
+color: #BC9458\
+}\
+.ace-idle-fingers .ace_meta.ace_tag {\
+color: #FFE5BB\
+}\
+.ace-idle-fingers .ace_entity.ace_name {\
+color: #FFC66D\
+}\
+.ace-idle-fingers .ace_collab.ace_user1 {\
+color: #323232;\
+background-color: #FFF980\
+}\
+.ace-idle-fingers .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMwMjLyZYiPj/8PAAreAwAI1+g0AAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-iplastic.js b/filemanager/static/filemanager/js/ace/theme-iplastic.js
new file mode 100755
index 000000000..593aa00ed
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-iplastic.js
@@ -0,0 +1,121 @@
+ace.define("ace/theme/iplastic",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-iplastic";
+exports.cssText = ".ace-iplastic .ace_gutter {\
+background: #dddddd;\
+color: #666666\
+}\
+.ace-iplastic .ace_print-margin {\
+width: 1px;\
+background: #bbbbbb\
+}\
+.ace-iplastic {\
+background-color: #eeeeee;\
+color: #333333\
+}\
+.ace-iplastic .ace_cursor {\
+color: #333\
+}\
+.ace-iplastic .ace_marker-layer .ace_selection {\
+background: #BAD6FD;\
+}\
+.ace-iplastic.ace_multiselect .ace_selection.ace_start {\
+border-radius: 4px\
+}\
+.ace-iplastic .ace_marker-layer .ace_step {\
+background: #444444\
+}\
+.ace-iplastic .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #49483E;\
+background: #FFF799\
+}\
+.ace-iplastic .ace_marker-layer .ace_active-line {\
+background: #e5e5e5\
+}\
+.ace-iplastic .ace_gutter-active-line {\
+background-color: #eeeeee\
+}\
+.ace-iplastic .ace_marker-layer .ace_selected-word {\
+border: 1px solid #555555;\
+border-radius:4px\
+}\
+.ace-iplastic .ace_invisible {\
+color: #999999\
+}\
+.ace-iplastic .ace_entity.ace_name.ace_tag,\
+.ace-iplastic .ace_keyword,\
+.ace-iplastic .ace_meta.ace_tag,\
+.ace-iplastic .ace_storage {\
+color: #0000FF\
+}\
+.ace-iplastic .ace_punctuation,\
+.ace-iplastic .ace_punctuation.ace_tag {\
+color: #000\
+}\
+.ace-iplastic .ace_constant {\
+color: #333333;\
+font-weight: 700\
+}\
+.ace-iplastic .ace_constant.ace_character,\
+.ace-iplastic .ace_constant.ace_language,\
+.ace-iplastic .ace_constant.ace_numeric,\
+.ace-iplastic .ace_constant.ace_other {\
+color: #0066FF;\
+font-weight: 700\
+}\
+.ace-iplastic .ace_constant.ace_numeric{\
+font-weight: 100\
+}\
+.ace-iplastic .ace_invalid {\
+color: #F8F8F0;\
+background-color: #F92672\
+}\
+.ace-iplastic .ace_invalid.ace_deprecated {\
+color: #F8F8F0;\
+background-color: #AE81FF\
+}\
+.ace-iplastic .ace_support.ace_constant,\
+.ace-iplastic .ace_support.ace_function {\
+color: #333333;\
+font-weight: 700\
+}\
+.ace-iplastic .ace_fold {\
+background-color: #464646;\
+border-color: #F8F8F2\
+}\
+.ace-iplastic .ace_storage.ace_type,\
+.ace-iplastic .ace_support.ace_class,\
+.ace-iplastic .ace_support.ace_type {\
+color: #3333fc;\
+font-weight: 700\
+}\
+.ace-iplastic .ace_entity.ace_name.ace_function,\
+.ace-iplastic .ace_entity.ace_other,\
+.ace-iplastic .ace_entity.ace_other.ace_attribute-name,\
+.ace-iplastic .ace_variable {\
+color: #3366cc;\
+font-style: italic\
+}\
+.ace-iplastic .ace_variable.ace_parameter {\
+font-style: italic;\
+color: #2469E0\
+}\
+.ace-iplastic .ace_string {\
+color: #a55f03\
+}\
+.ace-iplastic .ace_comment {\
+color: #777777;\
+font-style: italic\
+}\
+.ace-iplastic .ace_fold-widget {\
+background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==);\
+}\
+.ace-iplastic .ace_indent-guide {\
+background: url(data:image/png;base64,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) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-katzenmilch.js b/filemanager/static/filemanager/js/ace/theme-katzenmilch.js
new file mode 100755
index 000000000..f65ce4a81
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-katzenmilch.js
@@ -0,0 +1,121 @@
+ace.define("ace/theme/katzenmilch",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-katzenmilch";
+exports.cssText = ".ace-katzenmilch .ace_gutter,\
+.ace-katzenmilch .ace_gutter {\
+background: #e8e8e8;\
+color: #333\
+}\
+.ace-katzenmilch .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8\
+}\
+.ace-katzenmilch {\
+background-color: #f3f2f3;\
+color: rgba(15, 0, 9, 1.0)\
+}\
+.ace-katzenmilch .ace_cursor {\
+border-left: 2px solid #100011\
+}\
+.ace-katzenmilch .ace_overwrite-cursors .ace_cursor {\
+border-left: 0px;\
+border-bottom: 1px solid #100011\
+}\
+.ace-katzenmilch .ace_marker-layer .ace_selection {\
+background: rgba(100, 5, 208, 0.27)\
+}\
+.ace-katzenmilch.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #f3f2f3;\
+}\
+.ace-katzenmilch .ace_marker-layer .ace_step {\
+background: rgb(198, 219, 174)\
+}\
+.ace-katzenmilch .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(0, 0, 0, 0.33);\
+}\
+.ace-katzenmilch .ace_marker-layer .ace_active-line {\
+background: rgb(232, 242, 254)\
+}\
+.ace-katzenmilch .ace_gutter-active-line {\
+background-color: rgb(232, 242, 254)\
+}\
+.ace-katzenmilch .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(100, 5, 208, 0.27)\
+}\
+.ace-katzenmilch .ace_invisible {\
+color: #BFBFBF\
+}\
+.ace-katzenmilch .ace_fold {\
+background-color: rgba(2, 95, 73, 0.97);\
+border-color: rgba(15, 0, 9, 1.0)\
+}\
+.ace-katzenmilch .ace_keyword {\
+color: #674Aa8;\
+rbackground-color: rgba(163, 170, 216, 0.055)\
+}\
+.ace-katzenmilch .ace_constant.ace_language {\
+color: #7D7e52;\
+rbackground-color: rgba(189, 190, 130, 0.059)\
+}\
+.ace-katzenmilch .ace_constant.ace_numeric {\
+color: rgba(79, 130, 123, 0.93);\
+rbackground-color: rgba(119, 194, 187, 0.059)\
+}\
+.ace-katzenmilch .ace_constant.ace_character,\
+.ace-katzenmilch .ace_constant.ace_other {\
+color: rgba(2, 95, 105, 1.0);\
+rbackground-color: rgba(127, 34, 153, 0.063)\
+}\
+.ace-katzenmilch .ace_support.ace_function {\
+color: #9D7e62;\
+rbackground-color: rgba(189, 190, 130, 0.039)\
+}\
+.ace-katzenmilch .ace_support.ace_class {\
+color: rgba(239, 106, 167, 1.0);\
+rbackground-color: rgba(239, 106, 167, 0.063)\
+}\
+.ace-katzenmilch .ace_storage {\
+color: rgba(123, 92, 191, 1.0);\
+rbackground-color: rgba(139, 93, 223, 0.051)\
+}\
+.ace-katzenmilch .ace_invalid {\
+color: #DFDFD5;\
+rbackground-color: #CC1B27\
+}\
+.ace-katzenmilch .ace_string {\
+color: #5a5f9b;\
+rbackground-color: rgba(170, 175, 219, 0.035)\
+}\
+.ace-katzenmilch .ace_comment {\
+font-style: italic;\
+color: rgba(64, 79, 80, 0.67);\
+rbackground-color: rgba(95, 15, 255, 0.0078)\
+}\
+.ace-katzenmilch .ace_entity.ace_name.ace_function,\
+.ace-katzenmilch .ace_variable {\
+color: rgba(2, 95, 73, 0.97);\
+rbackground-color: rgba(34, 255, 73, 0.12)\
+}\
+.ace-katzenmilch .ace_variable.ace_language {\
+color: #316fcf;\
+rbackground-color: rgba(58, 175, 255, 0.039)\
+}\
+.ace-katzenmilch .ace_variable.ace_parameter {\
+font-style: italic;\
+color: rgba(51, 150, 159, 0.87);\
+rbackground-color: rgba(5, 214, 249, 0.043)\
+}\
+.ace-katzenmilch .ace_entity.ace_other.ace_attribute-name {\
+color: rgba(73, 70, 194, 0.93);\
+rbackground-color: rgba(73, 134, 194, 0.035)\
+}\
+.ace-katzenmilch .ace_entity.ace_name.ace_tag {\
+color: #3976a2;\
+rbackground-color: rgba(73, 166, 210, 0.039)\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-kr_theme.js b/filemanager/static/filemanager/js/ace/theme-kr_theme.js
new file mode 100755
index 000000000..8818b33e7
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-kr_theme.js
@@ -0,0 +1,104 @@
+ace.define("ace/theme/kr_theme",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-kr-theme";
+exports.cssText = ".ace-kr-theme .ace_gutter {\
+background: #1c1917;\
+color: #FCFFE0\
+}\
+.ace-kr-theme .ace_print-margin {\
+width: 1px;\
+background: #1c1917\
+}\
+.ace-kr-theme {\
+background-color: #0B0A09;\
+color: #FCFFE0\
+}\
+.ace-kr-theme .ace_cursor {\
+color: #FF9900\
+}\
+.ace-kr-theme .ace_marker-layer .ace_selection {\
+background: rgba(170, 0, 255, 0.45)\
+}\
+.ace-kr-theme.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #0B0A09;\
+}\
+.ace-kr-theme .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-kr-theme .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(255, 177, 111, 0.32)\
+}\
+.ace-kr-theme .ace_marker-layer .ace_active-line {\
+background: #38403D\
+}\
+.ace-kr-theme .ace_gutter-active-line {\
+background-color : #38403D\
+}\
+.ace-kr-theme .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(170, 0, 255, 0.45)\
+}\
+.ace-kr-theme .ace_invisible {\
+color: rgba(255, 177, 111, 0.32)\
+}\
+.ace-kr-theme .ace_keyword,\
+.ace-kr-theme .ace_meta {\
+color: #949C8B\
+}\
+.ace-kr-theme .ace_constant,\
+.ace-kr-theme .ace_constant.ace_character,\
+.ace-kr-theme .ace_constant.ace_character.ace_escape,\
+.ace-kr-theme .ace_constant.ace_other {\
+color: rgba(210, 117, 24, 0.76)\
+}\
+.ace-kr-theme .ace_invalid {\
+color: #F8F8F8;\
+background-color: #A41300\
+}\
+.ace-kr-theme .ace_support {\
+color: #9FC28A\
+}\
+.ace-kr-theme .ace_support.ace_constant {\
+color: #C27E66\
+}\
+.ace-kr-theme .ace_fold {\
+background-color: #949C8B;\
+border-color: #FCFFE0\
+}\
+.ace-kr-theme .ace_support.ace_function {\
+color: #85873A\
+}\
+.ace-kr-theme .ace_storage {\
+color: #FFEE80\
+}\
+.ace-kr-theme .ace_string {\
+color: rgba(164, 161, 181, 0.8)\
+}\
+.ace-kr-theme .ace_string.ace_regexp {\
+color: rgba(125, 255, 192, 0.65)\
+}\
+.ace-kr-theme .ace_comment {\
+font-style: italic;\
+color: #706D5B\
+}\
+.ace-kr-theme .ace_variable {\
+color: #D1A796\
+}\
+.ace-kr-theme .ace_list,\
+.ace-kr-theme .ace_markup.ace_list {\
+background-color: #0F0040\
+}\
+.ace-kr-theme .ace_variable.ace_language {\
+color: #FF80E1\
+}\
+.ace-kr-theme .ace_meta.ace_tag {\
+color: #BABD9C\
+}\
+.ace-kr-theme .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-kuroir.js b/filemanager/static/filemanager/js/ace/theme-kuroir.js
new file mode 100755
index 000000000..30e0a8bb3
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-kuroir.js
@@ -0,0 +1,61 @@
+ace.define("ace/theme/kuroir",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-kuroir";
+exports.cssText = "\
+.ace-kuroir .ace_gutter {\
+background: #e8e8e8;\
+color: #333;\
+}\
+.ace-kuroir .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8;\
+}\
+.ace-kuroir {\
+background-color: #E8E9E8;\
+color: #363636;\
+}\
+.ace-kuroir .ace_cursor {\
+color: #202020;\
+}\
+.ace-kuroir .ace_marker-layer .ace_selection {\
+background: rgba(245, 170, 0, 0.57);\
+}\
+.ace-kuroir.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #E8E9E8;\
+}\
+.ace-kuroir .ace_marker-layer .ace_step {\
+background: rgb(198, 219, 174);\
+}\
+.ace-kuroir .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(0, 0, 0, 0.29);\
+}\
+.ace-kuroir .ace_marker-layer .ace_active-line {\
+background: rgba(203, 220, 47, 0.22);\
+}\
+.ace-kuroir .ace_gutter-active-line {\
+background-color: rgba(203, 220, 47, 0.22);\
+}\
+.ace-kuroir .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(245, 170, 0, 0.57);\
+}\
+.ace-kuroir .ace_invisible {\
+color: #BFBFBF\
+}\
+.ace-kuroir .ace_fold {\
+border-color: #363636;\
+}\
+.ace-kuroir .ace_constant{color:#CD6839;}.ace-kuroir .ace_constant.ace_numeric{color:#9A5925;}.ace-kuroir .ace_support{color:#104E8B;}.ace-kuroir .ace_support.ace_function{color:#005273;}.ace-kuroir .ace_support.ace_constant{color:#CF6A4C;}.ace-kuroir .ace_storage{color:#A52A2A;}.ace-kuroir .ace_invalid.ace_illegal{color:#FD1224;\
+background-color:rgba(255, 6, 0, 0.15);}.ace-kuroir .ace_invalid.ace_deprecated{text-decoration:underline;\
+font-style:italic;\
+color:#FD1732;\
+background-color:#E8E9E8;}.ace-kuroir .ace_string{color:#639300;}.ace-kuroir .ace_string.ace_regexp{color:#417E00;\
+background-color:#C9D4BE;}.ace-kuroir .ace_comment{color:rgba(148, 148, 148, 0.91);\
+background-color:rgba(220, 220, 220, 0.56);}.ace-kuroir .ace_variable{color:#009ACD;}.ace-kuroir .ace_meta.ace_tag{color:#005273;}.ace-kuroir .ace_markup.ace_heading{color:#B8012D;\
+background-color:rgba(191, 97, 51, 0.051);}.ace-kuroir .ace_markup.ace_list{color:#8F5B26;}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-merbivore.js b/filemanager/static/filemanager/js/ace/theme-merbivore.js
new file mode 100755
index 000000000..fc0a72f1c
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-merbivore.js
@@ -0,0 +1,95 @@
+ace.define("ace/theme/merbivore",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-merbivore";
+exports.cssText = ".ace-merbivore .ace_gutter {\
+background: #202020;\
+color: #E6E1DC\
+}\
+.ace-merbivore .ace_print-margin {\
+width: 1px;\
+background: #555651\
+}\
+.ace-merbivore {\
+background-color: #161616;\
+color: #E6E1DC\
+}\
+.ace-merbivore .ace_cursor {\
+color: #FFFFFF\
+}\
+.ace-merbivore .ace_marker-layer .ace_selection {\
+background: #454545\
+}\
+.ace-merbivore.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #161616;\
+}\
+.ace-merbivore .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-merbivore .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #404040\
+}\
+.ace-merbivore .ace_marker-layer .ace_active-line {\
+background: #333435\
+}\
+.ace-merbivore .ace_gutter-active-line {\
+background-color: #333435\
+}\
+.ace-merbivore .ace_marker-layer .ace_selected-word {\
+border: 1px solid #454545\
+}\
+.ace-merbivore .ace_invisible {\
+color: #404040\
+}\
+.ace-merbivore .ace_entity.ace_name.ace_tag,\
+.ace-merbivore .ace_keyword,\
+.ace-merbivore .ace_meta,\
+.ace-merbivore .ace_meta.ace_tag,\
+.ace-merbivore .ace_storage,\
+.ace-merbivore .ace_support.ace_function {\
+color: #FC6F09\
+}\
+.ace-merbivore .ace_constant,\
+.ace-merbivore .ace_constant.ace_character,\
+.ace-merbivore .ace_constant.ace_character.ace_escape,\
+.ace-merbivore .ace_constant.ace_other,\
+.ace-merbivore .ace_support.ace_type {\
+color: #1EDAFB\
+}\
+.ace-merbivore .ace_constant.ace_character.ace_escape {\
+color: #519F50\
+}\
+.ace-merbivore .ace_constant.ace_language {\
+color: #FDC251\
+}\
+.ace-merbivore .ace_constant.ace_library,\
+.ace-merbivore .ace_string,\
+.ace-merbivore .ace_support.ace_constant {\
+color: #8DFF0A\
+}\
+.ace-merbivore .ace_constant.ace_numeric {\
+color: #58C554\
+}\
+.ace-merbivore .ace_invalid {\
+color: #FFFFFF;\
+background-color: #990000\
+}\
+.ace-merbivore .ace_fold {\
+background-color: #FC6F09;\
+border-color: #E6E1DC\
+}\
+.ace-merbivore .ace_comment {\
+font-style: italic;\
+color: #AD2EA4\
+}\
+.ace-merbivore .ace_entity.ace_other.ace_attribute-name {\
+color: #FFFF89\
+}\
+.ace-merbivore .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQFxf3ZXB1df0PAAdsAmERTkEHAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-merbivore_soft.js b/filemanager/static/filemanager/js/ace/theme-merbivore_soft.js
new file mode 100755
index 000000000..eff246465
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-merbivore_soft.js
@@ -0,0 +1,96 @@
+ace.define("ace/theme/merbivore_soft",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-merbivore-soft";
+exports.cssText = ".ace-merbivore-soft .ace_gutter {\
+background: #262424;\
+color: #E6E1DC\
+}\
+.ace-merbivore-soft .ace_print-margin {\
+width: 1px;\
+background: #262424\
+}\
+.ace-merbivore-soft {\
+background-color: #1C1C1C;\
+color: #E6E1DC\
+}\
+.ace-merbivore-soft .ace_cursor {\
+color: #FFFFFF\
+}\
+.ace-merbivore-soft .ace_marker-layer .ace_selection {\
+background: #494949\
+}\
+.ace-merbivore-soft.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #1C1C1C;\
+}\
+.ace-merbivore-soft .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-merbivore-soft .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #404040\
+}\
+.ace-merbivore-soft .ace_marker-layer .ace_active-line {\
+background: #333435\
+}\
+.ace-merbivore-soft .ace_gutter-active-line {\
+background-color: #333435\
+}\
+.ace-merbivore-soft .ace_marker-layer .ace_selected-word {\
+border: 1px solid #494949\
+}\
+.ace-merbivore-soft .ace_invisible {\
+color: #404040\
+}\
+.ace-merbivore-soft .ace_entity.ace_name.ace_tag,\
+.ace-merbivore-soft .ace_keyword,\
+.ace-merbivore-soft .ace_meta,\
+.ace-merbivore-soft .ace_meta.ace_tag,\
+.ace-merbivore-soft .ace_storage {\
+color: #FC803A\
+}\
+.ace-merbivore-soft .ace_constant,\
+.ace-merbivore-soft .ace_constant.ace_character,\
+.ace-merbivore-soft .ace_constant.ace_character.ace_escape,\
+.ace-merbivore-soft .ace_constant.ace_other,\
+.ace-merbivore-soft .ace_support.ace_type {\
+color: #68C1D8\
+}\
+.ace-merbivore-soft .ace_constant.ace_character.ace_escape {\
+color: #B3E5B4\
+}\
+.ace-merbivore-soft .ace_constant.ace_language {\
+color: #E1C582\
+}\
+.ace-merbivore-soft .ace_constant.ace_library,\
+.ace-merbivore-soft .ace_string,\
+.ace-merbivore-soft .ace_support.ace_constant {\
+color: #8EC65F\
+}\
+.ace-merbivore-soft .ace_constant.ace_numeric {\
+color: #7FC578\
+}\
+.ace-merbivore-soft .ace_invalid,\
+.ace-merbivore-soft .ace_invalid.ace_deprecated {\
+color: #FFFFFF;\
+background-color: #FE3838\
+}\
+.ace-merbivore-soft .ace_fold {\
+background-color: #FC803A;\
+border-color: #E6E1DC\
+}\
+.ace-merbivore-soft .ace_comment,\
+.ace-merbivore-soft .ace_meta {\
+font-style: italic;\
+color: #AC4BB8\
+}\
+.ace-merbivore-soft .ace_entity.ace_other.ace_attribute-name {\
+color: #EAF1A3\
+}\
+.ace-merbivore-soft .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWOQkpLyZfD09PwPAAfYAnaStpHRAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-mono_industrial.js b/filemanager/static/filemanager/js/ace/theme-mono_industrial.js
new file mode 100755
index 000000000..0ece0309c
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-mono_industrial.js
@@ -0,0 +1,107 @@
+ace.define("ace/theme/mono_industrial",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-mono-industrial";
+exports.cssText = ".ace-mono-industrial .ace_gutter {\
+background: #1d2521;\
+color: #C5C9C9\
+}\
+.ace-mono-industrial .ace_print-margin {\
+width: 1px;\
+background: #555651\
+}\
+.ace-mono-industrial {\
+background-color: #222C28;\
+color: #FFFFFF\
+}\
+.ace-mono-industrial .ace_cursor {\
+color: #FFFFFF\
+}\
+.ace-mono-industrial .ace_marker-layer .ace_selection {\
+background: rgba(145, 153, 148, 0.40)\
+}\
+.ace-mono-industrial.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #222C28;\
+}\
+.ace-mono-industrial .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-mono-industrial .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(102, 108, 104, 0.50)\
+}\
+.ace-mono-industrial .ace_marker-layer .ace_active-line {\
+background: rgba(12, 13, 12, 0.25)\
+}\
+.ace-mono-industrial .ace_gutter-active-line {\
+background-color: rgba(12, 13, 12, 0.25)\
+}\
+.ace-mono-industrial .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(145, 153, 148, 0.40)\
+}\
+.ace-mono-industrial .ace_invisible {\
+color: rgba(102, 108, 104, 0.50)\
+}\
+.ace-mono-industrial .ace_string {\
+background-color: #151C19;\
+color: #FFFFFF\
+}\
+.ace-mono-industrial .ace_keyword,\
+.ace-mono-industrial .ace_meta {\
+color: #A39E64\
+}\
+.ace-mono-industrial .ace_constant,\
+.ace-mono-industrial .ace_constant.ace_character,\
+.ace-mono-industrial .ace_constant.ace_character.ace_escape,\
+.ace-mono-industrial .ace_constant.ace_numeric,\
+.ace-mono-industrial .ace_constant.ace_other {\
+color: #E98800\
+}\
+.ace-mono-industrial .ace_entity.ace_name.ace_function,\
+.ace-mono-industrial .ace_keyword.ace_operator,\
+.ace-mono-industrial .ace_variable {\
+color: #A8B3AB\
+}\
+.ace-mono-industrial .ace_invalid {\
+color: #FFFFFF;\
+background-color: rgba(153, 0, 0, 0.68)\
+}\
+.ace-mono-industrial .ace_support.ace_constant {\
+color: #C87500\
+}\
+.ace-mono-industrial .ace_fold {\
+background-color: #A8B3AB;\
+border-color: #FFFFFF\
+}\
+.ace-mono-industrial .ace_support.ace_function {\
+color: #588E60\
+}\
+.ace-mono-industrial .ace_entity.ace_name,\
+.ace-mono-industrial .ace_support.ace_class,\
+.ace-mono-industrial .ace_support.ace_type {\
+color: #5778B6\
+}\
+.ace-mono-industrial .ace_storage {\
+color: #C23B00\
+}\
+.ace-mono-industrial .ace_variable.ace_language,\
+.ace-mono-industrial .ace_variable.ace_parameter {\
+color: #648BD2\
+}\
+.ace-mono-industrial .ace_comment {\
+color: #666C68;\
+background-color: #151C19\
+}\
+.ace-mono-industrial .ace_entity.ace_other.ace_attribute-name {\
+color: #909993\
+}\
+.ace-mono-industrial .ace_entity.ace_name.ace_tag {\
+color: #A65EFF\
+}\
+.ace-mono-industrial .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNQ1NbwZfALD/4PAAlTArlEC4r/AAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-monokai.js b/filemanager/static/filemanager/js/ace/theme-monokai.js
new file mode 100755
index 000000000..322c2fa88
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-monokai.js
@@ -0,0 +1,105 @@
+ace.define("ace/theme/monokai",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-monokai";
+exports.cssText = ".ace-monokai .ace_gutter {\
+background: #2F3129;\
+color: #8F908A\
+}\
+.ace-monokai .ace_print-margin {\
+width: 1px;\
+background: #555651\
+}\
+.ace-monokai {\
+background-color: #272822;\
+color: #F8F8F2\
+}\
+.ace-monokai .ace_cursor {\
+color: #F8F8F0\
+}\
+.ace-monokai .ace_marker-layer .ace_selection {\
+background: #49483E\
+}\
+.ace-monokai.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #272822;\
+}\
+.ace-monokai .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-monokai .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #49483E\
+}\
+.ace-monokai .ace_marker-layer .ace_active-line {\
+background: #202020\
+}\
+.ace-monokai .ace_gutter-active-line {\
+background-color: #272727\
+}\
+.ace-monokai .ace_marker-layer .ace_selected-word {\
+border: 1px solid #49483E\
+}\
+.ace-monokai .ace_invisible {\
+color: #52524d\
+}\
+.ace-monokai .ace_entity.ace_name.ace_tag,\
+.ace-monokai .ace_keyword,\
+.ace-monokai .ace_meta.ace_tag,\
+.ace-monokai .ace_storage {\
+color: #F92672\
+}\
+.ace-monokai .ace_punctuation,\
+.ace-monokai .ace_punctuation.ace_tag {\
+color: #fff\
+}\
+.ace-monokai .ace_constant.ace_character,\
+.ace-monokai .ace_constant.ace_language,\
+.ace-monokai .ace_constant.ace_numeric,\
+.ace-monokai .ace_constant.ace_other {\
+color: #AE81FF\
+}\
+.ace-monokai .ace_invalid {\
+color: #F8F8F0;\
+background-color: #F92672\
+}\
+.ace-monokai .ace_invalid.ace_deprecated {\
+color: #F8F8F0;\
+background-color: #AE81FF\
+}\
+.ace-monokai .ace_support.ace_constant,\
+.ace-monokai .ace_support.ace_function {\
+color: #66D9EF\
+}\
+.ace-monokai .ace_fold {\
+background-color: #A6E22E;\
+border-color: #F8F8F2\
+}\
+.ace-monokai .ace_storage.ace_type,\
+.ace-monokai .ace_support.ace_class,\
+.ace-monokai .ace_support.ace_type {\
+font-style: italic;\
+color: #66D9EF\
+}\
+.ace-monokai .ace_entity.ace_name.ace_function,\
+.ace-monokai .ace_entity.ace_other,\
+.ace-monokai .ace_entity.ace_other.ace_attribute-name,\
+.ace-monokai .ace_variable {\
+color: #A6E22E\
+}\
+.ace-monokai .ace_variable.ace_parameter {\
+font-style: italic;\
+color: #FD971F\
+}\
+.ace-monokai .ace_string {\
+color: #E6DB74\
+}\
+.ace-monokai .ace_comment {\
+color: #75715E\
+}\
+.ace-monokai .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-pastel_on_dark.js b/filemanager/static/filemanager/js/ace/theme-pastel_on_dark.js
new file mode 100755
index 000000000..2631ae003
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-pastel_on_dark.js
@@ -0,0 +1,108 @@
+ace.define("ace/theme/pastel_on_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-pastel-on-dark";
+exports.cssText = ".ace-pastel-on-dark .ace_gutter {\
+background: #353030;\
+color: #8F938F\
+}\
+.ace-pastel-on-dark .ace_print-margin {\
+width: 1px;\
+background: #353030\
+}\
+.ace-pastel-on-dark {\
+background-color: #2C2828;\
+color: #8F938F\
+}\
+.ace-pastel-on-dark .ace_cursor {\
+color: #A7A7A7\
+}\
+.ace-pastel-on-dark .ace_marker-layer .ace_selection {\
+background: rgba(221, 240, 255, 0.20)\
+}\
+.ace-pastel-on-dark.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #2C2828;\
+}\
+.ace-pastel-on-dark .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-pastel-on-dark .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(255, 255, 255, 0.25)\
+}\
+.ace-pastel-on-dark .ace_marker-layer .ace_active-line {\
+background: rgba(255, 255, 255, 0.031)\
+}\
+.ace-pastel-on-dark .ace_gutter-active-line {\
+background-color: rgba(255, 255, 255, 0.031)\
+}\
+.ace-pastel-on-dark .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(221, 240, 255, 0.20)\
+}\
+.ace-pastel-on-dark .ace_invisible {\
+color: rgba(255, 255, 255, 0.25)\
+}\
+.ace-pastel-on-dark .ace_keyword,\
+.ace-pastel-on-dark .ace_meta {\
+color: #757aD8\
+}\
+.ace-pastel-on-dark .ace_constant,\
+.ace-pastel-on-dark .ace_constant.ace_character,\
+.ace-pastel-on-dark .ace_constant.ace_character.ace_escape,\
+.ace-pastel-on-dark .ace_constant.ace_other {\
+color: #4FB7C5\
+}\
+.ace-pastel-on-dark .ace_keyword.ace_operator {\
+color: #797878\
+}\
+.ace-pastel-on-dark .ace_constant.ace_character {\
+color: #AFA472\
+}\
+.ace-pastel-on-dark .ace_constant.ace_language {\
+color: #DE8E30\
+}\
+.ace-pastel-on-dark .ace_constant.ace_numeric {\
+color: #CCCCCC\
+}\
+.ace-pastel-on-dark .ace_invalid,\
+.ace-pastel-on-dark .ace_invalid.ace_illegal {\
+color: #F8F8F8;\
+background-color: rgba(86, 45, 86, 0.75)\
+}\
+.ace-pastel-on-dark .ace_invalid.ace_deprecated {\
+text-decoration: underline;\
+font-style: italic;\
+color: #D2A8A1\
+}\
+.ace-pastel-on-dark .ace_fold {\
+background-color: #757aD8;\
+border-color: #8F938F\
+}\
+.ace-pastel-on-dark .ace_support.ace_function {\
+color: #AEB2F8\
+}\
+.ace-pastel-on-dark .ace_string {\
+color: #66A968\
+}\
+.ace-pastel-on-dark .ace_string.ace_regexp {\
+color: #E9C062\
+}\
+.ace-pastel-on-dark .ace_comment {\
+color: #A6C6FF\
+}\
+.ace-pastel-on-dark .ace_variable {\
+color: #BEBF55\
+}\
+.ace-pastel-on-dark .ace_variable.ace_language {\
+color: #C1C144\
+}\
+.ace-pastel-on-dark .ace_xml-pe {\
+color: #494949\
+}\
+.ace-pastel-on-dark .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYIiPj/8PAARgAh2NTMh8AAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-solarized_dark.js b/filemanager/static/filemanager/js/ace/theme-solarized_dark.js
new file mode 100755
index 000000000..d1acdb46a
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-solarized_dark.js
@@ -0,0 +1,88 @@
+ace.define("ace/theme/solarized_dark",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-solarized-dark";
+exports.cssText = ".ace-solarized-dark .ace_gutter {\
+background: #01313f;\
+color: #d0edf7\
+}\
+.ace-solarized-dark .ace_print-margin {\
+width: 1px;\
+background: #33555E\
+}\
+.ace-solarized-dark {\
+background-color: #002B36;\
+color: #93A1A1\
+}\
+.ace-solarized-dark .ace_entity.ace_other.ace_attribute-name,\
+.ace-solarized-dark .ace_storage {\
+color: #93A1A1\
+}\
+.ace-solarized-dark .ace_cursor,\
+.ace-solarized-dark .ace_string.ace_regexp {\
+color: #D30102\
+}\
+.ace-solarized-dark .ace_marker-layer .ace_active-line,\
+.ace-solarized-dark .ace_marker-layer .ace_selection {\
+background: rgba(255, 255, 255, 0.1)\
+}\
+.ace-solarized-dark.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #002B36;\
+}\
+.ace-solarized-dark .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-solarized-dark .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(147, 161, 161, 0.50)\
+}\
+.ace-solarized-dark .ace_gutter-active-line {\
+background-color: #0d3440\
+}\
+.ace-solarized-dark .ace_marker-layer .ace_selected-word {\
+border: 1px solid #073642\
+}\
+.ace-solarized-dark .ace_invisible {\
+color: rgba(147, 161, 161, 0.50)\
+}\
+.ace-solarized-dark .ace_keyword,\
+.ace-solarized-dark .ace_meta,\
+.ace-solarized-dark .ace_support.ace_class,\
+.ace-solarized-dark .ace_support.ace_type {\
+color: #859900\
+}\
+.ace-solarized-dark .ace_constant.ace_character,\
+.ace-solarized-dark .ace_constant.ace_other {\
+color: #CB4B16\
+}\
+.ace-solarized-dark .ace_constant.ace_language {\
+color: #B58900\
+}\
+.ace-solarized-dark .ace_constant.ace_numeric {\
+color: #D33682\
+}\
+.ace-solarized-dark .ace_fold {\
+background-color: #268BD2;\
+border-color: #93A1A1\
+}\
+.ace-solarized-dark .ace_entity.ace_name.ace_function,\
+.ace-solarized-dark .ace_entity.ace_name.ace_tag,\
+.ace-solarized-dark .ace_support.ace_function,\
+.ace-solarized-dark .ace_variable,\
+.ace-solarized-dark .ace_variable.ace_language {\
+color: #268BD2\
+}\
+.ace-solarized-dark .ace_string {\
+color: #2AA198\
+}\
+.ace-solarized-dark .ace_comment {\
+font-style: italic;\
+color: #657B83\
+}\
+.ace-solarized-dark .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNg0Db1ZVCxc/sPAAd4AlUHlLenAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-solarized_light.js b/filemanager/static/filemanager/js/ace/theme-solarized_light.js
new file mode 100755
index 000000000..f0c078ae5
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-solarized_light.js
@@ -0,0 +1,91 @@
+ace.define("ace/theme/solarized_light",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-solarized-light";
+exports.cssText = ".ace-solarized-light .ace_gutter {\
+background: #fbf1d3;\
+color: #333\
+}\
+.ace-solarized-light .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8\
+}\
+.ace-solarized-light {\
+background-color: #FDF6E3;\
+color: #586E75\
+}\
+.ace-solarized-light .ace_cursor {\
+color: #000000\
+}\
+.ace-solarized-light .ace_marker-layer .ace_selection {\
+background: rgba(7, 54, 67, 0.09)\
+}\
+.ace-solarized-light.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #FDF6E3;\
+}\
+.ace-solarized-light .ace_marker-layer .ace_step {\
+background: rgb(255, 255, 0)\
+}\
+.ace-solarized-light .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(147, 161, 161, 0.50)\
+}\
+.ace-solarized-light .ace_marker-layer .ace_active-line {\
+background: #EEE8D5\
+}\
+.ace-solarized-light .ace_gutter-active-line {\
+background-color : #EDE5C1\
+}\
+.ace-solarized-light .ace_marker-layer .ace_selected-word {\
+border: 1px solid #073642\
+}\
+.ace-solarized-light .ace_invisible {\
+color: rgba(147, 161, 161, 0.50)\
+}\
+.ace-solarized-light .ace_keyword,\
+.ace-solarized-light .ace_meta,\
+.ace-solarized-light .ace_support.ace_class,\
+.ace-solarized-light .ace_support.ace_type {\
+color: #859900\
+}\
+.ace-solarized-light .ace_constant.ace_character,\
+.ace-solarized-light .ace_constant.ace_other {\
+color: #CB4B16\
+}\
+.ace-solarized-light .ace_constant.ace_language {\
+color: #B58900\
+}\
+.ace-solarized-light .ace_constant.ace_numeric {\
+color: #D33682\
+}\
+.ace-solarized-light .ace_fold {\
+background-color: #268BD2;\
+border-color: #586E75\
+}\
+.ace-solarized-light .ace_entity.ace_name.ace_function,\
+.ace-solarized-light .ace_entity.ace_name.ace_tag,\
+.ace-solarized-light .ace_support.ace_function,\
+.ace-solarized-light .ace_variable,\
+.ace-solarized-light .ace_variable.ace_language {\
+color: #268BD2\
+}\
+.ace-solarized-light .ace_storage {\
+color: #073642\
+}\
+.ace-solarized-light .ace_string {\
+color: #2AA198\
+}\
+.ace-solarized-light .ace_string.ace_regexp {\
+color: #D30102\
+}\
+.ace-solarized-light .ace_comment,\
+.ace-solarized-light .ace_entity.ace_other.ace_attribute-name {\
+color: #93A1A1\
+}\
+.ace-solarized-light .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHjy8NJ/AAjgA5fzQUmBAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-sqlserver.js b/filemanager/static/filemanager/js/ace/theme-sqlserver.js
new file mode 100755
index 000000000..91f34f6c4
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-sqlserver.js
@@ -0,0 +1,138 @@
+ace.define("ace/theme/sqlserver",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-sqlserver";
+exports.cssText = ".ace-sqlserver .ace_gutter {\
+background: #ebebeb;\
+color: #333;\
+overflow: hidden;\
+}\
+.ace-sqlserver .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8;\
+}\
+.ace-sqlserver {\
+background-color: #FFFFFF;\
+color: black;\
+}\
+.ace-sqlserver .ace_identifier {\
+color: black;\
+}\
+.ace-sqlserver .ace_keyword {\
+color: #0000FF;\
+}\
+.ace-sqlserver .ace_numeric {\
+color: black;\
+}\
+.ace-sqlserver .ace_storage {\
+color: #11B7BE;\
+}\
+.ace-sqlserver .ace_keyword.ace_operator,\
+.ace-sqlserver .ace_lparen,\
+.ace-sqlserver .ace_rparen,\
+.ace-sqlserver .ace_punctuation {\
+color: #808080;\
+}\
+.ace-sqlserver .ace_set.ace_statement {\
+color: #0000FF;\
+text-decoration: underline;\
+}\
+.ace-sqlserver .ace_cursor {\
+color: black;\
+}\
+.ace-sqlserver .ace_invisible {\
+color: rgb(191, 191, 191);\
+}\
+.ace-sqlserver .ace_constant.ace_buildin {\
+color: rgb(88, 72, 246);\
+}\
+.ace-sqlserver .ace_constant.ace_language {\
+color: #979797;\
+}\
+.ace-sqlserver .ace_constant.ace_library {\
+color: rgb(6, 150, 14);\
+}\
+.ace-sqlserver .ace_invalid {\
+background-color: rgb(153, 0, 0);\
+color: white;\
+}\
+.ace-sqlserver .ace_support.ace_function {\
+color: #FF00FF;\
+}\
+.ace-sqlserver .ace_support.ace_constant {\
+color: rgb(6, 150, 14);\
+}\
+.ace-sqlserver .ace_class {\
+color: #008080;\
+}\
+.ace-sqlserver .ace_support.ace_other {\
+color: #6D79DE;\
+}\
+.ace-sqlserver .ace_variable.ace_parameter {\
+font-style: italic;\
+color: #FD971F;\
+}\
+.ace-sqlserver .ace_comment {\
+color: #008000;\
+}\
+.ace-sqlserver .ace_constant.ace_numeric {\
+color: black;\
+}\
+.ace-sqlserver .ace_variable {\
+color: rgb(49, 132, 149);\
+}\
+.ace-sqlserver .ace_xml-pe {\
+color: rgb(104, 104, 91);\
+}\
+.ace-sqlserver .ace_support.ace_storedprocedure {\
+color: #800000;\
+}\
+.ace-sqlserver .ace_heading {\
+color: rgb(12, 7, 255);\
+}\
+.ace-sqlserver .ace_list {\
+color: rgb(185, 6, 144);\
+}\
+.ace-sqlserver .ace_marker-layer .ace_selection {\
+background: rgb(181, 213, 255);\
+}\
+.ace-sqlserver .ace_marker-layer .ace_step {\
+background: rgb(252, 255, 0);\
+}\
+.ace-sqlserver .ace_marker-layer .ace_stack {\
+background: rgb(164, 229, 101);\
+}\
+.ace-sqlserver .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgb(192, 192, 192);\
+}\
+.ace-sqlserver .ace_marker-layer .ace_active-line {\
+background: rgba(0, 0, 0, 0.07);\
+}\
+.ace-sqlserver .ace_gutter-active-line {\
+background-color: #dcdcdc;\
+}\
+.ace-sqlserver .ace_marker-layer .ace_selected-word {\
+background: rgb(250, 250, 255);\
+border: 1px solid rgb(200, 200, 250);\
+}\
+.ace-sqlserver .ace_meta.ace_tag {\
+color: #0000FF;\
+}\
+.ace-sqlserver .ace_string.ace_regex {\
+color: #FF0000;\
+}\
+.ace-sqlserver .ace_string {\
+color: #FF0000;\
+}\
+.ace-sqlserver .ace_entity.ace_other.ace_attribute-name {\
+color: #994409;\
+}\
+.ace-sqlserver .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-terminal.js b/filemanager/static/filemanager/js/ace/theme-terminal.js
new file mode 100755
index 000000000..def9e69b7
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-terminal.js
@@ -0,0 +1,114 @@
+ace.define("ace/theme/terminal",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-terminal-theme";
+exports.cssText = ".ace-terminal-theme .ace_gutter {\
+background: #1a0005;\
+color: steelblue\
+}\
+.ace-terminal-theme .ace_print-margin {\
+width: 1px;\
+background: #1a1a1a\
+}\
+.ace-terminal-theme {\
+background-color: black;\
+color: #DEDEDE\
+}\
+.ace-terminal-theme .ace_cursor {\
+color: #9F9F9F\
+}\
+.ace-terminal-theme .ace_marker-layer .ace_selection {\
+background: #424242\
+}\
+.ace-terminal-theme.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px black;\
+}\
+.ace-terminal-theme .ace_marker-layer .ace_step {\
+background: rgb(0, 0, 0)\
+}\
+.ace-terminal-theme .ace_marker-layer .ace_bracket {\
+background: #090;\
+}\
+.ace-terminal-theme .ace_marker-layer .ace_bracket-start {\
+background: #090;\
+}\
+.ace-terminal-theme .ace_marker-layer .ace_bracket-unmatched {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #900\
+}\
+.ace-terminal-theme .ace_marker-layer .ace_active-line {\
+background: #2A2A2A\
+}\
+.ace-terminal-theme .ace_gutter-active-line {\
+background-color: #2A112A\
+}\
+.ace-terminal-theme .ace_marker-layer .ace_selected-word {\
+border: 1px solid #424242\
+}\
+.ace-terminal-theme .ace_invisible {\
+color: #343434\
+}\
+.ace-terminal-theme .ace_keyword,\
+.ace-terminal-theme .ace_meta,\
+.ace-terminal-theme .ace_storage,\
+.ace-terminal-theme .ace_storage.ace_type,\
+.ace-terminal-theme .ace_support.ace_type {\
+color: tomato\
+}\
+.ace-terminal-theme .ace_keyword.ace_operator {\
+color: deeppink\
+}\
+.ace-terminal-theme .ace_constant.ace_character,\
+.ace-terminal-theme .ace_constant.ace_language,\
+.ace-terminal-theme .ace_constant.ace_numeric,\
+.ace-terminal-theme .ace_keyword.ace_other.ace_unit,\
+.ace-terminal-theme .ace_support.ace_constant,\
+.ace-terminal-theme .ace_variable.ace_parameter {\
+color: #E78C45\
+}\
+.ace-terminal-theme .ace_constant.ace_other {\
+color: gold\
+}\
+.ace-terminal-theme .ace_invalid {\
+color: yellow;\
+background-color: red\
+}\
+.ace-terminal-theme .ace_invalid.ace_deprecated {\
+color: #CED2CF;\
+background-color: #B798BF\
+}\
+.ace-terminal-theme .ace_fold {\
+background-color: #7AA6DA;\
+border-color: #DEDEDE\
+}\
+.ace-terminal-theme .ace_entity.ace_name.ace_function,\
+.ace-terminal-theme .ace_support.ace_function,\
+.ace-terminal-theme .ace_variable {\
+color: #7AA6DA\
+}\
+.ace-terminal-theme .ace_support.ace_class,\
+.ace-terminal-theme .ace_support.ace_type {\
+color: #E7C547\
+}\
+.ace-terminal-theme .ace_heading,\
+.ace-terminal-theme .ace_string {\
+color: #B9CA4A\
+}\
+.ace-terminal-theme .ace_entity.ace_name.ace_tag,\
+.ace-terminal-theme .ace_entity.ace_other.ace_attribute-name,\
+.ace-terminal-theme .ace_meta.ace_tag,\
+.ace-terminal-theme .ace_string.ace_regexp,\
+.ace-terminal-theme .ace_variable {\
+color: #D54E53\
+}\
+.ace-terminal-theme .ace_comment {\
+color: orangered\
+}\
+.ace-terminal-theme .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYLBWV/8PAAK4AYnhiq+xAAAAAElFTkSuQmCC) right repeat-y;\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-textmate.js b/filemanager/static/filemanager/js/ace/theme-textmate.js
new file mode 100755
index 000000000..0033edae2
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-textmate.js
@@ -0,0 +1,129 @@
+ace.define("ace/theme/textmate",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+"use strict";
+
+exports.isDark = false;
+exports.cssClass = "ace-tm";
+exports.cssText = ".ace-tm .ace_gutter {\
+background: #f0f0f0;\
+color: #333;\
+}\
+.ace-tm .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8;\
+}\
+.ace-tm .ace_fold {\
+background-color: #6B72E6;\
+}\
+.ace-tm {\
+background-color: #FFFFFF;\
+color: black;\
+}\
+.ace-tm .ace_cursor {\
+color: black;\
+}\
+.ace-tm .ace_invisible {\
+color: rgb(191, 191, 191);\
+}\
+.ace-tm .ace_storage,\
+.ace-tm .ace_keyword {\
+color: blue;\
+}\
+.ace-tm .ace_constant {\
+color: rgb(197, 6, 11);\
+}\
+.ace-tm .ace_constant.ace_buildin {\
+color: rgb(88, 72, 246);\
+}\
+.ace-tm .ace_constant.ace_language {\
+color: rgb(88, 92, 246);\
+}\
+.ace-tm .ace_constant.ace_library {\
+color: rgb(6, 150, 14);\
+}\
+.ace-tm .ace_invalid {\
+background-color: rgba(255, 0, 0, 0.1);\
+color: red;\
+}\
+.ace-tm .ace_support.ace_function {\
+color: rgb(60, 76, 114);\
+}\
+.ace-tm .ace_support.ace_constant {\
+color: rgb(6, 150, 14);\
+}\
+.ace-tm .ace_support.ace_type,\
+.ace-tm .ace_support.ace_class {\
+color: rgb(109, 121, 222);\
+}\
+.ace-tm .ace_keyword.ace_operator {\
+color: rgb(104, 118, 135);\
+}\
+.ace-tm .ace_string {\
+color: rgb(3, 106, 7);\
+}\
+.ace-tm .ace_comment {\
+color: rgb(76, 136, 107);\
+}\
+.ace-tm .ace_comment.ace_doc {\
+color: rgb(0, 102, 255);\
+}\
+.ace-tm .ace_comment.ace_doc.ace_tag {\
+color: rgb(128, 159, 191);\
+}\
+.ace-tm .ace_constant.ace_numeric {\
+color: rgb(0, 0, 205);\
+}\
+.ace-tm .ace_variable {\
+color: rgb(49, 132, 149);\
+}\
+.ace-tm .ace_xml-pe {\
+color: rgb(104, 104, 91);\
+}\
+.ace-tm .ace_entity.ace_name.ace_function {\
+color: #0000A2;\
+}\
+.ace-tm .ace_heading {\
+color: rgb(12, 7, 255);\
+}\
+.ace-tm .ace_list {\
+color:rgb(185, 6, 144);\
+}\
+.ace-tm .ace_meta.ace_tag {\
+color:rgb(0, 22, 142);\
+}\
+.ace-tm .ace_string.ace_regex {\
+color: rgb(255, 0, 0)\
+}\
+.ace-tm .ace_marker-layer .ace_selection {\
+background: rgb(181, 213, 255);\
+}\
+.ace-tm.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px white;\
+}\
+.ace-tm .ace_marker-layer .ace_step {\
+background: rgb(252, 255, 0);\
+}\
+.ace-tm .ace_marker-layer .ace_stack {\
+background: rgb(164, 229, 101);\
+}\
+.ace-tm .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgb(192, 192, 192);\
+}\
+.ace-tm .ace_marker-layer .ace_active-line {\
+background: rgba(0, 0, 0, 0.07);\
+}\
+.ace-tm .ace_gutter-active-line {\
+background-color : #dcdcdc;\
+}\
+.ace-tm .ace_marker-layer .ace_selected-word {\
+background: rgb(250, 250, 255);\
+border: 1px solid rgb(200, 200, 250);\
+}\
+.ace-tm .ace_indent-guide {\
+background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\
+}\
+";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-tomorrow.js b/filemanager/static/filemanager/js/ace/theme-tomorrow.js
new file mode 100755
index 000000000..4661be112
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-tomorrow.js
@@ -0,0 +1,108 @@
+ace.define("ace/theme/tomorrow",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-tomorrow";
+exports.cssText = ".ace-tomorrow .ace_gutter {\
+background: #f6f6f6;\
+color: #4D4D4C\
+}\
+.ace-tomorrow .ace_print-margin {\
+width: 1px;\
+background: #f6f6f6\
+}\
+.ace-tomorrow {\
+background-color: #FFFFFF;\
+color: #4D4D4C\
+}\
+.ace-tomorrow .ace_cursor {\
+color: #AEAFAD\
+}\
+.ace-tomorrow .ace_marker-layer .ace_selection {\
+background: #D6D6D6\
+}\
+.ace-tomorrow.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #FFFFFF;\
+}\
+.ace-tomorrow .ace_marker-layer .ace_step {\
+background: rgb(255, 255, 0)\
+}\
+.ace-tomorrow .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #D1D1D1\
+}\
+.ace-tomorrow .ace_marker-layer .ace_active-line {\
+background: #EFEFEF\
+}\
+.ace-tomorrow .ace_gutter-active-line {\
+background-color : #dcdcdc\
+}\
+.ace-tomorrow .ace_marker-layer .ace_selected-word {\
+border: 1px solid #D6D6D6\
+}\
+.ace-tomorrow .ace_invisible {\
+color: #D1D1D1\
+}\
+.ace-tomorrow .ace_keyword,\
+.ace-tomorrow .ace_meta,\
+.ace-tomorrow .ace_storage,\
+.ace-tomorrow .ace_storage.ace_type,\
+.ace-tomorrow .ace_support.ace_type {\
+color: #8959A8\
+}\
+.ace-tomorrow .ace_keyword.ace_operator {\
+color: #3E999F\
+}\
+.ace-tomorrow .ace_constant.ace_character,\
+.ace-tomorrow .ace_constant.ace_language,\
+.ace-tomorrow .ace_constant.ace_numeric,\
+.ace-tomorrow .ace_keyword.ace_other.ace_unit,\
+.ace-tomorrow .ace_support.ace_constant,\
+.ace-tomorrow .ace_variable.ace_parameter {\
+color: #F5871F\
+}\
+.ace-tomorrow .ace_constant.ace_other {\
+color: #666969\
+}\
+.ace-tomorrow .ace_invalid {\
+color: #FFFFFF;\
+background-color: #C82829\
+}\
+.ace-tomorrow .ace_invalid.ace_deprecated {\
+color: #FFFFFF;\
+background-color: #8959A8\
+}\
+.ace-tomorrow .ace_fold {\
+background-color: #4271AE;\
+border-color: #4D4D4C\
+}\
+.ace-tomorrow .ace_entity.ace_name.ace_function,\
+.ace-tomorrow .ace_support.ace_function,\
+.ace-tomorrow .ace_variable {\
+color: #4271AE\
+}\
+.ace-tomorrow .ace_support.ace_class,\
+.ace-tomorrow .ace_support.ace_type {\
+color: #C99E00\
+}\
+.ace-tomorrow .ace_heading,\
+.ace-tomorrow .ace_markup.ace_heading,\
+.ace-tomorrow .ace_string {\
+color: #718C00\
+}\
+.ace-tomorrow .ace_entity.ace_name.ace_tag,\
+.ace-tomorrow .ace_entity.ace_other.ace_attribute-name,\
+.ace-tomorrow .ace_meta.ace_tag,\
+.ace-tomorrow .ace_string.ace_regexp,\
+.ace-tomorrow .ace_variable {\
+color: #C82829\
+}\
+.ace-tomorrow .ace_comment {\
+color: #8E908C\
+}\
+.ace-tomorrow .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bdu3f/BwAlfgctduB85QAAAABJRU5ErkJggg==) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-tomorrow_night.js b/filemanager/static/filemanager/js/ace/theme-tomorrow_night.js
new file mode 100755
index 000000000..53e1f39a4
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-tomorrow_night.js
@@ -0,0 +1,108 @@
+ace.define("ace/theme/tomorrow_night",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-tomorrow-night";
+exports.cssText = ".ace-tomorrow-night .ace_gutter {\
+background: #25282c;\
+color: #C5C8C6\
+}\
+.ace-tomorrow-night .ace_print-margin {\
+width: 1px;\
+background: #25282c\
+}\
+.ace-tomorrow-night {\
+background-color: #1D1F21;\
+color: #C5C8C6\
+}\
+.ace-tomorrow-night .ace_cursor {\
+color: #AEAFAD\
+}\
+.ace-tomorrow-night .ace_marker-layer .ace_selection {\
+background: #373B41\
+}\
+.ace-tomorrow-night.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #1D1F21;\
+}\
+.ace-tomorrow-night .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-tomorrow-night .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #4B4E55\
+}\
+.ace-tomorrow-night .ace_marker-layer .ace_active-line {\
+background: #282A2E\
+}\
+.ace-tomorrow-night .ace_gutter-active-line {\
+background-color: #282A2E\
+}\
+.ace-tomorrow-night .ace_marker-layer .ace_selected-word {\
+border: 1px solid #373B41\
+}\
+.ace-tomorrow-night .ace_invisible {\
+color: #4B4E55\
+}\
+.ace-tomorrow-night .ace_keyword,\
+.ace-tomorrow-night .ace_meta,\
+.ace-tomorrow-night .ace_storage,\
+.ace-tomorrow-night .ace_storage.ace_type,\
+.ace-tomorrow-night .ace_support.ace_type {\
+color: #B294BB\
+}\
+.ace-tomorrow-night .ace_keyword.ace_operator {\
+color: #8ABEB7\
+}\
+.ace-tomorrow-night .ace_constant.ace_character,\
+.ace-tomorrow-night .ace_constant.ace_language,\
+.ace-tomorrow-night .ace_constant.ace_numeric,\
+.ace-tomorrow-night .ace_keyword.ace_other.ace_unit,\
+.ace-tomorrow-night .ace_support.ace_constant,\
+.ace-tomorrow-night .ace_variable.ace_parameter {\
+color: #DE935F\
+}\
+.ace-tomorrow-night .ace_constant.ace_other {\
+color: #CED1CF\
+}\
+.ace-tomorrow-night .ace_invalid {\
+color: #CED2CF;\
+background-color: #DF5F5F\
+}\
+.ace-tomorrow-night .ace_invalid.ace_deprecated {\
+color: #CED2CF;\
+background-color: #B798BF\
+}\
+.ace-tomorrow-night .ace_fold {\
+background-color: #81A2BE;\
+border-color: #C5C8C6\
+}\
+.ace-tomorrow-night .ace_entity.ace_name.ace_function,\
+.ace-tomorrow-night .ace_support.ace_function,\
+.ace-tomorrow-night .ace_variable {\
+color: #81A2BE\
+}\
+.ace-tomorrow-night .ace_support.ace_class,\
+.ace-tomorrow-night .ace_support.ace_type {\
+color: #F0C674\
+}\
+.ace-tomorrow-night .ace_heading,\
+.ace-tomorrow-night .ace_markup.ace_heading,\
+.ace-tomorrow-night .ace_string {\
+color: #B5BD68\
+}\
+.ace-tomorrow-night .ace_entity.ace_name.ace_tag,\
+.ace-tomorrow-night .ace_entity.ace_other.ace_attribute-name,\
+.ace-tomorrow-night .ace_meta.ace_tag,\
+.ace-tomorrow-night .ace_string.ace_regexp,\
+.ace-tomorrow-night .ace_variable {\
+color: #CC6666\
+}\
+.ace-tomorrow-night .ace_comment {\
+color: #969896\
+}\
+.ace-tomorrow-night .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYHB3d/8PAAOIAdULw8qMAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-tomorrow_night_blue.js b/filemanager/static/filemanager/js/ace/theme-tomorrow_night_blue.js
new file mode 100755
index 000000000..956e221ec
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-tomorrow_night_blue.js
@@ -0,0 +1,106 @@
+ace.define("ace/theme/tomorrow_night_blue",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-tomorrow-night-blue";
+exports.cssText = ".ace-tomorrow-night-blue .ace_gutter {\
+background: #00204b;\
+color: #7388b5\
+}\
+.ace-tomorrow-night-blue .ace_print-margin {\
+width: 1px;\
+background: #00204b\
+}\
+.ace-tomorrow-night-blue {\
+background-color: #002451;\
+color: #FFFFFF\
+}\
+.ace-tomorrow-night-blue .ace_constant.ace_other,\
+.ace-tomorrow-night-blue .ace_cursor {\
+color: #FFFFFF\
+}\
+.ace-tomorrow-night-blue .ace_marker-layer .ace_selection {\
+background: #003F8E\
+}\
+.ace-tomorrow-night-blue.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #002451;\
+}\
+.ace-tomorrow-night-blue .ace_marker-layer .ace_step {\
+background: rgb(127, 111, 19)\
+}\
+.ace-tomorrow-night-blue .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #404F7D\
+}\
+.ace-tomorrow-night-blue .ace_marker-layer .ace_active-line {\
+background: #00346E\
+}\
+.ace-tomorrow-night-blue .ace_gutter-active-line {\
+background-color: #022040\
+}\
+.ace-tomorrow-night-blue .ace_marker-layer .ace_selected-word {\
+border: 1px solid #003F8E\
+}\
+.ace-tomorrow-night-blue .ace_invisible {\
+color: #404F7D\
+}\
+.ace-tomorrow-night-blue .ace_keyword,\
+.ace-tomorrow-night-blue .ace_meta,\
+.ace-tomorrow-night-blue .ace_storage,\
+.ace-tomorrow-night-blue .ace_storage.ace_type,\
+.ace-tomorrow-night-blue .ace_support.ace_type {\
+color: #EBBBFF\
+}\
+.ace-tomorrow-night-blue .ace_keyword.ace_operator {\
+color: #99FFFF\
+}\
+.ace-tomorrow-night-blue .ace_constant.ace_character,\
+.ace-tomorrow-night-blue .ace_constant.ace_language,\
+.ace-tomorrow-night-blue .ace_constant.ace_numeric,\
+.ace-tomorrow-night-blue .ace_keyword.ace_other.ace_unit,\
+.ace-tomorrow-night-blue .ace_support.ace_constant,\
+.ace-tomorrow-night-blue .ace_variable.ace_parameter {\
+color: #FFC58F\
+}\
+.ace-tomorrow-night-blue .ace_invalid {\
+color: #FFFFFF;\
+background-color: #F99DA5\
+}\
+.ace-tomorrow-night-blue .ace_invalid.ace_deprecated {\
+color: #FFFFFF;\
+background-color: #EBBBFF\
+}\
+.ace-tomorrow-night-blue .ace_fold {\
+background-color: #BBDAFF;\
+border-color: #FFFFFF\
+}\
+.ace-tomorrow-night-blue .ace_entity.ace_name.ace_function,\
+.ace-tomorrow-night-blue .ace_support.ace_function,\
+.ace-tomorrow-night-blue .ace_variable {\
+color: #BBDAFF\
+}\
+.ace-tomorrow-night-blue .ace_support.ace_class,\
+.ace-tomorrow-night-blue .ace_support.ace_type {\
+color: #FFEEAD\
+}\
+.ace-tomorrow-night-blue .ace_heading,\
+.ace-tomorrow-night-blue .ace_markup.ace_heading,\
+.ace-tomorrow-night-blue .ace_string {\
+color: #D1F1A9\
+}\
+.ace-tomorrow-night-blue .ace_entity.ace_name.ace_tag,\
+.ace-tomorrow-night-blue .ace_entity.ace_other.ace_attribute-name,\
+.ace-tomorrow-night-blue .ace_meta.ace_tag,\
+.ace-tomorrow-night-blue .ace_string.ace_regexp,\
+.ace-tomorrow-night-blue .ace_variable {\
+color: #FF9DA4\
+}\
+.ace-tomorrow-night-blue .ace_comment {\
+color: #7285B7\
+}\
+.ace-tomorrow-night-blue .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYJDzqfwPAANXAeNsiA+ZAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-tomorrow_night_bright.js b/filemanager/static/filemanager/js/ace/theme-tomorrow_night_bright.js
new file mode 100755
index 000000000..8514a0d69
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-tomorrow_night_bright.js
@@ -0,0 +1,121 @@
+ace.define("ace/theme/tomorrow_night_bright",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-tomorrow-night-bright";
+exports.cssText = ".ace-tomorrow-night-bright .ace_gutter {\
+background: #1a1a1a;\
+color: #DEDEDE\
+}\
+.ace-tomorrow-night-bright .ace_print-margin {\
+width: 1px;\
+background: #1a1a1a\
+}\
+.ace-tomorrow-night-bright {\
+background-color: #000000;\
+color: #DEDEDE\
+}\
+.ace-tomorrow-night-bright .ace_cursor {\
+color: #9F9F9F\
+}\
+.ace-tomorrow-night-bright .ace_marker-layer .ace_selection {\
+background: #424242\
+}\
+.ace-tomorrow-night-bright.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #000000;\
+}\
+.ace-tomorrow-night-bright .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-tomorrow-night-bright .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #888888\
+}\
+.ace-tomorrow-night-bright .ace_marker-layer .ace_highlight {\
+border: 1px solid rgb(110, 119, 0);\
+border-bottom: 0;\
+box-shadow: inset 0 -1px rgb(110, 119, 0);\
+margin: -1px 0 0 -1px;\
+background: rgba(255, 235, 0, 0.1)\
+}\
+.ace-tomorrow-night-bright .ace_marker-layer .ace_active-line {\
+background: #2A2A2A\
+}\
+.ace-tomorrow-night-bright .ace_gutter-active-line {\
+background-color: #2A2A2A\
+}\
+.ace-tomorrow-night-bright .ace_stack {\
+background-color: rgb(66, 90, 44)\
+}\
+.ace-tomorrow-night-bright .ace_marker-layer .ace_selected-word {\
+border: 1px solid #888888\
+}\
+.ace-tomorrow-night-bright .ace_invisible {\
+color: #343434\
+}\
+.ace-tomorrow-night-bright .ace_keyword,\
+.ace-tomorrow-night-bright .ace_meta,\
+.ace-tomorrow-night-bright .ace_storage,\
+.ace-tomorrow-night-bright .ace_storage.ace_type,\
+.ace-tomorrow-night-bright .ace_support.ace_type {\
+color: #C397D8\
+}\
+.ace-tomorrow-night-bright .ace_keyword.ace_operator {\
+color: #70C0B1\
+}\
+.ace-tomorrow-night-bright .ace_constant.ace_character,\
+.ace-tomorrow-night-bright .ace_constant.ace_language,\
+.ace-tomorrow-night-bright .ace_constant.ace_numeric,\
+.ace-tomorrow-night-bright .ace_keyword.ace_other.ace_unit,\
+.ace-tomorrow-night-bright .ace_support.ace_constant,\
+.ace-tomorrow-night-bright .ace_variable.ace_parameter {\
+color: #E78C45\
+}\
+.ace-tomorrow-night-bright .ace_constant.ace_other {\
+color: #EEEEEE\
+}\
+.ace-tomorrow-night-bright .ace_invalid {\
+color: #CED2CF;\
+background-color: #DF5F5F\
+}\
+.ace-tomorrow-night-bright .ace_invalid.ace_deprecated {\
+color: #CED2CF;\
+background-color: #B798BF\
+}\
+.ace-tomorrow-night-bright .ace_fold {\
+background-color: #7AA6DA;\
+border-color: #DEDEDE\
+}\
+.ace-tomorrow-night-bright .ace_entity.ace_name.ace_function,\
+.ace-tomorrow-night-bright .ace_support.ace_function,\
+.ace-tomorrow-night-bright .ace_variable {\
+color: #7AA6DA\
+}\
+.ace-tomorrow-night-bright .ace_support.ace_class,\
+.ace-tomorrow-night-bright .ace_support.ace_type {\
+color: #E7C547\
+}\
+.ace-tomorrow-night-bright .ace_heading,\
+.ace-tomorrow-night-bright .ace_markup.ace_heading,\
+.ace-tomorrow-night-bright .ace_string {\
+color: #B9CA4A\
+}\
+.ace-tomorrow-night-bright .ace_entity.ace_name.ace_tag,\
+.ace-tomorrow-night-bright .ace_entity.ace_other.ace_attribute-name,\
+.ace-tomorrow-night-bright .ace_meta.ace_tag,\
+.ace-tomorrow-night-bright .ace_string.ace_regexp,\
+.ace-tomorrow-night-bright .ace_variable {\
+color: #D54E53\
+}\
+.ace-tomorrow-night-bright .ace_comment {\
+color: #969896\
+}\
+.ace-tomorrow-night-bright .ace_c9searchresults.ace_keyword {\
+color: #C2C280\
+}\
+.ace-tomorrow-night-bright .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYFBXV/8PAAJoAXX4kT2EAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-tomorrow_night_eighties.js b/filemanager/static/filemanager/js/ace/theme-tomorrow_night_eighties.js
new file mode 100755
index 000000000..3665e3f7d
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-tomorrow_night_eighties.js
@@ -0,0 +1,108 @@
+ace.define("ace/theme/tomorrow_night_eighties",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-tomorrow-night-eighties";
+exports.cssText = ".ace-tomorrow-night-eighties .ace_gutter {\
+background: #272727;\
+color: #CCC\
+}\
+.ace-tomorrow-night-eighties .ace_print-margin {\
+width: 1px;\
+background: #272727\
+}\
+.ace-tomorrow-night-eighties {\
+background-color: #2D2D2D;\
+color: #CCCCCC\
+}\
+.ace-tomorrow-night-eighties .ace_constant.ace_other,\
+.ace-tomorrow-night-eighties .ace_cursor {\
+color: #CCCCCC\
+}\
+.ace-tomorrow-night-eighties .ace_marker-layer .ace_selection {\
+background: #515151\
+}\
+.ace-tomorrow-night-eighties.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #2D2D2D;\
+}\
+.ace-tomorrow-night-eighties .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-tomorrow-night-eighties .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #6A6A6A\
+}\
+.ace-tomorrow-night-bright .ace_stack {\
+background: rgb(66, 90, 44)\
+}\
+.ace-tomorrow-night-eighties .ace_marker-layer .ace_active-line {\
+background: #393939\
+}\
+.ace-tomorrow-night-eighties .ace_gutter-active-line {\
+background-color: #393939\
+}\
+.ace-tomorrow-night-eighties .ace_marker-layer .ace_selected-word {\
+border: 1px solid #515151\
+}\
+.ace-tomorrow-night-eighties .ace_invisible {\
+color: #6A6A6A\
+}\
+.ace-tomorrow-night-eighties .ace_keyword,\
+.ace-tomorrow-night-eighties .ace_meta,\
+.ace-tomorrow-night-eighties .ace_storage,\
+.ace-tomorrow-night-eighties .ace_storage.ace_type,\
+.ace-tomorrow-night-eighties .ace_support.ace_type {\
+color: #CC99CC\
+}\
+.ace-tomorrow-night-eighties .ace_keyword.ace_operator {\
+color: #66CCCC\
+}\
+.ace-tomorrow-night-eighties .ace_constant.ace_character,\
+.ace-tomorrow-night-eighties .ace_constant.ace_language,\
+.ace-tomorrow-night-eighties .ace_constant.ace_numeric,\
+.ace-tomorrow-night-eighties .ace_keyword.ace_other.ace_unit,\
+.ace-tomorrow-night-eighties .ace_support.ace_constant,\
+.ace-tomorrow-night-eighties .ace_variable.ace_parameter {\
+color: #F99157\
+}\
+.ace-tomorrow-night-eighties .ace_invalid {\
+color: #CDCDCD;\
+background-color: #F2777A\
+}\
+.ace-tomorrow-night-eighties .ace_invalid.ace_deprecated {\
+color: #CDCDCD;\
+background-color: #CC99CC\
+}\
+.ace-tomorrow-night-eighties .ace_fold {\
+background-color: #6699CC;\
+border-color: #CCCCCC\
+}\
+.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_function,\
+.ace-tomorrow-night-eighties .ace_support.ace_function,\
+.ace-tomorrow-night-eighties .ace_variable {\
+color: #6699CC\
+}\
+.ace-tomorrow-night-eighties .ace_support.ace_class,\
+.ace-tomorrow-night-eighties .ace_support.ace_type {\
+color: #FFCC66\
+}\
+.ace-tomorrow-night-eighties .ace_heading,\
+.ace-tomorrow-night-eighties .ace_markup.ace_heading,\
+.ace-tomorrow-night-eighties .ace_string {\
+color: #99CC99\
+}\
+.ace-tomorrow-night-eighties .ace_comment {\
+color: #999999\
+}\
+.ace-tomorrow-night-eighties .ace_entity.ace_name.ace_tag,\
+.ace-tomorrow-night-eighties .ace_entity.ace_other.ace_attribute-name,\
+.ace-tomorrow-night-eighties .ace_meta.ace_tag,\
+.ace-tomorrow-night-eighties .ace_variable {\
+color: #F2777A\
+}\
+.ace-tomorrow-night-eighties .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ09NrYAgMjP4PAAtGAwchHMyAAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-twilight.js b/filemanager/static/filemanager/js/ace/theme-twilight.js
new file mode 100755
index 000000000..48ec03098
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-twilight.js
@@ -0,0 +1,109 @@
+ace.define("ace/theme/twilight",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-twilight";
+exports.cssText = ".ace-twilight .ace_gutter {\
+background: #232323;\
+color: #E2E2E2\
+}\
+.ace-twilight .ace_print-margin {\
+width: 1px;\
+background: #232323\
+}\
+.ace-twilight {\
+background-color: #141414;\
+color: #F8F8F8\
+}\
+.ace-twilight .ace_cursor {\
+color: #A7A7A7\
+}\
+.ace-twilight .ace_marker-layer .ace_selection {\
+background: rgba(221, 240, 255, 0.20)\
+}\
+.ace-twilight.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #141414;\
+}\
+.ace-twilight .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-twilight .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid rgba(255, 255, 255, 0.25)\
+}\
+.ace-twilight .ace_marker-layer .ace_active-line {\
+background: rgba(255, 255, 255, 0.031)\
+}\
+.ace-twilight .ace_gutter-active-line {\
+background-color: rgba(255, 255, 255, 0.031)\
+}\
+.ace-twilight .ace_marker-layer .ace_selected-word {\
+border: 1px solid rgba(221, 240, 255, 0.20)\
+}\
+.ace-twilight .ace_invisible {\
+color: rgba(255, 255, 255, 0.25)\
+}\
+.ace-twilight .ace_keyword,\
+.ace-twilight .ace_meta {\
+color: #CDA869\
+}\
+.ace-twilight .ace_constant,\
+.ace-twilight .ace_constant.ace_character,\
+.ace-twilight .ace_constant.ace_character.ace_escape,\
+.ace-twilight .ace_constant.ace_other,\
+.ace-twilight .ace_heading,\
+.ace-twilight .ace_markup.ace_heading,\
+.ace-twilight .ace_support.ace_constant {\
+color: #CF6A4C\
+}\
+.ace-twilight .ace_invalid.ace_illegal {\
+color: #F8F8F8;\
+background-color: rgba(86, 45, 86, 0.75)\
+}\
+.ace-twilight .ace_invalid.ace_deprecated {\
+text-decoration: underline;\
+font-style: italic;\
+color: #D2A8A1\
+}\
+.ace-twilight .ace_support {\
+color: #9B859D\
+}\
+.ace-twilight .ace_fold {\
+background-color: #AC885B;\
+border-color: #F8F8F8\
+}\
+.ace-twilight .ace_support.ace_function {\
+color: #DAD085\
+}\
+.ace-twilight .ace_list,\
+.ace-twilight .ace_markup.ace_list,\
+.ace-twilight .ace_storage {\
+color: #F9EE98\
+}\
+.ace-twilight .ace_entity.ace_name.ace_function,\
+.ace-twilight .ace_meta.ace_tag,\
+.ace-twilight .ace_variable {\
+color: #AC885B\
+}\
+.ace-twilight .ace_string {\
+color: #8F9D6A\
+}\
+.ace-twilight .ace_string.ace_regexp {\
+color: #E9C062\
+}\
+.ace-twilight .ace_comment {\
+font-style: italic;\
+color: #5F5A60\
+}\
+.ace-twilight .ace_variable {\
+color: #7587A6\
+}\
+.ace-twilight .ace_xml-pe {\
+color: #494949\
+}\
+.ace-twilight .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWMQERFpYLC1tf0PAAgOAnPnhxyiAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-vibrant_ink.js b/filemanager/static/filemanager/js/ace/theme-vibrant_ink.js
new file mode 100755
index 000000000..db926c705
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-vibrant_ink.js
@@ -0,0 +1,94 @@
+ace.define("ace/theme/vibrant_ink",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = true;
+exports.cssClass = "ace-vibrant-ink";
+exports.cssText = ".ace-vibrant-ink .ace_gutter {\
+background: #1a1a1a;\
+color: #BEBEBE\
+}\
+.ace-vibrant-ink .ace_print-margin {\
+width: 1px;\
+background: #1a1a1a\
+}\
+.ace-vibrant-ink {\
+background-color: #0F0F0F;\
+color: #FFFFFF\
+}\
+.ace-vibrant-ink .ace_cursor {\
+color: #FFFFFF\
+}\
+.ace-vibrant-ink .ace_marker-layer .ace_selection {\
+background: #6699CC\
+}\
+.ace-vibrant-ink.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #0F0F0F;\
+}\
+.ace-vibrant-ink .ace_marker-layer .ace_step {\
+background: rgb(102, 82, 0)\
+}\
+.ace-vibrant-ink .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #404040\
+}\
+.ace-vibrant-ink .ace_marker-layer .ace_active-line {\
+background: #333333\
+}\
+.ace-vibrant-ink .ace_gutter-active-line {\
+background-color: #333333\
+}\
+.ace-vibrant-ink .ace_marker-layer .ace_selected-word {\
+border: 1px solid #6699CC\
+}\
+.ace-vibrant-ink .ace_invisible {\
+color: #404040\
+}\
+.ace-vibrant-ink .ace_keyword,\
+.ace-vibrant-ink .ace_meta {\
+color: #FF6600\
+}\
+.ace-vibrant-ink .ace_constant,\
+.ace-vibrant-ink .ace_constant.ace_character,\
+.ace-vibrant-ink .ace_constant.ace_character.ace_escape,\
+.ace-vibrant-ink .ace_constant.ace_other {\
+color: #339999\
+}\
+.ace-vibrant-ink .ace_constant.ace_numeric {\
+color: #99CC99\
+}\
+.ace-vibrant-ink .ace_invalid,\
+.ace-vibrant-ink .ace_invalid.ace_deprecated {\
+color: #CCFF33;\
+background-color: #000000\
+}\
+.ace-vibrant-ink .ace_fold {\
+background-color: #FFCC00;\
+border-color: #FFFFFF\
+}\
+.ace-vibrant-ink .ace_entity.ace_name.ace_function,\
+.ace-vibrant-ink .ace_support.ace_function,\
+.ace-vibrant-ink .ace_variable {\
+color: #FFCC00\
+}\
+.ace-vibrant-ink .ace_variable.ace_parameter {\
+font-style: italic\
+}\
+.ace-vibrant-ink .ace_string {\
+color: #66FF00\
+}\
+.ace-vibrant-ink .ace_string.ace_regexp {\
+color: #44B4CC\
+}\
+.ace-vibrant-ink .ace_comment {\
+color: #9933CC\
+}\
+.ace-vibrant-ink .ace_entity.ace_other.ace_attribute-name {\
+font-style: italic;\
+color: #99CC99\
+}\
+.ace-vibrant-ink .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWNgYGBgYNDTc/oPAALPAZ7hxlbYAAAAAElFTkSuQmCC) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/theme-xcode.js b/filemanager/static/filemanager/js/ace/theme-xcode.js
new file mode 100755
index 000000000..3604a1702
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/theme-xcode.js
@@ -0,0 +1,88 @@
+ace.define("ace/theme/xcode",["require","exports","module","ace/lib/dom"], function(require, exports, module) {
+
+exports.isDark = false;
+exports.cssClass = "ace-xcode";
+exports.cssText = "\
+.ace-xcode .ace_gutter {\
+background: #e8e8e8;\
+color: #333\
+}\
+.ace-xcode .ace_print-margin {\
+width: 1px;\
+background: #e8e8e8\
+}\
+.ace-xcode {\
+background-color: #FFFFFF;\
+color: #000000\
+}\
+.ace-xcode .ace_cursor {\
+color: #000000\
+}\
+.ace-xcode .ace_marker-layer .ace_selection {\
+background: #B5D5FF\
+}\
+.ace-xcode.ace_multiselect .ace_selection.ace_start {\
+box-shadow: 0 0 3px 0px #FFFFFF;\
+}\
+.ace-xcode .ace_marker-layer .ace_step {\
+background: rgb(198, 219, 174)\
+}\
+.ace-xcode .ace_marker-layer .ace_bracket {\
+margin: -1px 0 0 -1px;\
+border: 1px solid #BFBFBF\
+}\
+.ace-xcode .ace_marker-layer .ace_active-line {\
+background: rgba(0, 0, 0, 0.071)\
+}\
+.ace-xcode .ace_gutter-active-line {\
+background-color: rgba(0, 0, 0, 0.071)\
+}\
+.ace-xcode .ace_marker-layer .ace_selected-word {\
+border: 1px solid #B5D5FF\
+}\
+.ace-xcode .ace_constant.ace_language,\
+.ace-xcode .ace_keyword,\
+.ace-xcode .ace_meta,\
+.ace-xcode .ace_variable.ace_language {\
+color: #C800A4\
+}\
+.ace-xcode .ace_invisible {\
+color: #BFBFBF\
+}\
+.ace-xcode .ace_constant.ace_character,\
+.ace-xcode .ace_constant.ace_other {\
+color: #275A5E\
+}\
+.ace-xcode .ace_constant.ace_numeric {\
+color: #3A00DC\
+}\
+.ace-xcode .ace_entity.ace_other.ace_attribute-name,\
+.ace-xcode .ace_support.ace_constant,\
+.ace-xcode .ace_support.ace_function {\
+color: #450084\
+}\
+.ace-xcode .ace_fold {\
+background-color: #C800A4;\
+border-color: #000000\
+}\
+.ace-xcode .ace_entity.ace_name.ace_tag,\
+.ace-xcode .ace_support.ace_class,\
+.ace-xcode .ace_support.ace_type {\
+color: #790EAD\
+}\
+.ace-xcode .ace_storage {\
+color: #C900A4\
+}\
+.ace-xcode .ace_string {\
+color: #DF0002\
+}\
+.ace-xcode .ace_comment {\
+color: #008E00\
+}\
+.ace-xcode .ace_indent-guide {\
+background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==) right repeat-y\
+}";
+
+var dom = require("../lib/dom");
+dom.importCssString(exports.cssText, exports.cssClass);
+});
diff --git a/filemanager/static/filemanager/js/ace/worker-coffee.js b/filemanager/static/filemanager/js/ace/worker-coffee.js
new file mode 100755
index 000000000..f71fa4f94
--- /dev/null
+++ b/filemanager/static/filemanager/js/ace/worker-coffee.js
@@ -0,0 +1,2157 @@
+"no use strict";
+!(function(window) {
+if (typeof window.window != "undefined" && window.document)
+ return;
+if (window.require && window.define)
+ return;
+
+if (!window.console) {
+ window.console = function() {
+ var msgs = Array.prototype.slice.call(arguments, 0);
+ postMessage({type: "log", data: msgs});
+ };
+ window.console.error =
+ window.console.warn =
+ window.console.log =
+ window.console.trace = window.console;
+}
+window.window = window;
+window.ace = window;
+
+window.onerror = function(message, file, line, col, err) {
+ postMessage({type: "error", data: {
+ message: message,
+ data: err.data,
+ file: file,
+ line: line,
+ col: col,
+ stack: err.stack
+ }});
+};
+
+window.normalizeModule = function(parentId, moduleName) {
+ // normalize plugin requires
+ if (moduleName.indexOf("!") !== -1) {
+ var chunks = moduleName.split("!");
+ return window.normalizeModule(parentId, chunks[0]) + "!" + window.normalizeModule(parentId, chunks[1]);
+ }
+ // normalize relative requires
+ if (moduleName.charAt(0) == ".") {
+ var base = parentId.split("/").slice(0, -1).join("/");
+ moduleName = (base ? base + "/" : "") + moduleName;
+
+ while (moduleName.indexOf(".") !== -1 && previous != moduleName) {
+ var previous = moduleName;
+ moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
+ }
+ }
+
+ return moduleName;
+};
+
+window.require = function require(parentId, id) {
+ if (!id) {
+ id = parentId;
+ parentId = null;
+ }
+ if (!id.charAt)
+ throw new Error("worker.js require() accepts only (parentId, id) as arguments");
+
+ id = window.normalizeModule(parentId, id);
+
+ var module = window.require.modules[id];
+ if (module) {
+ if (!module.initialized) {
+ module.initialized = true;
+ module.exports = module.factory().exports;
+ }
+ return module.exports;
+ }
+
+ if (!window.require.tlns)
+ return console.log("unable to load " + id);
+
+ var path = resolveModuleId(id, window.require.tlns);
+ if (path.slice(-3) != ".js") path += ".js";
+
+ window.require.id = id;
+ window.require.modules[id] = {}; // prevent infinite loop on broken modules
+ importScripts(path);
+ return window.require(parentId, id);
+};
+function resolveModuleId(id, paths) {
+ var testPath = id, tail = "";
+ while (testPath) {
+ var alias = paths[testPath];
+ if (typeof alias == "string") {
+ return alias + tail;
+ } else if (alias) {
+ return alias.location.replace(/\/*$/, "/") + (tail || alias.main || alias.name);
+ } else if (alias === false) {
+ return "";
+ }
+ var i = testPath.lastIndexOf("/");
+ if (i === -1) break;
+ tail = testPath.substr(i) + tail;
+ testPath = testPath.slice(0, i);
+ }
+ return id;
+}
+window.require.modules = {};
+window.require.tlns = {};
+
+window.define = function(id, deps, factory) {
+ if (arguments.length == 2) {
+ factory = deps;
+ if (typeof id != "string") {
+ deps = id;
+ id = window.require.id;
+ }
+ } else if (arguments.length == 1) {
+ factory = id;
+ deps = [];
+ id = window.require.id;
+ }
+
+ if (typeof factory != "function") {
+ window.require.modules[id] = {
+ exports: factory,
+ initialized: true
+ };
+ return;
+ }
+
+ if (!deps.length)
+ // If there is no dependencies, we inject "require", "exports" and
+ // "module" as dependencies, to provide CommonJS compatibility.
+ deps = ["require", "exports", "module"];
+
+ var req = function(childId) {
+ return window.require(id, childId);
+ };
+
+ window.require.modules[id] = {
+ exports: {},
+ factory: function() {
+ var module = this;
+ var returnExports = factory.apply(this, deps.map(function(dep) {
+ switch (dep) {
+ // Because "require", "exports" and "module" aren't actual
+ // dependencies, we must handle them seperately.
+ case "require": return req;
+ case "exports": return module.exports;
+ case "module": return module;
+ // But for all other dependencies, we can just go ahead and
+ // require them.
+ default: return req(dep);
+ }
+ }));
+ if (returnExports)
+ module.exports = returnExports;
+ return module;
+ }
+ };
+};
+window.define.amd = {};
+require.tlns = {};
+window.initBaseUrls = function initBaseUrls(topLevelNamespaces) {
+ for (var i in topLevelNamespaces)
+ require.tlns[i] = topLevelNamespaces[i];
+};
+
+window.initSender = function initSender() {
+
+ var EventEmitter = window.require("ace/lib/event_emitter").EventEmitter;
+ var oop = window.require("ace/lib/oop");
+
+ var Sender = function() {};
+
+ (function() {
+
+ oop.implement(this, EventEmitter);
+
+ this.callback = function(data, callbackId) {
+ postMessage({
+ type: "call",
+ id: callbackId,
+ data: data
+ });
+ };
+
+ this.emit = function(name, data) {
+ postMessage({
+ type: "event",
+ name: name,
+ data: data
+ });
+ };
+
+ }).call(Sender.prototype);
+
+ return new Sender();
+};
+
+var main = window.main = null;
+var sender = window.sender = null;
+
+window.onmessage = function(e) {
+ var msg = e.data;
+ if (msg.event && sender) {
+ sender._signal(msg.event, msg.data);
+ }
+ else if (msg.command) {
+ if (main[msg.command])
+ main[msg.command].apply(main, msg.args);
+ else if (window[msg.command])
+ window[msg.command].apply(window, msg.args);
+ else
+ throw new Error("Unknown command:" + msg.command);
+ }
+ else if (msg.init) {
+ window.initBaseUrls(msg.tlns);
+ require("ace/lib/es5-shim");
+ sender = window.sender = window.initSender();
+ var clazz = require(msg.module)[msg.classname];
+ main = window.main = new clazz(sender);
+ }
+};
+})(this);
+
+ace.define("ace/lib/oop",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+exports.inherits = function(ctor, superCtor) {
+ ctor.super_ = superCtor;
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+};
+
+exports.mixin = function(obj, mixin) {
+ for (var key in mixin) {
+ obj[key] = mixin[key];
+ }
+ return obj;
+};
+
+exports.implement = function(proto, mixin) {
+ exports.mixin(proto, mixin);
+};
+
+});
+
+ace.define("ace/range",["require","exports","module"], function(require, exports, module) {
+"use strict";
+var comparePoints = function(p1, p2) {
+ return p1.row - p2.row || p1.column - p2.column;
+};
+var Range = function(startRow, startColumn, endRow, endColumn) {
+ this.start = {
+ row: startRow,
+ column: startColumn
+ };
+
+ this.end = {
+ row: endRow,
+ column: endColumn
+ };
+};
+
+(function() {
+ this.isEqual = function(range) {
+ return this.start.row === range.start.row &&
+ this.end.row === range.end.row &&
+ this.start.column === range.start.column &&
+ this.end.column === range.end.column;
+ };
+ this.toString = function() {
+ return ("Range: [" + this.start.row + "/" + this.start.column +
+ "] -> [" + this.end.row + "/" + this.end.column + "]");
+ };
+
+ this.contains = function(row, column) {
+ return this.compare(row, column) == 0;
+ };
+ this.compareRange = function(range) {
+ var cmp,
+ end = range.end,
+ start = range.start;
+
+ cmp = this.compare(end.row, end.column);
+ if (cmp == 1) {
+ cmp = this.compare(start.row, start.column);
+ if (cmp == 1) {
+ return 2;
+ } else if (cmp == 0) {
+ return 1;
+ } else {
+ return 0;
+ }
+ } else if (cmp == -1) {
+ return -2;
+ } else {
+ cmp = this.compare(start.row, start.column);
+ if (cmp == -1) {
+ return -1;
+ } else if (cmp == 1) {
+ return 42;
+ } else {
+ return 0;
+ }
+ }
+ };
+ this.comparePoint = function(p) {
+ return this.compare(p.row, p.column);
+ };
+ this.containsRange = function(range) {
+ return this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0;
+ };
+ this.intersects = function(range) {
+ var cmp = this.compareRange(range);
+ return (cmp == -1 || cmp == 0 || cmp == 1);
+ };
+ this.isEnd = function(row, column) {
+ return this.end.row == row && this.end.column == column;
+ };
+ this.isStart = function(row, column) {
+ return this.start.row == row && this.start.column == column;
+ };
+ this.setStart = function(row, column) {
+ if (typeof row == "object") {
+ this.start.column = row.column;
+ this.start.row = row.row;
+ } else {
+ this.start.row = row;
+ this.start.column = column;
+ }
+ };
+ this.setEnd = function(row, column) {
+ if (typeof row == "object") {
+ this.end.column = row.column;
+ this.end.row = row.row;
+ } else {
+ this.end.row = row;
+ this.end.column = column;
+ }
+ };
+ this.inside = function(row, column) {
+ if (this.compare(row, column) == 0) {
+ if (this.isEnd(row, column) || this.isStart(row, column)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ return false;
+ };
+ this.insideStart = function(row, column) {
+ if (this.compare(row, column) == 0) {
+ if (this.isEnd(row, column)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ return false;
+ };
+ this.insideEnd = function(row, column) {
+ if (this.compare(row, column) == 0) {
+ if (this.isStart(row, column)) {
+ return false;
+ } else {
+ return true;
+ }
+ }
+ return false;
+ };
+ this.compare = function(row, column) {
+ if (!this.isMultiLine()) {
+ if (row === this.start.row) {
+ return column < this.start.column ? -1 : (column > this.end.column ? 1 : 0);
+ }
+ }
+
+ if (row < this.start.row)
+ return -1;
+
+ if (row > this.end.row)
+ return 1;
+
+ if (this.start.row === row)
+ return column >= this.start.column ? 0 : -1;
+
+ if (this.end.row === row)
+ return column <= this.end.column ? 0 : 1;
+
+ return 0;
+ };
+ this.compareStart = function(row, column) {
+ if (this.start.row == row && this.start.column == column) {
+ return -1;
+ } else {
+ return this.compare(row, column);
+ }
+ };
+ this.compareEnd = function(row, column) {
+ if (this.end.row == row && this.end.column == column) {
+ return 1;
+ } else {
+ return this.compare(row, column);
+ }
+ };
+ this.compareInside = function(row, column) {
+ if (this.end.row == row && this.end.column == column) {
+ return 1;
+ } else if (this.start.row == row && this.start.column == column) {
+ return -1;
+ } else {
+ return this.compare(row, column);
+ }
+ };
+ this.clipRows = function(firstRow, lastRow) {
+ if (this.end.row > lastRow)
+ var end = {row: lastRow + 1, column: 0};
+ else if (this.end.row < firstRow)
+ var end = {row: firstRow, column: 0};
+
+ if (this.start.row > lastRow)
+ var start = {row: lastRow + 1, column: 0};
+ else if (this.start.row < firstRow)
+ var start = {row: firstRow, column: 0};
+
+ return Range.fromPoints(start || this.start, end || this.end);
+ };
+ this.extend = function(row, column) {
+ var cmp = this.compare(row, column);
+
+ if (cmp == 0)
+ return this;
+ else if (cmp == -1)
+ var start = {row: row, column: column};
+ else
+ var end = {row: row, column: column};
+
+ return Range.fromPoints(start || this.start, end || this.end);
+ };
+
+ this.isEmpty = function() {
+ return (this.start.row === this.end.row && this.start.column === this.end.column);
+ };
+ this.isMultiLine = function() {
+ return (this.start.row !== this.end.row);
+ };
+ this.clone = function() {
+ return Range.fromPoints(this.start, this.end);
+ };
+ this.collapseRows = function() {
+ if (this.end.column == 0)
+ return new Range(this.start.row, 0, Math.max(this.start.row, this.end.row-1), 0);
+ else
+ return new Range(this.start.row, 0, this.end.row, 0);
+ };
+ this.toScreenRange = function(session) {
+ var screenPosStart = session.documentToScreenPosition(this.start);
+ var screenPosEnd = session.documentToScreenPosition(this.end);
+
+ return new Range(
+ screenPosStart.row, screenPosStart.column,
+ screenPosEnd.row, screenPosEnd.column
+ );
+ };
+ this.moveBy = function(row, column) {
+ this.start.row += row;
+ this.start.column += column;
+ this.end.row += row;
+ this.end.column += column;
+ };
+
+}).call(Range.prototype);
+Range.fromPoints = function(start, end) {
+ return new Range(start.row, start.column, end.row, end.column);
+};
+Range.comparePoints = comparePoints;
+
+Range.comparePoints = function(p1, p2) {
+ return p1.row - p2.row || p1.column - p2.column;
+};
+
+
+exports.Range = Range;
+});
+
+ace.define("ace/apply_delta",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+function throwDeltaError(delta, errorText){
+ console.log("Invalid Delta:", delta);
+ throw "Invalid Delta: " + errorText;
+}
+
+function positionInDocument(docLines, position) {
+ return position.row >= 0 && position.row < docLines.length &&
+ position.column >= 0 && position.column <= docLines[position.row].length;
+}
+
+function validateDelta(docLines, delta) {
+ if (delta.action != "insert" && delta.action != "remove")
+ throwDeltaError(delta, "delta.action must be 'insert' or 'remove'");
+ if (!(delta.lines instanceof Array))
+ throwDeltaError(delta, "delta.lines must be an Array");
+ if (!delta.start || !delta.end)
+ throwDeltaError(delta, "delta.start/end must be an present");
+ var start = delta.start;
+ if (!positionInDocument(docLines, delta.start))
+ throwDeltaError(delta, "delta.start must be contained in document");
+ var end = delta.end;
+ if (delta.action == "remove" && !positionInDocument(docLines, end))
+ throwDeltaError(delta, "delta.end must contained in document for 'remove' actions");
+ var numRangeRows = end.row - start.row;
+ var numRangeLastLineChars = (end.column - (numRangeRows == 0 ? start.column : 0));
+ if (numRangeRows != delta.lines.length - 1 || delta.lines[numRangeRows].length != numRangeLastLineChars)
+ throwDeltaError(delta, "delta.range must match delta lines");
+}
+
+exports.applyDelta = function(docLines, delta, doNotValidate) {
+
+ var row = delta.start.row;
+ var startColumn = delta.start.column;
+ var line = docLines[row] || "";
+ switch (delta.action) {
+ case "insert":
+ var lines = delta.lines;
+ if (lines.length === 1) {
+ docLines[row] = line.substring(0, startColumn) + delta.lines[0] + line.substring(startColumn);
+ } else {
+ var args = [row, 1].concat(delta.lines);
+ docLines.splice.apply(docLines, args);
+ docLines[row] = line.substring(0, startColumn) + docLines[row];
+ docLines[row + delta.lines.length - 1] += line.substring(startColumn);
+ }
+ break;
+ case "remove":
+ var endColumn = delta.end.column;
+ var endRow = delta.end.row;
+ if (row === endRow) {
+ docLines[row] = line.substring(0, startColumn) + line.substring(endColumn);
+ } else {
+ docLines.splice(
+ row, endRow - row + 1,
+ line.substring(0, startColumn) + docLines[endRow].substring(endColumn)
+ );
+ }
+ break;
+ }
+};
+});
+
+ace.define("ace/lib/event_emitter",["require","exports","module"], function(require, exports, module) {
+"use strict";
+
+var EventEmitter = {};
+var stopPropagation = function() { this.propagationStopped = true; };
+var preventDefault = function() { this.defaultPrevented = true; };
+
+EventEmitter._emit =
+EventEmitter._dispatchEvent = function(eventName, e) {
+ this._eventRegistry || (this._eventRegistry = {});
+ this._defaultHandlers || (this._defaultHandlers = {});
+
+ var listeners = this._eventRegistry[eventName] || [];
+ var defaultHandler = this._defaultHandlers[eventName];
+ if (!listeners.length && !defaultHandler)
+ return;
+
+ if (typeof e != "object" || !e)
+ e = {};
+
+ if (!e.type)
+ e.type = eventName;
+ if (!e.stopPropagation)
+ e.stopPropagation = stopPropagation;
+ if (!e.preventDefault)
+ e.preventDefault = preventDefault;
+
+ listeners = listeners.slice();
+ for (var i=0; i