aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contexts/build.mk4
-rw-r--r--contexts/data/fiveui/entry.css19
-rw-r--r--contexts/data/fiveui/entry.js261
-rw-r--r--contexts/data/fiveui/options.css38
-rw-r--r--contexts/data/fiveui/options.html54
-rw-r--r--contexts/data/fiveui/options.js264
-rw-r--r--contexts/data/fiveui/rules.js110
-rw-r--r--contexts/data/fiveui/settings.js10
-rw-r--r--contexts/data/fiveui/utils.js67
-rw-r--r--contexts/data/lib/codemirror/codemirror-compressed.js3
-rw-r--r--contexts/data/lib/codemirror/codemirror.css240
-rw-r--r--contexts/data/tests/specs/rules.js4
12 files changed, 356 insertions, 718 deletions
diff --git a/contexts/build.mk b/contexts/build.mk
index 30409c2..2bbcc5c 100644
--- a/contexts/build.mk
+++ b/contexts/build.mk
@@ -82,7 +82,9 @@ options-deps := $(addprefix $(fiveui-dir)/,\
messenger.js \
options.js \
update-manager.js \
- utils.js )
+ utils.js \
+ entry.js \
+ rules.js )
# CSS Staging ##################################################################
diff --git a/contexts/data/fiveui/entry.css b/contexts/data/fiveui/entry.css
index 8ee7b62..fcaa390 100644
--- a/contexts/data/fiveui/entry.css
+++ b/contexts/data/fiveui/entry.css
@@ -22,8 +22,6 @@
/* Generic list entries */
div.entries>div.entry {
- width: 49em;
- display: block;
border-top: 1px solid #CDCDCD;
margin-top: 5px;
padding: 10px;
@@ -33,22 +31,13 @@ div.entries>div.entry:first-child {
border-top: 0px;
}
-div.entry>div.content {
- float: left;
- display: block;
- width: 80%;
+div.entry span.button {
+ cursor: pointer;
+ cursor: hand;
}
-div.entry>div.controls {
- text-align: right;
- float: left;
+div.entry>div.content {
display: block;
- width: 20%;
-}
-
-div.entry>div.controls>button {
- width: 5em;
- margin-right: 5px;
}
div.entry>div.content>div.title {
diff --git a/contexts/data/fiveui/entry.js b/contexts/data/fiveui/entry.js
index fcc65e5..e1deeb7 100644
--- a/contexts/data/fiveui/entry.js
+++ b/contexts/data/fiveui/entry.js
@@ -27,164 +27,175 @@ var fiveui = fiveui || {};
/** Generic Entry Elements ***************************************************/
/**
- * Create an Entry element, which provides a content area, and remove button.
- *
- * @constructor
+ * Generic mixin for adding entry-list functionality to a View.
*/
-fiveui.Entry = function() {
-
- // containing element
- this._e = jQuery('div');
+fiveui.Entry = {
- // content container
- this.content = jQuery('div');
- this._e.append(this.content);
+ tagName: 'div',
- // title element
- this._title = jQuery('div');
- this.content.append(this._title);
+ className: 'entry',
- // description element
- this._description = jQuery('div');
- this.content.append(this._description);
+ remove: function(evt) {
+ this.$el.remove();
+ this.model.destroy();
+ },
- // control container
- this._controls = jQuery('div');
- this._e.append(this._controls);
+ edit: function() {
+ var attrs = this.model.attributes;
+ this.$el.html(this.editTemplate(attrs));
+ return this;
+ },
- // the remove button
- this._remove = jQuery('button');
- this._remove.text('Remove');
- this._controls.append(this._remove);
+ /**
+ * Render the item according to its template
+ */
+ render: function() {
+ var attrs = this.model.attributes;
+ this.$el.html(this.viewTemplate(attrs));
+ return this;
+ }
- // connect the remove event to the remove button being clicked
- this._remove.on('click', _.bind(this.trigger, this, 'remove'));
};
-_.extend(fiveui.Entry.prototype, Backbone.Events);
-_.extend(fiveui.Entry.prototype, {
+/** UrlPat Entry Elements ****************************************************/
- /**
- * Append the entry to a containing element
- *
- * @param {!Element} e The element to append to.
- * @return {void}
- */
- append: function(e) {
- e.append(this._e);
- },
+fiveui.UrlPatEntryModel = Backbone.Model.extend({
- /**
- * Remove the entry from its containing element.
- *
- * @return {void}
- */
- remove: function() {
- this._e.remove();
- },
+ defaults: {
+ title: '',
+ descr: '',
+ ruleSet: ''
+ }
- /**
- * Set the text of the title element.
- *
- * @param {!string} title The content of the title element.
- */
- setTitle: function(title) {
- this._title.text(title);
- },
+});
- /**
- * Set the text of the description element.
- *
- * @param {!string} description The content of the description element.
- */
- setDescription: function(description) {
- this._description.text(description);
+fiveui.UrlPatEntry = Backbone.View.extend(_.extend({
+
+ events: function() {
+ return _.extend(this.entryEvents, {});
},
-});
+}, fiveui.Entry));
-/** UrlPat Entry Elements ****************************************************/
+/** Rule Entry Elements ******************************************************/
-/**
- * Construct a list entry for a url pattern.
- *
- * @constructor
- *
- * @param {!fiveui.UrlPat} urlPat UrlPat instance to use.
- * @param {!fiveui.RuleSet} ruleSet RuleSet instance to associate with.
- */
-fiveui.UrlPatEntry = function(urlPat, ruleSet) {
- // call the parent constructor
- fiveui.Entry.call(this);
+fiveui.RuleSetModel = Backbone.Model.extend({
- this.setUrlPat(urlPat);
- this.setRuleSet(ruleSet);
-};
-_.extend(fiveui.UrlPatEntry.prototype, fiveui.Entry.prototype);
+ defaults: {
+ msg: null,
+ id: null,
+ name: '',
+ description: '',
+ source: '',
+ rules: [],
+ dependencies: [],
+ },
-_.extend(fiveui.UrlPatEntry.prototype, {
+ sync: function(method, model, options) {
- /**
- * @param {!fiveui.UrlPat} urlPat UrlPat instance to use.
- * @return {void}
- */
- setUrlPat: function(urlPat) {
- this._urlPat = urlPat;
- this.setTitle(this._urlPat.regex);
- },
+ _.defaults(options, {
+ success:function() {},
+ error: function() {}
+ });
- /**
- * @param {!fiveui.RuleSet} ruleSet RuleSet instance to associate with.
- * @return {void}
- */
- setRuleSet: function(ruleSet) {
- this._ruleSet = ruleSet
- this.setDescription(this._ruleSet.name);
- },
+ var msg = model.get('msg');
+ var id = model.get('id');
-});
+ switch(method) {
+ case 'update':
+ case 'create':
+ var rsMethod = method == 'update' ? 'updateRuleSet' : 'addRuleSet';
-/** Rule Entry Elements ******************************************************/
+ fiveui.RuleSet.load(model.get('source'), {
+ success: function(obj) {
+ // null when a new rule set
+ obj.id = id;
-/**
- * Construct a list entry for a rule set.
- *
- * @constructor
- *
- * @param {!fiveui.RuleSet} rule The RuleSet instance to use.
- */
-fiveui.RuleSetEntry = function(rule) {
- // call the parent constructor
- fiveui.Entry.call(this);
+ msg.send(rsMethod, obj, function(ruleSet) {
+ // XXX this should probably be just the relevant fields, rules is
+ // probably unnecessarily big to duplicate
+ model.set(ruleSet);
+ options.success();
+ });
+ },
- // edit button
- this._edit = jQuery('button');
- this._edit.text('Edit');
- this._controls.append(this._edit);
- this._edit.on('click', _.bind(this.trigger, this, 'edit'));
+ error: options.error
+ });
+ break;
- this.setRuleSet(rule);
-};
+ case 'delete':
+ msg.send('remRuleSet', id);
+ break;
-_.extend(fiveui.RuleSetEntry.prototype, fiveui.Entry.prototype);
+ case 'read':
+ msg.send('getRuleSet', id, function(rs) {
+ model.set({
+ title: rs.name,
+ descr: rs.description,
+ source: rs.source,
+ });
+ });
+ break;
-_.extend(fiveui.RuleSetEntry.prototype, {
+ default:
+ break;
+ }
+ }
- /**
- * Use the given rule set for the current display values for the entry.
- *
- * @param {!fiveui.RuleSet} ruleSet RuleSet to use for display.
- * @return {void}
- */
- setRuleSet: function(ruleSet) {
- this._rule = ruleSet;
- this.setTitle(this._rule.name);
- this.setDescription(this._rule.description);
- },
});
+fiveui.RuleSetEntry = Backbone.View.extend(_.extend({
+
+ viewTemplate: _.template(
+ [ '<div class="content">'
+ , ' <div class="header">'
+ , ' <span class="button remove">x</span>'
+ , ' <span class="button edit">edit</span>'
+ , ' <span class="title"><%= name %></span>'
+ , ' </div>'
+ , '</div>'
+ ].join('')),
+
+ editTemplate: _.template(
+ [ '<div class="content">'
+ , ' <div class="header">'
+ , ' <span class="button remove">x</span>'
+ , ' <span class="button save">save</span>'
+ , ' <input class="source" placeholder="rule set url" '
+ , ' type="textbox" value="<%= source %>" />'
+ , ' </div>'
+ , '</div>'
+ ].join('')),
+
+ events: {
+ 'click span.save' : function(evt) {
+ evt.stopPropagation();
+ this.save();
+ },
+
+ 'click span.remove' : function(evt) {
+ evt.stopPropagation();
+ this.remove();
+ },
+
+ 'click span.edit' : function(evt) {
+ evt.stopPropagation();
+ this.edit();
+ },
+ },
+
+ save: function() {
+ var source = this.$el.find('.source').val();
+ this.model.save({ source: source }, {
+ success: _.bind(this.render, this),
+ error: _.bind(this.edit, this)
+ });
+ },
+
+}, fiveui.Entry));
+
})();
diff --git a/contexts/data/fiveui/options.css b/contexts/data/fiveui/options.css
index f87a053..c2fd359 100644
--- a/contexts/data/fiveui/options.css
+++ b/contexts/data/fiveui/options.css
@@ -129,10 +129,6 @@ div.title {
width: 50%;
}
-.entry {
- float: left;
-}
-
#upDownGroup button {
display: block
}
@@ -143,40 +139,6 @@ div.title {
float: left;
}
-div.editorPane {
- position: absolute;
- top: 0px;
- left: 25%;
- right: 0px;
- bottom: 0px;
- background: white;
- display: none;
- margin: 0;
- padding: 0.5em;
- padding-bottom: 0;
- padding-right: 0;
- box-shadow: -5px 0px 10px #ddd;
-}
-
-div.editorPane div.row {
- padding-left: 5px;
-}
-
-div.editorPane div.row>label {
- clear: left;
- float: left;
- width: 5em;
-}
-
.buttons {
display: inline;
}
-
-.CodeMirror {
- border: 2px solid #eee;
- height: auto;
-}
-.CodeMirror-scroll {
- overflow-y: hidden;
- overflow-x: auto;
-}
diff --git a/contexts/data/fiveui/options.html b/contexts/data/fiveui/options.html
index 79f2f58..3e3b28c 100644
--- a/contexts/data/fiveui/options.html
+++ b/contexts/data/fiveui/options.html
@@ -28,10 +28,8 @@
<link id="favicon" rel="icon" href="images/fiveui-icon-16.png" />
<link rel="stylesheet" href="options.css" />
<link rel="stylesheet" href="entry.css" />
- <link rel="stylesheet" href="../lib/codemirror/codemirror.css"/>
<script src="../lib/jquery/jquery-1.8.3.js"></script>
<script src="../lib/jquery/jquery.json-2.4.js"></script>
- <script src="../lib/codemirror/codemirror-compressed.js"></script>
<script src="../lib/underscore/underscore.js"></script>
<script src="../lib/backbone/backbone.js"></script>
<script src="../target/chrome-options.js"></script>
@@ -53,14 +51,22 @@
<div id="content">
<section id="tab-url-defaults">
<div class="title">URL Patterns</div>
- <div id="urlPatEntries" class="entries"></div>
- <div><button id="addUrlPat">Add</button></div>
+ <section>
+ <div id="urlPatEntries" class="entries"></div>
+ <div>
+ <button id="addUrlPat">Add</button>
+ </div>
+ </section>
</section>
<section id="tab-rule-sets">
<div class="title">Rule Sets</div>
- <div id="ruleSetEntries" class="entries"></div>
- <div><button id="addRsButton">Add</button></div>
+ <section>
+ <div id="ruleSetEntries" class="entries"></div>
+ <div>
+ <button id="addRsButton">Add</button>
+ </div>
+ </section>
</section>
<section id="tab-basics">
@@ -79,41 +85,5 @@
</section>
</div>
- <div id="ruleSetEditorPane" class="editorPane">
- <div class="title">Rule Set</div>
- <div id="editorButtons">
- <button id="saveEditButton">Save</button>
- <button id="cancelEditButton">Cancel</button>
- </div>
- <div id="editorDiv">
- <form><textarea id="editor" name="editor">{ 'name': 'rule set name'
-, 'description': 'rule set description'
-, 'id': 0 /* each rule set needs a unique id */
-, 'rules': [
- { 'name': 'rule 1 name'
- , 'description': 'rule 1 description'
- , 'rule': function () { /* do something here */ }
- , 'id': 1 /* each rule needs a unique id */
- }]
-} </textarea></form>
- </div>
-
- </div>
-
- <div id="urlPatEditorPane" class="editorPane">
- <div class="title">URL Pattern</div>
- <div class="row">
- <label>Pattern</label>
- <input id="urlPatRegex" type="text" placeholder="URL Pattern"></input>
- </div>
- <div class="row">
- <label>Rule Set</label>
- <select id="urlPatRuleSetId"></select>
- </div>
- <div class="row">
- <button id="confirmAddUrlPat">Add</button>
- <button id="cancelAddUrlPat">Cancel</button>
- </div>
- </div>
</body>
</html>
diff --git a/contexts/data/fiveui/options.js b/contexts/data/fiveui/options.js
index 8558ca2..08f3d99 100644
--- a/contexts/data/fiveui/options.js
+++ b/contexts/data/fiveui/options.js
@@ -202,253 +202,28 @@ fiveui.options.init = function(port) {
* @param {!fiveui.UrlPat} pat The new url pattern.
*/
var onAddUrlPat = function(pat) {
- getRuleSet(pat.rule_id, function(rs) {
- if (null == rs) {
- console.error('could not find ruleset with id: ' + pat.rule_id);
- return;
- }
-
- var entry = new fiveui.UrlPatEntry(pat, rs);
- entry.append(gdom.getElement('urlPatEntries'));
-
- entry.on('remove', function() {
- remUrlPat(pat.id);
- });
-
- update.on('remUrlPat.' + pat.id,
- _.bind(entry.remove, entry));
-
- update.on('updateRuleSet.' + pat.rule_id,
- _.bind(entry.setRuleSet, entry));
- });
};
// register to handle new url patterns from the backend
- msg.register('addUrlPat', onAddUrlPat);
-
-
- /** UrlPat editor overlay **************************************************/
-
- var getUrlPatEditor = function() {
- return gdom.getElement('urlPatEditorPane');
- };
-
- var openUrlPatEditor = function() {
- getRuleSets(function(ruleSets) {
- if (ruleSets.length <= 0) {
- // XXX not sure what to do about goog.dialog
- var errDialog = new goog.ui.Dialog();
- errDialog.setTitle('No Rule Sets Defined');
- errDialog.setContent('No rule sets are defined. Please define some '
- + 'before creating a URL Pattern.');
-
- errDialog.setButtonSet(goog.ui.Dialog.ButtonSet.createOk());
- errDialog.setVisible(true);
-
- goog.events.listen(errDialog, goog.ui.Dialog.EventType.SELECT,
- closeUrlPatEditor);
- } else {
- var pane = getUrlPatEditor();
- pane.style.display = 'block';
- }
- });
- };
-
- var closeUrlPatEditor = function() {
- var pane = getUrlPatEditor();
- pane.style.display = 'none';
-
- // clear out the text field
- gdom.forms.setValue(gdom.getElement('urlPatRegex'), '');
- };
-
- setClickHandler(jQuery('#addUrlPat'), openUrlPatEditor);
-
- setClickHandler(jQuery('#cancelAddUrlPat'), closeUrlPatEditor);
-
- setClickHandler(jQuery('#confirmAddUrlPat'), function() {
- var pat = jQuery('#urlPatRegex').val();
- var rs = jQuery('#urlPatRuleSetId').val();
+ msg.register('addUrlPat', _.bind(console.error, console));
- if (pat && rs) {
- addUrlPat(pat, rs);
- closeUrlPatEditor();
- }
-
- // TODO we need to notify them that the creation failed
- });
+ // handle the `add` button being clicked
+ jQuery('#addUrlPat').on('click', onAddUrlPat);
/** RuleSet list entries ***************************************************/
- /**
- * Respond to addRuleSet events from the backend.
- *
- * @param {!fiveui.RuleSet} ruleSet The RuleSet that was added.
- */
- var onAddRuleSet = function(ruleSet) {
- // register the rule set with the drop down
- var rsDropDown = jQuery(_.template(
- '<option value="<%= id %>"><%= name %></option>',
- ruleSet));
-
- jQuery('#urlPatRuleSetId').append(rsDropDown);
-
- // create the rule set list entry
- var entry = new fiveui.RuleSetEntry(ruleSet);
- entry.append(jQuery('#ruleSetEntries'));
-
- entry.on('remove', function() {
- remRuleSet(ruleSet.id);
- });
+ var ruleSetEntries = jQuery('#ruleSetEntries');
- entry.on('edit', function() {
- editButtonHandler(ruleSet.id);
- });
-
- update.on('updateRuleSet.' + ruleSet.id,
- function(newRuleSet) {
- entry.setRuleSet(newRuleSet);
- gdom.setTextContent(rsDropDown, newRuleSet.name);
- });
-
- update.once(rmEvtName, function() {
- entry.remove();
- rsDropDown.remove();
- });
- };
-
- /**
- * @param {?number} ruleSetId Optional: The id of the rule to open in the editor.
- */
- var editButtonHandler = function(ruleSetId) {
- var editPane = gdom.getElement('ruleSetEditorPane');
- editPane.curRuleSetId = ruleSetId;
- showEditorPane(true);
-
- if (ruleSetId != null) {
- getRuleSet(ruleSetId,
- function(ruleSet) {
- if (ruleSet) {
- setEditorText(ruleSet.original);
- }
- });
- } else {
- setEditorText('');
- }
- };
-
- // Register for events from the messenger:
- msg.register('addRuleSet', onAddRuleSet);
-
- // listen to clicks to the add rule set button
- setClickHandler(jQuery('#addRsButton'), _.bind(editButtonHandler, this, null));
-
-
- /** RuleSet Editor Overlay *************************************************/
-
- var editorDiv = document.getElementById("editorDiv");
- var editor = CodeMirror.fromTextArea(document.getElementById("editor"), {
- lineNumbers: true
- });
-
- /**
- * Display an error dialog with a list of url pattern that rely on a
- * given rule id.
- */
- var showRemRuleSetErr = function(ruleSetId, urlPats) {
- var info = '';
- _.each(urlPats, function(m) {
- info += '<li>' + m.regex + '</li>';
- });
-
- // XXX not sure what to do about this
- var errDialog = new goog.ui.Dialog();
- errDialog.setTitle('Rule Set could not be removed.');
- errDialog.setContent('<p>The following Url Patterns use this rule set:</p>'
- + '<ul>'
- + info
- + '</ul>'
- + 'Remove these Url Patterns as well?');
-
- errDialog.setButtonSet(goog.ui.Dialog.ButtonSet.createOkCancel());
- errDialog.setVisible(true);
-
- goog.events.listen(errDialog, goog.ui.Dialog.EventType.SELECT, function(e) {
- if (e.key == 'ok') {
- // Remove the url patterns:
- _.each(urlPats, function(urlPat) {
- remUrlPat(urlPat.id);
- });
- // re-issue the RuleSet remove:
- remRuleSet(ruleSetId);
- }
- });
- };
-
- /**
- * Show or hide the editor pane that contains the Ace text editor.
- *
- * @param {!boolean} showP True to show the edit pane, false to hide
- * it.
- */
- var showEditorPane = function(showP) {
- var editPane = gdom.getElement('ruleSetEditorPane');
- if (! showP) {
- editPane.style.display = 'none';
- return;
- }
-
- editPane.style.display = 'block';
-
-
- var buttonPane = gdom.getElement('editorButtons');
- var newWidth = editPane.clientWidth - 10;
- var newHeight = editPane.clientHeight - 10;
- for (var i = 0; i < editPane.children.length; ++i) {
- var child = editPane.children[i];
- if (child.id == 'editor') {
- break;
- } else {
- newHeight = newHeight - child.clientHeight;
- }
- }
-
- //editorDiv.style.width = newWidth + 'px';
- //editorDiv.style.height = newHeight + 'px';
- };
-
- // set the content of the editor widget
- var setEditorText = function(string) {
- editor.setValue(string);
- editor.setSize('auto', 'auto');
- };
-
- // listen to click events from the cancel button in the rule set editor
- setClickHandler(jQuery('#cancelEditButton'),
- function() {
- showEditorPane(false);
- });
-
- // listen to click events from the save button in the rule set editor
- setClickHandler(jQuery('#saveEditButton'),
- function() {
- var editPane = gdom.getElement('ruleSetEditorPane');
- var rsText = editor.getValue();
- if (null != editPane.curRuleSetId) {
- updateRuleSet(editPane.curRuleSetId, rsText);
- } else {
- addRuleSet(rsText);
- }
- showEditorPane(false);
+ // handle clicks to the 'add' button on the rule sets page
+ jQuery('#addRsButton').on('click', function() {
+ var entry = new fiveui.RuleSetEntry({
+ model: new fiveui.RuleSetModel({ msg: msg })
});
+ ruleSetEntries.append(entry.$el);
+ entry.edit();
+ });
- // change default display state
- setClickHandler(jQuery('#windowDisplayDefault'),
- function(event) {
- var displayDef = event.currentTarget.checked;
- setDisplayDefault(displayDef);
- });
/** Tab Management *********************************************************/
@@ -523,7 +298,22 @@ fiveui.options.init = function(port) {
// pre-populate the list of rule sets
getRuleSets(function(ruleSets) {
- _.each(ruleSets, onAddRuleSet);
+ _.each(ruleSets, function(ruleSet) {
+
+ var entry = new fiveui.RuleSetEntry({
+ model: new fiveui.RuleSetModel({
+ msg: msg,
+ id: ruleSet.id,
+ name: ruleSet.name,
+ description: ruleSet.description,
+ source: ruleSet.source,
+ })
+ });
+
+ ruleSetEntries.append(entry.$el);
+ entry.render();
+
+ });
});
};
diff --git a/contexts/data/fiveui/rules.js b/contexts/data/fiveui/rules.js
index 29d63df..3802ffb 100644
--- a/contexts/data/fiveui/rules.js
+++ b/contexts/data/fiveui/rules.js
@@ -37,6 +37,15 @@ fiveui.Rule = function(id, name, desc, ruleStr) {
this.ruleStr = ruleStr;
};
+fiveui.Rule.defaults = function(obj) {
+ return _.defaults(obj, {
+ id: null,
+ name: '',
+ description: '',
+ ruleStr: ''
+ });
+};
+
/**
* Create a Rule from a JSON object.
*
@@ -53,17 +62,17 @@ fiveui.Rule.fromJSON = function(obj) {
* @param {!number} id The unique RuleSet identifier.
* @param {!string} name A human-readable name for this RuleSet.
* @param {!string} desc A human-readable description of the Rule Set.
+ * @param {!string} source The url where the manifest can be retrieved
* @param {!Array.<fiveui.Rule>} rules An Array of Rules.
- * @param {!string} original The original string representation.
* @param {?Array.<string>} deps Dependencies that this RuleSet requires.
*/
-fiveui.RuleSet = function(id, name, desc, rules, original, deps) {
- this.id = id;
- this.name = name;
- this.description = desc;
- this.rules = rules;
- this.original = original;
- this.dependencies = deps || [];
+fiveui.RuleSet = function(id, name, desc, source, rules, deps) {
+ this.id = id;
+ this.name = name;
+ this.description = desc;
+ this.source = source;
+ this.rules = rules || [];
+ this.dependencies = deps || [];
};
/**
@@ -77,8 +86,89 @@ fiveui.RuleSet.fromJSON = function(id, obj) {
var rules = (/** @type {!Array.<!fiveui.Rule>} */
_.map(obj.rules, fiveui.Rule.fromJSON));
- return new fiveui.RuleSet(id, obj.name, obj.description, rules,
- obj.original, obj.dependencies);
+ return new fiveui.RuleSet(id, obj.name, obj.description, obj.source,
+ rules, obj.dependencies);
+};
+
+
+fiveui.RuleSet.defaults = function(obj) {
+ return _.defaults(obj, {
+ name: '',
+ description: '',
+ source: '',
+ rules: [],
+ dependencies: []
+ });
+};
+
+
+/**
+ * Options is an object that can contain a success and error continuation.
+ */
+fiveui.RuleSet.load = function(manifest_url, options) {
+
+ _.defaults(options, {
+ success: function() {},
+ error: function() { throw "failed when loading url"; }
+ });
+
+ var match = manifest_url.match(/\/[^\/]*$/);
+
+ if(match) {
+ var base_url = manifest_url.substring(0,match.index);
+
+ // iterate over rules, retrieving the
+ var loadRules = function(manifest, rules) {
+
+ if(rules.length == 0) {
+ options.success(manifest);
+ } else {
+
+ // XXX there's likely problems here, how should we make sure that the
+ // url is what we expect?
+ var rule = fiveui.Rule.defaults(rules.pop());
+ var rule_url = base_url + '/' + rule.file;
+ jQuery.ajax(rule_url, {
+
+ dataType: 'text',
+
+ success: function(ruleStr) {
+ rule.ruleStr = ruleStr;
+ manifest.rules.push(rule);
+
+ loadRules(manifest, rules);
+ },
+
+ error: options.error
+ });
+
+ }
+ };
+
+ // fetch the manifest, and load its rules
+ jQuery.ajax(manifest_url, {
+
+ dataType: 'json',
+
+ dataFilter: fiveui.utils.filterJSON,
+
+ success: function(manifest) {
+ fiveui.RuleSet.defaults(manifest);
+
+ var rules = manifest.rules;
+ manifest.rules = [];
+ loadRules(manifest, rules);
+ },
+
+ error: options.error
+ });
+
+
+ } else {
+ throw "unable to parse manifest url";
+ }
+
};
+
})();
diff --git a/contexts/data/fiveui/settings.js b/contexts/data/fiveui/settings.js
index acedda4..7aa6c1e 100644
--- a/contexts/data/fiveui/settings.js
+++ b/contexts/data/fiveui/settings.js
@@ -342,13 +342,13 @@ fiveui.Settings.manager = function(chan, settings) {
var msg = new fiveui.Messenger(chan);
- msg.register('addRuleSet', function(ruleSet){
+ msg.register('addRuleSet', function(ruleSet,respond){
var newRS = settings.addRuleSet(ruleSet);
- msg.send('addRuleSet', newRS);
+ respond(newRS);
});
- msg.register('updateRuleSet', function(updatedRS){
- var newRS = settings.updateRuleSet(updatedRS.id, updatedRS.obj);
- msg.send('updateRuleSet', newRS);
+ msg.register('updateRuleSet', function(updatedRS,respond){
+ var newRS = settings.updateRuleSet(updatedRS.id, updatedRS);
+ respond(newRS);
});
msg.register('remRuleSet', function(ruleSetId, respond) {
var pats = settings.remRuleSet(ruleSetId);
diff --git a/contexts/data/fiveui/utils.js b/contexts/data/fiveui/utils.js
index 411c144..9f0bd12 100644
--- a/contexts/data/fiveui/utils.js
+++ b/contexts/data/fiveui/utils.js
@@ -74,4 +74,71 @@ fiveui.utils.getNewId = function(list) {
}
};
+
+/**
+ * Remove c-style comments
+ *
+ * There's probably a faster way to do this.
+ */
+var removeComments = function(data) {
+
+ var state = 0;
+ var toEOL = 1;
+ var toEOC = 2;
+
+ var sanitized = '';
+ var len = data.length;
+ var s = 0, e = 0;
+
+ for(; e < len; ++e) {
+ switch(state) {
+ case toEOL:
+ if(data[e] == '\n') {
+ state = 0;
+ }
+ break;
+
+ case toEOC:
+ if(data[e] == '*' && data[e+1] == '/') {
+ state = 0;
+ s = e + 2;
+ e = e + 1;
+ }
+ break;
+
+ default:
+ if(data[e] == '/') {
+ if(data[e+1] == '/') {
+ sanitized = sanitized + data.substring(s,e);
+ state = toEOL;
+ e = e + 1;
+ } else if(data[e+1] == '*') {
+ sanitized = sanitized + data.substring(s,e);
+ state = toEOC;
+ e = e + 1;
+ }
+ }
+ break;
+ }
+ }
+
+ if(state == 0 && s < e) {
+ sanitized = sanitized + data.substring(s,e);
+ }
+
+ return sanitized;
+};
+
+
+/**
+ * Filter out comments, and other things that aren't appropriate in JSON.
+ */
+fiveui.utils.filterJSON = function(data, type) {
+ if(type == 'json') {
+ return removeComments(data);
+ } else {
+ return data;
+ }
+};
+
})();
diff --git a/contexts/data/lib/codemirror/codemirror-compressed.js b/contexts/data/lib/codemirror/codemirror-compressed.js
deleted file mode 100644
index cba6e39..0000000
--- a/contexts/data/lib/codemirror/codemirror-compressed.js
+++ /dev/null
@@ -1,3 +0,0 @@
-window.CodeMirror=function(){"use strict";function w(a,c){if(!(this instanceof w))return new w(a,c);this.options=c=c||{};for(var d in Ac)!c.hasOwnProperty(d)&&Ac.hasOwnProperty(d)&&(c[d]=Ac[d]);H(c);var e=this.display=x(a);e.wrapper.CodeMirror=this,E(this),c.autofocus&&!p&&xb(this),this.view=y(new xd([new wd([hd("",null,nb(e))])])),this.nextOpId=0,z(this),C(this),c.lineWrapping&&(this.display.wrapper.className+=" CodeMirror-wrap"),this.setValue(c.value||""),b&&setTimeout(be(wb,this,!0),20),this.view.history=Ed(),zb(this);var f;try{f=document.activeElement==e.input}catch(g){}f||c.autofocus&&!p?setTimeout(be(Zb,this),20):$b(this),rb(this,function(){for(var a in zc)zc.propertyIsEnumerable(a)&&zc[a](this,c[a],Cc);for(var b=0;Gc.length>b;++b)Gc[b](this)})()}function x(a){var b={},d=b.input=ge("textarea",null,null,"position: absolute; padding: 0; width: 1px; height: 1em; outline: none;");f||d.setAttribute("wrap","off"),d.setAttribute("autocorrect","off"),d.setAttribute("autocapitalize","off"),b.inputDiv=ge("div",[d],null,"overflow: hidden; position: relative; width: 3px; height: 0px;"),b.scrollbarH=ge("div",[ge("div",null,null,"height: 1px")],"CodeMirror-hscrollbar"),b.scrollbarV=ge("div",[ge("div",null,null,"width: 1px")],"CodeMirror-vscrollbar"),b.scrollbarFiller=ge("div",null,"CodeMirror-scrollbar-filler"),b.lineDiv=ge("div"),b.selectionDiv=ge("div",null,null,"position: relative; z-index: 1"),b.cursor=ge("div","\u00a0","CodeMirror-cursor"),b.otherCursor=ge("div","\u00a0","CodeMirror-cursor CodeMirror-secondarycursor"),b.measure=ge("div",null,"CodeMirror-measure"),b.lineSpace=ge("div",[b.measure,b.selectionDiv,b.lineDiv,b.cursor,b.otherCursor],null,"position: relative; outline: none"),b.mover=ge("div",[ge("div",[b.lineSpace],"CodeMirror-lines")],null,"position: relative"),b.sizer=ge("div",[b.mover],"CodeMirror-sizer"),b.heightForcer=ge("div","\u00a0",null,"position: absolute; height: "+Td+"px"),b.gutters=ge("div",null,"CodeMirror-gutters"),b.lineGutter=null;var e=ge("div",[b.sizer,b.heightForcer,b.gutters],null,"position: relative; min-height: 100%");return b.scroller=ge("div",[e],"CodeMirror-scroll"),b.scroller.setAttribute("tabIndex","-1"),b.wrapper=ge("div",[b.inputDiv,b.scrollbarH,b.scrollbarV,b.scrollbarFiller,b.scroller],"CodeMirror"),c&&(b.gutters.style.zIndex=-1,b.scroller.style.paddingRight=0),a.appendChild?a.appendChild(b.wrapper):a(b.wrapper),o&&(d.style.width="0px"),f||(b.scroller.draggable=!0),k?(b.inputDiv.style.height="1px",b.inputDiv.style.position="absolute"):c&&(b.scrollbarH.style.minWidth=b.scrollbarV.style.minWidth="18px"),b.viewOffset=b.showingFrom=b.showingTo=b.lastSizeC=0,b.lineNumWidth=b.lineNumInnerWidth=b.lineNumChars=null,b.prevInput="",b.alignWidgets=!1,b.pollingFast=!1,b.poll=new Vd,b.draggingText=!1,b.cachedCharWidth=b.cachedTextHeight=null,b.measureLineCache=[],b.measureLineCachePos=0,b.inaccurateSelection=!1,b.pasteIncoming=!1,b}function y(a){var b={line:0,ch:0};return{doc:a,frontier:0,highlight:new Vd,sel:{from:b,to:b,head:b,anchor:b,shift:!1,extend:!1},scrollTop:0,scrollLeft:0,overwrite:!1,focused:!1,maxLine:yd(a,0),maxLineLength:0,maxLineChanged:!1,suppressEdits:!1,goalColumn:null,cantEdit:!1,keyMaps:[],overlays:[],modeGen:0}}function z(a){var b=a.view.doc;a.view.mode=w.getMode(a.options,a.options.mode),b.iter(0,b.size,function(a){a.stateAfter&&(a.stateAfter=null)}),a.view.frontier=0,Z(a,100),a.view.modeGen++}function A(a){var b=a.view.doc,c=nb(a.display);if(a.options.lineWrapping){a.display.wrapper.className+=" CodeMirror-wrap";var d=a.display.scroller.clientWidth/ob(a.display)-3;b.iter(0,b.size,function(a){if(0!=a.height){var b=Math.ceil(a.text.length/d)||1;1!=b&&zd(a,b*c)}}),a.display.sizer.style.minWidth=""}else a.display.wrapper.className=a.display.wrapper.className.replace(" CodeMirror-wrap",""),G(a.view),b.iter(0,b.size,function(a){0!=a.height&&zd(a,c)});sb(a,0,b.size),gb(a),setTimeout(function(){I(a.display,a.view.doc.height)},100)}function B(a){var b=Kc[a.options.keyMap].style;a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-keymap-\S+/g,"")+(b?" cm-keymap-"+b:"")}function C(a){a.display.wrapper.className=a.display.wrapper.className.replace(/\s*cm-s-\S+/g,"")+a.options.theme.replace(/(^|\s)\s*/g," cm-s-"),gb(a)}function D(a){E(a),O(a,!0)}function E(a){var b=a.display.gutters,c=a.options.gutters;he(b);for(var d=0;c.length>d;++d){var e=c[d],f=b.appendChild(ge("div",null,"CodeMirror-gutter "+e));"CodeMirror-linenumbers"==e&&(a.display.lineGutter=f,f.style.width=(a.display.lineNumWidth||1)+"px")}b.style.display=d?"":"none"}function F(a,b){if(0==b.height)return 0;for(var d,c=b.text.length,e=b;d=Zc(e);){var f=d.find();e=yd(a,f.from.line),c+=f.from.ch-f.to.ch}for(e=b;d=$c(e);){var f=d.find();c-=e.text.length-f.from.ch,e=yd(a,f.to.line),c+=e.text.length-f.to.ch}return c}function G(a){a.maxLine=yd(a.doc,0),a.maxLineLength=F(a.doc,a.maxLine),a.maxLineChanged=!0,a.doc.iter(1,a.doc.size,function(b){var c=F(a.doc,b);c>a.maxLineLength&&(a.maxLineLength=c,a.maxLine=b)})}function H(a){for(var b=!1,c=0;a.gutters.length>c;++c)"CodeMirror-linenumbers"==a.gutters[c]&&(a.lineNumbers?b=!0:a.gutters.splice(c--,1));!b&&a.lineNumbers&&a.gutters.push("CodeMirror-linenumbers")}function I(a,b){var c=b+2*bb(a);a.sizer.style.minHeight=a.heightForcer.style.top=c+"px";var d=Math.max(c,a.scroller.scrollHeight),e=a.scroller.scrollWidth>a.scroller.clientWidth,f=d>a.scroller.clientHeight;f?(a.scrollbarV.style.display="block",a.scrollbarV.style.bottom=e?ne(a.measure)+"px":"0",a.scrollbarV.firstChild.style.height=d-a.scroller.clientHeight+a.scrollbarV.clientHeight+"px"):a.scrollbarV.style.display="",e?(a.scrollbarH.style.display="block",a.scrollbarH.style.right=f?ne(a.measure)+"px":"0",a.scrollbarH.firstChild.style.width=a.scroller.scrollWidth-a.scroller.clientWidth+a.scrollbarH.clientWidth+"px"):a.scrollbarH.style.display="",e&&f?(a.scrollbarFiller.style.display="block",a.scrollbarFiller.style.height=a.scrollbarFiller.style.width=ne(a.measure)+"px"):a.scrollbarFiller.style.display="",l&&0===ne(a.measure)&&(a.scrollbarV.style.minWidth=a.scrollbarH.style.minHeight=m?"18px":"12px")}function J(a,b,c){var d=a.scroller.scrollTop,e=a.wrapper.clientHeight;"number"==typeof c?d=c:c&&(d=c.top,e=c.bottom-c.top),d=Math.floor(d-bb(a));var f=Math.ceil(d+e);return{from:Bd(b,d),to:Bd(b,f)}}function K(a){var b=a.display;if(b.alignWidgets||b.gutters.firstChild){for(var c=N(b)-b.scroller.scrollLeft+a.view.scrollLeft,d=b.gutters.offsetWidth,e=c+"px",f=b.lineDiv.firstChild;f;f=f.nextSibling)if(f.alignable)for(var g=0,h=f.alignable;h.length>g;++g)h[g].style.left=e;b.gutters.style.left=c+d+"px"}}function L(a){if(!a.options.lineNumbers)return!1;var b=a.view.doc,c=M(a.options,b.size-1),d=a.display;if(c.length!=d.lineNumChars){var e=d.measure.appendChild(ge("div",[ge("div",c)],"CodeMirror-linenumber CodeMirror-gutter-elt")),f=e.firstChild.offsetWidth,g=e.offsetWidth-f;return d.lineGutter.style.width="",d.lineNumInnerWidth=Math.max(f,d.lineGutter.offsetWidth-g),d.lineNumWidth=d.lineNumInnerWidth+g,d.lineNumChars=d.lineNumInnerWidth?c.length:-1,d.lineGutter.style.width=d.lineNumWidth+"px",!0}return!1}function M(a,b){return a.lineNumberFormatter(b+a.firstLineNumber)+""}function N(a){return a.scroller.getBoundingClientRect().left-a.sizer.getBoundingClientRect().left}function O(a,b,c){var d=a.display.showingFrom,e=a.display.showingTo,f=P(a,b,c);return f&&(Rd(a,a,"update",a),(a.display.showingFrom!=d||a.display.showingTo!=e)&&Rd(a,a,"viewportChange",a,a.display.showingFrom,a.display.showingTo)),V(a),I(a.display,a.view.doc.height),f}function P(a,b,d){var e=a.display,f=a.view.doc;if(!e.wrapper.clientWidth)return e.showingFrom=e.showingTo=e.viewOffset=0,void 0;var g=J(e,f,d);if(!(b!==!0&&0==b.length&&g.from>e.showingFrom&&g.to<e.showingTo)){if(b&&L(a)&&(b=!0),e.sizer.style.marginLeft=e.scrollbarH.style.left=e.gutters.offsetWidth+"px",b!==!0&&v)for(var h=0;b.length>h;++h)for(var j,i=b[h];j=Zc(yd(f,i.from));){var k=j.find().from.line;i.diff&&(i.diff-=i.from-k),i.from=k}var l=b===!0?0:1/0;if(a.options.lineNumbers&&b&&b!==!0)for(var h=0;b.length>h;++h)if(b[h].diff){l=b[h].from;break}var k=Math.max(g.from-a.options.viewportMargin,0),m=Math.min(f.size,g.to+a.options.viewportMargin);if(k>e.showingFrom&&20>k-e.showingFrom&&(k=e.showingFrom),e.showingTo>m&&20>e.showingTo-m&&(m=Math.min(f.size,e.showingTo)),v)for(k=Ad(_c(f,yd(f,k)));f.size>m&&ad(yd(f,m));)++m;for(var n=b===!0?[]:Q([{from:e.showingFrom,to:e.showingTo}],b),o=0,h=0;n.length>h;++h){var p=n[h];k>p.from&&(p.from=k),p.to>m&&(p.to=m),p.from>=p.to?n.splice(h--,1):o+=p.to-p.from}if(o!=m-k||k!=e.showingFrom||m!=e.showingTo){n.sort(function(a,b){return a.from-b.from});var q=document.activeElement;.7*(m-k)>o&&(e.lineDiv.style.display="none"),S(a,k,m,n,l),e.lineDiv.style.display="",document.activeElement!=q&&q.offsetHeight&&q.focus();var r=k!=e.showingFrom||m!=e.showingTo||e.lastSizeC!=e.wrapper.clientHeight;r&&(e.lastSizeC=e.wrapper.clientHeight),e.showingFrom=k,e.showingTo=m,Z(a,100);for(var u,s=e.lineDiv.offsetTop,t=e.lineDiv.firstChild;t;t=t.nextSibling)if(t.lineObj){if(c){var w=t.offsetTop+t.offsetHeight;u=w-s,s=w}else{var x=t.getBoundingClientRect();u=x.bottom-x.top}var y=t.lineObj.height-u;2>u&&(u=nb(e)),(y>.001||-.001>y)&&zd(t.lineObj,u)}return e.viewOffset=Cd(a,yd(f,k)),e.mover.style.top=e.viewOffset+"px",!0}}}function Q(a,b){for(var c=0,d=b.length||0;d>c;++c){for(var e=b[c],f=[],g=e.diff||0,h=0,i=a.length;i>h;++h){var j=a[h];e.to<=j.from&&e.diff?f.push({from:j.from+g,to:j.to+g}):e.to<=j.from||e.from>=j.to?f.push(j):(e.from>j.from&&f.push({from:j.from,to:e.from}),e.to<j.to&&f.push({from:e.to+g,to:j.to+g}))}a=f}return a}function R(a){for(var b=a.display,c={},d={},e=b.gutters.firstChild,f=0;e;e=e.nextSibling,++f)c[a.options.gutters[f]]=e.offsetLeft,d[a.options.gutters[f]]=e.offsetWidth;return{fixedPos:N(b),gutterTotalWidth:b.gutters.offsetWidth,gutterLeft:c,gutterWidth:d,wrapperWidth:b.wrapper.clientWidth}}function S(a,c,d,e,g){function m(b){var c=b.nextSibling;return f&&q&&a.display.currentWheelTarget==b?(b.style.display="none",b.lineObj=null):k.removeChild(b),c}var h=R(a),i=a.display,j=a.options.lineNumbers;e.length||b||f&&a.display.currentWheelTarget||he(i.lineDiv);var k=i.lineDiv,l=k.firstChild,n=e.shift(),o=c;for(a.view.doc.iter(c,d,function(b){if(n&&n.to==o&&(n=e.shift()),ad(b)){if(0!=b.height&&zd(b,0),b.widgets&&l.previousSibling)for(var c=0;b.widgets.length>c;++c)if(b.widgets[c].showIfHidden){var d=l.previousSibling;if("pre"==d.nodeType){var f=ge("div",null,null,"position: relative");d.parentNode.replaceChild(f,d),f.appendChild(d),d=f}d.appendChild(U(b.widgets[c],d,h))}}else if(n&&o>=n.from&&n.to>o){for(;l.lineObj!=b;)l=m(l);j&&o>=g&&l.lineNumber&&je(l.lineNumber,M(a.options,o)),l=l.nextSibling}else{var i=T(a,b,o,h);k.insertBefore(i,l),i.lineObj=b}++o});l;)l=m(l)}function T(a,b,d,e){var f=qd(a,b),g=b.gutterMarkers,h=a.display;if(!(a.options.lineNumbers||g||b.bgClass||b.wrapClass||b.widgets&&b.widgets.length))return f;var i=ge("div",null,b.wrapClass,"position: relative");if(a.options.lineNumbers||g){var j=i.appendChild(ge("div",null,null,"position: absolute; left: "+e.fixedPos+"px"));if(i.alignable=[j],!a.options.lineNumbers||g&&g["CodeMirror-linenumbers"]||(i.lineNumber=j.appendChild(ge("div",M(a.options,d),"CodeMirror-linenumber CodeMirror-gutter-elt","left: "+e.gutterLeft["CodeMirror-linenumbers"]+"px; width: "+h.lineNumInnerWidth+"px"))),g)for(var k=0;a.options.gutters.length>k;++k){var l=a.options.gutters[k],m=g.hasOwnProperty(l)&&g[l];m&&j.appendChild(ge("div",[m],"CodeMirror-gutter-elt","left: "+e.gutterLeft[l]+"px; width: "+e.gutterWidth[l]+"px"))}}if(b.bgClass&&i.appendChild(ge("div","\u00a0",b.bgClass+" CodeMirror-linebackground")),i.appendChild(f),b.widgets)for(var n=0,o=b.widgets;o.length>n;++n){var p=o[n],q=U(p,i,e);p.above?i.insertBefore(q,a.options.lineNumbers&&0!=b.height?j:f):i.appendChild(q)}return c&&(i.style.zIndex=2),i}function U(a,b,c){var d=ge("div",[a.node],"CodeMirror-linewidget");if(d.widget=a,a.noHScroll){(b.alignable||(b.alignable=[])).push(d);var e=c.wrapperWidth;d.style.left=c.fixedPos+"px",a.coverGutter||(e-=c.gutterTotalWidth,d.style.paddingLeft=c.gutterTotalWidth+"px"),d.style.width=e+"px"}return a.coverGutter&&(d.style.zIndex=5,d.style.position="relative",a.noHScroll||(d.style.marginLeft=-c.gutterTotalWidth+"px")),d}function V(a){var b=a.display,c=gc(a.view.sel.from,a.view.sel.to);c||a.options.showCursorWhenSelecting?W(a):b.cursor.style.display=b.otherCursor.style.display="none",c?b.selectionDiv.style.display="none":X(a);var d=jb(a,a.view.sel.head,"div"),e=b.wrapper.getBoundingClientRect(),f=b.lineDiv.getBoundingClientRect();b.inputDiv.style.top=Math.max(0,Math.min(b.wrapper.clientHeight-10,d.top+f.top-e.top))+"px",b.inputDiv.style.left=Math.max(0,Math.min(b.wrapper.clientWidth-10,d.left+f.left-e.left))+"px"}function W(a){var b=a.display,c=jb(a,a.view.sel.head,"div");b.cursor.style.left=c.left+"px",b.cursor.style.top=c.top+"px",b.cursor.style.height=Math.max(0,c.bottom-c.top)*a.options.cursorHeight+"px",b.cursor.style.display="",c.other?(b.otherCursor.style.display="",b.otherCursor.style.left=c.other.left+"px",b.otherCursor.style.top=c.other.top+"px",b.otherCursor.style.height=.85*(c.other.bottom-c.other.top)+"px"):b.otherCursor.style.display="none"}function X(a){function h(a,b,c,d){0>b&&(b=0),e.appendChild(ge("div",null,"CodeMirror-selected","position: absolute; left: "+a+"px; top: "+b+"px; width: "+(null==c?f-a:c)+"px; height: "+(d-b)+"px"))}function i(b,d,e,i){function m(c){return ib(a,{line:b,ch:c},"div",j)}var j=yd(c,b),k=j.text.length,l=i?1/0:-1/0;return ue(Dd(j),d||0,null==e?k:e,function(a,b,c){var j=m("rtl"==c?b-1:a),n=m("rtl"==c?a:b-1),o=j.left,p=n.right;n.top-j.top>3&&(h(o,j.top,null,j.bottom),o=g,j.bottom<n.top&&h(o,j.bottom,null,n.top)),null==e&&b==k&&(p=f),null==d&&0==a&&(o=g),l=i?Math.min(n.top,l):Math.max(n.bottom,l),g+1>o&&(o=g),h(o,n.top,p-o,n.bottom)}),l}var b=a.display,c=a.view.doc,d=a.view.sel,e=document.createDocumentFragment(),f=b.lineSpace.offsetWidth,g=cb(a.display);if(d.from.line==d.to.line)i(d.from.line,d.from.ch,d.to.ch);else{for(var l,n,j=yd(c,d.from.line),k=j,m=[d.from.line,d.from.ch];l=$c(k);){var o=l.find();if(m.push(o.from.ch,o.to.line,o.to.ch),o.to.line==d.to.line){m.push(d.to.ch),n=!0;break}k=yd(c,o.to.line)}if(n)for(var p=0;m.length>p;p+=3)i(m[p],m[p+1],m[p+2]);else{var q,r,s=yd(c,d.to.line);q=d.from.ch?i(d.from.line,d.from.ch,null,!1):Cd(a,j)-b.viewOffset,r=d.to.ch?i(d.to.line,Zc(s)?null:0,d.to.ch,!0):Cd(a,s)-b.viewOffset,r>q&&h(g,q,null,r)}}ie(b.selectionDiv,e),b.selectionDiv.style.display=""}function Y(a){var b=a.display;clearInterval(b.blinker);var c=!0;b.cursor.style.visibility=b.otherCursor.style.visibility="",b.blinker=setInterval(function(){b.cursor.offsetHeight&&(b.cursor.style.visibility=b.otherCursor.style.visibility=(c=!c)?"":"hidden")},a.options.cursorBlinkRate)}function Z(a,b){a.view.mode.startState&&a.view.frontier<a.display.showingTo&&a.view.highlight.set(b,be($,a))}function $(a){var b=a.view,c=b.doc;if(!(b.frontier>=a.display.showingTo)){var g,d=+new Date+a.options.workTime,e=Hc(b.mode,ab(a,b.frontier)),f=[];c.iter(b.frontier,Math.min(c.size,a.display.showingTo+500),function(c){if(b.frontier>=a.display.showingFrom){var h=c.styles;c.styles=ld(a,c,e);for(var i=!h||h.length!=c.styles.length,j=0;!i&&h.length>j;++j)i=h[j]!=c.styles[j];i&&(g&&g.end==b.frontier?g.end++:f.push(g={start:b.frontier,end:b.frontier+1})),c.stateAfter=Hc(b.mode,e)}else nd(a,c,e),c.stateAfter=0==b.frontier%5?Hc(b.mode,e):null;return++b.frontier,+new Date>d?(Z(a,a.options.workDelay),!0):void 0}),f.length&&rb(a,function(){for(var a=0;f.length>a;++a)sb(this,f[a].start,f[a].end)})()}}function _(a,b){for(var c,d,e=a.view.doc,f=b,g=b-100;f>g;--f){if(0==f)return 0;var h=yd(e,f-1);if(h.stateAfter)return f;var i=Wd(h.text,null,a.options.tabSize);(null==d||c>i)&&(d=f-1,c=i)}return d}function ab(a,b){var c=a.view;if(!c.mode.startState)return!0;var d=_(a,b),e=d&&yd(c.doc,d-1).stateAfter;return e=e?Hc(c.mode,e):Ic(c.mode),c.doc.iter(d,b,function(f){nd(a,f,e);var g=d==b-1||0==d%5||d>=c.showingFrom&&c.showingTo>d;f.stateAfter=g?Hc(c.mode,e):null,++d}),e}function bb(a){return a.lineSpace.offsetTop}function cb(a){var b=ie(a.measure,ge("pre")).appendChild(ge("span","x"));return b.offsetLeft}function db(a,b,c,d){var e=-1;d=d||eb(a,b);for(var f=c;;f+=e){var g=d[f];if(g)break;0>e&&0==f&&(e=1)}return{left:c>f?g.right:g.left,right:f>c?g.left:g.right,top:g.top,bottom:g.bottom}}function eb(a,b){for(var c=a.display,d=a.display.measureLineCache,e=0;d.length>e;++e){var f=d[e];if(f.text==b.text&&f.markedSpans==b.markedSpans&&c.scroller.clientWidth==f.width)return f.measure}var g=fb(a,b),f={text:b.text,width:c.scroller.clientWidth,markedSpans:b.markedSpans,measure:g};return 16==d.length?d[++c.measureLineCachePos%16]=f:d.push(f),g}function fb(a,d){var e=a.display,f=ae(d.text.length),g=qd(a,d,f);if(b&&!c&&!a.options.lineWrapping&&g.childNodes.length>100){for(var h=document.createDocumentFragment(),i=10,j=g.childNodes.length,k=0,l=Math.ceil(j/i);l>k;++k){for(var m=ge("div",null,null,"display: inline-block"),n=0;i>n&&j;++n)m.appendChild(g.firstChild),--j;h.appendChild(m)}g.appendChild(h)}ie(e.measure,g);for(var s,o=e.lineDiv.getBoundingClientRect(),p=[],q=ae(d.text.length),r=g.offsetHeight,k=0;f.length>k;++k)if(s=f[k]){for(var t=s.getBoundingClientRect(),u=Math.max(0,t.top-o.top),v=Math.min(t.bottom-o.top,r),n=0;p.length>n;n+=2){var w=p[n],x=p[n+1];if(!(w>v||u>x)&&(u>=w&&x>=v||w>=u&&v>=x||Math.min(v,x)-Math.max(u,w)>=v-u>>1)){p[n]=Math.min(u,w),p[n+1]=Math.max(v,x);break}}n==p.length&&p.push(u,v),q[k]={left:t.left-o.left,right:t.right-o.left,top:n}}for(var s,k=0;q.length>k;++k)if(s=q[k]){var y=s.top;s.top=p[y],s.bottom=p[y+1]}return q}function gb(a){a.display.measureLineCache.length=a.display.measureLineCachePos=0,a.display.cachedCharWidth=a.display.cachedTextHeight=null,a.view.maxLineChanged=!0}function hb(a,b,c,d){if(b.widgets)for(var e=0;b.widgets.length>e;++e)if(b.widgets[e].above){var f=b.widgets[e].node.offsetHeight;c.top+=f,c.bottom+=f}if("line"==d)return c;d||(d="local");var g=Cd(a,b);if("local"!=d&&(g-=a.display.viewOffset),"page"==d){var h=a.display.lineSpace.getBoundingClientRect();g+=h.top+(window.pageYOffset||(document.documentElement||document.body).scrollTop);var i=h.left+(window.pageXOffset||(document.documentElement||document.body).scrollLeft);c.left+=i,c.right+=i}return c.top+=g,c.bottom+=g,c}function ib(a,b,c,d){return d||(d=yd(a.view.doc,b.line)),hb(a,d,db(a,d,b.ch),c)}function jb(a,b,c,d,e){function f(b,f){var g=db(a,d,b,e);return f?g.left=g.right:g.right=g.left,hb(a,d,g,c)}d=d||yd(a.view.doc,b.line),e||(e=eb(a,d));var g=Dd(d),h=b.ch;if(!g)return f(h);for(var i,j,k=g[0].level,l=0;g.length>l;++l){var o,p,m=g[l],n=m.level%2;if(h>m.from&&m.to>h)return f(h,n);var q=n?m.to:m.from,r=n?m.from:m.to;if(q==h)p=l&&m.level<(o=g[l-1]).level?f(o.level%2?o.from:o.to-1,!0):f(n&&m.from!=m.to?h-1:h),n==k?i=p:j=p;else if(r==h){var o=g.length-1>l&&g[l+1];if(!n&&o&&o.from==o.to)continue;p=o&&m.level<o.level?f(o.level%2?o.to-1:o.from):f(n?h:h-1,!0),n==k?i=p:j=p}}return k&&!h&&(j=f(g[0].to-1)),i?(j&&(i.other=j),i):j}function kb(a,b,c){var d=a.view.doc;if(c+=a.display.viewOffset,0>c)return{line:0,ch:0,outside:!0};var e=Bd(d,c);if(e>=d.size)return{line:d.size-1,ch:yd(d,d.size-1).text.length};for(0>b&&(b=0);;){var f=yd(d,e),g=lb(a,f,e,b,c),h=$c(f);if(!h||g.ch!=ye(f))return g;e=h.find().to.line}}function lb(a,b,c,d,e){function j(d){var e=jb(a,{line:c,ch:d},"line",b,i);return g=!0,f>e.bottom?Math.max(0,e.left-h):e.top>f?e.left+h:(g=!1,e.left)}var f=e-Cd(a,b),g=!1,h=a.display.wrapper.clientWidth,i=eb(a,b),k=Dd(b),l=b.text.length,m=xe(b),n=ye(b),o=cb(a.display),p=j(n);if(d>p)return{line:c,ch:n,outside:g};for(;;){if(k?n==m||n==Be(b,m,1):1>=n-m){for(var q=p-d>d-o,r=q?m:n;fe.test(b.text.charAt(r));)++r;return{line:c,ch:r,after:q,outside:g}}var s=Math.ceil(l/2),t=m+s;if(k){t=m;for(var u=0;s>u;++u)t=Be(b,t,1)}var v=j(t);v>d?(n=t,p=v,g&&(p+=1e3),l-=s):(m=t,o=v,l=s)}}function nb(a){if(null!=a.cachedTextHeight)return a.cachedTextHeight;if(null==mb){mb=ge("pre");for(var b=0;49>b;++b)mb.appendChild(document.createTextNode("x")),mb.appendChild(ge("br"));mb.appendChild(document.createTextNode("x"))}ie(a.measure,mb);var c=mb.offsetHeight/50;return c>3&&(a.cachedTextHeight=c),he(a.measure),c||1}function ob(a){if(null!=a.cachedCharWidth)return a.cachedCharWidth;var b=ge("span","x"),c=ge("pre",[b]);ie(a.measure,c);var d=b.offsetWidth;return d>2&&(a.cachedCharWidth=d),d||10}function pb(a){a.curOp?++a.curOp.depth:a.curOp={depth:1,changes:[],delayedCallbacks:[],updateInput:null,userSelChange:null,textChanged:null,selectionChanged:!1,updateMaxLine:!1,id:++a.nextOpId}}function qb(a){var b=a.curOp;if(!--b.depth){a.curOp=null;var c=a.view,d=a.display;if(b.updateMaxLine&&G(c),c.maxLineChanged&&!a.options.lineWrapping){var e=db(a,c.maxLine,c.maxLine.text.length).right;d.sizer.style.minWidth=e+3+Td+"px",c.maxLineChanged=!1;var f=Math.max(0,d.sizer.offsetLeft+d.sizer.offsetWidth-d.scroller.clientWidth);c.scrollLeft>f&&Jb(a,Math.min(d.scroller.scrollLeft,f),!0)}var g,h;if(b.selectionChanged){var i=jb(a,c.sel.head);g=tc(a,i.left,i.top,i.left,i.bottom)}(b.changes.length||g&&null!=g.scrollTop)&&(h=O(a,b.changes,g&&g.scrollTop)),!h&&b.selectionChanged&&V(a),g&&qc(a),b.selectionChanged&&Y(a),c.focused&&b.updateInput&&wb(a,b.userSelChange),b.textChanged&&Qd(a,"change",a,b.textChanged),b.selectionChanged&&Qd(a,"cursorActivity",a);for(var j=0;b.delayedCallbacks.length>j;++j)b.delayedCallbacks[j](a)}}function rb(a,b){return function(){var c=a||this;pb(c);try{var d=b.apply(c,arguments)}finally{qb(c)}return d}}function sb(a,b,c,d){a.curOp.changes.push({from:b,to:c,diff:d})}function tb(a){a.view.pollingFast||a.display.poll.set(a.options.pollInterval,function(){vb(a),a.view.focused&&tb(a)})}function ub(a){function c(){var d=vb(a);d||b?(a.display.pollingFast=!1,tb(a)):(b=!0,a.display.poll.set(60,c))}var b=!1;a.display.pollingFast=!0,a.display.poll.set(20,c)}function vb(a){var b=a.display.input,c=a.display.prevInput,d=a.view,e=d.sel;if(!d.focused||re(b)||yb(a))return!1;var f=b.value;if(f==c&&gc(e.from,e.to))return!1;pb(a),d.sel.shift=!1;for(var g=0,h=Math.min(c.length,f.length);h>g&&c[g]==f[g];)++g;var i=e.from,j=e.to;c.length>g?i={line:i.line,ch:i.ch-(c.length-g)}:d.overwrite&&gc(i,j)&&!a.display.pasteIncoming&&(j={line:j.line,ch:Math.min(yd(a.view.doc,j.line).text.length,j.ch+(f.length-g))});var k=a.curOp.updateInput;return bc(a,i,j,qe(f.slice(g)),"end",a.display.pasteIncoming?"paste":"input",{from:i,to:j}),a.curOp.updateInput=k,f.length>1e3?b.value=a.display.prevInput="":a.display.prevInput=f,qb(a),a.display.pasteIncoming=!1,!0}function wb(a,b){var d,e,c=a.view;gc(c.sel.from,c.sel.to)?b&&(a.display.prevInput=a.display.input.value=""):(a.display.prevInput="",d=se&&(c.sel.to.line-c.sel.from.line>100||(e=a.getSelection()).length>1e3),a.display.input.value=d?"-":e||a.getSelection(),c.focused&&$d(a.display.input)),a.display.inaccurateSelection=d}function xb(a){"nocursor"==a.options.readOnly||!b&&document.activeElement==a.display.input||a.display.input.focus()}function yb(a){return a.options.readOnly||a.view.cantEdit}function zb(b){function d(){b.view.focused&&setTimeout(be(xb,b),0)}function g(a){b.options.onDragEvent&&b.options.onDragEvent(b,Hd(a))||Kd(a)}function h(){c.inaccurateSelection&&(c.prevInput="",c.inaccurateSelection=!1,c.input.value=b.getSelection(),$d(c.input))}var c=b.display;Od(c.scroller,"mousedown",rb(b,Eb)),Od(c.scroller,"dblclick",rb(b,Id)),Od(c.lineSpace,"selectstart",function(a){Ab(c,a)||Id(a)}),a||Od(c.scroller,"contextmenu",function(a){ac(b,a)}),Od(c.scroller,"scroll",function(){Ib(b,c.scroller.scrollTop),Jb(b,c.scroller.scrollLeft,!0),Qd(b,"scroll",b)}),Od(c.scrollbarV,"scroll",function(){Ib(b,c.scrollbarV.scrollTop)}),Od(c.scrollbarH,"scroll",function(){Jb(b,c.scrollbarH.scrollLeft)}),Od(c.scroller,"mousewheel",function(a){Qb(b,a)}),Od(c.scroller,"DOMMouseScroll",function(a){Qb(b,a)}),Od(c.scrollbarH,"mousedown",d),Od(c.scrollbarV,"mousedown",d),Od(c.wrapper,"scroll",function(){c.wrapper.scrollTop=c.wrapper.scrollLeft=0}),Od(window,"resize",function f(){c.cachedCharWidth=c.cachedTextHeight=null,gb(b),c.wrapper.parentNode?O(b,!0):Pd(window,"resize",f)}),Od(c.input,"keyup",rb(b,function(a){b.options.onKeyEvent&&b.options.onKeyEvent(b,Hd(a))||16==Nd(a,"keyCode")&&(b.view.sel.shift=!1)})),Od(c.input,"input",be(ub,b)),Od(c.input,"keydown",rb(b,Xb)),Od(c.input,"keypress",rb(b,Yb)),Od(c.input,"focus",be(Zb,b)),Od(c.input,"blur",be($b,b)),b.options.dragDrop&&(Od(c.scroller,"dragstart",function(a){Hb(b,a)}),Od(c.scroller,"dragenter",g),Od(c.scroller,"dragover",g),Od(c.scroller,"drop",rb(b,Fb))),Od(c.scroller,"paste",function(){Ab(c,e)||(xb(b),ub(b))}),Od(c.input,"paste",function(){c.pasteIncoming=!0,ub(b)}),Od(c.input,"cut",h),Od(c.input,"copy",h),k&&Od(c.sizer,"mouseup",function(){document.activeElement==c.input&&c.input.blur(),xb(b)})}function Ab(a,b){for(var c=Ld(b);c!=a.wrapper;c=c.parentNode){if(!c)return!0;if(/\bCodeMirror-(?:line)?widget\b/.test(c.className)||c.parentNode==a.sizer&&c!=a.mover)return!0}}function Bb(a,b,c){var d=a.display;if(!c){var e=Ld(b);if(e==d.scrollbarH||e==d.scrollbarH.firstChild||e==d.scrollbarV||e==d.scrollbarV.firstChild||e==d.scrollbarFiller)return null}var f,g,h=d.lineSpace.getBoundingClientRect();try{f=b.clientX,g=b.clientY}catch(b){return null}return kb(a,f-h.left,g-h.top)}function Eb(c){function r(a){if("single"==l)return mc(d,kc(i,j),a),void 0;if(p=kc(i,p),q=kc(i,q),"double"==l){var b=xc(yd(i,a.line).text,a);hc(a,p)?mc(d,b.from,q):mc(d,p,b.to)}else"triple"==l&&(hc(a,p)?mc(d,q,kc(i,{line:a.line,ch:0})):mc(d,p,kc(i,{line:a.line+1,ch:0})))}function u(a){var b=++t,c=Bb(d,a,!0);if(c)if(gc(c,n)){var h=a.clientY<s.top?-20:a.clientY>s.bottom?20:0;h&&setTimeout(rb(d,function(){t==b&&(e.scroller.scrollTop+=h,u(a))}),50)}else{g.focused||Zb(d),n=c,r(c);var f=J(e,i);(c.line>=f.to||c.line<f.from)&&setTimeout(rb(d,function(){t==b&&u(a)}),150)}}function v(a){t=1/0;var b=Bb(d,a);b&&r(b),Id(a),xb(d),Pd(document,"mousemove",w),Pd(document,"mouseup",x)}var d=this,e=d.display,g=d.view,h=g.sel,i=g.doc;if(h.shift=Nd(c,"shiftKey"),Ab(e,c))return f||(e.scroller.draggable=!1,setTimeout(function(){e.scroller.draggable=!0},100)),void 0;if(!Gb(d,c)){var j=Bb(d,c);switch(Md(c)){case 3:return a&&ac.call(d,d,c),void 0;case 2:return j&&mc(d,j),setTimeout(be(xb,d),20),Id(c),void 0}if(!j)return Ld(c)==e.scroller&&Id(c),void 0;g.focused||Zb(d);var k=+new Date,l="single";if(Db&&Db.time>k-400&&gc(Db.pos,j))l="triple",Id(c),setTimeout(be(xb,d),20),yc(d,j.line);else if(Cb&&Cb.time>k-400&&gc(Cb.pos,j)){l="double",Db={time:k,pos:j},Id(c);var m=xc(yd(i,j.line).text,j);mc(d,m.from,m.to)}else Cb={time:k,pos:j};var n=j;if(d.options.dragDrop&&ke&&!yb(d)&&!gc(h.from,h.to)&&!hc(j,h.from)&&!hc(h.to,j)&&"single"==l){var o=rb(d,function(a){f&&(e.scroller.draggable=!1),g.draggingText=!1,Pd(document,"mouseup",o),Pd(e.scroller,"drop",o),10>Math.abs(c.clientX-a.clientX)+Math.abs(c.clientY-a.clientY)&&(Id(a),mc(d,j),xb(d))});return f&&(e.scroller.draggable=!0),g.draggingText=o,e.scroller.dragDrop&&e.scroller.dragDrop(),Od(document,"mouseup",o),Od(e.scroller,"drop",o),void 0}Id(c),"single"==l&&mc(d,kc(i,j));var p=h.from,q=h.to,s=e.wrapper.getBoundingClientRect(),t=0,w=rb(d,function(a){b||Md(a)?u(a):v(a)}),x=rb(d,v);Od(document,"mousemove",w),Od(document,"mouseup",x)}}function Fb(a){var c=this;if(!(Ab(c.display,a)||c.options.onDragEvent&&c.options.onDragEvent(c,Hd(a)))){Id(a);var d=Bb(c,a,!0),e=a.dataTransfer.files;if(d&&!yb(c))if(e&&e.length&&window.FileReader&&window.File)for(var f=e.length,g=Array(f),h=0,i=function(a,b){var e=new FileReader;e.onload=function(){g[b]=e.result,++h==f&&(d=kc(c.view.doc,d),rb(c,function(){var a=fc(c,g.join(""),d,d,"paste");nc(c,d,a)})())},e.readAsText(a)},j=0;f>j;++j)i(e[j],j);else{if(c.view.draggingText&&!hc(d,c.view.sel.from)&&!hc(c.view.sel.to,d))return c.view.draggingText(a),b&&setTimeout(be(xb,c),50),void 0;try{var g=a.dataTransfer.getData("Text");if(g){var k=c.view.sel.from,l=c.view.sel.to;nc(c,d,d),c.view.draggingText&&fc(c,"",k,l,"paste"),c.replaceSelection(g,null,"paste"),xb(c),Zb(c)}}catch(a){}}}}function Gb(a,b){var c=a.display;try{var d=b.clientX,e=b.clientY}catch(b){return!1}if(d>=Math.floor(c.gutters.getBoundingClientRect().right))return!1;if(Id(b),!Sd(a,"gutterClick"))return!0;var f=c.lineDiv.getBoundingClientRect();if(e>f.bottom)return!0;e-=f.top-c.viewOffset;for(var g=0;a.options.gutters.length>g;++g){var h=c.gutters.childNodes[g];if(h&&h.getBoundingClientRect().right>=d){var i=Bd(a.view.doc,e),j=a.options.gutters[g];Rd(a,a,"gutterClick",a,i,j,b);break}}return!0}function Hb(a,b){if(!Ab(a.display,b)){var c=a.getSelection();b.dataTransfer.setData("Text",c),b.dataTransfer.setDragImage&&!j&&b.dataTransfer.setDragImage(ge("img"),0,0)}}function Ib(b,c){2>Math.abs(b.view.scrollTop-c)||(b.view.scrollTop=c,a||O(b,[],c),b.display.scroller.scrollTop!=c&&(b.display.scroller.scrollTop=c),b.display.scrollbarV.scrollTop!=c&&(b.display.scrollbarV.scrollTop=c),a&&O(b,[]))}function Jb(a,b,c){(c?b==a.view.scrollLeft:2>Math.abs(a.view.scrollLeft-b))||(b=Math.min(b,a.display.scroller.scrollWidth-a.display.scroller.clientWidth),a.view.scrollLeft=b,K(a),a.display.scroller.scrollLeft!=b&&(a.display.scroller.scrollLeft=b),a.display.scrollbarH.scrollLeft!=b&&(a.display.scrollbarH.scrollLeft=b))}function Qb(b,c){var d=c.wheelDeltaX,e=c.wheelDeltaY;if(null==d&&c.detail&&c.axis==c.HORIZONTAL_AXIS&&(d=c.detail),null==e&&c.detail&&c.axis==c.VERTICAL_AXIS?e=c.detail:null==e&&(e=c.wheelDelta),e&&q&&f)for(var g=c.target;g!=h;g=g.parentNode)if(g.lineObj){b.display.currentWheelTarget=g;break}var h=b.display.scroller;if(d&&!a&&!i&&null!=Pb)return e&&Ib(b,Math.max(0,Math.min(h.scrollTop+e*Pb,h.scrollHeight-h.clientHeight))),Jb(b,Math.max(0,Math.min(h.scrollLeft+d*Pb,h.scrollWidth-h.clientWidth))),Id(c),Nb=null,void 0;if(e&&null!=Pb){var j=e*Pb,k=b.view.scrollTop,l=k+b.display.wrapper.clientHeight;0>j?k=Math.max(0,k+j-50):l=Math.min(b.view.doc.height,l+j+50),O(b,[],{top:k,bottom:l})}20>Kb&&(null==Nb?(Nb=h.scrollLeft,Ob=h.scrollTop,Lb=d,Mb=e,setTimeout(function(){if(null!=Nb){var a=h.scrollLeft-Nb,b=h.scrollTop-Ob,c=b&&Mb&&b/Mb||a&&Lb&&a/Lb;Nb=Ob=null,c&&(Pb=(Pb*Kb+c)/(Kb+1),++Kb)}},200)):(Lb+=d,Mb+=e))}function Rb(a,b,c){if("string"==typeof b&&(b=Jc[b],!b))return!1;a.display.pollingFast&&vb(a)&&(a.display.pollingFast=!1);var d=a.view,e=d.sel.shift;try{yb(a)&&(d.suppressEdits=!0),c&&(d.sel.shift=!1),b(a)}catch(f){if(f!=Ud)throw f;return!1}finally{d.sel.shift=e,d.suppressEdits=!1}return!0}function Sb(a){var b=a.view.keyMaps.slice(0);return b.push(a.options.keyMap),a.options.extraKeys&&b.unshift(a.options.extraKeys),b}function Ub(a,b){function i(){h=!0}var c=Lc(a.options.keyMap),e=c.auto;clearTimeout(Tb),e&&!Nc(b)&&(Tb=setTimeout(function(){Lc(a.options.keyMap)==c&&(a.options.keyMap=e.call?e.call(null,a):e)},50));var f=te[Nd(b,"keyCode")],g=!1;if(null==f||b.altGraphKey)return!1;Nd(b,"altKey")&&(f="Alt-"+f),Nd(b,t?"metaKey":"ctrlKey")&&(f="Ctrl-"+f),Nd(b,t?"ctrlKey":"metaKey")&&(f="Cmd-"+f);var h=!1,j=Sb(a);return g=Nd(b,"shiftKey")?Mc("Shift-"+f,j,function(b){return Rb(a,b,!0)},i)||Mc(f,j,function(b){return"string"==typeof b&&/^go[A-Z]/.test(b)?Rb(a,b):void 0},i):Mc(f,j,function(b){return Rb(a,b)},i),h&&(g=!1),g&&(Id(b),Y(a),d&&(b.oldKeyCode=b.keyCode,b.keyCode=0)),g}function Vb(a,b,c){var d=Mc("'"+c+"'",Sb(a),function(b){return Rb(a,b,!0)});return d&&(Id(b),Y(a)),d}function Xb(a){var c=this;if(c.view.focused||Zb(c),b&&27==a.keyCode&&(a.returnValue=!1),!c.options.onKeyEvent||!c.options.onKeyEvent(c,Hd(a))){var d=Nd(a,"keyCode");c.view.sel.shift=16==d||Nd(a,"shiftKey");var e=Ub(c,a);i&&(Wb=e?d:null,e||88!=d||se||!Nd(a,q?"metaKey":"ctrlKey")||c.replaceSelection(""))}}function Yb(a){var b=this;if(!b.options.onKeyEvent||!b.options.onKeyEvent(b,Hd(a))){var c=Nd(a,"keyCode"),d=Nd(a,"charCode");if(i&&c==Wb)return Wb=null,Id(a),void 0;if(!(i&&(!a.which||10>a.which)||k)||!Ub(b,a)){var e=String.fromCharCode(null==d?c:d);
-this.options.electricChars&&this.view.mode.electricChars&&this.options.smartIndent&&!yb(this)&&this.view.mode.electricChars.indexOf(e)>-1&&setTimeout(rb(b,function(){uc(b,b.view.sel.to.line,"smart")}),75),Vb(b,a,e)||ub(b)}}}function Zb(a){"nocursor"!=a.options.readOnly&&(a.view.focused||(Qd(a,"focus",a),a.view.focused=!0,-1==a.display.scroller.className.search(/\bCodeMirror-focused\b/)&&(a.display.scroller.className+=" CodeMirror-focused"),wb(a,!0)),tb(a),Y(a))}function $b(a){a.view.focused&&(Qd(a,"blur",a),a.view.focused=!1,a.display.scroller.className=a.display.scroller.className.replace(" CodeMirror-focused","")),clearInterval(a.display.blinker),setTimeout(function(){a.view.focused||(a.view.sel.shift=!1)},150)}function ac(b,c){function k(){if(e.inputDiv.style.position="relative",e.input.style.cssText=j,d&&(e.scrollbarV.scrollTop=e.scroller.scrollTop=h),tb(b),null!=e.input.selectionStart){clearTimeout(_b);var a=e.input.value=" "+(gc(f.from,f.to)?"":e.input.value),c=0;e.prevInput=" ",e.input.selectionStart=1,e.input.selectionEnd=a.length,_b=setTimeout(function g(){" "==e.prevInput&&0==e.input.selectionStart?rb(b,Jc.selectAll)(b):10>c++?_b=setTimeout(g,500):wb(b)},200)}}var e=b.display;if(!Ab(e,c)){var f=b.view.sel,g=Bb(b,c),h=e.scroller.scrollTop;if(g&&!i){(gc(f.from,f.to)||hc(g,f.from)||!hc(g,f.to))&&rb(b,nc)(b,g,g);var j=e.input.style.cssText;e.inputDiv.style.position="absolute",e.input.style.cssText="position: fixed; width: 30px; height: 30px; top: "+(c.clientY-5)+"px; left: "+(c.clientX-5)+"px; z-index: 1000; background: white; outline: none;"+"border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);",xb(b),wb(b,!0),gc(f.from,f.to)&&(e.input.value=e.prevInput=" "),a?(Kd(c),Od(window,"mouseup",function l(){Pd(window,"mouseup",l),setTimeout(k,20)})):setTimeout(k,50)}}}function bc(a,b,c,d,e,f){var g=u&&Xc(a.view.doc,b,c);if(!g)return cc(a,b,c,d,e,f);for(var h=g.length-1;h>=1;--h)cc(a,g[h].from,g[h].to,[""],f);return g.length?cc(a,g[0].from,g[0].to,d,e,f):void 0}function cc(a,b,c,d,e,f){if(!a.view.suppressEdits){var g=a.view,h=g.doc,i=[];h.iter(b.line,c.line+1,function(a){i.push(ed(a.text,a.markedSpans))});var j=g.sel.from,k=g.sel.to,l=Wc(dd(i[0]),dd(Zd(i)),b.ch,c.ch,d),m=ec(a,b,c,l,e,f);return g.history&&Fd(a,b.line,d.length,i,f,j,k,g.sel.from,g.sel.to),m}}function dc(a,b){var c=a.view.doc,d=a.view.history,e=("undo"==b?d.done:d.undone).pop();if(e){for(var f={events:[],fromBefore:e.fromAfter,toBefore:e.toAfter,fromAfter:e.fromBefore,toAfter:e.toBefore},g=e.events.length-1;g>=0;g-=1){d.dirtyCounter+="undo"==b?-1:1;var h=e.events[g],i=[],j=h.start+h.added;c.iter(h.start,j,function(a){i.push(ed(a.text,a.markedSpans))}),f.events.push({start:h.start,added:h.old.length,old:i});var k=g?null:{from:e.fromBefore,to:e.toBefore};ec(a,{line:h.start,ch:0},{line:j-1,ch:yd(c,j-1).text.length},h.old,k,b)}("undo"==b?d.undone:d.done).push(f)}}function ec(a,b,c,d,e,f){var g=a.view,h=g.doc,i=a.display;if(!g.suppressEdits){var j=c.line-b.line,k=yd(h,b.line),l=yd(h,c.line),m=!1,n=b.line;a.options.lineWrapping||(n=Ad(_c(h,k)),h.iter(n,c.line+1,function(a){return F(h,a)==g.maxLineLength?(m=!0,!0):void 0}));var o=Zd(d),p=nb(i);if(0==b.ch&&0==c.ch&&""==cd(o)){for(var q=[],r=0,s=d.length-1;s>r;++r)q.push(hd(cd(d[r]),dd(d[r]),p));id(a,l,l.text,dd(o)),j&&h.remove(b.line,j,a),q.length&&h.insert(b.line,q)}else if(k==l)if(1==d.length)id(a,k,k.text.slice(0,b.ch)+cd(d[0])+k.text.slice(c.ch),dd(d[0]));else{for(var q=[],r=1,s=d.length-1;s>r;++r)q.push(hd(cd(d[r]),dd(d[r]),p));q.push(hd(cd(o)+k.text.slice(c.ch),dd(o),p)),id(a,k,k.text.slice(0,b.ch)+cd(d[0]),dd(d[0])),h.insert(b.line+1,q)}else if(1==d.length)id(a,k,k.text.slice(0,b.ch)+cd(d[0])+l.text.slice(c.ch),dd(d[0])),h.remove(b.line+1,j,a);else{var q=[];id(a,k,k.text.slice(0,b.ch)+cd(d[0]),dd(d[0])),id(a,l,cd(o)+l.text.slice(c.ch),dd(o));for(var r=1,s=d.length-1;s>r;++r)q.push(hd(cd(d[r]),dd(d[r]),p));j>1&&h.remove(b.line+1,j-1,a),h.insert(b.line+1,q)}if(a.options.lineWrapping){var t=Math.max(5,i.scroller.clientWidth/ob(i)-3);h.iter(b.line,b.line+d.length,function(a){if(0!=a.height){var b=(Math.ceil(a.text.length/t)||1)*p;b!=a.height&&zd(a,b)}})}else h.iter(n,b.line+d.length,function(a){var b=F(h,a);b>g.maxLineLength&&(g.maxLine=a,g.maxLineLength=b,g.maxLineChanged=!0,m=!1)}),m&&(a.curOp.updateMaxLine=!0);g.frontier=Math.min(g.frontier,b.line),Z(a,400);var u=d.length-j-1;if(sb(a,b.line,c.line+1,u),Sd(a,"change")){for(var r=0;d.length>r;++r)"string"!=typeof d[r]&&(d[r]=d[r].text);var v={from:b,to:c,text:d,origin:f};if(a.curOp.textChanged){for(var w=a.curOp.textChanged;w.next;w=w.next);w.next=v}else a.curOp.textChanged=v}var x,y,z={line:b.line+d.length-1,ch:cd(o).length+(1==d.length?b.ch:0)};if(e&&"string"!=typeof e)e.from?(x=e.from,y=e.to):x=y=e;else if("end"==e)x=y=z;else if("start"==e)x=y=b;else if("around"==e)x=b,y=z;else{var A=function(a){if(hc(a,b))return a;if(!hc(c,a))return z;var d=a.line+u,e=a.ch;return a.line==c.line&&(e+=cd(o).length-(c.ch-(c.line==b.line?b.ch:0))),{line:d,ch:e}};x=A(g.sel.from),y=A(g.sel.to)}return nc(a,x,y,null,!0),z}}function fc(a,b,c,d,e){if(d||(d=c),hc(d,c)){var f=d;d=c,c=f}return bc(a,c,d,qe(b),null,e)}function gc(a,b){return a.line==b.line&&a.ch==b.ch}function hc(a,b){return a.line<b.line||a.line==b.line&&a.ch<b.ch}function ic(a){return{line:a.line,ch:a.ch}}function jc(a,b){return Math.max(0,Math.min(b,a.size-1))}function kc(a,b){if(0>b.line)return{line:0,ch:0};if(b.line>=a.size)return{line:a.size-1,ch:yd(a,a.size-1).text.length};var c=b.ch,d=yd(a,b.line).text.length;return null==c||c>d?{line:b.line,ch:d}:0>c?{line:b.line,ch:0}:b}function lc(a,b){return b>=0&&a.size>b}function mc(a,b,c,d){var e=a.view.sel;if(e.shift||e.extend){var f=e.anchor;if(c){var g=hc(b,f);g!=hc(c,f)?(f=b,b=c):g!=hc(b,c)&&(b=c)}nc(a,f,b,d)}else nc(a,b,c||b,d);a.curOp.userSelChange=!0}function nc(a,b,c,d,e){a.view.goalColumn=null;var f=a.view.sel;if((e||!gc(b,f.anchor))&&(b=pc(a,b,d,"push"!=e)),(e||!gc(c,f.head))&&(c=pc(a,c,d,"push"!=e)),!gc(f.anchor,b)||!gc(f.head,c)){f.anchor=b,f.head=c;var g=hc(c,b);f.from=g?c:b,f.to=g?b:c,a.curOp.updateInput=!0,a.curOp.selectionChanged=!0}}function oc(a){nc(a,a.view.sel.from,a.view.sel.to,null,"push")}function pc(a,b,c,d){var e=a.view.doc,f=!1,g=b,h=c||1;a.view.cantEdit=!1;a:for(;;){var j,i=yd(e,g.line);if(i.markedSpans){for(var k=0;i.markedSpans.length>k;++k){var l=i.markedSpans[k],m=l.marker;if((null==l.from||(m.inclusiveLeft?l.from<=g.ch:l.from<g.ch))&&(null==l.to||(m.inclusiveRight?l.to>=g.ch:l.to>g.ch))){if(d&&m.clearOnEnter){(j||(j=[])).push(m);continue}if(!m.atomic)continue;var n=m.find()[0>h?"from":"to"];if(gc(n,g)&&(n.ch+=h,0>n.ch?n=n.line?kc(e,{line:n.line-1}):null:n.ch>i.text.length&&(n=n.line<e.size-1?{line:n.line+1,ch:0}:null),!n)){if(f)return d?(a.view.cantEdit=!0,{line:0,ch:0}):pc(a,b,c,!0);f=!0,n=b,h=-h}g=n;continue a}}if(j)for(var k=0;j.length>k;++k)j[k].clear()}return g}}function qc(a){var b=a.view,c=rc(a,b.sel.head);if(b.focused){var d=a.display,e=d.sizer.getBoundingClientRect(),f=null;if(0>c.top+e.top?f=!0:c.bottom+e.top>(window.innerHeight||document.documentElement.clientHeight)&&(f=!1),null!=f&&!n){var g="none"==d.cursor.style.display;g&&(d.cursor.style.display="",d.cursor.style.left=c.left+"px",d.cursor.style.top=c.top-d.viewOffset+"px"),d.cursor.scrollIntoView(f),g&&(d.cursor.style.display="none")}}}function rc(a,b){for(;;){var c=!1,d=jb(a,b),e=tc(a,d.left,d.top,d.left,d.bottom),f=a.view.scrollTop,g=a.view.scrollLeft;if(null!=e.scrollTop&&(Ib(a,e.scrollTop),Math.abs(a.view.scrollTop-f)>1&&(c=!0)),null!=e.scrollLeft&&(Jb(a,e.scrollLeft),Math.abs(a.view.scrollLeft-g)>1&&(c=!0)),!c)return d}}function sc(a,b,c,d,e){var f=tc(a,b,c,d,e);null!=f.scrollTop&&Ib(a,f.scrollTop),null!=f.scrollLeft&&Jb(a,f.scrollLeft)}function tc(a,b,c,d,e){var f=a.display,g=bb(f);c+=g,e+=g;var h=f.scroller.clientHeight-Td,i=f.scroller.scrollTop,j={},k=a.view.doc.height+2*g,l=g+10>c,m=e+g>k-10;i>c?j.scrollTop=l?0:Math.max(0,c):e>i+h&&(j.scrollTop=(m?k:e)-h);var n=f.scroller.clientWidth-Td,o=f.scroller.scrollLeft;b+=f.gutters.offsetWidth,d+=f.gutters.offsetWidth;var p=f.gutters.offsetWidth,q=p+10>b;return o+p>b||q?(q&&(b=0),j.scrollLeft=Math.max(0,b-10-p)):d>n+o-3&&(j.scrollLeft=d+10-n),j}function uc(a,b,c,d){var e=a.view.doc;if(c||(c="add"),"smart"==c)if(a.view.mode.indent)var f=ab(a,b);else c="prev";var k,g=a.options.tabSize,h=yd(e,b),i=Wd(h.text,null,g),j=h.text.match(/^\s*/)[0];if("smart"==c&&(k=a.view.mode.indent(f,h.text.slice(j.length),h.text),k==Ud)){if(!d)return;c="prev"}"prev"==c?k=b?Wd(yd(e,b-1).text,null,g):0:"add"==c?k=i+a.options.indentUnit:"subtract"==c&&(k=i-a.options.indentUnit),k=Math.max(0,k);var l="",m=0;if(a.options.indentWithTabs)for(var n=Math.floor(k/g);n;--n)m+=g,l+=" ";k>m&&(l+=Yd(k-m)),l!=j&&fc(a,l,{line:b,ch:0},{line:b,ch:j.length},"input"),h.stateAfter=null}function vc(a,b,c){var d=b,e=b,f=a.view.doc;return"number"==typeof b?e=yd(f,jc(f,b)):d=Ad(b),null==d?null:c(e,d)?(sb(a,d,d+1),e):null}function wc(a,b,c,d){function j(){var a=g+b;return 0>a||a==e.size?!1:(g=a,i=yd(e,a))}function k(a){var c=(d?Be:Ce)(i,h,b,!0);if(null==c){if(a||!j())return!1;h=d?(0>b?ye:xe)(i):0>b?i.text.length:0}else h=c;return!0}var e=a.view.doc,f=a.view.sel.head,g=f.line,h=f.ch,i=yd(e,g);if("char"==c)k();else if("column"==c)k(!0);else if("word"==c)for(var l=!1;!(0>b)||k();){if(de(i.text.charAt(h)))l=!0;else if(l){0>b&&(b=1,k());break}if(b>0&&!k())break}return pc(a,{line:g,ch:h},b,!0)}function xc(a,b){var c=b.ch,d=b.ch;if(a){b.after===!1||d==a.length?--c:++d;for(var e=a.charAt(c),f=de(e)?de:/\s/.test(e)?function(a){return/\s/.test(a)}:function(a){return!/\s/.test(a)&&!de(a)};c>0&&f(a.charAt(c-1));)--c;for(;a.length>d&&f(a.charAt(d));)++d}return{from:{line:b.line,ch:c},to:{line:b.line,ch:d}}}function yc(a,b){mc(a,{line:b,ch:0},kc(a.view.doc,{line:b+1,ch:0}))}function Bc(a,b,c,d){w.defaults[a]=b,c&&(zc[a]=d?function(a,b,d){d!=Cc&&c(a,b,d)}:c)}function Hc(a,b){if(b===!0)return b;if(a.copyState)return a.copyState(b);var c={};for(var d in b){var e=b[d];e instanceof Array&&(e=e.concat([])),c[d]=e}return c}function Ic(a,b,c){return a.startState?a.startState(b,c):!0}function Lc(a){return"string"==typeof a?Kc[a]:a}function Mc(a,b,c,d){function e(b){b=Lc(b);var f=b[a];if(f===!1)return d&&d(),!0;if(null!=f&&c(f))return!0;if(b.nofallthrough)return d&&d(),!0;var g=b.fallthrough;if(null==g)return!1;if("[object Array]"!=Object.prototype.toString.call(g))return e(g);for(var h=0,i=g.length;i>h;++h)if(e(g[h]))return!0;return!1}for(var f=0;b.length>f;++f)if(e(b[f]))return!0}function Nc(a){var b=te[Nd(a,"keyCode")];return"Ctrl"==b||"Alt"==b||"Shift"==b||"Mod"==b}function Oc(a,b){this.pos=this.start=0,this.string=a,this.tabSize=b||8}function Pc(a,b){this.lines=[],this.type=b,this.cm=a}function Qc(a,b,c,d,e){var f=a.view.doc,g=new Pc(a,e);if("range"==e&&!hc(b,c))return g;if(d)for(var h in d)d.hasOwnProperty(h)&&(g[h]=d[h]);g.replacedWith&&(g.collapsed=!0,g.replacedWith=ge("span",[g.replacedWith],"CodeMirror-widget")),g.collapsed&&(v=!0);var k,l,i=b.line,j=0;if(f.iter(i,c.line+1,function(a){var d={from:null,to:null,marker:g};j+=a.text.length,i==b.line&&(d.from=b.ch,j-=b.ch),i==c.line&&(d.to=c.ch,j-=a.text.length-c.ch),g.collapsed&&(i==c.line&&(l=Yc(a,c.ch)),i==b.line?k=Yc(a,b.ch):zd(a,0)),Tc(a,d),g.collapsed&&i==b.line&&ad(a)&&zd(a,0),++i}),g.readOnly&&(u=!0,(a.view.history.done.length||a.view.history.undone.length)&&a.clearHistory()),g.collapsed){if(k!=l)throw Error("Inserting collapsed marker overlapping an existing one");g.size=j,g.atomic=!0}return(g.className||g.startStyle||g.endStyle||g.collapsed)&&sb(a,b.line,c.line+1),g.atomic&&oc(a),g}function Rc(a,b){if(a)for(var c=0;a.length>c;++c){var d=a[c];if(d.marker==b)return d}}function Sc(a,b){for(var c,d=0;a.length>d;++d)a[d]!=b&&(c||(c=[])).push(a[d]);return c}function Tc(a,b){a.markedSpans=a.markedSpans?a.markedSpans.concat([b]):[b],b.marker.lines.push(a)}function Uc(a,b){if(a)for(var d,c=0;a.length>c;++c){var e=a[c],f=e.marker,g=null==e.from||(f.inclusiveLeft?b>=e.from:b>e.from);if(g||"bookmark"==f.type&&e.from==b){var h=null==e.to||(f.inclusiveRight?e.to>=b:e.to>b);(d||(d=[])).push({from:e.from,to:h?null:e.to,marker:f})}}return d}function Vc(a,b,c){if(a)for(var e,d=0;a.length>d;++d){var f=a[d],g=f.marker,h=null==f.to||(g.inclusiveRight?f.to>=c:f.to>c);if(h||"bookmark"==g.type&&f.from==c&&f.from!=b){var i=null==f.from||(g.inclusiveLeft?c>=f.from:c>f.from);(e||(e=[])).push({from:i?null:f.from-c,to:null==f.to?null:f.to-c,marker:g})}}return e}function Wc(a,b,c,d,e){if(!a&&!b)return e;var f=Uc(a,c),g=Vc(b,c,d),h=1==e.length,i=Zd(e).length+(h?c:0);if(f)for(var j=0;f.length>j;++j){var k=f[j];if(null==k.to){var l=Rc(g,k.marker);l?h&&(k.to=null==l.to?null:l.to+i):k.to=c}}if(g)for(var j=0;g.length>j;++j){var k=g[j];if(null!=k.to&&(k.to+=i),null==k.from){var l=Rc(f,k.marker);l||(k.from=i,h&&(f||(f=[])).push(k))}else k.from+=i,h&&(f||(f=[])).push(k)}var m=[ed(e[0],f)];if(!h){var o,n=e.length-2;if(n>0&&f)for(var j=0;f.length>j;++j)null==f[j].to&&(o||(o=[])).push({from:null,to:null,marker:f[j].marker});for(var j=0;n>j;++j)m.push(ed(e[j+1],o));m.push(ed(Zd(e),g))}return m}function Xc(a,b,c){var d=null;if(a.iter(b.line,c.line+1,function(a){if(a.markedSpans)for(var b=0;a.markedSpans.length>b;++b){var c=a.markedSpans[b].marker;!c.readOnly||d&&-1!=_d(d,c)||(d||(d=[])).push(c)}}),!d)return null;for(var e=[{from:b,to:c}],f=0;d.length>f;++f)for(var g=d[f].find(),h=0;e.length>h;++h){var i=e[h];if(hc(g.from,i.to)&&!hc(g.to,i.from)){var j=[h,1];hc(i.from,g.from)&&j.push({from:i.from,to:g.from}),hc(g.to,i.to)&&j.push({from:g.to,to:i.to}),e.splice.apply(e,j),h+=j.length-1}}return e}function Yc(a,b){var d,c=v&&a.markedSpans;if(c)for(var e,f=0;c.length>f;++f)e=c[f],e.marker.collapsed&&(null==e.from||b>e.from)&&(null==e.to||e.to>b)&&(!d||d.width<e.marker.width)&&(d=e.marker);return d}function Zc(a){return Yc(a,-1)}function $c(a){return Yc(a,a.text.length+1)}function _c(a,b){for(var c;c=Zc(b);)b=yd(a,c.find().from.line);return b}function ad(a){var b=v&&a.markedSpans;if(b)for(var c,d=0;b.length>d;++d)if(c=b[d],c.marker.collapsed){if(null==c.from)return!0;if(0==c.from&&c.marker.inclusiveLeft&&bd(a,c))return!0}}function bd(a,b){if(null==b.to||b.marker.inclusiveRight&&b.to==a.text.length)return!0;for(var c,d=0;a.markedSpans.length>d;++d)if(c=a.markedSpans[d],c.marker.collapsed&&c.from==b.to&&(c.marker.inclusiveLeft||b.marker.inclusiveRight)&&bd(a,c))return!0}function cd(a){return"string"==typeof a?a:a.text}function dd(a){if("string"==typeof a)return null;for(var b=a.markedSpans,c=null,d=0;b.length>d;++d)b[d].marker.explicitlyCleared?c||(c=b.slice(0,d)):c&&c.push(b[d]);return c?c.length?c:null:b}function ed(a,b){return b?{text:a,markedSpans:b}:a}function fd(a){var b=a.markedSpans;if(b){for(var c=0;b.length>c;++c){var d=b[c].marker.lines,e=_d(d,a);d.splice(e,1)}a.markedSpans=null}}function gd(a,b){if(b){for(var c=0;b.length>c;++c)b[c].marker.lines.push(a);a.markedSpans=b}}function hd(a,b,c){var d={text:a,height:c};return gd(d,b),ad(d)&&(d.height=0),d}function id(a,b,c,d){b.text=c,b.stateAfter&&(b.stateAfter=null),b.styles&&(b.styles=null),null!=b.order&&(b.order=null),fd(b),gd(b,d),ad(b)?b.height=0:b.height||(b.height=nb(a.display)),Rd(a,b,"change")}function jd(a){a.parent=null,fd(a)}function kd(a,b,c,d,e){var f=a.options.flattenSpans,g="",h=null,i=new Oc(b,a.options.tabSize);for(""==b&&c.blankLine&&c.blankLine(d);!i.eol();){var j=c.token(i,d);i.pos>5e3&&(i.pos=Math.min(b.length,i.pos+5e4),j=null);var k=i.current();i.start=i.pos,f&&h==j?g+=k:(g&&e(g,h),g=k,h=j)}g&&e(g,h)}function ld(a,b,c){var d=[a.view.modeGen];kd(a,b.text,a.view.mode,c,function(a,b){d.push(a,b)});for(var e=0;a.view.overlays.length>e;++e){var f=a.view.overlays[e],g=1;kd(a,b.text,f.mode,!0,function(a,b){for(var c=g,e=a.length;e;){var h=d[g],i=h.length;e>=i?e-=i:(d.splice(g,1,h.slice(0,e),d[g+1],h.slice(e)),e=0),g+=2}if(b)if(f.opaque)d.splice(c,g-c,a,b),g=c+2;else for(;g>c;c+=2){var h=d[c+1];d[c+1]=h?h+" "+b:b}})}return d}function md(a,b){return b.styles&&b.styles[0]==a.view.modeGen||(b.styles=ld(a,b,b.stateAfter=ab(a,Ad(b)))),b.styles}function nd(a,b,c){var d=a.view.mode,e=new Oc(b.text,a.options.tabSize);for(""==b.text&&d.blankLine&&d.blankLine(c);!e.eol()&&5e3>=e.pos;)d.token(e,c),e.start=e.pos}function pd(a){return a?od[a]||(od[a]="cm-"+a.replace(/ +/g," cm-")):null}function qd(a,b,c){for(var d,f,g,e=b,h=!0;d=Zc(e);)h=!1,e=yd(a.view.doc,d.find().from.line),f||(f=e);var i={pre:ge("pre"),col:0,pos:0,display:!c,measure:null,addedOne:!1,cm:a};e.textClass&&(i.pre.className=e.textClass);do{i.measure=e==b&&c,i.pos=0,i.addToken=i.measure?td:sd,c&&g&&e!=b&&!i.addedOne&&(c[0]=i.pre.appendChild(pe(a.display.measure)),i.addedOne=!0);var j=vd(e,i,md(a,e));g=e==f,j&&(e=yd(a.view.doc,j.to.line),h=!1)}while(j);return c&&!i.addedOne&&(c[0]=i.pre.appendChild(h?ge("span","\u00a0"):pe(a.display.measure))),i.pre.firstChild||ad(b)||i.pre.appendChild(document.createTextNode("\u00a0")),i.pre}function sd(a,b,c,d,e){if(b){if(rd.test(b))for(var f=document.createDocumentFragment(),g=0;;){rd.lastIndex=g;var h=rd.exec(b),i=h?h.index-g:b.length-g;if(i&&(f.appendChild(document.createTextNode(b.slice(g,g+i))),a.col+=i),!h)break;if(g+=i+1," "==h[0]){var j=a.cm.options.tabSize,k=j-a.col%j;f.appendChild(ge("span",Yd(k),"cm-tab")),a.col+=k}else{var l=ge("span","\u2022","cm-invalidchar");l.title="\\u"+h[0].charCodeAt(0).toString(16),f.appendChild(l),a.col+=1}}else{a.col+=b.length;var f=document.createTextNode(b)}if(c||d||e||a.measure){var m=c||"";return d&&(m+=d),e&&(m+=e),a.pre.appendChild(ge("span",[f],m))}a.pre.appendChild(f)}}function td(a,b,c,d,e){for(var f=0;b.length>f;++f)f&&b.length>f&&a.cm.options.lineWrapping&&le.test(b.slice(f-1,f+1))&&a.pre.appendChild(ge("wbr")),a.measure[a.pos++]=sd(a,b.charAt(f),c,0==f&&d,f==b.length-1&&e);b.length&&(a.addedOne=!0)}function ud(a,b,c){c&&(a.display||(c=c.cloneNode(!0)),a.pre.appendChild(c),a.measure&&b&&(a.measure[a.pos]=c,a.addedOne=!0)),a.pos+=b}function vd(a,b,c){var d=a.markedSpans;if(d)for(var j,l,m,n,o,f=a.text,g=f.length,h=0,e=1,i="",k=0;;){if(k==h){l=m=n="",o=null,k=1/0;for(var p=null,q=0;d.length>q;++q){var r=d[q],s=r.marker;h>=r.from&&(null==r.to||r.to>h)?(null!=r.to&&k>r.to&&(k=r.to,m=""),s.className&&(l+=" "+s.className),s.startStyle&&r.from==h&&(n+=" "+s.startStyle),s.endStyle&&r.to==k&&(m+=" "+s.endStyle),s.collapsed&&(!o||o.marker.width<s.width)&&(o=r)):r.from>h&&k>r.from&&(k=r.from),"bookmark"==s.type&&r.from==h&&s.replacedWith&&(p=s.replacedWith)}if(o&&(o.from||0)==h&&(ud(b,(null==o.to?g:o.to)-h,null!=o.from&&o.marker.replacedWith),null==o.to))return o.marker.find();p&&!o&&ud(b,0,p)}if(h>=g)break;for(var t=Math.min(g,k);;){if(i){var u=h+i.length;if(!o){var v=u>t?i.slice(0,t-h):i;b.addToken(b,v,j+l,n,h+v.length==k?m:"")}if(u>=t){i=i.slice(t-h),h=t;break}h=u,n=""}i=c[e++],j=pd(c[e++])}}else for(var e=1;c.length>e;e+=2)b.addToken(b,c[e],pd(c[e+1]))}function wd(a){this.lines=a,this.parent=null;for(var b=0,c=a.length,d=0;c>b;++b)a[b].parent=this,d+=a[b].height;this.height=d}function xd(a){this.children=a;for(var b=0,c=0,d=0,e=a.length;e>d;++d){var f=a[d];b+=f.chunkSize(),c+=f.height,f.parent=this}this.size=b,this.height=c,this.parent=null}function yd(a,b){for(;!a.lines;)for(var c=0;;++c){var d=a.children[c],e=d.chunkSize();if(e>b){a=d;break}b-=e}return a.lines[b]}function zd(a,b){for(var c=b-a.height,d=a;d;d=d.parent)d.height+=c}function Ad(a){if(null==a.parent)return null;for(var b=a.parent,c=_d(b.lines,a),d=b.parent;d;b=d,d=d.parent)for(var e=0;d.children[e]!=b;++e)c+=d.children[e].chunkSize();return c}function Bd(a,b){var c=0;a:do{for(var d=0,e=a.children.length;e>d;++d){var f=a.children[d],g=f.height;if(g>b){a=f;continue a}b-=g,c+=f.chunkSize()}return c}while(!a.lines);for(var d=0,e=a.lines.length;e>d;++d){var h=a.lines[d],i=h.height;if(i>b)break;b-=i}return c+d}function Cd(a,b){b=_c(a.view.doc,b);for(var c=0,d=b.parent,e=0;d.lines.length>e;++e){var f=d.lines[e];if(f==b)break;c+=f.height}for(var g=d.parent;g;d=g,g=d.parent)for(var e=0;g.children.length>e;++e){var h=g.children[e];if(h==d)break;c+=h.height}return c}function Dd(a){var b=a.order;return null==b&&(b=a.order=De(a.text)),b}function Ed(){return{done:[],undone:[],lastTime:0,lastOp:null,lastOrigin:null,dirtyCounter:0}}function Fd(a,b,c,d,e,f,g,h,i){var j=a.view.history;j.undone.length=0;var k=+new Date,l=Zd(j.done);if(l&&(j.lastOp==a.curOp.id||j.lastOrigin==e&&("input"==e||"delete"==e)&&j.lastTime>k-600)){var m=Zd(l.events);if(m.start>b+d.length||b>m.start+m.added)l.events.push({start:b,added:c,old:d});else{for(var n=Math.max(0,m.start-b),o=Math.max(0,b+d.length-(m.start+m.added)),p=n;p>0;--p)m.old.unshift(d[p-1]);for(var p=o;p>0;--p)m.old.push(d[d.length-p]);n&&(m.start=b),m.added+=c-(d.length-n-o)}l.fromAfter=h,l.toAfter=i}else{for(l={events:[{start:b,added:c,old:d}],fromBefore:f,toBefore:g,fromAfter:h,toAfter:i},j.done.push(l);j.done.length>a.options.undoDepth;)j.done.shift();0>j.dirtyCounter?j.dirtyCounter=0/0:j.dirtyCounter++}j.lastTime=k,j.lastOp=a.curOp.id,j.lastOrigin=e}function Gd(){Kd(this)}function Hd(a){return a.stop||(a.stop=Gd),a}function Id(a){a.preventDefault?a.preventDefault():a.returnValue=!1}function Jd(a){a.stopPropagation?a.stopPropagation():a.cancelBubble=!0}function Kd(a){Id(a),Jd(a)}function Ld(a){return a.target||a.srcElement}function Md(a){var b=a.which;return null==b&&(1&a.button?b=1:2&a.button?b=3:4&a.button&&(b=2)),q&&a.ctrlKey&&1==b&&(b=3),b}function Nd(a,b){var c=a.override&&a.override.hasOwnProperty(b);return c?a.override[b]:a[b]}function Od(a,b,c){if(a.addEventListener)a.addEventListener(b,c,!1);else if(a.attachEvent)a.attachEvent("on"+b,c);else{var d=a._handlers||(a._handlers={}),e=d[b]||(d[b]=[]);e.push(c)}}function Pd(a,b,c){if(a.removeEventListener)a.removeEventListener(b,c,!1);else if(a.detachEvent)a.detachEvent("on"+b,c);else{var d=a._handlers&&a._handlers[b];if(!d)return;for(var e=0;d.length>e;++e)if(d[e]==c){d.splice(e,1);break}}}function Qd(a,b){var c=a._handlers&&a._handlers[b];if(c)for(var d=Array.prototype.slice.call(arguments,2),e=0;c.length>e;++e)c[e].apply(null,d)}function Rd(a,b,c){function g(a){return function(){a.apply(null,e)}}var d=b._handlers&&b._handlers[c];if(d)for(var e=Array.prototype.slice.call(arguments,3),f=a.curOp&&a.curOp.delayedCallbacks,h=0;d.length>h;++h)f?f.push(g(d[h])):d[h].apply(null,e)}function Sd(a,b){var c=a._handlers&&a._handlers[b];return c&&c.length>0}function Vd(){this.id=null}function Wd(a,b,c){null==b&&(b=a.search(/[^\s\u00a0]/),-1==b&&(b=a.length));for(var d=0,e=0;b>d;++d)" "==a.charAt(d)?e+=c-e%c:++e;return e}function Yd(a){for(;a>=Xd.length;)Xd.push(Zd(Xd)+" ");return Xd[a]}function Zd(a){return a[a.length-1]}function $d(a){o?(a.selectionStart=0,a.selectionEnd=a.value.length):a.select()}function _d(a,b){if(a.indexOf)return a.indexOf(b);for(var c=0,d=a.length;d>c;++c)if(a[c]==b)return c;return-1}function ae(a){for(var b=[],c=0;a>c;++c)b.push(void 0);return b}function be(a){var b=Array.prototype.slice.call(arguments,1);return function(){return a.apply(null,b)}}function de(a){return/\w/.test(a)||a>"\u0080"&&(a.toUpperCase()!=a.toLowerCase()||ce.test(a))}function ee(a){var b=0;for(var c in a)a.hasOwnProperty(c)&&a[c]&&++b;return!b}function ge(a,b,c,d){var e=document.createElement(a);if(c&&(e.className=c),d&&(e.style.cssText=d),"string"==typeof b)je(e,b);else if(b)for(var f=0;b.length>f;++f)e.appendChild(b[f]);return e}function he(a){return a.innerHTML="",a}function ie(a,b){return he(a).appendChild(b)}function je(a,b){d?(a.innerHTML="",a.appendChild(document.createTextNode(b))):a.textContent=b}function ne(a){if(null!=me)return me;var b=ge("div",null,null,"width: 50px; height: 50px; overflow-x: scroll");return ie(a,b),b.offsetWidth&&(me=b.offsetHeight-b.clientHeight),me||0}function pe(a){if(null==oe){var b=ge("span","\u200b");ie(a,ge("span",[b,document.createTextNode("x")])),0!=a.firstChild.offsetHeight&&(oe=1>=b.offsetWidth&&b.offsetHeight>2&&!c)}return oe?ge("span","\u200b"):ge("span","\u00a0",null,"display: inline-block; width: 1px; margin-right: -1px")}function ue(a,b,c,d){if(!a)return d(b,c,"ltr");for(var e=0;a.length>e;++e){var f=a[e];(c>f.from&&f.to>b||b==c&&f.to==b)&&d(Math.max(f.from,b),Math.min(f.to,c),1==f.level?"rtl":"ltr")}}function ve(a){return a.level%2?a.to:a.from}function we(a){return a.level%2?a.from:a.to}function xe(a){var b=Dd(a);return b?ve(b[0]):0}function ye(a){var b=Dd(a);return b?we(Zd(b)):a.text.length}function ze(a,b){var c=yd(a.view.doc,b),d=_c(a.view.doc,c);d!=c&&(b=Ad(d));var e=Dd(d),f=e?e[0].level%2?ye(d):xe(d):0;return{line:b,ch:f}}function Ae(a,b){for(var c,d;c=$c(d=yd(a.view.doc,b));)b=c.find().to.line;var e=Dd(d),f=e?e[0].level%2?xe(d):ye(d):d.text.length;return{line:b,ch:f}}function Be(a,b,c,d){var e=Dd(a);if(!e)return Ce(a,b,c,d);for(var f=d?function(b,c){do b+=c;while(b>0&&fe.test(a.text.charAt(b)));return b}:function(a,b){return a+b},g=e[0].level,h=0;e.length>h;++h){var i=e[h],j=i.level%2==g;if(b>i.from&&i.to>b||j&&(i.from==b||i.to==b))break}for(var k=f(b,i.level%2?-c:c);null!=k;)if(i.level%2==g){if(!(i.from>k||k>i.to))break;i=e[h+=c],k=i&&(c>0==i.level%2?f(i.to,-1):f(i.from,1))}else if(k==ve(i))i=e[--h],k=i&&we(i);else{if(k!=we(i))break;i=e[++h],k=i&&ve(i)}return 0>k||k>a.text.length?null:k}function Ce(a,b,c,d){var e=b+c;if(d)for(;e>0&&fe.test(a.text.charAt(e));)e+=c;return 0>e||e>a.text.length?null:e}var a=/gecko\/\d/i.test(navigator.userAgent),b=/MSIE \d/.test(navigator.userAgent),c=/MSIE [1-7]\b/.test(navigator.userAgent),d=/MSIE [1-8]\b/.test(navigator.userAgent),f=/WebKit\//.test(navigator.userAgent),g=f&&/Qt\/\d+\.\d+/.test(navigator.userAgent),h=/Chrome\//.test(navigator.userAgent),i=/Opera\//.test(navigator.userAgent),j=/Apple Computer/.test(navigator.vendor),k=/KHTML\//.test(navigator.userAgent),l=/Mac OS X 1\d\D([7-9]|\d\d)\D/.test(navigator.userAgent),m=/Mac OS X 1\d\D([8-9]|\d\d)\D/.test(navigator.userAgent),n=/PhantomJS/.test(navigator.userAgent),o=/AppleWebKit/.test(navigator.userAgent)&&/Mobile\/\w+/.test(navigator.userAgent),p=o||/Android|webOS|BlackBerry|Opera Mini|IEMobile/i.test(navigator.userAgent),q=o||/Mac/.test(navigator.platform),r=/windows/i.test(navigator.platform),s=i&&navigator.userAgent.match(/Version\/(\d*\.\d*)/);s&&(s=Number(s[1]));var mb,Cb,Db,Lb,Mb,Nb,Ob,t=q&&(g||i&&(null==s||12.11>s)),u=!1,v=!1,Kb=0,Pb=null;b?Pb=-.53:a?Pb=15:h?Pb=-.7:j&&(Pb=-1/3);var Tb,_b,Wb=null;w.prototype={getValue:function(a){var b=[],c=this.view.doc;return c.iter(0,c.size,function(a){b.push(a.text)}),b.join(a||"\n")},setValue:rb(null,function(a){var b=this.view.doc,c={line:0,ch:0},d=yd(b,b.size-1).text.length;cc(this,c,{line:b.size-1,ch:d},qe(a),c,c,"setValue")}),getSelection:function(a){return this.getRange(this.view.sel.from,this.view.sel.to,a)},replaceSelection:rb(null,function(a,b,c){var d=this.view.sel;bc(this,d.from,d.to,qe(a),b||"around",c)}),focus:function(){window.focus(),xb(this),Zb(this),ub(this)},setOption:function(a,b){var c=this.options,d=c[a];(c[a]!=b||"mode"==a)&&(c[a]=b,zc.hasOwnProperty(a)&&rb(this,zc[a])(this,b,d))},getOption:function(a){return this.options[a]},getMode:function(){return this.view.mode},addKeyMap:function(a){this.view.keyMaps.push(a)},removeKeyMap:function(a){for(var b=this.view.keyMaps,c=0;b.length>c;++c)if(("string"==typeof a?b[c].name:b[c])==a)return b.splice(c,1),!0},addOverlay:rb(null,function(a,b){var c=a.token?a:w.getMode(this.options,a);if(c.startState)throw Error("Overlays may not be stateful.");this.view.overlays.push({mode:c,modeSpec:a,opaque:b&&b.opaque}),this.view.modeGen++,sb(this,0,this.view.doc.size)}),removeOverlay:rb(null,function(a){for(var b=this.view.overlays,c=0;b.length>c;++c)if(b[c].modeSpec==a)return b.splice(c,1),this.view.modeGen++,sb(this,0,this.view.doc.size),void 0}),undo:rb(null,function(){dc(this,"undo")}),redo:rb(null,function(){dc(this,"redo")}),indentLine:rb(null,function(a,b,c){"string"!=typeof b&&(b=null==b?this.options.smartIndent?"smart":"prev":b?"add":"subtract"),lc(this.view.doc,a)&&uc(this,a,b,c)}),indentSelection:rb(null,function(a){var b=this.view.sel;if(gc(b.from,b.to))return uc(this,b.from.line,a);for(var c=b.to.line-(b.to.ch?0:1),d=b.from.line;c>=d;++d)uc(this,d,a)}),historySize:function(){var a=this.view.history;return{undo:a.done.length,redo:a.undone.length}},clearHistory:function(){this.view.history=Ed()},markClean:function(){this.view.history.dirtyCounter=0,this.view.history.lastOp=this.view.history.lastOrigin=null},isClean:function(){return 0==this.view.history.dirtyCounter},getHistory:function(){function b(a){for(var d,b=0,c=[];a.length>b;++b){var e=a[b];c.push({events:d=[],fromBefore:e.fromBefore,toBefore:e.toBefore,fromAfter:e.fromAfter,toAfter:e.toAfter});for(var f=0,g=e.events;g.length>f;++f){var h=[],i=g[f];d.push({start:i.start,added:i.added,old:h});for(var j=0;i.old.length>j;++j)h.push(cd(i.old[j]))}}return c}var a=this.view.history;return{done:b(a.done),undone:b(a.undone)}},setHistory:function(a){var b=this.view.history=Ed();b.done=a.done,b.undone=a.undone},getTokenAt:function(a){var b=this.view.doc;a=kc(b,a);for(var c=ab(this,a.line),d=this.view.mode,e=yd(b,a.line),f=new Oc(e.text,this.options.tabSize);f.pos<a.ch&&!f.eol();){f.start=f.pos;var g=d.token(f,c)}return{start:f.start,end:f.pos,string:f.current(),className:g||null,type:g||null,state:c}},getStateAfter:function(a){var b=this.view.doc;return a=jc(b,null==a?b.size-1:a),ab(this,a+1)},cursorCoords:function(a,b){var c,d=this.view.sel;return c=null==a?d.head:"object"==typeof a?kc(this.view.doc,a):a?d.from:d.to,jb(this,c,b||"page")},charCoords:function(a,b){return ib(this,kc(this.view.doc,a),b||"page")},coordsChar:function(a){var b=this.display.lineSpace.getBoundingClientRect();return kb(this,a.left-b.left,a.top-b.top)},defaultTextHeight:function(){return nb(this.display)},markText:rb(null,function(a,b,c){return Qc(this,kc(this.view.doc,a),kc(this.view.doc,b),c,"range")}),setBookmark:rb(null,function(a,b){return a=kc(this.view.doc,a),Qc(this,a,a,b?{replacedWith:b}:{},"bookmark")}),findMarksAt:function(a){var b=this.view.doc;a=kc(b,a);var c=[],d=yd(b,a.line).markedSpans;if(d)for(var e=0;d.length>e;++e){var f=d[e];(null==f.from||f.from<=a.ch)&&(null==f.to||f.to>=a.ch)&&c.push(f.marker)}return c},setGutterMarker:rb(null,function(a,b,c){return vc(this,a,function(a){var d=a.gutterMarkers||(a.gutterMarkers={});return d[b]=c,!c&&ee(d)&&(a.gutterMarkers=null),!0})}),clearGutter:rb(null,function(a){var b=0,c=this,d=c.view.doc;d.iter(0,d.size,function(d){d.gutterMarkers&&d.gutterMarkers[a]&&(d.gutterMarkers[a]=null,sb(c,b,b+1),ee(d.gutterMarkers)&&(d.gutterMarkers=null)),++b})}),addLineClass:rb(null,function(a,b,c){return vc(this,a,function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"wrapClass";if(a[d]){if(RegExp("\\b"+c+"\\b").test(a[d]))return!1;a[d]+=" "+c}else a[d]=c;return!0})}),removeLineClass:rb(null,function(a,b,c){return vc(this,a,function(a){var d="text"==b?"textClass":"background"==b?"bgClass":"wrapClass",e=a[d];if(!e)return!1;if(null==c)a[d]=null;else{var f=e.replace(RegExp("^"+c+"\\b\\s*|\\s*\\b"+c+"\\b"),"");if(f==e)return!1;a[d]=f||null}return!0})}),addLineWidget:rb(null,function(a,b,c){var d=c||{};return d.node=b,d.noHScroll&&(this.display.alignWidgets=!0),vc(this,a,function(a){return(a.widgets||(a.widgets=[])).push(d),d.line=a,!0}),d}),removeLineWidget:rb(null,function(a){var b=a.line.widgets,c=Ad(a.line);if(null!=c&&b){for(var d=0;b.length>d;++d)b[d]==a&&b.splice(d--,1);var e=a.node.offsetHeight?a.line.height-a.node.offsetHeight:nb(this.display);zd(a.line,e),sb(this,c,c+1)}}),lineInfo:function(a){if("number"==typeof a){if(!lc(this.view.doc,a))return null;var b=a;if(a=yd(this.view.doc,a),!a)return null}else{var b=Ad(a);if(null==b)return null}return{line:b,handle:a,text:a.text,gutterMarkers:a.gutterMarkers,textClass:a.textClass,bgClass:a.bgClass,wrapClass:a.wrapClass,widgets:a.widgets}},getViewport:function(){return{from:this.display.showingFrom,to:this.display.showingTo}},addWidget:function(a,b,c,d,e){var f=this.display;a=jb(this,kc(this.view.doc,a));var g=a.top,h=a.left;
-if(b.style.position="absolute",f.sizer.appendChild(b),"over"==d)g=a.top;else if("near"==d){var i=Math.max(f.wrapper.clientHeight,this.view.doc.height),j=Math.max(f.sizer.clientWidth,f.lineSpace.clientWidth);a.bottom+b.offsetHeight>i&&a.top>b.offsetHeight&&(g=a.top-b.offsetHeight),h+b.offsetWidth>j&&(h=j-b.offsetWidth)}b.style.top=g+bb(f)+"px",b.style.left=b.style.right="","right"==e?(h=f.sizer.clientWidth-b.offsetWidth,b.style.right="0px"):("left"==e?h=0:"middle"==e&&(h=(f.sizer.clientWidth-b.offsetWidth)/2),b.style.left=h+"px"),c&&sc(this,h,g,h+b.offsetWidth,g+b.offsetHeight)},lineCount:function(){return this.view.doc.size},clipPos:function(a){return kc(this.view.doc,a)},getCursor:function(a){var c,b=this.view.sel;return c=null==a||"head"==a?b.head:"anchor"==a?b.anchor:"end"==a||a===!1?b.to:b.from,ic(c)},somethingSelected:function(){return!gc(this.view.sel.from,this.view.sel.to)},setCursor:rb(null,function(a,b,c){var d=kc(this.view.doc,"number"==typeof a?{line:a,ch:b||0}:a);c?mc(this,d):nc(this,d,d)}),setSelection:rb(null,function(a,b){var c=this.view.doc;nc(this,kc(c,a),kc(c,b||a))}),extendSelection:rb(null,function(a,b){var c=this.view.doc;mc(this,kc(c,a),b&&kc(c,b))}),setExtending:function(a){this.view.sel.extend=a},getLine:function(a){var b=this.getLineHandle(a);return b&&b.text},getLineHandle:function(a){var b=this.view.doc;return lc(b,a)?yd(b,a):void 0},getLineNumber:function(a){return Ad(a)},setLine:rb(null,function(a,b){lc(this.view.doc,a)&&fc(this,b,{line:a,ch:0},{line:a,ch:yd(this.view.doc,a).text.length})}),removeLine:rb(null,function(a){lc(this.view.doc,a)&&fc(this,"",{line:a,ch:0},kc(this.view.doc,{line:a+1,ch:0}))}),replaceRange:rb(null,function(a,b,c){var d=this.view.doc;return b=kc(d,b),c=c?kc(d,c):b,fc(this,a,b,c)}),getRange:function(a,b,c){var d=this.view.doc;a=kc(d,a),b=kc(d,b);var e=a.line,f=b.line;if(e==f)return yd(d,e).text.slice(a.ch,b.ch);var g=[yd(d,e).text.slice(a.ch)];return d.iter(e+1,f,function(a){g.push(a.text)}),g.push(yd(d,f).text.slice(0,b.ch)),g.join(c||"\n")},triggerOnKeyDown:rb(null,Xb),execCommand:function(a){return Jc[a](this)},moveH:rb(null,function(a,b){var c=this.view.sel,d=0>a?c.from:c.to;(c.shift||c.extend||gc(c.from,c.to))&&(d=wc(this,a,b,this.options.rtlMoveVisually)),mc(this,d,d,a)}),deleteH:rb(null,function(a,b){var c=this.view.sel;gc(c.from,c.to)?fc(this,"",c.from,wc(this,a,b,!1),"delete"):fc(this,"",c.from,c.to,"delete"),this.curOp.userSelChange=!0}),moveV:rb(null,function(a,b){var i,c=this.view,d=c.doc,e=this.display,f=c.sel.head,g=jb(this,f,"div"),h=g.left;if(null!=c.goalColumn&&(h=c.goalColumn),"page"==b){var j=Math.min(e.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight);i=g.top+a*j}else"line"==b&&(i=a>0?g.bottom+3:g.top-3);do{var k=kb(this,h,i);i+=5*a}while(k.outside&&(0>a?i>0:d.height>i));"page"==b&&(e.scrollbarV.scrollTop+=ib(this,k,"div").top-g.top),mc(this,k,k,a),c.goalColumn=h}),toggleOverwrite:function(){(this.view.overwrite=!this.view.overwrite)?this.display.cursor.className+=" CodeMirror-overwrite":this.display.cursor.className=this.display.cursor.className.replace(" CodeMirror-overwrite","")},posFromIndex:function(a){var c,b=0,d=this.view.doc;return d.iter(0,d.size,function(d){var e=d.text.length+1;return e>a?(c=a,!0):(a-=e,++b,void 0)}),kc(d,{line:b,ch:c})},indexFromPos:function(a){a=kc(this.view.doc,a);var b=a.ch;return this.view.doc.iter(0,a.line,function(a){b+=a.text.length+1}),b},scrollTo:function(a,b){null!=a&&(this.display.scrollbarH.scrollLeft=this.display.scroller.scrollLeft=a),null!=b&&(this.display.scrollbarV.scrollTop=this.display.scroller.scrollTop=b),O(this,[])},getScrollInfo:function(){var a=this.display.scroller,b=Td;return{left:a.scrollLeft,top:a.scrollTop,height:a.scrollHeight-b,width:a.scrollWidth-b,clientHeight:a.clientHeight-b,clientWidth:a.clientWidth-b}},scrollIntoView:function(a){"number"==typeof a&&(a={line:a,ch:0}),a&&null==a.line?sc(this,a.left,a.top,a.right,a.bottom):(a=a?kc(this.view.doc,a):this.view.sel.head,rc(this,a))},setSize:function(a,b){function c(a){return"number"==typeof a||/^\d+$/.test(a+"")?a+"px":a}null!=a&&(this.display.wrapper.style.width=c(a)),null!=b&&(this.display.wrapper.style.height=c(b)),this.refresh()},on:function(a,b){Od(this,a,b)},off:function(a,b){Pd(this,a,b)},operation:function(a){return rb(this,a)()},refresh:function(){gb(this),this.display.scroller.scrollHeight>this.view.scrollTop&&(this.display.scrollbarV.scrollTop=this.display.scroller.scrollTop=this.view.scrollTop),O(this,!0)},getInputField:function(){return this.display.input},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}};var zc=w.optionHandlers={},Ac=w.defaults={},Cc=w.Init={toString:function(){return"CodeMirror.Init"}};Bc("value","",function(a,b){a.setValue(b)},!0),Bc("mode",null,z,!0),Bc("indentUnit",2,z,!0),Bc("indentWithTabs",!1),Bc("smartIndent",!0),Bc("tabSize",4,function(a){z(a),gb(a),O(a,!0)},!0),Bc("electricChars",!0),Bc("rtlMoveVisually",!r),Bc("theme","default",function(a){C(a),D(a)},!0),Bc("keyMap","default",B),Bc("extraKeys",null),Bc("onKeyEvent",null),Bc("onDragEvent",null),Bc("lineWrapping",!1,A,!0),Bc("gutters",[],function(a){H(a.options),D(a)},!0),Bc("lineNumbers",!1,function(a){H(a.options),D(a)},!0),Bc("firstLineNumber",1,D,!0),Bc("lineNumberFormatter",function(a){return a},D,!0),Bc("showCursorWhenSelecting",!1,V,!0),Bc("readOnly",!1,function(a,b){"nocursor"==b?($b(a),a.display.input.blur()):b||wb(a,!0)}),Bc("dragDrop",!0),Bc("cursorBlinkRate",530),Bc("cursorHeight",1),Bc("workTime",100),Bc("workDelay",100),Bc("flattenSpans",!0),Bc("pollInterval",100),Bc("undoDepth",40),Bc("viewportMargin",10,function(a){a.refresh()},!0),Bc("tabindex",null,function(a,b){a.display.input.tabIndex=b||""}),Bc("autofocus",null);var Dc=w.modes={},Ec=w.mimeModes={};w.defineMode=function(a,b){if(w.defaults.mode||"null"==a||(w.defaults.mode=a),arguments.length>2){b.dependencies=[];for(var c=2;arguments.length>c;++c)b.dependencies.push(arguments[c])}Dc[a]=b},w.defineMIME=function(a,b){Ec[a]=b},w.resolveMode=function(a){if("string"==typeof a&&Ec.hasOwnProperty(a))a=Ec[a];else if("string"==typeof a&&/^[\w\-]+\/[\w\-]+\+xml$/.test(a))return w.resolveMode("application/xml");return"string"==typeof a?{name:a}:a||{name:"null"}},w.getMode=function(a,b){b=w.resolveMode(b);var c=Dc[b.name];if(!c)return w.getMode(a,"text/plain");var d=c(a,b);if(Fc.hasOwnProperty(b.name)){var e=Fc[b.name];for(var f in e)e.hasOwnProperty(f)&&(d.hasOwnProperty(f)&&(d["_"+f]=d[f]),d[f]=e[f])}return d.name=b.name,d},w.defineMode("null",function(){return{token:function(a){a.skipToEnd()}}}),w.defineMIME("text/plain","null");var Fc=w.modeExtensions={};w.extendMode=function(a,b){var c=Fc.hasOwnProperty(a)?Fc[a]:Fc[a]={};for(var d in b)b.hasOwnProperty(d)&&(c[d]=b[d])},w.defineExtension=function(a,b){w.prototype[a]=b},w.defineOption=Bc;var Gc=[];w.defineInitHook=function(a){Gc.push(a)},w.copyState=Hc,w.startState=Ic,w.innerMode=function(a,b){for(;a.innerMode;){var c=a.innerMode(b);b=c.state,a=c.mode}return c||{mode:a,state:b}};var Jc=w.commands={selectAll:function(a){a.setSelection({line:0,ch:0},{line:a.lineCount()-1})},killLine:function(a){var b=a.getCursor(!0),c=a.getCursor(!1),d=!gc(b,c);d||a.getLine(b.line).length!=b.ch?a.replaceRange("",b,d?c:{line:b.line},"delete"):a.replaceRange("",b,{line:b.line+1,ch:0},"delete")},deleteLine:function(a){var b=a.getCursor().line;a.replaceRange("",{line:b,ch:0},{line:b},"delete")},undo:function(a){a.undo()},redo:function(a){a.redo()},goDocStart:function(a){a.extendSelection({line:0,ch:0})},goDocEnd:function(a){a.extendSelection({line:a.lineCount()-1})},goLineStart:function(a){a.extendSelection(ze(a,a.getCursor().line))},goLineStartSmart:function(a){var b=a.getCursor(),c=ze(a,b.line),d=a.getLineHandle(c.line),e=Dd(d);if(e&&0!=e[0].level)a.extendSelection(c);else{var f=Math.max(0,d.text.search(/\S/)),g=b.line==c.line&&f>=b.ch&&b.ch;a.extendSelection({line:c.line,ch:g?0:f})}},goLineEnd:function(a){a.extendSelection(Ae(a,a.getCursor().line))},goLineUp:function(a){a.moveV(-1,"line")},goLineDown:function(a){a.moveV(1,"line")},goPageUp:function(a){a.moveV(-1,"page")},goPageDown:function(a){a.moveV(1,"page")},goCharLeft:function(a){a.moveH(-1,"char")},goCharRight:function(a){a.moveH(1,"char")},goColumnLeft:function(a){a.moveH(-1,"column")},goColumnRight:function(a){a.moveH(1,"column")},goWordLeft:function(a){a.moveH(-1,"word")},goWordRight:function(a){a.moveH(1,"word")},delCharBefore:function(a){a.deleteH(-1,"char")},delCharAfter:function(a){a.deleteH(1,"char")},delWordBefore:function(a){a.deleteH(-1,"word")},delWordAfter:function(a){a.deleteH(1,"word")},indentAuto:function(a){a.indentSelection("smart")},indentMore:function(a){a.indentSelection("add")},indentLess:function(a){a.indentSelection("subtract")},insertTab:function(a){a.replaceSelection(" ","end","input")},defaultTab:function(a){a.somethingSelected()?a.indentSelection("add"):a.replaceSelection(" ","end","input")},transposeChars:function(a){var b=a.getCursor(),c=a.getLine(b.line);b.ch>0&&b.ch<c.length-1&&a.replaceRange(c.charAt(b.ch)+c.charAt(b.ch-1),{line:b.line,ch:b.ch-1},{line:b.line,ch:b.ch+1})},newlineAndIndent:function(a){rb(a,function(){a.replaceSelection("\n","end","input"),a.indentLine(a.getCursor().line,null,!0)})()},toggleOverwrite:function(a){a.toggleOverwrite()}},Kc=w.keyMap={};Kc.basic={Left:"goCharLeft",Right:"goCharRight",Up:"goLineUp",Down:"goLineDown",End:"goLineEnd",Home:"goLineStartSmart",PageUp:"goPageUp",PageDown:"goPageDown",Delete:"delCharAfter",Backspace:"delCharBefore",Tab:"defaultTab","Shift-Tab":"indentAuto",Enter:"newlineAndIndent",Insert:"toggleOverwrite"},Kc.pcDefault={"Ctrl-A":"selectAll","Ctrl-D":"deleteLine","Ctrl-Z":"undo","Shift-Ctrl-Z":"redo","Ctrl-Y":"redo","Ctrl-Home":"goDocStart","Alt-Up":"goDocStart","Ctrl-End":"goDocEnd","Ctrl-Down":"goDocEnd","Ctrl-Left":"goWordLeft","Ctrl-Right":"goWordRight","Alt-Left":"goLineStart","Alt-Right":"goLineEnd","Ctrl-Backspace":"delWordBefore","Ctrl-Delete":"delWordAfter","Ctrl-S":"save","Ctrl-F":"find","Ctrl-G":"findNext","Shift-Ctrl-G":"findPrev","Shift-Ctrl-F":"replace","Shift-Ctrl-R":"replaceAll","Ctrl-[":"indentLess","Ctrl-]":"indentMore",fallthrough:"basic"},Kc.macDefault={"Cmd-A":"selectAll","Cmd-D":"deleteLine","Cmd-Z":"undo","Shift-Cmd-Z":"redo","Cmd-Y":"redo","Cmd-Up":"goDocStart","Cmd-End":"goDocEnd","Cmd-Down":"goDocEnd","Alt-Left":"goWordLeft","Alt-Right":"goWordRight","Cmd-Left":"goLineStart","Cmd-Right":"goLineEnd","Alt-Backspace":"delWordBefore","Ctrl-Alt-Backspace":"delWordAfter","Alt-Delete":"delWordAfter","Cmd-S":"save","Cmd-F":"find","Cmd-G":"findNext","Shift-Cmd-G":"findPrev","Cmd-Alt-F":"replace","Shift-Cmd-Alt-F":"replaceAll","Cmd-[":"indentLess","Cmd-]":"indentMore",fallthrough:["basic","emacsy"]},Kc["default"]=q?Kc.macDefault:Kc.pcDefault,Kc.emacsy={"Ctrl-F":"goCharRight","Ctrl-B":"goCharLeft","Ctrl-P":"goLineUp","Ctrl-N":"goLineDown","Alt-F":"goWordRight","Alt-B":"goWordLeft","Ctrl-A":"goLineStart","Ctrl-E":"goLineEnd","Ctrl-V":"goPageDown","Shift-Ctrl-V":"goPageUp","Ctrl-D":"delCharAfter","Ctrl-H":"delCharBefore","Alt-D":"delWordAfter","Alt-Backspace":"delWordBefore","Ctrl-K":"killLine","Ctrl-T":"transposeChars"},w.isModifierKey=Nc,w.fromTextArea=function(a,b){function e(){a.value=i.getValue()}if(b||(b={}),b.value=a.value,!b.tabindex&&a.tabindex&&(b.tabindex=a.tabindex),null==b.autofocus){var c=document.body;try{c=document.activeElement}catch(d){}b.autofocus=c==a||null!=a.getAttribute("autofocus")&&c==document.body}if(a.form){Od(a.form,"submit",e);var f=a.form,g=f.submit;try{f.submit=function h(){e(),f.submit=g,f.submit(),f.submit=h}}catch(d){}}a.style.display="none";var i=w(function(b){a.parentNode.insertBefore(b,a.nextSibling)},b);return i.save=e,i.getTextArea=function(){return a},i.toTextArea=function(){e(),a.parentNode.removeChild(i.getWrapperElement()),a.style.display="",a.form&&(Pd(a.form,"submit",e),"function"==typeof a.form.submit&&(a.form.submit=g))},i},Oc.prototype={eol:function(){return this.pos>=this.string.length},sol:function(){return 0==this.pos},peek:function(){return this.string.charAt(this.pos)||void 0},next:function(){return this.pos<this.string.length?this.string.charAt(this.pos++):void 0},eat:function(a){var b=this.string.charAt(this.pos);if("string"==typeof a)var c=b==a;else var c=b&&(a.test?a.test(b):a(b));return c?(++this.pos,b):void 0},eatWhile:function(a){for(var b=this.pos;this.eat(a););return this.pos>b},eatSpace:function(){for(var a=this.pos;/[\s\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>a},skipToEnd:function(){this.pos=this.string.length},skipTo:function(a){var b=this.string.indexOf(a,this.pos);return b>-1?(this.pos=b,!0):void 0},backUp:function(a){this.pos-=a},column:function(){return Wd(this.string,this.start,this.tabSize)},indentation:function(){return Wd(this.string,null,this.tabSize)},match:function(a,b,c){if("string"!=typeof a){var e=this.string.slice(this.pos).match(a);return e&&e.index>0?null:(e&&b!==!1&&(this.pos+=e[0].length),e)}var d=function(a){return c?a.toLowerCase():a};return d(this.string).indexOf(d(a),this.pos)==this.pos?(b!==!1&&(this.pos+=a.length),!0):void 0},current:function(){return this.string.slice(this.start,this.pos)}},w.StringStream=Oc,w.TextMarker=Pc,Pc.prototype.clear=function(){if(!this.explicitlyCleared){pb(this.cm);for(var a=null,b=null,c=0;this.lines.length>c;++c){var d=this.lines[c],e=Rc(d.markedSpans,this);null!=e.to&&(b=Ad(d)),d.markedSpans=Sc(d.markedSpans,e),null!=e.from?a=Ad(d):this.collapsed&&!ad(d)&&zd(d,nb(this.cm.display))}null!=a&&sb(this.cm,a,b+1),this.lines.length=0,this.explicitlyCleared=!0,this.collapsed&&this.cm.view.cantEdit&&(this.cm.view.cantEdit=!1,oc(this.cm)),qb(this.cm),Rd(this.cm,this,"clear")}},Pc.prototype.find=function(){for(var a,b,c=0;this.lines.length>c;++c){var d=this.lines[c],e=Rc(d.markedSpans,this);if(null!=e.from||null!=e.to){var f=Ad(d);null!=e.from&&(a={line:f,ch:e.from}),null!=e.to&&(b={line:f,ch:e.to})}}return"bookmark"==this.type?a:a&&{from:a,to:b}},Pc.prototype.getOptions=function(a){var b=this.replacedWith;return{className:this.className,inclusiveLeft:this.inclusiveLeft,inclusiveRight:this.inclusiveRight,atomic:this.atomic,collapsed:this.collapsed,clearOnEnter:this.clearOnEnter,replacedWith:a?b&&b.cloneNode(!0):b,readOnly:this.readOnly,startStyle:this.startStyle,endStyle:this.endStyle}},window.lineIsHidden=ad;var od={},rd=/[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g;wd.prototype={chunkSize:function(){return this.lines.length},remove:function(a,b,c){for(var d=a,e=a+b;e>d;++d){var f=this.lines[d];this.height-=f.height,jd(f),Rd(c,f,"delete")}this.lines.splice(a,b)},collapse:function(a){a.splice.apply(a,[a.length,0].concat(this.lines))},insertHeight:function(a,b,c){this.height+=c,this.lines=this.lines.slice(0,a).concat(b).concat(this.lines.slice(a));for(var d=0,e=b.length;e>d;++d)b[d].parent=this},iterN:function(a,b,c){for(var d=a+b;d>a;++a)if(c(this.lines[a]))return!0}},xd.prototype={chunkSize:function(){return this.size},remove:function(a,b,c){this.size-=b;for(var d=0;this.children.length>d;++d){var e=this.children[d],f=e.chunkSize();if(f>a){var g=Math.min(b,f-a),h=e.height;if(e.remove(a,g,c),this.height-=h-e.height,f==g&&(this.children.splice(d--,1),e.parent=null),0==(b-=g))break;a=0}else a-=f}if(25>this.size-b){var i=[];this.collapse(i),this.children=[new wd(i)],this.children[0].parent=this}},collapse:function(a){for(var b=0,c=this.children.length;c>b;++b)this.children[b].collapse(a)},insert:function(a,b){for(var c=0,d=0,e=b.length;e>d;++d)c+=b[d].height;this.insertHeight(a,b,c)},insertHeight:function(a,b,c){this.size+=b.length,this.height+=c;for(var d=0,e=this.children.length;e>d;++d){var f=this.children[d],g=f.chunkSize();if(g>=a){if(f.insertHeight(a,b,c),f.lines&&f.lines.length>50){for(;f.lines.length>50;){var h=f.lines.splice(f.lines.length-25,25),i=new wd(h);f.height-=i.height,this.children.splice(d+1,0,i),i.parent=this}this.maybeSpill()}break}a-=g}},maybeSpill:function(){if(!(10>=this.children.length)){var a=this;do{var b=a.children.splice(a.children.length-5,5),c=new xd(b);if(a.parent){a.size-=c.size,a.height-=c.height;var e=_d(a.parent.children,a);a.parent.children.splice(e+1,0,c)}else{var d=new xd(a.children);d.parent=a,a.children=[d,c],a=d}c.parent=a.parent}while(a.children.length>10);a.parent.maybeSpill()}},iter:function(a,b,c){this.iterN(a,b-a,c)},iterN:function(a,b,c){for(var d=0,e=this.children.length;e>d;++d){var f=this.children[d],g=f.chunkSize();if(g>a){var h=Math.min(b,g-a);if(f.iterN(a,h,c))return!0;if(0==(b-=h))break;a=0}else a-=g}}},w.e_stop=Kd,w.e_preventDefault=Id,w.e_stopPropagation=Jd,w.on=Od,w.off=Pd,w.signal=Qd;var Td=30,Ud=w.Pass={toString:function(){return"CodeMirror.Pass"}};Vd.prototype={set:function(a,b){clearTimeout(this.id),this.id=setTimeout(b,a)}},w.countColumn=Wd;var Xd=[""],ce=/[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/,fe=/[\u0300-\u036F\u0483-\u0487\u0488-\u0489\u0591-\u05BD\u05BF\u05C1-\u05C2\u05C4-\u05C5\u05C7\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7-\u06E8\u06EA-\u06ED\uA66F\uA670-\uA672\uA674-\uA67D\uA69F]/,ke=function(){if(d)return!1;var a=ge("div");return"draggable"in a||"dragDrop"in a}(),le=/^$/;a?le=/$'/:j?le=/\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/:h&&(le=/\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/);var me,oe,qe=3!="\n\nb".split(/\n/).length?function(a){for(var b=0,c=[],d=a.length;d>=b;){var e=a.indexOf("\n",b);-1==e&&(e=a.length);var f=a.slice(b,"\r"==a.charAt(e-1)?e-1:e),g=f.indexOf("\r");-1!=g?(c.push(f.slice(0,g)),b+=g+1):(c.push(f),b=e+1)}return c}:function(a){return a.split(/\r\n?|\n/)};w.splitLines=qe;var re=window.getSelection?function(a){try{return a.selectionStart!=a.selectionEnd}catch(b){return!1}}:function(a){try{var b=a.ownerDocument.selection.createRange()}catch(c){}return b&&b.parentElement()==a?0!=b.compareEndPoints("StartToEnd",b):!1},se=function(){var a=ge("div");return"oncopy"in a?!0:(a.setAttribute("oncopy","return;"),"function"==typeof a.oncopy)}(),te={3:"Enter",8:"Backspace",9:"Tab",13:"Enter",16:"Shift",17:"Ctrl",18:"Alt",19:"Pause",20:"CapsLock",27:"Esc",32:"Space",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"Left",38:"Up",39:"Right",40:"Down",44:"PrintScrn",45:"Insert",46:"Delete",59:";",91:"Mod",92:"Mod",93:"Mod",109:"-",107:"=",127:"Delete",186:";",187:"=",188:",",189:"-",190:".",191:"/",192:"`",219:"[",220:"\\",221:"]",222:"'",63276:"PageUp",63277:"PageDown",63275:"End",63273:"Home",63234:"Left",63232:"Up",63235:"Right",63233:"Down",63302:"Insert",63272:"Delete"};w.keyNames=te,function(){for(var a=0;10>a;a++)te[a+48]=a+"";for(var a=65;90>=a;a++)te[a]=String.fromCharCode(a);for(var a=1;12>=a;a++)te[a+111]=te[a+63235]="F"+a}();var De=function(){function c(c){return 255>=c?a.charAt(c):c>=1424&&1524>=c?"R":c>=1536&&1791>=c?b.charAt(c-1536):c>=1792&&2220>=c?"r":"L"}var a="bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL",b="rrrrrrrrrrrr,rNNmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmrrrrrrrnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmNmmmmrrrrrrrrrrrrrrrrrr",d=/[\u0590-\u05f4\u0600-\u06ff\u0700-\u08ac]/,e=/[stwN]/,f=/[LRr]/,g=/[Lb1n]/,h=/[1n]/,i="L";return function(a){if(!d.test(a))return!1;for(var l,b=a.length,j=[],k=0;b>k;++k)j.push(l=c(a.charCodeAt(k)));for(var k=0,m=i;b>k;++k){var l=j[k];"m"==l?j[k]=m:m=l}for(var k=0,n=i;b>k;++k){var l=j[k];"1"==l&&"r"==n?j[k]="n":f.test(l)&&(n=l,"r"==l&&(j[k]="R"))}for(var k=1,m=j[0];b-1>k;++k){var l=j[k];"+"==l&&"1"==m&&"1"==j[k+1]?j[k]="1":","!=l||m!=j[k+1]||"1"!=m&&"n"!=m||(j[k]=m),m=l}for(var k=0;b>k;++k){var l=j[k];if(","==l)j[k]="N";else if("%"==l){for(var o=k+1;b>o&&"%"==j[o];++o);for(var p=k&&"!"==j[k-1]||b-1>o&&"1"==j[o]?"1":"N",q=k;o>q;++q)j[q]=p;k=o-1}}for(var k=0,n=i;b>k;++k){var l=j[k];"L"==n&&"1"==l?j[k]="L":f.test(l)&&(n=l)}for(var k=0;b>k;++k)if(e.test(j[k])){for(var o=k+1;b>o&&e.test(j[o]);++o);for(var r="L"==(k?j[k-1]:i),s="L"==(b-1>o?j[o]:i),p=r||s?"L":"R",q=k;o>q;++q)j[q]=p;k=o-1}for(var u,t=[],k=0;b>k;)if(g.test(j[k])){var v=k;for(++k;b>k&&g.test(j[k]);++k);t.push({from:v,to:k,level:0})}else{var w=k,x=t.length;for(++k;b>k&&"L"!=j[k];++k);for(var q=w;k>q;)if(h.test(j[q])){q>w&&t.splice(x,0,{from:w,to:q,level:1});var y=q;for(++q;k>q&&h.test(j[q]);++q);t.splice(x,0,{from:y,to:q,level:2}),w=q}else++q;k>w&&t.splice(x,0,{from:w,to:k,level:1})}return 1==t[0].level&&(u=a.match(/^\s+/))&&(t[0].from=u[0].length,t.unshift({from:0,to:u[0].length,level:0})),1==Zd(t).level&&(u=a.match(/\s+$/))&&(Zd(t).to-=u[0].length,t.push({from:b-u[0].length,to:b,level:0})),t[0].level!=Zd(t).level&&t.push({from:b,to:b,level:t[0].level}),t}}();return w.version="3.0 +",w}(),CodeMirror.defineMode("javascript",function(a,b){function h(a,b,c){return b.tokenize=c,c(a,b)}function i(a,b){for(var d,c=!1;null!=(d=a.next());){if(d==b&&!c)return!1;c=!c&&"\\"==d}return c}function l(a,b,c){return j=a,k=c,b}function m(a,b){var c=a.next();if('"'==c||"'"==c)return h(a,b,n(c));if(/[\[\]{}\(\),;\:\.]/.test(c))return l(c);if("0"==c&&a.eat(/x/i))return a.eatWhile(/[\da-f]/i),l("number","number");if(/\d/.test(c)||"-"==c&&a.eat(/\d/))return a.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/),l("number","number");if("/"==c)return a.eat("*")?h(a,b,o):a.eat("/")?(a.skipToEnd(),l("comment","comment")):"operator"==b.lastType||"keyword c"==b.lastType||/^[\[{}\(,;:]$/.test(b.lastType)?(i(a,"/"),a.eatWhile(/[gimy]/),l("regexp","string-2")):(a.eatWhile(g),l("operator",null,a.current()));if("#"==c)return a.skipToEnd(),l("error","error");if(g.test(c))return a.eatWhile(g),l("operator",null,a.current());a.eatWhile(/[\w\$_]/);var d=a.current(),e=f.propertyIsEnumerable(d)&&f[d];return e&&"."!=b.lastType?l(e.type,e.style,d):l("variable","variable",d)}function n(a){return function(b,c){return i(b,a)||(c.tokenize=m),l("string","string")}}function o(a,b){for(var d,c=!1;d=a.next();){if("/"==d&&c){b.tokenize=m;break}c="*"==d}return l("comment","comment")}function q(a,b,c,d,e,f){this.indented=a,this.column=b,this.type=c,this.prev=e,this.info=f,null!=d&&(this.align=d)}function r(a,b){for(var c=a.localVars;c;c=c.next)if(c.name==b)return!0}function s(a,b,c,e,f){var g=a.cc;for(t.state=a,t.stream=f,t.marked=null,t.cc=g,a.lexical.hasOwnProperty("align")||(a.lexical.align=!0);;){var h=g.length?g.pop():d?E:D;if(h(c,e)){for(;g.length&&g[g.length-1].lex;)g.pop()();return t.marked?t.marked:"variable"==c&&r(a,e)?"variable-2":b}}}function u(){for(var a=arguments.length-1;a>=0;a--)t.cc.push(arguments[a])}function v(){return u.apply(null,arguments),!0}function w(a){function b(b){for(var c=b;c;c=c.next)if(c.name==a)return!0;return!1}var c=t.state;if(c.context){if(t.marked="def",b(c.localVars))return;c.localVars={name:a,next:c.localVars}}else{if(b(c.globalVars))return;c.globalVars={name:a,next:c.globalVars}}}function y(){t.state.context={prev:t.state.context,vars:t.state.localVars},t.state.localVars=x}function z(){t.state.localVars=t.state.context.vars,t.state.context=t.state.context.prev}function A(a,b){var c=function(){var c=t.state;c.lexical=new q(c.indented,t.stream.column(),a,null,c.lexical,b)};return c.lex=!0,c}function B(){var a=t.state;a.lexical.prev&&(")"==a.lexical.type&&(a.indented=a.lexical.indented),a.lexical=a.lexical.prev)}function C(a){return function(b){return b==a?v():";"==a?u():v(arguments.callee)}}function D(a){return"var"==a?v(A("vardef"),O,C(";"),B):"keyword a"==a?v(A("form"),E,D,B):"keyword b"==a?v(A("form"),D,B):"{"==a?v(A("}"),L,B):";"==a?v():"function"==a?v(U):"for"==a?v(A("form"),C("("),A(")"),Q,C(")"),B,D,B):"variable"==a?v(A("stat"),H):"switch"==a?v(A("form"),E,A("}","switch"),C("{"),L,B,B):"case"==a?v(E,C(":")):"default"==a?v(C(":")):"catch"==a?v(A("form"),y,C("("),V,C(")"),D,B,z):u(A("stat"),E,C(";"),B)}function E(a){return p.hasOwnProperty(a)?v(G):"function"==a?v(U):"keyword c"==a?v(F):"("==a?v(A(")"),F,C(")"),B,G):"operator"==a?v(E):"["==a?v(A("]"),K(E,"]"),B,G):"{"==a?v(A("}"),K(J,"}"),B,G):v()}function F(a){return a.match(/[;\}\)\],]/)?u():u(E)}function G(a,b){if("operator"==a&&/\+\+|--/.test(b))return v(G);if("operator"==a&&"?"==b)return v(E,C(":"),E);if(";"!=a)return"("==a?v(A(")"),K(E,")"),B,G):"."==a?v(I,G):"["==a?v(A("]"),E,C("]"),B,G):void 0}function H(a){return":"==a?v(B,D):u(G,C(";"),B)}function I(a){return"variable"==a?(t.marked="property",v()):void 0}function J(a){return"variable"==a&&(t.marked="property"),p.hasOwnProperty(a)?v(C(":"),E):void 0}function K(a,b){function c(d){return","==d?v(a,c):d==b?v():v(C(b))}return function(d){return d==b?v():u(a,c)}}function L(a){return"}"==a?v():u(D,L)}function M(a){return":"==a?v(N):u()}function N(a){return"variable"==a?(t.marked="variable-3",v()):u()}function O(a,b){return"variable"==a?(w(b),e?v(M,P):v(P)):u()}function P(a,b){return"="==b?v(E,P):","==a?v(O):void 0}function Q(a){return"var"==a?v(O,C(";"),S):";"==a?v(S):"variable"==a?v(R):v(S)}function R(a,b){return"in"==b?v(E):v(G,S)}function S(a,b){return";"==a?v(T):"in"==b?v(E):v(E,C(";"),T)}function T(a){")"!=a&&v(E)}function U(a,b){return"variable"==a?(w(b),v(U)):"("==a?v(A(")"),y,K(V,")"),B,D,z):void 0}function V(a,b){return"variable"==a?(w(b),e?v(M):v()):void 0}var j,k,c=a.indentUnit,d=b.json,e=b.typescript,f=function(){function a(a){return{type:a,style:"keyword"}}var b=a("keyword a"),c=a("keyword b"),d=a("keyword c"),f=a("operator"),g={type:"atom",style:"atom"},h={"if":b,"while":b,"with":b,"else":c,"do":c,"try":c,"finally":c,"return":d,"break":d,"continue":d,"new":d,"delete":d,"throw":d,"var":a("var"),"const":a("var"),let:a("var"),"function":a("function"),"catch":a("catch"),"for":a("for"),"switch":a("switch"),"case":a("case"),"default":a("default"),"in":f,"typeof":f,"instanceof":f,"true":g,"false":g,"null":g,undefined:g,NaN:g,Infinity:g};if(e){var i={type:"variable",style:"variable-3"},j={"interface":a("interface"),"class":a("class"),"extends":a("extends"),constructor:a("constructor"),"public":a("public"),"private":a("private"),"protected":a("protected"),"static":a("static"),"super":a("super"),string:i,number:i,bool:i,any:i};for(var k in j)h[k]=j[k]}return h}(),g=/[+\-*&%=<>!?|]/,p={atom:!0,number:!0,variable:!0,string:!0,regexp:!0},t={state:null,column:null,marked:null,cc:null},x={name:"this",next:{name:"arguments"}};return B.lex=!0,{startState:function(a){return{tokenize:m,lastType:null,cc:[],lexical:new q((a||0)-c,0,"block",!1),localVars:b.localVars,globalVars:b.globalVars,context:b.localVars&&{vars:b.localVars},indented:0}},token:function(a,b){if(a.sol()&&(b.lexical.hasOwnProperty("align")||(b.lexical.align=!1),b.indented=a.indentation()),a.eatSpace())return null;var c=b.tokenize(a,b);return"comment"==j?c:(b.lastType=j,s(b,c,j,k,a))},indent:function(a,b){if(a.tokenize==o)return CodeMirror.Pass;if(a.tokenize!=m)return 0;var d=b&&b.charAt(0),e=a.lexical;"stat"==e.type&&"}"==d&&(e=e.prev);var f=e.type,g=d==f;return"vardef"==f?e.indented+("operator"==a.lastType||","==a.lastType?4:0):"form"==f&&"{"==d?e.indented:"form"==f?e.indented+c:"stat"==f?e.indented+("operator"==a.lastType||","==a.lastType?c:0):"switch"!=e.info||g?e.align?e.column+(g?0:1):e.indented+(g?0:c):e.indented+(/^(?:case|default)\b/.test(b)?c:2*c)},electricChars:":{}",jsonMode:d}}),CodeMirror.defineMIME("text/javascript","javascript"),CodeMirror.defineMIME("application/json",{name:"javascript",json:!0}),CodeMirror.defineMIME("text/typescript",{name:"javascript",typescript:!0}),CodeMirror.defineMIME("application/typescript",{name:"javascript",typescript:!0}); \ No newline at end of file
diff --git a/contexts/data/lib/codemirror/codemirror.css b/contexts/data/lib/codemirror/codemirror.css
deleted file mode 100644
index 1ceb080..0000000
--- a/contexts/data/lib/codemirror/codemirror.css
+++ /dev/null
@@ -1,240 +0,0 @@
-/* BASICS */
-
-.CodeMirror {
- /* Set height, width, borders, and global font properties here */
- font-family: monospace;
- height: 300px;
-}
-.CodeMirror-scroll {
- /* Set scrolling behaviour here */
- overflow: auto;
-}
-
-/* PADDING */
-
-.CodeMirror-lines {
- padding: 4px 0; /* Vertical padding around content */
-}
-.CodeMirror pre {
- padding: 0 4px; /* Horizontal padding of content */
-}
-
-.CodeMirror-scrollbar-filler {
- background-color: white; /* The little square between H and V scrollbars */
-}
-
-/* GUTTER */
-
-.CodeMirror-gutters {
- border-right: 1px solid #ddd;
- background-color: #f7f7f7;
-}
-.CodeMirror-linenumbers {}
-.CodeMirror-linenumber {
- padding: 0 3px 0 5px;
- min-width: 20px;
- text-align: right;
- color: #999;
-}
-
-/* CURSOR */
-
-.CodeMirror div.CodeMirror-cursor {
- border-left: 1px solid black;
-}
-/* Shown when moving in bi-directional text */
-.CodeMirror div.CodeMirror-secondarycursor {
- border-left: 1px solid silver;
-}
-.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor {
- width: auto;
- border: 0;
- background: transparent;
- background: rgba(0, 200, 0, .4);
- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr=#6600c800, endColorstr=#4c00c800);
-}
-/* Kludge to turn off filter in ie9+, which also accepts rgba */
-.CodeMirror.cm-keymap-fat-cursor div.CodeMirror-cursor:not(#nonsense_id) {
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-/* Can style cursor different in overwrite (non-insert) mode */
-.CodeMirror div.CodeMirror-cursor.CodeMirror-overwrite {}
-
-/* DEFAULT THEME */
-
-.cm-s-default .cm-keyword {color: #708;}
-.cm-s-default .cm-atom {color: #219;}
-.cm-s-default .cm-number {color: #164;}
-.cm-s-default .cm-def {color: #00f;}
-.cm-s-default .cm-variable {color: black;}
-.cm-s-default .cm-variable-2 {color: #05a;}
-.cm-s-default .cm-variable-3 {color: #085;}
-.cm-s-default .cm-property {color: black;}
-.cm-s-default .cm-operator {color: black;}
-.cm-s-default .cm-comment {color: #a50;}
-.cm-s-default .cm-string {color: #a11;}
-.cm-s-default .cm-string-2 {color: #f50;}
-.cm-s-default .cm-meta {color: #555;}
-.cm-s-default .cm-error {color: #f00;}
-.cm-s-default .cm-qualifier {color: #555;}
-.cm-s-default .cm-builtin {color: #30a;}
-.cm-s-default .cm-bracket {color: #997;}
-.cm-s-default .cm-tag {color: #170;}
-.cm-s-default .cm-attribute {color: #00c;}
-.cm-s-default .cm-header {color: blue;}
-.cm-s-default .cm-quote {color: #090;}
-.cm-s-default .cm-hr {color: #999;}
-.cm-s-default .cm-link {color: #00c;}
-
-.cm-negative {color: #d44;}
-.cm-positive {color: #292;}
-.cm-header, .cm-strong {font-weight: bold;}
-.cm-em {font-style: italic;}
-.cm-emstrong {font-style: italic; font-weight: bold;}
-.cm-link {text-decoration: underline;}
-
-.cm-invalidchar {color: #f00;}
-
-div.CodeMirror span.CodeMirror-matchingbracket {color: #0f0;}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #f22;}
-
-/* STOP */
-
-/* The rest of this file contains styles related to the mechanics of
- the editor. You probably shouldn't touch them. */
-
-.CodeMirror {
- line-height: 1;
- position: relative;
- overflow: hidden;
-}
-
-.CodeMirror-scroll {
- /* 30px is the magic margin used to hide the element's real scrollbars */
- /* See overflow: hidden in .CodeMirror, and the paddings in .CodeMirror-sizer */
- margin-bottom: -30px; margin-right: -30px;
- padding-bottom: 30px; padding-right: 30px;
- height: 100%;
- outline: none; /* Prevent dragging from highlighting the element */
- position: relative;
-}
-.CodeMirror-sizer {
- position: relative;
-}
-
-/* The fake, visible scrollbars. Used to force redraw during scrolling
- before actuall scrolling happens, thus preventing shaking and
- flickering artifacts. */
-.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler {
- position: absolute;
- z-index: 6;
- display: none;
-}
-.CodeMirror-vscrollbar {
- right: 0; top: 0;
- overflow-x: hidden;
- overflow-y: scroll;
-}
-.CodeMirror-hscrollbar {
- bottom: 0; left: 0;
- overflow-y: hidden;
- overflow-x: scroll;
-}
-.CodeMirror-scrollbar-filler {
- right: 0; bottom: 0;
- z-index: 6;
-}
-
-.CodeMirror-gutters {
- position: absolute; left: 0; top: 0;
- height: 100%;
- z-index: 3;
-}
-.CodeMirror-gutter {
- height: 100%;
- display: inline-block;
- /* Hack to make IE7 behave */
- *zoom:1;
- *display:inline;
-}
-.CodeMirror-gutter-elt {
- position: absolute;
- cursor: default;
- z-index: 4;
-}
-
-.CodeMirror-lines {
- cursor: text;
-}
-.CodeMirror pre {
- /* Reset some styles that the rest of the page might have set */
- -moz-border-radius: 0; -webkit-border-radius: 0; -o-border-radius: 0; border-radius: 0;
- border-width: 0;
- background: transparent;
- font-family: inherit;
- font-size: inherit;
- margin: 0;
- white-space: pre;
- word-wrap: normal;
- line-height: inherit;
- color: inherit;
- z-index: 2;
- position: relative;
- overflow: visible;
-}
-.CodeMirror-wrap pre {
- word-wrap: break-word;
- white-space: pre-wrap;
- word-break: normal;
-}
-.CodeMirror-linebackground {
- position: absolute;
- left: 0; right: 0; top: 0; bottom: 0;
- z-index: 0;
-}
-
-.CodeMirror-linewidget {
- position: relative;
- z-index: 2;
- overflow: auto;
-}
-
-.CodeMirror-wrap .CodeMirror-scroll {
- overflow-x: hidden;
-}
-
-.CodeMirror-measure {
- position: absolute;
- width: 100%; height: 0px;
- overflow: hidden;
- visibility: hidden;
-}
-.CodeMirror-measure pre { position: static; }
-
-.CodeMirror div.CodeMirror-cursor {
- position: absolute;
- visibility: hidden;
- border-right: none;
- width: 0;
-}
-.CodeMirror-focused div.CodeMirror-cursor {
- visibility: visible;
-}
-
-.CodeMirror-selected { background: #d9d9d9; }
-.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; }
-
-.cm-searching {
- background: #ffa;
- background: rgba(255, 255, 0, .4);
-}
-
-/* IE7 hack to prevent it from returning funny offsetTops on the spans */
-.CodeMirror span { *vertical-align: text-bottom; }
-
-@media print {
- /* Hide the cursor when printing */
- .CodeMirror div.CodeMirror-cursor {
- visibility: hidden;
- }
-}
diff --git a/contexts/data/tests/specs/rules.js b/contexts/data/tests/specs/rules.js
index 3b4feb5..3811f6e 100644
--- a/contexts/data/tests/specs/rules.js
+++ b/contexts/data/tests/specs/rules.js
@@ -28,7 +28,7 @@ describe('fiveui.RuleSet', function() {
var rule1 = new fiveui.Rule(42, 'r1', 'desc1', 'rule txt1');
var rule2 = new fiveui.Rule(43, 'r2', 'desc2', 'rule txt2');
- var ruleSet = new fiveui.RuleSet(42, 'rule set', 'desc', [rule1, rule2], '');
+ var ruleSet = new fiveui.RuleSet(42, 'rule set', 'desc', '', [rule1, rule2]);
var jsonSet = jQuery.toJSON(ruleSet);
var restoredSet = fiveui.RuleSet.fromJSON(42, jQuery.secureEvalJSON(jsonSet));
@@ -36,8 +36,8 @@ describe('fiveui.RuleSet', function() {
expect(restoredSet.id).toBe(ruleSet.id);
expect(restoredSet.name).toBe(ruleSet.name);
expect(restoredSet.description).toBe(ruleSet.description);
+ expect(restoredSet.source).toEqual(ruleSet.source);
expect(restoredSet.rules).toEqual(ruleSet.rules);
- expect(restoredSet.original).toEqual(ruleSet.original);
expect(restoredSet.dependencies.length).toBe(0);