").append(
-// rowText.split("\t").map(cellText => $("").text(cellText))
-// ))
-// );
-}
-
-function toggleTableColumn(col) {
- // Toggle the visibility of a table column. It only hides the values in the cells,
- // not the column header.
- // @col = the column that was clicked
-
- // the HTML id of the table cell is #table_:, the hash maps
- // from column ID to column offset
- var colId = TABLE_COLUMNS_HEADERS[col];
- var button = $("#tableCol_" + col).text(); // The text (e.g. dot)
-
- console.log("toggleTableColumn() " + " " + col + " " + button);
- // $("#tableCol_" + col).empty(); // Empty the text
-
- $("#tableCol_" + col + " i").toggleClass("fa-angle-double-right", "fa-angle-double-left");
- $("#tableHead_" + col).toggle();
- $("[id^=table_][id$=" + colId + "]").toggle();
- TABLE_COLUMNS_VISIBILITY[colId] = !TABLE_COLUMNS_VISIBILITY[colId];
-
- if (button === "⚪") { // If the column is currently hidden, make it visible
- //$("#tableCol_" + col).append("⚫");
- //$("#tableHead_" + col).css("display","inline-block");
- //$("[id^=table_][id$=" + colId+"]").css("display","inline-block");
- //TABLE_COLUMNS_VISIBILITY[colId] = true;
- } else { // If the column is visible make it hidden
- //$("#tableCol_" + col).append("⚪");
- //$("#tableHead_" + col).css("display","none");
- //$("[id^=table_][id$=" + colId+"]").css("display","none");
- //TABLE_COLUMNS_VISIBILITY[colId] = false;
- }
-
- // TODO: Maybe use greying out of the headers in addition to/instead of
- // the filled/empty dots to indicate hidden or not
-}
-
-function toggleCodeWindow() {
- $("#codeVisibleButton").toggleClass("fa-chevron-down", "fa-chevron-up");
- //console.log("toggleCodeWindow()");
- $(".indataarea").toggle();
- $("#tabBox").toggle();
- $("#viewButton").toggle();
- if(!VERT_ALIGNMENT) {
- $("#cy").css("height", $(window).height()-$(".inarea").height()-80);
- }
-}
diff --git a/standalone/lib/converters.js b/standalone/lib/converters.js
deleted file mode 100644
index a27b8630..00000000
--- a/standalone/lib/converters.js
+++ /dev/null
@@ -1,151 +0,0 @@
-/**
- * Takes a plain text sentence, returns a sentence in CoNLL-U format.
- * @param {String} text Input text (sentence)
- * @return {String} Sentence in CoNLL-U format
- */
-function plainSent2Conllu(text) {
- // TODO: if there's punctuation in the middle of a sentence,
- // indices shift when drawing an arc
- // punctuation
- text = text.replace(/([^ ])([.?!;:,])/g, "$1 $2");
-
- var sent = new conllu.Sentence();
- var lines = ["# sent_id = _" + "\n# text = " + text]; // creating comment
- var tokens = text.split(" ");
- // enumerating tokens
- $.each(tokens, function(i, token) {tokens[i] = (i + 1) + "\t" + token});
-
- lines = lines.concat(tokens);
- sent.serial = lines.join("\n");
- // TODO: automatical recognition of punctuation's POS
- for(var i = 0; i < sent.tokens.length; i++) {
- if(sent.tokens[i]['form'].match(/^[!.)(»«:;?¡,"\-><]+$/)) {
-// if(sent.tokens[i]['form'].match(/\W/)) {
- sent.tokens[i]['upostag'] = 'PUNCT';
- }
- if(sent.tokens[i]['form'].match(/^[0-9]+([,.][0-9]+)*$/)) {
- sent.tokens[i]['upostag'] = 'NUM';
- }
- if(sent.tokens[i]['form'].match(/^[$%€£¥Æ§©]+$/)) {
- sent.tokens[i]['upostag'] = 'SYM';
- }
- }
-
- return sent.serial;
-}
-
-/**
- * Takes a string in CG, converts it to CoNLL-U format.
- * @param {String} text Input string(CG format)
- */
-function SD2Conllu(text) {
- var newContents = [];
- newContents.push(SD2conllu(text));
- CONTENTS = newContents.join("\n");
- console.log('!!!' + CONTENTS);
- FORMAT = "CoNLL-U";
- loadDataInIndex();
- showDataIndiv();
-}
-
-/**
- * Takes a plain text, converts it to CoNLL-U format.
- * @param {String} text Input text
- */
-function txtCorpus2Conllu(text) {
- var corpus;
- var newContents = [];
- var splitted = text.match(/[^ ].+?[.!?](?=( |$|\n))/g);
- $.each(splitted, function(i, sentence) {
- sentence = plainSent2Conllu(sentence.trim());
- newContents.push(sentence);
- })
- corpus = newContents.join("\n");
- AVAILABLESENTENCES = splitted.length;
- return corpus;
-}
-
-/**
- * Checks if the input box has > 1 sentence.
- * @param {String} text Input text
- */
-function conlluMultiInput(text) { // TOFIX: this might break after rewriting architecture. fix later.
- if(text.match(/\n\n(#.*\n)?1\t/)) {
- console.log('conlluMultiInput()');
-
- // if text consists of several sentences, process it as imported file
- if (text.match(/\n\n/)) { // match doublenewline
- CONTENTS = text;
- }
- if (CONTENTS.trim() != "") {
- var newContents = [];
- var splitted = CONTENTS.split("\n\n");
- //console.log('@! ' + splitted.length);
- for(var i = 0; i < splitted.length; i++) {
- newContents.push(splitted[i]);
- }
- CONTENTS = newContents.join("\n\n");
- //console.log('!!!' + CONTENTS);
- FORMAT = "CoNLL-U";
- loadDataInIndex();
- }
- }
-}
-
-
-/**
- * Takes a string in CoNLL-U, converts it to plain text.
- * @param {String} text Input string
- * @return {String} Plain text
- */
-function conllu2plainSent(text) {
- var sent = new conllu.Sentence();
- sent.serial = text;
- var tokens = sent.tokens.map(function(token) {
- return token.form;
- })
- var plain = tokens.join(" ");
- return plain;
-}
-
-/**
- * Cleans up CoNNL-U content.
- * @param {String} content Content of input area
- * @return {String} Cleaned up content
- */
-function cleanConllu(content) {
- // if we don't find any tabs, then convert >1 space to tabs
- // TODO: this should probably go somewhere else, and be more
- // robust, think about vietnamese D:
- var res = content.search("\n");
- if(res < 0) {
- return content;
- }
- // maybe someone is just trying to type conllu directly...
- var res = (content.match(/_/g)||[]).length;
- if(res <= 2) {
- return content;
- }
- var res = content.search("\t");
- var spaceToTab = false;
- // If we don't find any tabs, then we want to replace multiple spaces with tabs
- if(res < 0) {
- spaceToTab = true;
- }
- // remove blank lines
- var lines = content.trim().split("\n");
- var newContent = "";
- for(var i = 0; i < lines.length; i++) {
- var newLine = lines[i].trim();
-// if(newLine.length == 0) {
-// continue;
-// }
- // If there are no spaces and the line isn't a comment, then replace more than one space with a tab
- if(newLine[0] != "#" && spaceToTab) {
- newLine = newLine.replace(/ */g, "\t");
- }
- // strip the extra tabs/spaces at the end of the line
- newContent = newContent + newLine + "\n";
- }
- return newContent;
-}
diff --git a/standalone/lib/css/style.css b/standalone/lib/css/style.css
deleted file mode 100644
index d472377a..00000000
--- a/standalone/lib/css/style.css
+++ /dev/null
@@ -1,681 +0,0 @@
-/* -*- Mode: CSS; tab-width: 4; indent-tabs-mode: nil; -*- */
-/* vim:set ft=css ts=4 sw=4 sts=4 autoindent: */
-
-/* style for home page and manual. */
-
-/* @import url(http://fonts.googleapis.com/css?family=Open+Sans:400,600,700,400italic,600italic,700italic&subset=latin&effect=smoothing); */
-@import url(https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,600,700,400italic,600italic,700italic&subset=latin&effect=smoothing);
-
-/* override sentence number text style from brat style-vis.css */
-.sentnum text {
- display: none;
-}
-
-/* override sentence number separator line style from brat style-vis.css */
-.sentnum path {
- display: none;
-}
-
-img.bordered {
- border: 1px solid black;
-}
-
-#oldbrowser {
- color: red;
-}
-
-#partialsupport {
- font-weight: bold;
-}
-
-a img {
- border: 0;
-}
-a.fronta:visited {
- color: #2200cc;
-}
-.smallgray {
- font-size: 80%;
- color:gray;
-}
-.smallgray a {
- color:gray;
-}
-.smallgray a:visited {
- color:#aaaaaa;
-}
-
-span.tt {
- font-family: 'Bitstream Vera Sans Mono','Courier',monospace;
-}
-
-.hp-unselectable {
- -moz-user-select: -moz-none;
- -khtml-user-select: none;
- -webkit-user-select: none;
- -o-user-select: none;
- user-select: none;
- cursor: default;
-}
-
-/*#help {
- position: relative;
- left: 100px;
-}*/
-
-#cy {
- position: relative;
- width: 1500px;
- height: 400px;
- display: block;
-}
-
-#save {
- display: none;
-}
-
-.hidden-input {
- position: absolute;
- display: none;
- opacity: 0.99;
-}
-
-.hidden-input.activated {
- display: inline;
- border: 2px solid black;
- color: black;
-}
-
-.activated#mute {
- position: absolute;
- width: 1500px;
- height: 400px;
- display: block;
- background-color: rgba(0,0,0,0.25);;
- z-index: 800;
-}
-
-#notebox {
- width:50%;
- margin:auto;
- text-align:center;
- background-color: #ffcccc;
- padding: 10px;
- margin: 20px;
-}
-
-.redacted {
-/* background-color: #ffcccc; */
- background-color: #cccccc;
-}
-
-img {
- -moz-box-shadow: 5px 5px 5px #999999;
- -webkit-box-shadow: 5px 5px 5px #999999;
- box-shadow: 5px 5px 5px #999999;
- margin-bottom: 0.5em;
-}
-
-img.right {
- border: 1px solid black;
- margin:auto;
- float:right;
- margin-left: 5em;
- margin-bottom: 3em;
- margin-top: 1em;
-}
-
-img.tinymargin {
- margin: 0.3em;
-}
-
-img.icon {
- vertical-align:bottom;
- -moz-box-shadow: 0px 0px 0px #ffffff;
- -webkit-box-shadow: 0px 0px 0px #ffffff;
- box-shadow: 0px 0px 0px #ffffff;
- margin-bottom: 0;
-}
-
-body {
-/* font-family: 'Open Sans', arial, sans-serif; */
-/* font-family: 'Open Sans', Arial, freesans, sans-serif; */
- font-family: 'Source Sans Pro', Arial, freesans, sans-serif;
- font-size: 14px;
- overflow-y: scroll;
-}
-
-h2 {
- margin-top: 2em;
-}
-
-h2.nomargin {
- margin-top: 0em;
-}
-
-h3 {
- margin-top: 1.5em;
-}
-
-.infolabel {
- font-weight: bold;
- display: inline-block;
- width: 10em;
-}
-
-.h1subtitle {
- font-size: 15px;
- color: gray;
-}
-
-div.center {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-#hp-header {
- padding-top: 5px;
- margin-bottom: 5px;
- padding-left: 2em;
-}
-#menulogo {
- padding-top: 0.5em;
- padding-right: 1em;
- float: right;
-}
-#hp-header span a {
- text-decoration: none; /* no underline in menu */
-}
-#hp-header > span, #hp-header > a {
- margin-right: 20px;
-}
-
-.bigbutton {
- font-size: 20px !important;
- padding: 10px 15px !important;
-}
-
-#hp-header > .hp-logo {
- font-size: 1.2em;
- margin-top: -10px;
- margin-bottom: -10px;
- text-shadow: #000 0 0 3px;
-}
-
-#main {
- max-width:1000px;
- min-width: 600px;
- padding-left: 2em;
- padding-right: 2em;
-}
-#content {
- margin: 15px;
-}
-
-#manual-main {
- max-width:960px;
- padding-left: 2em;
- padding-right: 2em;
- padding-bottom: 5em;
-}
-
-#footer {
- font-size: 9px;
- color: #999;
- border-top: 1px solid lightgray;
- margin-top: 10em;
- margin-bottom: 5em;
- clear: both;
-}
-
-.footer-text {
- float: right;
-}
-
-.footer-logo {
- float: right;
-}
-
-.footer-logo img {
- margin: 0;
- -moz-box-shadow: 0px 0px 0px #fff;
- -webkit-box-shadow: 0px 0px 0px #fff;
- box-shadow: 0px 0px 0px #fff;
-}
-
-#titleblock {
- height: 100px;
-}
-
-#downloadblock {
- float: right;
- width: 300px;
- margin: 1em;
-}
-
-.image {
- margin-left: 2em;
-}
-
-.image .caption {
- font-size: 85%;
- font-family: sans-serif;
- text-align: center;
-}
-
-#browsersupport {
- display: block;
- margin-left: auto;
- margin-right: auto;
-}
-
-.annotation_wrapper {
- margin-left: 2em;
- border: 1px solid;
- border-color: rgb(136, 136, 136);
- background-color: rgb(207, 226, 243);
-}
-
-.annotation_wrapper td {
- padding: 1em;
-}
-
-.annotation_table {
- border: none;
-}
-
-.annotation_table th {
- padding: 0em;
- font-family: monospace;
- font-size: 13px;
-}
-
-.annotation_table td {
- padding: 0;
- font-family: monospace;
- font-size: 13px;
-}
-
-td.complete {
- background-color: lightgreen;
-}
-
-td.partial {
- background-color: #F0F0B0;
-}
-
-td.none {
- /* background-color: #FF9090;*/
- background-color: white;
-}
-
-.rounded {
- -webkit-border-radius: 10px;
- -moz-border-radius: 10px;
- border-radius: 10px;
-}
-
-/* "starburst" CSS adapted from
- http://matthewjamestaylor.com/blog/css3-starbursts */
-.starburst {
- z-index:1000;
- position: relative;
- top: 0px;
- left: 600px;
- margin-left:-2.5em;
- margin-top: -0.5em;
- background: none;
- text-align: center;
- text-decoration: none;
- -webkit-transform:rotate(-90deg);
- -moz-transform:rotate(-90deg);
- rotation: -90deg;
-}
-.starburst span {
- display: block;
- -webkit-transform:rotate(22.5deg);
- -moz-transform:rotate(22.5deg);
- rotation: 22.5deg;
-}
-.starburst,
-.starburst span {
- width: 5em;
- height: 5em;
- display: block;
- /* border-radius: 3em; */
- font-size: 13px;
- -webkit-transition: 0.3s ease;
- -moz-transition: 0.3s ease;
- transition: 0.3s ease;
-}
-.starburst span.star,
-.starburst span.sshadow {
- position: absolute;
-}
-.starburst span.star {
- color: white;
- font-weight: bold;
- background: #6da6d1;
-}
-.starburst span.sshadow {
- -moz-box-shadow: 0px 0px 0px 2px #fff;
- -webkit-box-shadow: 0px 0px 0px 2px #fff;
- box-shadow: 0px 0px 0px 2px #fff;
-}
-.starburst:hover {
- -webkit-transform:rotate(-112.5deg);
- -moz-transform:rotate(-112.5deg);
- rotation: -112.5deg;
-}
-.starburst:hover span {
- border-radius: 0px;
-}
-.starburst:hover span.star {
- text-shadow: 0 0 6px #fff, 0 0 2px #fff;
-}
-.starburst:hover span.sshadow {
- -moz-box-shadow: 0px 0px 10px 10px #fff;
- -webkit-box-shadow: 0px 0px 10px 10px #fff;
- box-shadow: 0px 0px 10px 10px #fff;
-}
-.center-wrapper {
- width: 5em;
- height: 5em;
- display: table;
-}
-.center-wrapper p {
- display: table-cell;
- vertical-align: middle;
- text-align: center;
-}
-
-div.example {
- border: 1px solid gray;
- margin:1em;
- padding:2em 2em 0.5em 2em;
-}
-
-#indextable {
- margin-left: 3em;
- margin-top: 2em;
- /* border: 1px solid lightgray; */
- font-size: 120%;
-}
-
-#indextable td, #indextable th {
- padding: 5px;
-}
-
-#indextable td.right {
- text-align: right;
-}
-
-#indextable th {
- border-bottom: 1px solid lightgray;
-}
-
-table.typeindex {
- vertical-align: top;
- border-collapse:collapse;
- border: 1px solid lightgray;
-}
-
-table.typeindex td {
- vertical-align:top;
- border-left: 1px solid lightgray;
- border-right: 1px solid lightgray;
-}
-
-table.typeindex thead th {
- padding: 0.5em;
- border-left: 1px solid lightgray;
- border-right: 1px solid lightgray;
-}
-
-table.typeindex tbody td {
- padding-left: 0.5em;
- padding-right: 0.5em;
-}
-
-table.category {
- margin: 1em;
- width: 100%;
-}
-
-table.category td {
- border: none;
-}
-
-.jquery-ui-tabs > div {
- font-size: 120%;
-}
-
-table.statustable {
- float: right;
- margin-left: 3em;
- border: 1px solid lightgray;
- font-size: 90%;
- color: #444;
-}
-
-em strong, b {
- font-weight: 700;
- color: darkred;
-}
-
-h1, h2, h3, strong {
- font-weight: 600; /* standard, not extra bold */
-}
-
-h4, h5, h6 {
- font-weight: normal;
- text-decoration: underline;
-}
-
-
-/* Begin JNW additions for tabs */
-#filemanagement {
- float: right ;
-}
-
-.viewoptions {
- /* height: 4em ; */
- padding-top: 1ex;
- padding-left: 1ex;
- margin-bottom: -1px;
- float: right ;
-}
-
-.corpusNavigation {
- margin-bottom: .5em;
-}
-
-.tabContainer {
- display: flex;
-}
-
-.tabContainer div {
-}
-
-.inarea {
- clear: both ;
- background-color: #eee ;
- width: 100% ;
- vertical-align: bottom ;
-}
-
-/**
-.inarea button.selected {
- background: #fff ;
-}
-
-.inarea button {
- border: 1px solid silver ;
- border-radius: 3px 3px 0 0 ;
- border-bottom: none ;
- margin-right: 1ex ;
- padding: 0.5ex ;
- display: inline-block ;
-}
-
-.inarea button:hover {
- cursor: pointer ;
- color: #aaa ;
- display: inline-block ;
-}
-**/
-
-.inarea .row {
- margin-left: 0 !important;
- margin-right: 0 !important;
- padding: 1ex 1ex 0 1ex;
-
-}
-
-#indata {
- display: block ;
- font-family: "Liberation Mono", monospace ;
-
-}
-
-.indataarea {
- padding: 2ex ;
- padding-top: 1ex ;
- background-color: #fff ;
- border: 1px solid #ddd ;
- clear: both ;
- display: block ;
-}
-
-.cy {
- clear: both ;
-}
-
-.controls {
- clear: both ;
-}
-
-.graph {
- clear: both ;
-}
-
-#currentsen {
- text-align: right;
-}
-
-/** fix button height **/
-.input-group > .input-group-btn > .btn, .input-group-btn:last-child > .dropdown-toggle {
- height: 38px;
-}
-
-.nav-tabs {
- margin-bottom: -1px;
- margin-top: auto;
-}
-
-.tabContainer {
- z-index: +1;
-}
-
-.ui-selfcomplete {
- background-color: white;
- width: 150px;
- list-style-type: none;
- padding-left: 3px;
- padding-right: 3px;
-}
-
-.ui-menu-item a:hover {
- cursor: pointer ;
-}
-
-/* for the future */
-.ui-menu-item:has(> .ui-state-hover) {
- background-color: #ddd ;
-}
-/* for now */
-.ui-menu-item .ui-state-hover {
- background-color: #ddd ;
-}
-.ui-menu-item:hover {
- background-color: #ddd ;
-}
-
-
-
-/* End JNW additions for tabs */
-
-.treebankLabel {
- margin: 3px;
- padding-top: 2px;
- padding-right: 4px;
- padding-bottom: 2px;
- padding-left: 4px;
-font-weight: 600;
-border-top-left-radius: 2px;
-border-top-right-radius: 2px;
-border-bottom-right-radius: 2px;
-border-bottom-left-radius: 2px;
-background-color: #bf8cf2;
-box-shadow: inset 0 -1px 0 rgba(27,31,35,0.12);
-}
-
-textarea {
- border-color: #ddd;
-}
-
-.selfcomplete-suggestions {
-border: 1px solid #999;
-background: #FFF;
-cursor: default;
-overflow: auto;
-}
-.selfcomplete-suggestion {
-padding: 2px 5px;
-white-space: nowrap;
-overflow: hidden;
-}
-.selfcomplete-selected {
-background: #F0F0F0;
-}
-.selfcomplete-suggestions strong {
-font-weight: normal;
-color: #3399FF;
-}
-
-.tableColHeader {
- position: absolute ;
- right: 1px;
- bottom: 1ex;
- padding-left: 0.5ex;
-}
-
-.thead-default th {
- position: relative ;
- cursor: pointer ;
- border-right: 1px solid white ;
- border-left: 1px solid white ;
- border-spacing: 1px;
-}
-
-.thead-default th:first-child {
- border-left: 1px solid #e9ecef !important ;
-}
-.thead-default th:last-child {
- border-right: 1px solid #e9ecef !important ;
-}
-
-#progressContainer {
- position: fixed;
- left: 0px;
- bottom: 0px;
- height: 4px;
- width: 100%;
-}
-
-#progressBar {
- width: 0%;
- border-radius: 5px;
- height: 100%;
- background-color: #157EFB;
-}
diff --git a/standalone/lib/cy-style.js b/standalone/lib/cy-style.js
deleted file mode 100644
index a8ad18bd..00000000
--- a/standalone/lib/cy-style.js
+++ /dev/null
@@ -1,172 +0,0 @@
-
-// is defined in a js file, because fetch doesn't work offline in chrome
-var CY_STYLE = [{
- "selector": "node",
- "style": {
- "height": 20,
- "background-color": NORMAL,
- "shape": "roundrectangle",
- "text-valign": "center",
- "text-halign": "center",
- "border-color": "#000",
- "border-width": 1
- }
-}, {
- "selector": "node.wf",
- "style": {
- "width": "data(length)",
- "label": "data(label)"
- }
-}, {
- "selector": "node.MultiwordToken",
- "style": {
- "background-color": ST_COLOR,
- "text-background-color": NORMAL,
- "text-background-opacity": 0.9,
- "text-border-color": "#000",
- "text-border-opacity": 0.9,
- "text-border-width": "1px",
- "text-background-shape": "roundrectangle",
- "text-valign": "top",
- "label": "data(label)"
- }
-}, {
- "selector": ".supAct",
- "style": {
- "background-color": ACTIVE
- }
-}, {
- "selector": "node.wf.arc-selected",
- "style": {
- "border-color": FANCY
- }
-}, {
- "selector": "node.wf.root",
- "style": {
- "font-weight": "bold",
- //"text-border-width": "2em",
- "border-width": "2px"
- }
-}, {
- "selector": "node.wf.activated",
- "style": {
- "background-color": ACTIVE
- }
-}, {
- "selector": "node.wf.activated.retokenize",
- "style": {
- "background-color": POS_COLOR,
- "border-color": FANCY
- }
-}, {
- "selector": "node.wf.merge",
- "style": {
- "background-color": POS_COLOR,
- "border-color": FANCY
- }
-}, {
- "selector": "node.wf.supertoken",
- "style": {
- "background-color": POS_COLOR,
- "border-color": FANCY
- }
-}, {
- "selector": "node.pos",
- "style": {
- "width": "data(length)",
- "label": "data(label)",
- "background-color": POS_COLOR
- }
-}, {
- "selector": "edge",
- "style": {
- "width": 3,
- "opacity": 0.766,
- "line-color": "#111",
- "control-point-weights": "0.2 0.25 0.75 0.8",
- }
-}, {
- "selector": "edge.incomplete",
- "style": {
- "target-arrow-shape": "triangle",
- "target-arrow-color": "#aaa",
- "line-color": "#aaa",
- "text-margin-y": -10,
- "curve-style": "unbundled-bezier",
- "control-point-distances": "data(ctrl)",
- "control-point-weights": "0 0.25 0.75 1",
- 'arrow-scale': '1.5',
- "edge-distances": "node-position",
- "label": "data(label)",
- "text-events": "yes"
- }
-}, {
- "selector": "edge.error",
- "style": {
- "target-arrow-shape": "triangle",
- "target-arrow-color": "#d11",
- "line-color": "#d11",
- "text-margin-y": -10,
- "curve-style": "unbundled-bezier",
- "control-point-distances": "data(ctrl)",
- "control-point-weights": "0 0.25 0.75 1",
- 'arrow-scale': '1.5',
- "edge-distances": "node-position",
- "label": "data(label)",
- "text-events": "yes"
- }
-}, {
- "selector": "edge.enhanced",
- "style": {
- "target-arrow-shape": "triangle",
- "target-arrow-color": "#045",
- "line-color": "#045",
- "text-margin-y": -10,
- "curve-style": "unbundled-bezier",
- "control-point-distances": "data(ctrl)",
- "control-point-weights": "0 0.25 0.75 1",
- "edge-distances": "node-position",
- 'arrow-scale': '1.5',
- "label": "data(label)",
- "text-events": "yes"
- }
-}, {
- "selector": "edge.dependency",
- "style": {
- "target-arrow-shape": "triangle",
- "target-arrow-color": "#111",
- "text-margin-y": -10,
- "curve-style": "unbundled-bezier",
- "control-point-distances": "data(ctrl)",
- "control-point-weights": "0 0.25 0.75 1",
- "edge-distances": "node-position",
- "label": "data(label)",
- "text-events": "yes"
- }
-}, {
- "selector": "edge.dependency.selected",
- "style": {
- "line-color": FANCY,
- "target-arrow-color": FANCY
- }
-}, {"selector": "edge.pos",
- "style": {
- "curve-style": "haystack"
- }
-}, {
- "selector": "node.tokenNumber",
- "style": {
- "background-opacity": 0,
- "border-opacity": 0,
- "padding": 0,
- "text-background-color": POS_COLOR,
- "text-background-opacity": 0.9,
- "text-border-color": "#000",
- "text-border-opacity": 0.9,
- "text-border-width": "1px",
- "text-background-shape": "roundrectangle",
- "text-halign": "right",
- "label": "data(label)",
- "events": "no"
- }
-}];
diff --git a/standalone/lib/ext/bootstrap.min.css b/standalone/lib/ext/bootstrap.min.css
deleted file mode 100644
index 622b5a94..00000000
--- a/standalone/lib/ext/bootstrap.min.css
+++ /dev/null
@@ -1,7 +0,0 @@
-/*!
- * Bootstrap v4.0.0-beta (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors
- * Copyright 2011-2017 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */@media print{*,::after,::before{text-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}abbr[title]::after{content:" (" attr(title) ")"}pre{white-space:pre-wrap!important}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.badge{border:1px solid #000}.table{border-collapse:collapse!important}.table td,.table th{background-color:#fff!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}html{box-sizing:border-box;font-family:sans-serif;line-height:1.15;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-ms-overflow-style:scrollbar;-webkit-tap-highlight-color:transparent}*,::after,::before{box-sizing:inherit}@-ms-viewport{width:device-width}article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}body{margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff}[tabindex="-1"]:focus{outline:0!important}hr{box-sizing:content-box;height:0;overflow:visible}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem}p{margin-top:0;margin-bottom:1rem}abbr[data-original-title],abbr[title]{text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;border-bottom:0}address{margin-bottom:1rem;font-style:normal;line-height:inherit}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}dfn{font-style:italic}b,strong{font-weight:bolder}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#007bff;text-decoration:none;background-color:transparent;-webkit-text-decoration-skip:objects}a:hover{color:#0056b3;text-decoration:underline}a:not([href]):not([tabindex]){color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus,a:not([href]):not([tabindex]):hover{color:inherit;text-decoration:none}a:not([href]):not([tabindex]):focus{outline:0}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}pre{margin-top:0;margin-bottom:1rem;overflow:auto}figure{margin:0 0 1rem}img{vertical-align:middle;border-style:none}svg:not(:root){overflow:hidden}[role=button],a,area,button,input,label,select,summary,textarea{-ms-touch-action:manipulation;touch-action:manipulation}table{border-collapse:collapse}caption{padding-top:.75rem;padding-bottom:.75rem;color:#868e96;text-align:left;caption-side:bottom}th{text-align:left}label{display:inline-block;margin-bottom:.5rem}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{padding:0;border-style:none}input[type=checkbox],input[type=radio]{box-sizing:border-box;padding:0}input[type=date],input[type=datetime-local],input[type=month],input[type=time]{-webkit-appearance:listbox}textarea{overflow:auto;resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;max-width:100%;padding:0;margin-bottom:.5rem;font-size:1.5rem;line-height:inherit;color:inherit;white-space:normal}progress{vertical-align:baseline}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:none}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}summary{display:list-item}template{display:none}[hidden]{display:none!important}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{margin-bottom:.5rem;font-family:inherit;font-weight:500;line-height:1.1;color:inherit}.h1,h1{font-size:2.5rem}.h2,h2{font-size:2rem}.h3,h3{font-size:1.75rem}.h4,h4{font-size:1.5rem}.h5,h5{font-size:1.25rem}.h6,h6{font-size:1rem}.lead{font-size:1.25rem;font-weight:300}.display-1{font-size:6rem;font-weight:300;line-height:1.1}.display-2{font-size:5.5rem;font-weight:300;line-height:1.1}.display-3{font-size:4.5rem;font-weight:300;line-height:1.1}.display-4{font-size:3.5rem;font-weight:300;line-height:1.1}hr{margin-top:1rem;margin-bottom:1rem;border:0;border-top:1px solid rgba(0,0,0,.1)}.small,small{font-size:80%;font-weight:400}.mark,mark{padding:.2em;background-color:#fcf8e3}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline-item{display:inline-block}.list-inline-item:not(:last-child){margin-right:5px}.initialism{font-size:90%;text-transform:uppercase}.blockquote{margin-bottom:1rem;font-size:1.25rem}.blockquote-footer{display:block;font-size:80%;color:#868e96}.blockquote-footer::before{content:"\2014 \00A0"}.img-fluid{max-width:100%;height:auto}.img-thumbnail{padding:.25rem;background-color:#fff;border:1px solid #ddd;border-radius:.25rem;transition:all .2s ease-in-out;max-width:100%;height:auto}.figure{display:inline-block}.figure-img{margin-bottom:.5rem;line-height:1}.figure-caption{font-size:90%;color:#868e96}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}code{padding:.2rem .4rem;font-size:90%;color:#bd4147;background-color:#f8f9fa;border-radius:.25rem}a>code{padding:0;color:inherit;background-color:inherit}kbd{padding:.2rem .4rem;font-size:90%;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:100%;font-weight:700}pre{display:block;margin-top:0;margin-bottom:1rem;font-size:90%;color:#212529}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}@media (min-width:576px){.container{max-width:540px}}@media (min-width:768px){.container{max-width:720px}}@media (min-width:992px){.container{max-width:960px}}@media (min-width:1200px){.container{max-width:1140px}}.container-fluid{width:100%;margin-right:auto;margin-left:auto;padding-right:15px;padding-left:15px;width:100%}.row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-15px;margin-left:-15px}.no-gutters{margin-right:0;margin-left:0}.no-gutters>.col,.no-gutters>[class*=col-]{padding-right:0;padding-left:0}.col,.col-1,.col-10,.col-11,.col-12,.col-2,.col-3,.col-4,.col-5,.col-6,.col-7,.col-8,.col-9,.col-auto,.col-lg,.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-auto,.col-md,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-auto,.col-sm,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-auto,.col-xl,.col-xl-1,.col-xl-10,.col-xl-11,.col-xl-12,.col-xl-2,.col-xl-3,.col-xl-4,.col-xl-5,.col-xl-6,.col-xl-7,.col-xl-8,.col-xl-9,.col-xl-auto{position:relative;width:100%;min-height:1px;padding-right:15px;padding-left:15px}.col{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-1{-ms-flex-order:1;order:1}.order-2{-ms-flex-order:2;order:2}.order-3{-ms-flex-order:3;order:3}.order-4{-ms-flex-order:4;order:4}.order-5{-ms-flex-order:5;order:5}.order-6{-ms-flex-order:6;order:6}.order-7{-ms-flex-order:7;order:7}.order-8{-ms-flex-order:8;order:8}.order-9{-ms-flex-order:9;order:9}.order-10{-ms-flex-order:10;order:10}.order-11{-ms-flex-order:11;order:11}.order-12{-ms-flex-order:12;order:12}@media (min-width:576px){.col-sm{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-sm-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-sm-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-sm-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-sm-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-sm-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-sm-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-sm-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-sm-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-sm-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-sm-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-sm-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-sm-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-sm-1{-ms-flex-order:1;order:1}.order-sm-2{-ms-flex-order:2;order:2}.order-sm-3{-ms-flex-order:3;order:3}.order-sm-4{-ms-flex-order:4;order:4}.order-sm-5{-ms-flex-order:5;order:5}.order-sm-6{-ms-flex-order:6;order:6}.order-sm-7{-ms-flex-order:7;order:7}.order-sm-8{-ms-flex-order:8;order:8}.order-sm-9{-ms-flex-order:9;order:9}.order-sm-10{-ms-flex-order:10;order:10}.order-sm-11{-ms-flex-order:11;order:11}.order-sm-12{-ms-flex-order:12;order:12}}@media (min-width:768px){.col-md{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-md-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-md-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-md-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-md-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-md-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-md-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-md-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-md-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-md-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-md-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-md-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-md-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-md-1{-ms-flex-order:1;order:1}.order-md-2{-ms-flex-order:2;order:2}.order-md-3{-ms-flex-order:3;order:3}.order-md-4{-ms-flex-order:4;order:4}.order-md-5{-ms-flex-order:5;order:5}.order-md-6{-ms-flex-order:6;order:6}.order-md-7{-ms-flex-order:7;order:7}.order-md-8{-ms-flex-order:8;order:8}.order-md-9{-ms-flex-order:9;order:9}.order-md-10{-ms-flex-order:10;order:10}.order-md-11{-ms-flex-order:11;order:11}.order-md-12{-ms-flex-order:12;order:12}}@media (min-width:992px){.col-lg{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-lg-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-lg-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-lg-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-lg-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-lg-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-lg-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-lg-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-lg-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-lg-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-lg-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-lg-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-lg-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-lg-1{-ms-flex-order:1;order:1}.order-lg-2{-ms-flex-order:2;order:2}.order-lg-3{-ms-flex-order:3;order:3}.order-lg-4{-ms-flex-order:4;order:4}.order-lg-5{-ms-flex-order:5;order:5}.order-lg-6{-ms-flex-order:6;order:6}.order-lg-7{-ms-flex-order:7;order:7}.order-lg-8{-ms-flex-order:8;order:8}.order-lg-9{-ms-flex-order:9;order:9}.order-lg-10{-ms-flex-order:10;order:10}.order-lg-11{-ms-flex-order:11;order:11}.order-lg-12{-ms-flex-order:12;order:12}}@media (min-width:1200px){.col-xl{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;max-width:100%}.col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto;max-width:none}.col-xl-1{-ms-flex:0 0 8.333333%;flex:0 0 8.333333%;max-width:8.333333%}.col-xl-2{-ms-flex:0 0 16.666667%;flex:0 0 16.666667%;max-width:16.666667%}.col-xl-3{-ms-flex:0 0 25%;flex:0 0 25%;max-width:25%}.col-xl-4{-ms-flex:0 0 33.333333%;flex:0 0 33.333333%;max-width:33.333333%}.col-xl-5{-ms-flex:0 0 41.666667%;flex:0 0 41.666667%;max-width:41.666667%}.col-xl-6{-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.col-xl-7{-ms-flex:0 0 58.333333%;flex:0 0 58.333333%;max-width:58.333333%}.col-xl-8{-ms-flex:0 0 66.666667%;flex:0 0 66.666667%;max-width:66.666667%}.col-xl-9{-ms-flex:0 0 75%;flex:0 0 75%;max-width:75%}.col-xl-10{-ms-flex:0 0 83.333333%;flex:0 0 83.333333%;max-width:83.333333%}.col-xl-11{-ms-flex:0 0 91.666667%;flex:0 0 91.666667%;max-width:91.666667%}.col-xl-12{-ms-flex:0 0 100%;flex:0 0 100%;max-width:100%}.order-xl-1{-ms-flex-order:1;order:1}.order-xl-2{-ms-flex-order:2;order:2}.order-xl-3{-ms-flex-order:3;order:3}.order-xl-4{-ms-flex-order:4;order:4}.order-xl-5{-ms-flex-order:5;order:5}.order-xl-6{-ms-flex-order:6;order:6}.order-xl-7{-ms-flex-order:7;order:7}.order-xl-8{-ms-flex-order:8;order:8}.order-xl-9{-ms-flex-order:9;order:9}.order-xl-10{-ms-flex-order:10;order:10}.order-xl-11{-ms-flex-order:11;order:11}.order-xl-12{-ms-flex-order:12;order:12}}.table{width:100%;max-width:100%;margin-bottom:1rem;background-color:transparent}.table td,.table th{padding:.75rem;vertical-align:top;border-top:1px solid #e9ecef}.table thead th{vertical-align:bottom;border-bottom:2px solid #e9ecef}.table tbody+tbody{border-top:2px solid #e9ecef}.table .table{background-color:#fff}.table-sm td,.table-sm th{padding:.3rem}.table-bordered{border:1px solid #e9ecef}.table-bordered td,.table-bordered th{border:1px solid #e9ecef}.table-bordered thead td,.table-bordered thead th{border-bottom-width:2px}.table-striped tbody tr:nth-of-type(odd){background-color:rgba(0,0,0,.05)}.table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.table-primary,.table-primary>td,.table-primary>th{background-color:#b8daff}.table-hover .table-primary:hover{background-color:#9fcdff}.table-hover .table-primary:hover>td,.table-hover .table-primary:hover>th{background-color:#9fcdff}.table-secondary,.table-secondary>td,.table-secondary>th{background-color:#dddfe2}.table-hover .table-secondary:hover{background-color:#cfd2d6}.table-hover .table-secondary:hover>td,.table-hover .table-secondary:hover>th{background-color:#cfd2d6}.table-success,.table-success>td,.table-success>th{background-color:#c3e6cb}.table-hover .table-success:hover{background-color:#b1dfbb}.table-hover .table-success:hover>td,.table-hover .table-success:hover>th{background-color:#b1dfbb}.table-info,.table-info>td,.table-info>th{background-color:#bee5eb}.table-hover .table-info:hover{background-color:#abdde5}.table-hover .table-info:hover>td,.table-hover .table-info:hover>th{background-color:#abdde5}.table-warning,.table-warning>td,.table-warning>th{background-color:#ffeeba}.table-hover .table-warning:hover{background-color:#ffe8a1}.table-hover .table-warning:hover>td,.table-hover .table-warning:hover>th{background-color:#ffe8a1}.table-danger,.table-danger>td,.table-danger>th{background-color:#f5c6cb}.table-hover .table-danger:hover{background-color:#f1b0b7}.table-hover .table-danger:hover>td,.table-hover .table-danger:hover>th{background-color:#f1b0b7}.table-light,.table-light>td,.table-light>th{background-color:#fdfdfe}.table-hover .table-light:hover{background-color:#ececf6}.table-hover .table-light:hover>td,.table-hover .table-light:hover>th{background-color:#ececf6}.table-dark,.table-dark>td,.table-dark>th{background-color:#c6c8ca}.table-hover .table-dark:hover{background-color:#b9bbbe}.table-hover .table-dark:hover>td,.table-hover .table-dark:hover>th{background-color:#b9bbbe}.table-active,.table-active>td,.table-active>th{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover{background-color:rgba(0,0,0,.075)}.table-hover .table-active:hover>td,.table-hover .table-active:hover>th{background-color:rgba(0,0,0,.075)}.thead-inverse th{color:#fff;background-color:#212529}.thead-default th{color:#495057;background-color:#e9ecef}.table-inverse{color:#fff;background-color:#212529}.table-inverse td,.table-inverse th,.table-inverse thead th{border-color:#32383e}.table-inverse.table-bordered{border:0}.table-inverse.table-striped tbody tr:nth-of-type(odd){background-color:rgba(255,255,255,.05)}.table-inverse.table-hover tbody tr:hover{background-color:rgba(255,255,255,.075)}@media (max-width:991px){.table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.table-responsive.table-bordered{border:0}}.form-control{display:block;width:100%;padding:.5rem .75rem;font-size:1rem;line-height:1.25;color:#495057;background-color:#fff;background-image:none;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control::-ms-expand{background-color:transparent;border:0}.form-control:focus{color:#495057;background-color:#fff;border-color:#80bdff;outline:0}.form-control::-webkit-input-placeholder{color:#868e96;opacity:1}.form-control:-ms-input-placeholder{color:#868e96;opacity:1}.form-control::placeholder{color:#868e96;opacity:1}.form-control:disabled,.form-control[readonly]{background-color:#e9ecef;opacity:1}select.form-control:not([size]):not([multiple]){height:calc(2.25rem + 2px)}select.form-control:focus::-ms-value{color:#495057;background-color:#fff}.form-control-file,.form-control-range{display:block}.col-form-label{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);margin-bottom:0}.col-form-label-lg{padding-top:calc(.5rem - 1px * 2);padding-bottom:calc(.5rem - 1px * 2);font-size:1.25rem}.col-form-label-sm{padding-top:calc(.25rem - 1px * 2);padding-bottom:calc(.25rem - 1px * 2);font-size:.875rem}.col-form-legend{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;font-size:1rem}.form-control-plaintext{padding-top:.5rem;padding-bottom:.5rem;margin-bottom:0;line-height:1.25;border:solid transparent;border-width:1px 0}.form-control-plaintext.form-control-lg,.form-control-plaintext.form-control-sm,.input-group-lg>.form-control-plaintext.form-control,.input-group-lg>.form-control-plaintext.input-group-addon,.input-group-lg>.input-group-btn>.form-control-plaintext.btn,.input-group-sm>.form-control-plaintext.form-control,.input-group-sm>.form-control-plaintext.input-group-addon,.input-group-sm>.input-group-btn>.form-control-plaintext.btn{padding-right:0;padding-left:0}.form-control-sm,.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.input-group-sm>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-sm>select.form-control:not([size]):not([multiple]),.input-group-sm>select.input-group-addon:not([size]):not([multiple]),select.form-control-sm:not([size]):not([multiple]){height:calc(1.8125rem + 2px)}.form-control-lg,.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.input-group-lg>.input-group-btn>select.btn:not([size]):not([multiple]),.input-group-lg>select.form-control:not([size]):not([multiple]),.input-group-lg>select.input-group-addon:not([size]):not([multiple]),select.form-control-lg:not([size]):not([multiple]){height:calc(2.3125rem + 2px)}.form-group{margin-bottom:1rem}.form-text{display:block;margin-top:.25rem}.form-row{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-right:-5px;margin-left:-5px}.form-row>.col,.form-row>[class*=col-]{padding-right:5px;padding-left:5px}.form-check{position:relative;display:block;margin-bottom:.5rem}.form-check.disabled .form-check-label{color:#868e96}.form-check-label{padding-left:1.25rem;margin-bottom:0}.form-check-input{position:absolute;margin-top:.25rem;margin-left:-1.25rem}.form-check-input:only-child{position:static}.form-check-inline{display:inline-block}.form-check-inline .form-check-label{vertical-align:middle}.form-check-inline+.form-check-inline{margin-left:.75rem}.invalid-feedback{display:none;margin-top:.25rem;font-size:.875rem;color:#dc3545}.invalid-tooltip{position:absolute;top:100%;z-index:5;display:none;width:250px;padding:.5rem;margin-top:.1rem;font-size:.875rem;line-height:1;color:#fff;background-color:rgba(220,53,69,.8);border-radius:.2rem}.custom-select.is-valid,.form-control.is-valid,.was-validated .custom-select:valid,.was-validated .form-control:valid{border-color:#28a745}.custom-select.is-valid:focus,.form-control.is-valid:focus,.was-validated .custom-select:valid:focus,.was-validated .form-control:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-valid~.invalid-feedback,.custom-select.is-valid~.invalid-tooltip,.form-control.is-valid~.invalid-feedback,.form-control.is-valid~.invalid-tooltip,.was-validated .custom-select:valid~.invalid-feedback,.was-validated .custom-select:valid~.invalid-tooltip,.was-validated .form-control:valid~.invalid-feedback,.was-validated .form-control:valid~.invalid-tooltip{display:block}.form-check-input.is-valid+.form-check-label,.was-validated .form-check-input:valid+.form-check-label{color:#28a745}.custom-control-input.is-valid~.custom-control-indicator,.was-validated .custom-control-input:valid~.custom-control-indicator{background-color:rgba(40,167,69,.25)}.custom-control-input.is-valid~.custom-control-description,.was-validated .custom-control-input:valid~.custom-control-description{color:#28a745}.custom-file-input.is-valid~.custom-file-control,.was-validated .custom-file-input:valid~.custom-file-control{border-color:#28a745}.custom-file-input.is-valid~.custom-file-control::before,.was-validated .custom-file-input:valid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-valid:focus,.was-validated .custom-file-input:valid:focus{box-shadow:0 0 0 .2rem rgba(40,167,69,.25)}.custom-select.is-invalid,.form-control.is-invalid,.was-validated .custom-select:invalid,.was-validated .form-control:invalid{border-color:#dc3545}.custom-select.is-invalid:focus,.form-control.is-invalid:focus,.was-validated .custom-select:invalid:focus,.was-validated .form-control:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.custom-select.is-invalid~.invalid-feedback,.custom-select.is-invalid~.invalid-tooltip,.form-control.is-invalid~.invalid-feedback,.form-control.is-invalid~.invalid-tooltip,.was-validated .custom-select:invalid~.invalid-feedback,.was-validated .custom-select:invalid~.invalid-tooltip,.was-validated .form-control:invalid~.invalid-feedback,.was-validated .form-control:invalid~.invalid-tooltip{display:block}.form-check-input.is-invalid+.form-check-label,.was-validated .form-check-input:invalid+.form-check-label{color:#dc3545}.custom-control-input.is-invalid~.custom-control-indicator,.was-validated .custom-control-input:invalid~.custom-control-indicator{background-color:rgba(220,53,69,.25)}.custom-control-input.is-invalid~.custom-control-description,.was-validated .custom-control-input:invalid~.custom-control-description{color:#dc3545}.custom-file-input.is-invalid~.custom-file-control,.was-validated .custom-file-input:invalid~.custom-file-control{border-color:#dc3545}.custom-file-input.is-invalid~.custom-file-control::before,.was-validated .custom-file-input:invalid~.custom-file-control::before{border-color:inherit}.custom-file-input.is-invalid:focus,.was-validated .custom-file-input:invalid:focus{box-shadow:0 0 0 .2rem rgba(220,53,69,.25)}.form-inline{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center}.form-inline .form-check{width:100%}@media (min-width:576px){.form-inline label{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;margin-bottom:0}.form-inline .form-group{display:-ms-flexbox;display:flex;-ms-flex:0 0 auto;flex:0 0 auto;-ms-flex-flow:row wrap;flex-flow:row wrap;-ms-flex-align:center;align-items:center;margin-bottom:0}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-plaintext{display:inline-block}.form-inline .input-group{width:auto}.form-inline .form-control-label{margin-bottom:0;vertical-align:middle}.form-inline .form-check{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:auto;margin-top:0;margin-bottom:0}.form-inline .form-check-label{padding-left:0}.form-inline .form-check-input{position:relative;margin-top:0;margin-right:.25rem;margin-left:0}.form-inline .custom-control{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;padding-left:0}.form-inline .custom-control-indicator{position:static;display:inline-block;margin-right:.25rem;vertical-align:text-bottom}.form-inline .has-feedback .form-control-feedback{top:0}}.btn{display:inline-block;font-weight:400;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem .75rem;font-size:1rem;line-height:1.25;border-radius:.25rem;transition:all .15s ease-in-out}.btn:focus,.btn:hover{text-decoration:none}.btn.focus,.btn:focus{outline:0;box-shadow:0 0 0 3px rgba(0,123,255,.25)}.btn.disabled,.btn:disabled{opacity:.65}.btn.active,.btn:active{background-image:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-primary{color:#fff;background-color:#007bff;border-color:#007bff}.btn-primary:hover{color:#fff;background-color:#0069d9;border-color:#0062cc}.btn-primary.focus,.btn-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-primary.disabled,.btn-primary:disabled{background-color:#007bff;border-color:#007bff}.btn-primary.active,.btn-primary:active,.show>.btn-primary.dropdown-toggle{background-color:#0069d9;background-image:none;border-color:#0062cc}.btn-secondary{color:#fff;background-color:#868e96;border-color:#868e96}.btn-secondary:hover{color:#fff;background-color:#727b84;border-color:#6c757d}.btn-secondary.focus,.btn-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-secondary.disabled,.btn-secondary:disabled{background-color:#868e96;border-color:#868e96}.btn-secondary.active,.btn-secondary:active,.show>.btn-secondary.dropdown-toggle{background-color:#727b84;background-image:none;border-color:#6c757d}.btn-success{color:#fff;background-color:#28a745;border-color:#28a745}.btn-success:hover{color:#fff;background-color:#218838;border-color:#1e7e34}.btn-success.focus,.btn-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-success.disabled,.btn-success:disabled{background-color:#28a745;border-color:#28a745}.btn-success.active,.btn-success:active,.show>.btn-success.dropdown-toggle{background-color:#218838;background-image:none;border-color:#1e7e34}.btn-info{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-info:hover{color:#fff;background-color:#138496;border-color:#117a8b}.btn-info.focus,.btn-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-info.disabled,.btn-info:disabled{background-color:#17a2b8;border-color:#17a2b8}.btn-info.active,.btn-info:active,.show>.btn-info.dropdown-toggle{background-color:#138496;background-image:none;border-color:#117a8b}.btn-warning{color:#111;background-color:#ffc107;border-color:#ffc107}.btn-warning:hover{color:#111;background-color:#e0a800;border-color:#d39e00}.btn-warning.focus,.btn-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-warning.disabled,.btn-warning:disabled{background-color:#ffc107;border-color:#ffc107}.btn-warning.active,.btn-warning:active,.show>.btn-warning.dropdown-toggle{background-color:#e0a800;background-image:none;border-color:#d39e00}.btn-danger{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-danger:hover{color:#fff;background-color:#c82333;border-color:#bd2130}.btn-danger.focus,.btn-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-danger.disabled,.btn-danger:disabled{background-color:#dc3545;border-color:#dc3545}.btn-danger.active,.btn-danger:active,.show>.btn-danger.dropdown-toggle{background-color:#c82333;background-image:none;border-color:#bd2130}.btn-light{color:#111;background-color:#f8f9fa;border-color:#f8f9fa}.btn-light:hover{color:#111;background-color:#e2e6ea;border-color:#dae0e5}.btn-light.focus,.btn-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-light.disabled,.btn-light:disabled{background-color:#f8f9fa;border-color:#f8f9fa}.btn-light.active,.btn-light:active,.show>.btn-light.dropdown-toggle{background-color:#e2e6ea;background-image:none;border-color:#dae0e5}.btn-dark{color:#fff;background-color:#343a40;border-color:#343a40}.btn-dark:hover{color:#fff;background-color:#23272b;border-color:#1d2124}.btn-dark.focus,.btn-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-dark.disabled,.btn-dark:disabled{background-color:#343a40;border-color:#343a40}.btn-dark.active,.btn-dark:active,.show>.btn-dark.dropdown-toggle{background-color:#23272b;background-image:none;border-color:#1d2124}.btn-outline-primary{color:#007bff;background-color:transparent;background-image:none;border-color:#007bff}.btn-outline-primary:hover{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-primary.focus,.btn-outline-primary:focus{box-shadow:0 0 0 3px rgba(0,123,255,.5)}.btn-outline-primary.disabled,.btn-outline-primary:disabled{color:#007bff;background-color:transparent}.btn-outline-primary.active,.btn-outline-primary:active,.show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#007bff;border-color:#007bff}.btn-outline-secondary{color:#868e96;background-color:transparent;background-image:none;border-color:#868e96}.btn-outline-secondary:hover{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-secondary.focus,.btn-outline-secondary:focus{box-shadow:0 0 0 3px rgba(134,142,150,.5)}.btn-outline-secondary.disabled,.btn-outline-secondary:disabled{color:#868e96;background-color:transparent}.btn-outline-secondary.active,.btn-outline-secondary:active,.show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#868e96;border-color:#868e96}.btn-outline-success{color:#28a745;background-color:transparent;background-image:none;border-color:#28a745}.btn-outline-success:hover{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-success.focus,.btn-outline-success:focus{box-shadow:0 0 0 3px rgba(40,167,69,.5)}.btn-outline-success.disabled,.btn-outline-success:disabled{color:#28a745;background-color:transparent}.btn-outline-success.active,.btn-outline-success:active,.show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#28a745;border-color:#28a745}.btn-outline-info{color:#17a2b8;background-color:transparent;background-image:none;border-color:#17a2b8}.btn-outline-info:hover{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-info.focus,.btn-outline-info:focus{box-shadow:0 0 0 3px rgba(23,162,184,.5)}.btn-outline-info.disabled,.btn-outline-info:disabled{color:#17a2b8;background-color:transparent}.btn-outline-info.active,.btn-outline-info:active,.show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#17a2b8;border-color:#17a2b8}.btn-outline-warning{color:#ffc107;background-color:transparent;background-image:none;border-color:#ffc107}.btn-outline-warning:hover{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-warning.focus,.btn-outline-warning:focus{box-shadow:0 0 0 3px rgba(255,193,7,.5)}.btn-outline-warning.disabled,.btn-outline-warning:disabled{color:#ffc107;background-color:transparent}.btn-outline-warning.active,.btn-outline-warning:active,.show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#ffc107;border-color:#ffc107}.btn-outline-danger{color:#dc3545;background-color:transparent;background-image:none;border-color:#dc3545}.btn-outline-danger:hover{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-danger.focus,.btn-outline-danger:focus{box-shadow:0 0 0 3px rgba(220,53,69,.5)}.btn-outline-danger.disabled,.btn-outline-danger:disabled{color:#dc3545;background-color:transparent}.btn-outline-danger.active,.btn-outline-danger:active,.show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#dc3545;border-color:#dc3545}.btn-outline-light{color:#f8f9fa;background-color:transparent;background-image:none;border-color:#f8f9fa}.btn-outline-light:hover{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-light.focus,.btn-outline-light:focus{box-shadow:0 0 0 3px rgba(248,249,250,.5)}.btn-outline-light.disabled,.btn-outline-light:disabled{color:#f8f9fa;background-color:transparent}.btn-outline-light.active,.btn-outline-light:active,.show>.btn-outline-light.dropdown-toggle{color:#fff;background-color:#f8f9fa;border-color:#f8f9fa}.btn-outline-dark{color:#343a40;background-color:transparent;background-image:none;border-color:#343a40}.btn-outline-dark:hover{color:#fff;background-color:#343a40;border-color:#343a40}.btn-outline-dark.focus,.btn-outline-dark:focus{box-shadow:0 0 0 3px rgba(52,58,64,.5)}.btn-outline-dark.disabled,.btn-outline-dark:disabled{color:#343a40;background-color:transparent}.btn-outline-dark.active,.btn-outline-dark:active,.show>.btn-outline-dark.dropdown-toggle{color:#fff;background-color:#343a40;border-color:#343a40}.btn-link{font-weight:400;color:#007bff;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link:disabled{background-color:transparent}.btn-link,.btn-link:active,.btn-link:focus{border-color:transparent;box-shadow:none}.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#0056b3;text-decoration:underline;background-color:transparent}.btn-link:disabled{color:#868e96}.btn-link:disabled:focus,.btn-link:disabled:hover{text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:.5rem 1rem;font-size:1.25rem;line-height:1.5;border-radius:.3rem}.btn-group-sm>.btn,.btn-sm{padding:.25rem .5rem;font-size:.875rem;line-height:1.5;border-radius:.2rem}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:.5rem}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;transition:opacity .15s linear}.fade.show{opacity:1}.collapse{display:none}.collapse.show{display:block}tr.collapse.show{display:table-row}tbody.collapse.show{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;transition:height .35s ease}.dropdown,.dropup{position:relative}.dropdown-toggle::after{display:inline-block;width:0;height:0;margin-left:.255em;vertical-align:.255em;content:"";border-top:.3em solid;border-right:.3em solid transparent;border-left:.3em solid transparent}.dropdown-toggle:empty::after{margin-left:0}.dropup .dropdown-menu{margin-top:0;margin-bottom:.125rem}.dropup .dropdown-toggle::after{border-top:0;border-bottom:.3em solid}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:10rem;padding:.5rem 0;margin:.125rem 0 0;font-size:1rem;color:#212529;text-align:left;list-style:none;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.dropdown-divider{height:0;margin:.5rem 0;overflow:hidden;border-top:1px solid #e9ecef}.dropdown-item{display:block;width:100%;padding:.25rem 1.5rem;clear:both;font-weight:400;color:#212529;text-align:inherit;white-space:nowrap;background:0 0;border:0}.dropdown-item:focus,.dropdown-item:hover{color:#16181b;text-decoration:none;background-color:#f8f9fa}.dropdown-item.active,.dropdown-item:active{color:#fff;text-decoration:none;background-color:#007bff}.dropdown-item.disabled,.dropdown-item:disabled{color:#868e96;background-color:transparent}.show>a{outline:0}.dropdown-menu.show{display:block}.dropdown-header{display:block;padding:.5rem 1.5rem;margin-bottom:0;font-size:.875rem;color:#868e96;white-space:nowrap}.btn-group,.btn-group-vertical{position:relative;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;margin-bottom:0}.btn-group-vertical>.btn:hover,.btn-group>.btn:hover{z-index:2}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group,.btn-group-vertical .btn+.btn,.btn-group-vertical .btn+.btn-group,.btn-group-vertical .btn-group+.btn,.btn-group-vertical .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-pack:start;justify-content:flex-start}.btn-toolbar .input-group{width:auto}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn+.dropdown-toggle-split{padding-right:.5625rem;padding-left:.5625rem}.btn+.dropdown-toggle-split::after{margin-left:0}.btn-group-sm>.btn+.dropdown-toggle-split,.btn-sm+.dropdown-toggle-split{padding-right:.375rem;padding-left:.375rem}.btn-group-lg>.btn+.dropdown-toggle-split,.btn-lg+.dropdown-toggle-split{padding-right:.75rem;padding-left:.75rem}.btn-group-vertical{display:-ms-inline-flexbox;display:inline-flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-align:start;align-items:flex-start;-ms-flex-pack:center;justify-content:center}.btn-group-vertical .btn,.btn-group-vertical .btn-group{width:100%}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:-ms-flexbox;display:flex;width:100%}.input-group .form-control{position:relative;z-index:2;-ms-flex:1 1 auto;flex:1 1 auto;width:1%;margin-bottom:0}.input-group .form-control:active,.input-group .form-control:focus,.input-group .form-control:hover{z-index:3}.input-group .form-control,.input-group-addon,.input-group-btn{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{white-space:nowrap;vertical-align:middle}.input-group-addon{padding:.5rem .75rem;margin-bottom:0;font-size:1rem;font-weight:400;line-height:1.25;color:#495057;text-align:center;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.input-group-addon.form-control-sm,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.input-group-addon.btn{padding:.25rem .5rem;font-size:.875rem;border-radius:.2rem}.input-group-addon.form-control-lg,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.input-group-addon.btn{padding:.5rem 1rem;font-size:1.25rem;border-radius:.3rem}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:not(:last-child),.input-group-addon:not(:last-child),.input-group-btn:not(:first-child)>.btn-group:not(:last-child)>.btn,.input-group-btn:not(:first-child)>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group>.btn,.input-group-btn:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:not(:last-child){border-right:0}.input-group .form-control:not(:first-child),.input-group-addon:not(:first-child),.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group>.btn,.input-group-btn:not(:first-child)>.dropdown-toggle,.input-group-btn:not(:last-child)>.btn-group:not(:first-child)>.btn,.input-group-btn:not(:last-child)>.btn:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.form-control+.input-group-addon:not(:first-child){border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{z-index:3}.input-group-btn:not(:last-child)>.btn,.input-group-btn:not(:last-child)>.btn-group{margin-right:-1px}.input-group-btn:not(:first-child)>.btn,.input-group-btn:not(:first-child)>.btn-group{z-index:2;margin-left:-1px}.input-group-btn:not(:first-child)>.btn-group:active,.input-group-btn:not(:first-child)>.btn-group:focus,.input-group-btn:not(:first-child)>.btn-group:hover,.input-group-btn:not(:first-child)>.btn:active,.input-group-btn:not(:first-child)>.btn:focus,.input-group-btn:not(:first-child)>.btn:hover{z-index:3}.custom-control{position:relative;display:-ms-inline-flexbox;display:inline-flex;min-height:1.5rem;padding-left:1.5rem;margin-right:1rem}.custom-control-input{position:absolute;z-index:-1;opacity:0}.custom-control-input:checked~.custom-control-indicator{color:#fff;background-color:#007bff}.custom-control-input:focus~.custom-control-indicator{box-shadow:0 0 0 1px #fff,0 0 0 3px #007bff}.custom-control-input:active~.custom-control-indicator{color:#fff;background-color:#b3d7ff}.custom-control-input:disabled~.custom-control-indicator{background-color:#e9ecef}.custom-control-input:disabled~.custom-control-description{color:#868e96}.custom-control-indicator{position:absolute;top:.25rem;left:0;display:block;width:1rem;height:1rem;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#ddd;background-repeat:no-repeat;background-position:center center;background-size:50% 50%}.custom-checkbox .custom-control-indicator{border-radius:.25rem}.custom-checkbox .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3E%3Cpath fill='%23fff' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26 2.974 7.25 8 2.193z'/%3E%3C/svg%3E")}.custom-checkbox .custom-control-input:indeterminate~.custom-control-indicator{background-color:#007bff;background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 4'%3E%3Cpath stroke='%23fff' d='M0 2h4'/%3E%3C/svg%3E")}.custom-radio .custom-control-indicator{border-radius:50%}.custom-radio .custom-control-input:checked~.custom-control-indicator{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3E%3Ccircle r='3' fill='%23fff'/%3E%3C/svg%3E")}.custom-controls-stacked{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column}.custom-controls-stacked .custom-control{margin-bottom:.25rem}.custom-controls-stacked .custom-control+.custom-control{margin-left:0}.custom-select{display:inline-block;max-width:100%;height:calc(2.25rem + 2px);padding:.375rem 1.75rem .375rem .75rem;line-height:1.25;color:#495057;vertical-align:middle;background:#fff url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'%3E%3Cpath fill='%23333' d='M2 0L0 2h4zm0 5L0 3h4z'/%3E%3C/svg%3E") no-repeat right .75rem center;background-size:8px 10px;border:1px solid rgba(0,0,0,.15);border-radius:.25rem;-webkit-appearance:none;-moz-appearance:none;appearance:none}.custom-select:focus{border-color:#80bdff;outline:0}.custom-select:focus::-ms-value{color:#495057;background-color:#fff}.custom-select:disabled{color:#868e96;background-color:#e9ecef}.custom-select::-ms-expand{opacity:0}.custom-select-sm{height:calc(1.8125rem + 2px);padding-top:.375rem;padding-bottom:.375rem;font-size:75%}.custom-file{position:relative;display:inline-block;max-width:100%;height:2.5rem;margin-bottom:0}.custom-file-input{min-width:14rem;max-width:100%;height:2.5rem;margin:0;opacity:0}.custom-file-control{position:absolute;top:0;right:0;left:0;z-index:5;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:#fff;border:1px solid rgba(0,0,0,.15);border-radius:.25rem}.custom-file-control:lang(en):empty::after{content:"Choose file..."}.custom-file-control::before{position:absolute;top:-1px;right:-1px;bottom:-1px;z-index:6;display:block;height:2.5rem;padding:.5rem 1rem;line-height:1.5;color:#495057;background-color:#e9ecef;border:1px solid rgba(0,0,0,.15);border-radius:0 .25rem .25rem 0}.custom-file-control:lang(en)::before{content:"Browse"}.nav{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;padding-left:0;margin-bottom:0;list-style:none}.nav-link{display:block;padding:.5rem 1rem}.nav-link:focus,.nav-link:hover{text-decoration:none}.nav-link.disabled{color:#868e96}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs .nav-item{margin-bottom:-1px}.nav-tabs .nav-link{border:1px solid transparent;border-top-left-radius:.25rem;border-top-right-radius:.25rem}.nav-tabs .nav-link:focus,.nav-tabs .nav-link:hover{border-color:#e9ecef #e9ecef #ddd}.nav-tabs .nav-link.disabled{color:#868e96;background-color:transparent;border-color:transparent}.nav-tabs .nav-item.show .nav-link,.nav-tabs .nav-link.active{color:#495057;background-color:#fff;border-color:#ddd #ddd #fff}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.nav-pills .nav-link{border-radius:.25rem}.nav-pills .nav-link.active,.show>.nav-pills .nav-link{color:#fff;background-color:#007bff}.nav-fill .nav-item{-ms-flex:1 1 auto;flex:1 1 auto;text-align:center}.nav-justified .nav-item{-ms-flex-preferred-size:0;flex-basis:0;-ms-flex-positive:1;flex-grow:1;text-align:center}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.navbar{position:relative;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:.5rem 1rem}.navbar>.container,.navbar>.container-fluid{display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between}.navbar-brand{display:inline-block;padding-top:.3125rem;padding-bottom:.3125rem;margin-right:1rem;font-size:1.25rem;line-height:inherit;white-space:nowrap}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-nav{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0;list-style:none}.navbar-nav .nav-link{padding-right:0;padding-left:0}.navbar-nav .dropdown-menu{position:static;float:none}.navbar-text{display:inline-block;padding-top:.5rem;padding-bottom:.5rem}.navbar-collapse{-ms-flex-preferred-size:100%;flex-basis:100%;-ms-flex-align:center;align-items:center}.navbar-toggler{padding:.25rem .75rem;font-size:1.25rem;line-height:1;background:0 0;border:1px solid transparent;border-radius:.25rem}.navbar-toggler:focus,.navbar-toggler:hover{text-decoration:none}.navbar-toggler-icon{display:inline-block;width:1.5em;height:1.5em;vertical-align:middle;content:"";background:no-repeat center center;background-size:100% 100%}@media (max-width:575px){.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:576px){.navbar-expand-sm{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-sm .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-sm .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-sm .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-sm .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-sm>.container,.navbar-expand-sm>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-sm .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-sm .navbar-toggler{display:none}}@media (max-width:767px){.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:768px){.navbar-expand-md{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-md .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-md .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-md .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-md .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-md>.container,.navbar-expand-md>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-md .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-md .navbar-toggler{display:none}}@media (max-width:991px){.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:992px){.navbar-expand-lg{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-lg .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-lg .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-lg .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-lg .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-lg>.container,.navbar-expand-lg>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-lg .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-lg .navbar-toggler{display:none}}@media (max-width:1199px){.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{padding-right:0;padding-left:0}}@media (min-width:1200px){.navbar-expand-xl{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand-xl .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand-xl .navbar-nav .dropdown-menu{position:absolute}.navbar-expand-xl .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand-xl .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand-xl>.container,.navbar-expand-xl>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand-xl .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand-xl .navbar-toggler{display:none}}.navbar-expand{-ms-flex-direction:row;flex-direction:row;-ms-flex-wrap:nowrap;flex-wrap:nowrap;-ms-flex-pack:start;justify-content:flex-start}.navbar-expand>.container,.navbar-expand>.container-fluid{padding-right:0;padding-left:0}.navbar-expand .navbar-nav{-ms-flex-direction:row;flex-direction:row}.navbar-expand .navbar-nav .dropdown-menu{position:absolute}.navbar-expand .navbar-nav .dropdown-menu-right{right:0;left:auto}.navbar-expand .navbar-nav .nav-link{padding-right:.5rem;padding-left:.5rem}.navbar-expand>.container,.navbar-expand>.container-fluid{-ms-flex-wrap:nowrap;flex-wrap:nowrap}.navbar-expand .navbar-collapse{display:-ms-flexbox!important;display:flex!important}.navbar-expand .navbar-toggler{display:none}.navbar-light .navbar-brand{color:rgba(0,0,0,.9)}.navbar-light .navbar-brand:focus,.navbar-light .navbar-brand:hover{color:rgba(0,0,0,.9)}.navbar-light .navbar-nav .nav-link{color:rgba(0,0,0,.5)}.navbar-light .navbar-nav .nav-link:focus,.navbar-light .navbar-nav .nav-link:hover{color:rgba(0,0,0,.7)}.navbar-light .navbar-nav .nav-link.disabled{color:rgba(0,0,0,.3)}.navbar-light .navbar-nav .active>.nav-link,.navbar-light .navbar-nav .nav-link.active,.navbar-light .navbar-nav .nav-link.show,.navbar-light .navbar-nav .show>.nav-link{color:rgba(0,0,0,.9)}.navbar-light .navbar-toggler{color:rgba(0,0,0,.5);border-color:rgba(0,0,0,.1)}.navbar-light .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(0, 0, 0, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-light .navbar-text{color:rgba(0,0,0,.5)}.navbar-dark .navbar-brand{color:#fff}.navbar-dark .navbar-brand:focus,.navbar-dark .navbar-brand:hover{color:#fff}.navbar-dark .navbar-nav .nav-link{color:rgba(255,255,255,.5)}.navbar-dark .navbar-nav .nav-link:focus,.navbar-dark .navbar-nav .nav-link:hover{color:rgba(255,255,255,.75)}.navbar-dark .navbar-nav .nav-link.disabled{color:rgba(255,255,255,.25)}.navbar-dark .navbar-nav .active>.nav-link,.navbar-dark .navbar-nav .nav-link.active,.navbar-dark .navbar-nav .nav-link.show,.navbar-dark .navbar-nav .show>.nav-link{color:#fff}.navbar-dark .navbar-toggler{color:rgba(255,255,255,.5);border-color:rgba(255,255,255,.1)}.navbar-dark .navbar-toggler-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg viewBox='0 0 30 30' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath stroke='rgba(255, 255, 255, 0.5)' stroke-width='2' stroke-linecap='round' stroke-miterlimit='10' d='M4 7h22M4 15h22M4 23h22'/%3E%3C/svg%3E")}.navbar-dark .navbar-text{color:rgba(255,255,255,.5)}.card{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem;margin-bottom:0}.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-right:-.625rem;margin-bottom:-.75rem;margin-left:-.625rem;border-bottom:0}.card-header-pills{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}@media (min-width:576px){.card-deck{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck .card{display:-ms-flexbox;display:flex;-ms-flex:1 0 0%;flex:1 0 0%;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-left:15px}}@media (min-width:576px){.card-group{display:-ms-flexbox;display:flex;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group .card{-ms-flex:1 0 0%;flex:1 0 0%}.card-group .card+.card{margin-left:0;border-left:0}.card-group .card:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.card-group .card:first-child .card-img-top{border-top-right-radius:0}.card-group .card:first-child .card-img-bottom{border-bottom-right-radius:0}.card-group .card:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.card-group .card:last-child .card-img-top{border-top-left-radius:0}.card-group .card:last-child .card-img-bottom{border-bottom-left-radius:0}.card-group .card:not(:first-child):not(:last-child){border-radius:0}.card-group .card:not(:first-child):not(:last-child) .card-img-bottom,.card-group .card:not(:first-child):not(:last-child) .card-img-top{border-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem}.card-columns .card{display:inline-block;width:100%}}.breadcrumb{padding:.75rem 1rem;margin-bottom:1rem;list-style:none;background-color:#e9ecef;border-radius:.25rem}.breadcrumb::after{display:block;clear:both;content:""}.breadcrumb-item{float:left}.breadcrumb-item+.breadcrumb-item::before{display:inline-block;padding-right:.5rem;padding-left:.5rem;color:#868e96;content:"/"}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:underline}.breadcrumb-item+.breadcrumb-item:hover::before{text-decoration:none}.breadcrumb-item.active{color:#868e96}.pagination{display:-ms-flexbox;display:flex;padding-left:0;list-style:none;border-radius:.25rem}.page-item:first-child .page-link{margin-left:0;border-top-left-radius:.25rem;border-bottom-left-radius:.25rem}.page-item:last-child .page-link{border-top-right-radius:.25rem;border-bottom-right-radius:.25rem}.page-item.active .page-link{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.page-item.disabled .page-link{color:#868e96;pointer-events:none;background-color:#fff;border-color:#ddd}.page-link{position:relative;display:block;padding:.5rem .75rem;margin-left:-1px;line-height:1.25;color:#007bff;background-color:#fff;border:1px solid #ddd}.page-link:focus,.page-link:hover{color:#0056b3;text-decoration:none;background-color:#e9ecef;border-color:#ddd}.pagination-lg .page-link{padding:.75rem 1.5rem;font-size:1.25rem;line-height:1.5}.pagination-lg .page-item:first-child .page-link{border-top-left-radius:.3rem;border-bottom-left-radius:.3rem}.pagination-lg .page-item:last-child .page-link{border-top-right-radius:.3rem;border-bottom-right-radius:.3rem}.pagination-sm .page-link{padding:.25rem .5rem;font-size:.875rem;line-height:1.5}.pagination-sm .page-item:first-child .page-link{border-top-left-radius:.2rem;border-bottom-left-radius:.2rem}.pagination-sm .page-item:last-child .page-link{border-top-right-radius:.2rem;border-bottom-right-radius:.2rem}.badge{display:inline-block;padding:.25em .4em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.badge-pill{padding-right:.6em;padding-left:.6em;border-radius:10rem}.badge-primary{color:#fff;background-color:#007bff}.badge-primary[href]:focus,.badge-primary[href]:hover{color:#fff;text-decoration:none;background-color:#0062cc}.badge-secondary{color:#fff;background-color:#868e96}.badge-secondary[href]:focus,.badge-secondary[href]:hover{color:#fff;text-decoration:none;background-color:#6c757d}.badge-success{color:#fff;background-color:#28a745}.badge-success[href]:focus,.badge-success[href]:hover{color:#fff;text-decoration:none;background-color:#1e7e34}.badge-info{color:#fff;background-color:#17a2b8}.badge-info[href]:focus,.badge-info[href]:hover{color:#fff;text-decoration:none;background-color:#117a8b}.badge-warning{color:#111;background-color:#ffc107}.badge-warning[href]:focus,.badge-warning[href]:hover{color:#111;text-decoration:none;background-color:#d39e00}.badge-danger{color:#fff;background-color:#dc3545}.badge-danger[href]:focus,.badge-danger[href]:hover{color:#fff;text-decoration:none;background-color:#bd2130}.badge-light{color:#111;background-color:#f8f9fa}.badge-light[href]:focus,.badge-light[href]:hover{color:#111;text-decoration:none;background-color:#dae0e5}.badge-dark{color:#fff;background-color:#343a40}.badge-dark[href]:focus,.badge-dark[href]:hover{color:#fff;text-decoration:none;background-color:#1d2124}.jumbotron{padding:2rem 1rem;margin-bottom:2rem;background-color:#e9ecef;border-radius:.3rem}@media (min-width:576px){.jumbotron{padding:4rem 2rem}}.jumbotron-fluid{padding-right:0;padding-left:0;border-radius:0}.alert{padding:.75rem 1.25rem;margin-bottom:1rem;border:1px solid transparent;border-radius:.25rem}.alert-heading{color:inherit}.alert-link{font-weight:700}.alert-dismissible .close{position:relative;top:-.75rem;right:-1.25rem;padding:.75rem 1.25rem;color:inherit}.alert-primary{color:#004085;background-color:#cce5ff;border-color:#b8daff}.alert-primary hr{border-top-color:#9fcdff}.alert-primary .alert-link{color:#002752}.alert-secondary{color:#464a4e;background-color:#e7e8ea;border-color:#dddfe2}.alert-secondary hr{border-top-color:#cfd2d6}.alert-secondary .alert-link{color:#2e3133}.alert-success{color:#155724;background-color:#d4edda;border-color:#c3e6cb}.alert-success hr{border-top-color:#b1dfbb}.alert-success .alert-link{color:#0b2e13}.alert-info{color:#0c5460;background-color:#d1ecf1;border-color:#bee5eb}.alert-info hr{border-top-color:#abdde5}.alert-info .alert-link{color:#062c33}.alert-warning{color:#856404;background-color:#fff3cd;border-color:#ffeeba}.alert-warning hr{border-top-color:#ffe8a1}.alert-warning .alert-link{color:#533f03}.alert-danger{color:#721c24;background-color:#f8d7da;border-color:#f5c6cb}.alert-danger hr{border-top-color:#f1b0b7}.alert-danger .alert-link{color:#491217}.alert-light{color:#818182;background-color:#fefefe;border-color:#fdfdfe}.alert-light hr{border-top-color:#ececf6}.alert-light .alert-link{color:#686868}.alert-dark{color:#1b1e21;background-color:#d6d8d9;border-color:#c6c8ca}.alert-dark hr{border-top-color:#b9bbbe}.alert-dark .alert-link{color:#040505}@-webkit-keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:1rem 0}to{background-position:0 0}}.progress{display:-ms-flexbox;display:flex;overflow:hidden;font-size:.75rem;line-height:1rem;text-align:center;background-color:#e9ecef;border-radius:.25rem}.progress-bar{height:1rem;line-height:1rem;color:#fff;background-color:#007bff;transition:width .6s ease}.progress-bar-striped{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:1rem 1rem}.progress-bar-animated{-webkit-animation:progress-bar-stripes 1s linear infinite;animation:progress-bar-stripes 1s linear infinite}.media{display:-ms-flexbox;display:flex;-ms-flex-align:start;align-items:flex-start}.media-body{-ms-flex:1;flex:1}.list-group{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;padding-left:0;margin-bottom:0}.list-group-item-action{width:100%;color:#495057;text-align:inherit}.list-group-item-action:focus,.list-group-item-action:hover{color:#495057;text-decoration:none;background-color:#f8f9fa}.list-group-item-action:active{color:#212529;background-color:#e9ecef}.list-group-item{position:relative;display:block;padding:.75rem 1.25rem;margin-bottom:-1px;background-color:#fff;border:1px solid rgba(0,0,0,.125)}.list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.list-group-item:focus,.list-group-item:hover{text-decoration:none}.list-group-item.disabled,.list-group-item:disabled{color:#868e96;background-color:#fff}.list-group-item.active{z-index:2;color:#fff;background-color:#007bff;border-color:#007bff}.list-group-flush .list-group-item{border-right:0;border-left:0;border-radius:0}.list-group-flush:first-child .list-group-item:first-child{border-top:0}.list-group-flush:last-child .list-group-item:last-child{border-bottom:0}.list-group-item-primary{color:#004085;background-color:#b8daff}a.list-group-item-primary,button.list-group-item-primary{color:#004085}a.list-group-item-primary:focus,a.list-group-item-primary:hover,button.list-group-item-primary:focus,button.list-group-item-primary:hover{color:#004085;background-color:#9fcdff}a.list-group-item-primary.active,button.list-group-item-primary.active{color:#fff;background-color:#004085;border-color:#004085}.list-group-item-secondary{color:#464a4e;background-color:#dddfe2}a.list-group-item-secondary,button.list-group-item-secondary{color:#464a4e}a.list-group-item-secondary:focus,a.list-group-item-secondary:hover,button.list-group-item-secondary:focus,button.list-group-item-secondary:hover{color:#464a4e;background-color:#cfd2d6}a.list-group-item-secondary.active,button.list-group-item-secondary.active{color:#fff;background-color:#464a4e;border-color:#464a4e}.list-group-item-success{color:#155724;background-color:#c3e6cb}a.list-group-item-success,button.list-group-item-success{color:#155724}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#155724;background-color:#b1dfbb}a.list-group-item-success.active,button.list-group-item-success.active{color:#fff;background-color:#155724;border-color:#155724}.list-group-item-info{color:#0c5460;background-color:#bee5eb}a.list-group-item-info,button.list-group-item-info{color:#0c5460}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#0c5460;background-color:#abdde5}a.list-group-item-info.active,button.list-group-item-info.active{color:#fff;background-color:#0c5460;border-color:#0c5460}.list-group-item-warning{color:#856404;background-color:#ffeeba}a.list-group-item-warning,button.list-group-item-warning{color:#856404}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#856404;background-color:#ffe8a1}a.list-group-item-warning.active,button.list-group-item-warning.active{color:#fff;background-color:#856404;border-color:#856404}.list-group-item-danger{color:#721c24;background-color:#f5c6cb}a.list-group-item-danger,button.list-group-item-danger{color:#721c24}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#721c24;background-color:#f1b0b7}a.list-group-item-danger.active,button.list-group-item-danger.active{color:#fff;background-color:#721c24;border-color:#721c24}.list-group-item-light{color:#818182;background-color:#fdfdfe}a.list-group-item-light,button.list-group-item-light{color:#818182}a.list-group-item-light:focus,a.list-group-item-light:hover,button.list-group-item-light:focus,button.list-group-item-light:hover{color:#818182;background-color:#ececf6}a.list-group-item-light.active,button.list-group-item-light.active{color:#fff;background-color:#818182;border-color:#818182}.list-group-item-dark{color:#1b1e21;background-color:#c6c8ca}a.list-group-item-dark,button.list-group-item-dark{color:#1b1e21}a.list-group-item-dark:focus,a.list-group-item-dark:hover,button.list-group-item-dark:focus,button.list-group-item-dark:hover{color:#1b1e21;background-color:#b9bbbe}a.list-group-item-dark.active,button.list-group-item-dark.active{color:#fff;background-color:#1b1e21;border-color:#1b1e21}.close{float:right;font-size:1.5rem;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.5}.close:focus,.close:hover{color:#000;text-decoration:none;opacity:.75}button.close{padding:0;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;outline:0}.modal.fade .modal-dialog{transition:-webkit-transform .3s ease-out;transition:transform .3s ease-out;transition:transform .3s ease-out,-webkit-transform .3s ease-out;-webkit-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.show .modal-dialog{-webkit-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0}.modal-backdrop.show{opacity:.5}.modal-header{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:justify;justify-content:space-between;padding:15px;border-bottom:1px solid #e9ecef}.modal-title{margin-bottom:0;line-height:1.5}.modal-body{position:relative;-ms-flex:1 1 auto;flex:1 1 auto;padding:15px}.modal-footer{display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:end;justify-content:flex-end;padding:15px;border-top:1px solid #e9ecef}.modal-footer>:not(:first-child){margin-left:.25rem}.modal-footer>:not(:last-child){margin-right:.25rem}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:576px){.modal-dialog{max-width:500px;margin:30px auto}.modal-sm{max-width:300px}}@media (min-width:992px){.modal-lg{max-width:800px}}.tooltip{position:absolute;z-index:1070;display:block;margin:0;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;opacity:0}.tooltip.show{opacity:.9}.tooltip .arrow{position:absolute;display:block;width:5px;height:5px}.tooltip.bs-tooltip-auto[x-placement^=top],.tooltip.bs-tooltip-top{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow,.tooltip.bs-tooltip-top .arrow{bottom:0}.tooltip.bs-tooltip-auto[x-placement^=top] .arrow::before,.tooltip.bs-tooltip-top .arrow::before{margin-left:-3px;content:"";border-width:5px 5px 0;border-top-color:#000}.tooltip.bs-tooltip-auto[x-placement^=right],.tooltip.bs-tooltip-right{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow,.tooltip.bs-tooltip-right .arrow{left:0}.tooltip.bs-tooltip-auto[x-placement^=right] .arrow::before,.tooltip.bs-tooltip-right .arrow::before{margin-top:-3px;content:"";border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.bs-tooltip-auto[x-placement^=bottom],.tooltip.bs-tooltip-bottom{padding:5px 0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow,.tooltip.bs-tooltip-bottom .arrow{top:0}.tooltip.bs-tooltip-auto[x-placement^=bottom] .arrow::before,.tooltip.bs-tooltip-bottom .arrow::before{margin-left:-3px;content:"";border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bs-tooltip-auto[x-placement^=left],.tooltip.bs-tooltip-left{padding:0 5px}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow,.tooltip.bs-tooltip-left .arrow{right:0}.tooltip.bs-tooltip-auto[x-placement^=left] .arrow::before,.tooltip.bs-tooltip-left .arrow::before{right:0;margin-top:-3px;content:"";border-width:5px 0 5px 5px;border-left-color:#000}.tooltip .arrow::before{position:absolute;border-color:transparent;border-style:solid}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:.25rem}.popover{position:absolute;top:0;left:0;z-index:1060;display:block;max-width:276px;padding:1px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;font-style:normal;font-weight:400;line-height:1.5;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;white-space:normal;line-break:auto;font-size:.875rem;word-wrap:break-word;background-color:#fff;background-clip:padding-box;border:1px solid rgba(0,0,0,.2);border-radius:.3rem}.popover .arrow{position:absolute;display:block;width:10px;height:5px}.popover .arrow::after,.popover .arrow::before{position:absolute;display:block;border-color:transparent;border-style:solid}.popover .arrow::before{content:"";border-width:11px}.popover .arrow::after{content:"";border-width:11px}.popover.bs-popover-auto[x-placement^=top],.popover.bs-popover-top{margin-bottom:10px}.popover.bs-popover-auto[x-placement^=top] .arrow,.popover.bs-popover-top .arrow{bottom:0}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::after,.popover.bs-popover-top .arrow::before{border-bottom-width:0}.popover.bs-popover-auto[x-placement^=top] .arrow::before,.popover.bs-popover-top .arrow::before{bottom:-11px;margin-left:-6px;border-top-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=top] .arrow::after,.popover.bs-popover-top .arrow::after{bottom:-10px;margin-left:-6px;border-top-color:#fff}.popover.bs-popover-auto[x-placement^=right],.popover.bs-popover-right{margin-left:10px}.popover.bs-popover-auto[x-placement^=right] .arrow,.popover.bs-popover-right .arrow{left:0}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::after,.popover.bs-popover-right .arrow::before{margin-top:-8px;border-left-width:0}.popover.bs-popover-auto[x-placement^=right] .arrow::before,.popover.bs-popover-right .arrow::before{left:-11px;border-right-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=right] .arrow::after,.popover.bs-popover-right .arrow::after{left:-10px;border-right-color:#fff}.popover.bs-popover-auto[x-placement^=bottom],.popover.bs-popover-bottom{margin-top:10px}.popover.bs-popover-auto[x-placement^=bottom] .arrow,.popover.bs-popover-bottom .arrow{top:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::after,.popover.bs-popover-bottom .arrow::before{margin-left:-7px;border-top-width:0}.popover.bs-popover-auto[x-placement^=bottom] .arrow::before,.popover.bs-popover-bottom .arrow::before{top:-11px;border-bottom-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=bottom] .arrow::after,.popover.bs-popover-bottom .arrow::after{top:-10px;border-bottom-color:#fff}.popover.bs-popover-auto[x-placement^=bottom] .popover-header::before,.popover.bs-popover-bottom .popover-header::before{position:absolute;top:0;left:50%;display:block;width:20px;margin-left:-10px;content:"";border-bottom:1px solid #f7f7f7}.popover.bs-popover-auto[x-placement^=left],.popover.bs-popover-left{margin-right:10px}.popover.bs-popover-auto[x-placement^=left] .arrow,.popover.bs-popover-left .arrow{right:0}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::after,.popover.bs-popover-left .arrow::before{margin-top:-8px;border-right-width:0}.popover.bs-popover-auto[x-placement^=left] .arrow::before,.popover.bs-popover-left .arrow::before{right:-11px;border-left-color:rgba(0,0,0,.25)}.popover.bs-popover-auto[x-placement^=left] .arrow::after,.popover.bs-popover-left .arrow::after{right:-10px;border-left-color:#fff}.popover-header{padding:8px 14px;margin-bottom:0;font-size:1rem;color:inherit;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-top-left-radius:calc(.3rem - 1px);border-top-right-radius:calc(.3rem - 1px)}.popover-header:empty{display:none}.popover-body{padding:9px 14px;color:#212529}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-item{position:relative;display:none;-ms-flex-align:center;align-items:center;width:100%;transition:-webkit-transform .6s ease;transition:transform .6s ease;transition:transform .6s ease,-webkit-transform .6s ease;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-item-next,.carousel-item-prev,.carousel-item.active{display:block}.carousel-item-next,.carousel-item-prev{position:absolute;top:0}.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translateX(0);transform:translateX(0)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.carousel-item-next.carousel-item-left,.carousel-item-prev.carousel-item-right{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.active.carousel-item-right,.carousel-item-next{-webkit-transform:translateX(100%);transform:translateX(100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-right,.carousel-item-next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}}.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translateX(-100%);transform:translateX(-100%)}@supports ((-webkit-transform-style:preserve-3d) or (transform-style:preserve-3d)){.active.carousel-item-left,.carousel-item-prev{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}}.carousel-control-next,.carousel-control-prev{position:absolute;top:0;bottom:0;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;width:15%;color:#fff;text-align:center;opacity:.5}.carousel-control-next:focus,.carousel-control-next:hover,.carousel-control-prev:focus,.carousel-control-prev:hover{color:#fff;text-decoration:none;outline:0;opacity:.9}.carousel-control-prev{left:0}.carousel-control-next{right:0}.carousel-control-next-icon,.carousel-control-prev-icon{display:inline-block;width:20px;height:20px;background:transparent no-repeat center center;background-size:100% 100%}.carousel-control-prev-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M4 0l-4 4 4 4 1.5-1.5-2.5-2.5 2.5-2.5-1.5-1.5z'/%3E%3C/svg%3E")}.carousel-control-next-icon{background-image:url("data:image/svg+xml;charset=utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='%23fff' viewBox='0 0 8 8'%3E%3Cpath d='M1.5 0l-1.5 1.5 2.5 2.5-2.5 2.5 1.5 1.5 4-4-4-4z'/%3E%3C/svg%3E")}.carousel-indicators{position:absolute;right:0;bottom:10px;left:0;z-index:15;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;padding-left:0;margin-right:15%;margin-left:15%;list-style:none}.carousel-indicators li{position:relative;-ms-flex:0 1 auto;flex:0 1 auto;width:30px;height:3px;margin-right:3px;margin-left:3px;text-indent:-999px;background-color:rgba(255,255,255,.5)}.carousel-indicators li::before{position:absolute;top:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators li::after{position:absolute;bottom:-10px;left:0;display:inline-block;width:100%;height:10px;content:""}.carousel-indicators .active{background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center}.align-baseline{vertical-align:baseline!important}.align-top{vertical-align:top!important}.align-middle{vertical-align:middle!important}.align-bottom{vertical-align:bottom!important}.align-text-bottom{vertical-align:text-bottom!important}.align-text-top{vertical-align:text-top!important}.bg-primary{background-color:#007bff!important}a.bg-primary:focus,a.bg-primary:hover{background-color:#0062cc!important}.bg-secondary{background-color:#868e96!important}a.bg-secondary:focus,a.bg-secondary:hover{background-color:#6c757d!important}.bg-success{background-color:#28a745!important}a.bg-success:focus,a.bg-success:hover{background-color:#1e7e34!important}.bg-info{background-color:#17a2b8!important}a.bg-info:focus,a.bg-info:hover{background-color:#117a8b!important}.bg-warning{background-color:#ffc107!important}a.bg-warning:focus,a.bg-warning:hover{background-color:#d39e00!important}.bg-danger{background-color:#dc3545!important}a.bg-danger:focus,a.bg-danger:hover{background-color:#bd2130!important}.bg-light{background-color:#f8f9fa!important}a.bg-light:focus,a.bg-light:hover{background-color:#dae0e5!important}.bg-dark{background-color:#343a40!important}a.bg-dark:focus,a.bg-dark:hover{background-color:#1d2124!important}.bg-white{background-color:#fff!important}.bg-transparent{background-color:transparent!important}.border{border:1px solid #e9ecef!important}.border-0{border:0!important}.border-top-0{border-top:0!important}.border-right-0{border-right:0!important}.border-bottom-0{border-bottom:0!important}.border-left-0{border-left:0!important}.border-primary{border-color:#007bff!important}.border-secondary{border-color:#868e96!important}.border-success{border-color:#28a745!important}.border-info{border-color:#17a2b8!important}.border-warning{border-color:#ffc107!important}.border-danger{border-color:#dc3545!important}.border-light{border-color:#f8f9fa!important}.border-dark{border-color:#343a40!important}.border-white{border-color:#fff!important}.rounded{border-radius:.25rem!important}.rounded-top{border-top-left-radius:.25rem!important;border-top-right-radius:.25rem!important}.rounded-right{border-top-right-radius:.25rem!important;border-bottom-right-radius:.25rem!important}.rounded-bottom{border-bottom-right-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-left{border-top-left-radius:.25rem!important;border-bottom-left-radius:.25rem!important}.rounded-circle{border-radius:50%}.rounded-0{border-radius:0}.clearfix::after{display:block;clear:both;content:""}.d-none{display:none!important}.d-inline{display:inline!important}.d-inline-block{display:inline-block!important}.d-block{display:block!important}.d-table{display:table!important}.d-table-cell{display:table-cell!important}.d-flex{display:-ms-flexbox!important;display:flex!important}.d-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}@media (min-width:576px){.d-sm-none{display:none!important}.d-sm-inline{display:inline!important}.d-sm-inline-block{display:inline-block!important}.d-sm-block{display:block!important}.d-sm-table{display:table!important}.d-sm-table-cell{display:table-cell!important}.d-sm-flex{display:-ms-flexbox!important;display:flex!important}.d-sm-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:768px){.d-md-none{display:none!important}.d-md-inline{display:inline!important}.d-md-inline-block{display:inline-block!important}.d-md-block{display:block!important}.d-md-table{display:table!important}.d-md-table-cell{display:table-cell!important}.d-md-flex{display:-ms-flexbox!important;display:flex!important}.d-md-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:992px){.d-lg-none{display:none!important}.d-lg-inline{display:inline!important}.d-lg-inline-block{display:inline-block!important}.d-lg-block{display:block!important}.d-lg-table{display:table!important}.d-lg-table-cell{display:table-cell!important}.d-lg-flex{display:-ms-flexbox!important;display:flex!important}.d-lg-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}@media (min-width:1200px){.d-xl-none{display:none!important}.d-xl-inline{display:inline!important}.d-xl-inline-block{display:inline-block!important}.d-xl-block{display:block!important}.d-xl-table{display:table!important}.d-xl-table-cell{display:table-cell!important}.d-xl-flex{display:-ms-flexbox!important;display:flex!important}.d-xl-inline-flex{display:-ms-inline-flexbox!important;display:inline-flex!important}}.d-print-block{display:none!important}@media print{.d-print-block{display:block!important}}.d-print-inline{display:none!important}@media print{.d-print-inline{display:inline!important}}.d-print-inline-block{display:none!important}@media print{.d-print-inline-block{display:inline-block!important}}@media print{.d-print-none{display:none!important}}.embed-responsive{position:relative;display:block;width:100%;padding:0;overflow:hidden}.embed-responsive::before{display:block;content:""}.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{position:absolute;top:0;bottom:0;left:0;width:100%;height:100%;border:0}.embed-responsive-21by9::before{padding-top:42.857143%}.embed-responsive-16by9::before{padding-top:56.25%}.embed-responsive-4by3::before{padding-top:75%}.embed-responsive-1by1::before{padding-top:100%}.flex-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-center{-ms-flex-align:center!important;align-items:center!important}.align-items-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}@media (min-width:576px){.flex-sm-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-sm-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-sm-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-sm-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-sm-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-sm-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-sm-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-sm-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-sm-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-sm-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-sm-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-sm-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-sm-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-sm-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-sm-center{-ms-flex-align:center!important;align-items:center!important}.align-items-sm-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-sm-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-sm-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-sm-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-sm-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-sm-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-sm-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-sm-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-sm-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-sm-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-sm-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-sm-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-sm-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-sm-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:768px){.flex-md-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-md-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-md-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-md-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-md-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-md-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-md-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-md-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-md-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-md-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-md-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-md-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-md-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-md-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-md-center{-ms-flex-align:center!important;align-items:center!important}.align-items-md-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-md-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-md-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-md-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-md-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-md-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-md-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-md-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-md-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-md-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-md-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-md-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-md-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-md-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:992px){.flex-lg-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-lg-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-lg-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-lg-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-lg-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-lg-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-lg-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-lg-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-lg-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-lg-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-lg-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-lg-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-lg-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-lg-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-lg-center{-ms-flex-align:center!important;align-items:center!important}.align-items-lg-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-lg-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-lg-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-lg-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-lg-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-lg-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-lg-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-lg-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-lg-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-lg-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-lg-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-lg-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-lg-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-lg-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}@media (min-width:1200px){.flex-xl-row{-ms-flex-direction:row!important;flex-direction:row!important}.flex-xl-column{-ms-flex-direction:column!important;flex-direction:column!important}.flex-xl-row-reverse{-ms-flex-direction:row-reverse!important;flex-direction:row-reverse!important}.flex-xl-column-reverse{-ms-flex-direction:column-reverse!important;flex-direction:column-reverse!important}.flex-xl-wrap{-ms-flex-wrap:wrap!important;flex-wrap:wrap!important}.flex-xl-nowrap{-ms-flex-wrap:nowrap!important;flex-wrap:nowrap!important}.flex-xl-wrap-reverse{-ms-flex-wrap:wrap-reverse!important;flex-wrap:wrap-reverse!important}.justify-content-xl-start{-ms-flex-pack:start!important;justify-content:flex-start!important}.justify-content-xl-end{-ms-flex-pack:end!important;justify-content:flex-end!important}.justify-content-xl-center{-ms-flex-pack:center!important;justify-content:center!important}.justify-content-xl-between{-ms-flex-pack:justify!important;justify-content:space-between!important}.justify-content-xl-around{-ms-flex-pack:distribute!important;justify-content:space-around!important}.align-items-xl-start{-ms-flex-align:start!important;align-items:flex-start!important}.align-items-xl-end{-ms-flex-align:end!important;align-items:flex-end!important}.align-items-xl-center{-ms-flex-align:center!important;align-items:center!important}.align-items-xl-baseline{-ms-flex-align:baseline!important;align-items:baseline!important}.align-items-xl-stretch{-ms-flex-align:stretch!important;align-items:stretch!important}.align-content-xl-start{-ms-flex-line-pack:start!important;align-content:flex-start!important}.align-content-xl-end{-ms-flex-line-pack:end!important;align-content:flex-end!important}.align-content-xl-center{-ms-flex-line-pack:center!important;align-content:center!important}.align-content-xl-between{-ms-flex-line-pack:justify!important;align-content:space-between!important}.align-content-xl-around{-ms-flex-line-pack:distribute!important;align-content:space-around!important}.align-content-xl-stretch{-ms-flex-line-pack:stretch!important;align-content:stretch!important}.align-self-xl-auto{-ms-flex-item-align:auto!important;align-self:auto!important}.align-self-xl-start{-ms-flex-item-align:start!important;align-self:flex-start!important}.align-self-xl-end{-ms-flex-item-align:end!important;align-self:flex-end!important}.align-self-xl-center{-ms-flex-item-align:center!important;align-self:center!important}.align-self-xl-baseline{-ms-flex-item-align:baseline!important;align-self:baseline!important}.align-self-xl-stretch{-ms-flex-item-align:stretch!important;align-self:stretch!important}}.float-left{float:left!important}.float-right{float:right!important}.float-none{float:none!important}@media (min-width:576px){.float-sm-left{float:left!important}.float-sm-right{float:right!important}.float-sm-none{float:none!important}}@media (min-width:768px){.float-md-left{float:left!important}.float-md-right{float:right!important}.float-md-none{float:none!important}}@media (min-width:992px){.float-lg-left{float:left!important}.float-lg-right{float:right!important}.float-lg-none{float:none!important}}@media (min-width:1200px){.float-xl-left{float:left!important}.float-xl-right{float:right!important}.float-xl-none{float:none!important}}.fixed-top{position:fixed;top:0;right:0;left:0;z-index:1030}.fixed-bottom{position:fixed;right:0;bottom:0;left:0;z-index:1030}@supports ((position:-webkit-sticky) or (position:sticky)){.sticky-top{position:-webkit-sticky;position:sticky;top:0;z-index:1020}}.sr-only{position:absolute;width:1px;height:1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;-webkit-clip-path:inset(50%);clip-path:inset(50%);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;overflow:visible;clip:auto;white-space:normal;-webkit-clip-path:none;clip-path:none}.w-25{width:25%!important}.w-50{width:50%!important}.w-75{width:75%!important}.w-100{width:100%!important}.h-25{height:25%!important}.h-50{height:50%!important}.h-75{height:75%!important}.h-100{height:100%!important}.mw-100{max-width:100%!important}.mh-100{max-height:100%!important}.m-0{margin:0!important}.mt-0{margin-top:0!important}.mr-0{margin-right:0!important}.mb-0{margin-bottom:0!important}.ml-0{margin-left:0!important}.mx-0{margin-right:0!important;margin-left:0!important}.my-0{margin-top:0!important;margin-bottom:0!important}.m-1{margin:.25rem!important}.mt-1{margin-top:.25rem!important}.mr-1{margin-right:.25rem!important}.mb-1{margin-bottom:.25rem!important}.ml-1{margin-left:.25rem!important}.mx-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-2{margin:.5rem!important}.mt-2{margin-top:.5rem!important}.mr-2{margin-right:.5rem!important}.mb-2{margin-bottom:.5rem!important}.ml-2{margin-left:.5rem!important}.mx-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-3{margin:1rem!important}.mt-3{margin-top:1rem!important}.mr-3{margin-right:1rem!important}.mb-3{margin-bottom:1rem!important}.ml-3{margin-left:1rem!important}.mx-3{margin-right:1rem!important;margin-left:1rem!important}.my-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-4{margin:1.5rem!important}.mt-4{margin-top:1.5rem!important}.mr-4{margin-right:1.5rem!important}.mb-4{margin-bottom:1.5rem!important}.ml-4{margin-left:1.5rem!important}.mx-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-5{margin:3rem!important}.mt-5{margin-top:3rem!important}.mr-5{margin-right:3rem!important}.mb-5{margin-bottom:3rem!important}.ml-5{margin-left:3rem!important}.mx-5{margin-right:3rem!important;margin-left:3rem!important}.my-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-0{padding:0!important}.pt-0{padding-top:0!important}.pr-0{padding-right:0!important}.pb-0{padding-bottom:0!important}.pl-0{padding-left:0!important}.px-0{padding-right:0!important;padding-left:0!important}.py-0{padding-top:0!important;padding-bottom:0!important}.p-1{padding:.25rem!important}.pt-1{padding-top:.25rem!important}.pr-1{padding-right:.25rem!important}.pb-1{padding-bottom:.25rem!important}.pl-1{padding-left:.25rem!important}.px-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-2{padding:.5rem!important}.pt-2{padding-top:.5rem!important}.pr-2{padding-right:.5rem!important}.pb-2{padding-bottom:.5rem!important}.pl-2{padding-left:.5rem!important}.px-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-3{padding:1rem!important}.pt-3{padding-top:1rem!important}.pr-3{padding-right:1rem!important}.pb-3{padding-bottom:1rem!important}.pl-3{padding-left:1rem!important}.px-3{padding-right:1rem!important;padding-left:1rem!important}.py-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-4{padding:1.5rem!important}.pt-4{padding-top:1.5rem!important}.pr-4{padding-right:1.5rem!important}.pb-4{padding-bottom:1.5rem!important}.pl-4{padding-left:1.5rem!important}.px-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-5{padding:3rem!important}.pt-5{padding-top:3rem!important}.pr-5{padding-right:3rem!important}.pb-5{padding-bottom:3rem!important}.pl-5{padding-left:3rem!important}.px-5{padding-right:3rem!important;padding-left:3rem!important}.py-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-auto{margin:auto!important}.mt-auto{margin-top:auto!important}.mr-auto{margin-right:auto!important}.mb-auto{margin-bottom:auto!important}.ml-auto{margin-left:auto!important}.mx-auto{margin-right:auto!important;margin-left:auto!important}.my-auto{margin-top:auto!important;margin-bottom:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0{margin-top:0!important}.mr-sm-0{margin-right:0!important}.mb-sm-0{margin-bottom:0!important}.ml-sm-0{margin-left:0!important}.mx-sm-0{margin-right:0!important;margin-left:0!important}.my-sm-0{margin-top:0!important;margin-bottom:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1{margin-top:.25rem!important}.mr-sm-1{margin-right:.25rem!important}.mb-sm-1{margin-bottom:.25rem!important}.ml-sm-1{margin-left:.25rem!important}.mx-sm-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-sm-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2{margin-top:.5rem!important}.mr-sm-2{margin-right:.5rem!important}.mb-sm-2{margin-bottom:.5rem!important}.ml-sm-2{margin-left:.5rem!important}.mx-sm-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-sm-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3{margin-top:1rem!important}.mr-sm-3{margin-right:1rem!important}.mb-sm-3{margin-bottom:1rem!important}.ml-sm-3{margin-left:1rem!important}.mx-sm-3{margin-right:1rem!important;margin-left:1rem!important}.my-sm-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4{margin-top:1.5rem!important}.mr-sm-4{margin-right:1.5rem!important}.mb-sm-4{margin-bottom:1.5rem!important}.ml-sm-4{margin-left:1.5rem!important}.mx-sm-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-sm-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5{margin-top:3rem!important}.mr-sm-5{margin-right:3rem!important}.mb-sm-5{margin-bottom:3rem!important}.ml-sm-5{margin-left:3rem!important}.mx-sm-5{margin-right:3rem!important;margin-left:3rem!important}.my-sm-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0{padding-top:0!important}.pr-sm-0{padding-right:0!important}.pb-sm-0{padding-bottom:0!important}.pl-sm-0{padding-left:0!important}.px-sm-0{padding-right:0!important;padding-left:0!important}.py-sm-0{padding-top:0!important;padding-bottom:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1{padding-top:.25rem!important}.pr-sm-1{padding-right:.25rem!important}.pb-sm-1{padding-bottom:.25rem!important}.pl-sm-1{padding-left:.25rem!important}.px-sm-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-sm-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2{padding-top:.5rem!important}.pr-sm-2{padding-right:.5rem!important}.pb-sm-2{padding-bottom:.5rem!important}.pl-sm-2{padding-left:.5rem!important}.px-sm-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-sm-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3{padding-top:1rem!important}.pr-sm-3{padding-right:1rem!important}.pb-sm-3{padding-bottom:1rem!important}.pl-sm-3{padding-left:1rem!important}.px-sm-3{padding-right:1rem!important;padding-left:1rem!important}.py-sm-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4{padding-top:1.5rem!important}.pr-sm-4{padding-right:1.5rem!important}.pb-sm-4{padding-bottom:1.5rem!important}.pl-sm-4{padding-left:1.5rem!important}.px-sm-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-sm-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5{padding-top:3rem!important}.pr-sm-5{padding-right:3rem!important}.pb-sm-5{padding-bottom:3rem!important}.pl-sm-5{padding-left:3rem!important}.px-sm-5{padding-right:3rem!important;padding-left:3rem!important}.py-sm-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto{margin-top:auto!important}.mr-sm-auto{margin-right:auto!important}.mb-sm-auto{margin-bottom:auto!important}.ml-sm-auto{margin-left:auto!important}.mx-sm-auto{margin-right:auto!important;margin-left:auto!important}.my-sm-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0{margin-top:0!important}.mr-md-0{margin-right:0!important}.mb-md-0{margin-bottom:0!important}.ml-md-0{margin-left:0!important}.mx-md-0{margin-right:0!important;margin-left:0!important}.my-md-0{margin-top:0!important;margin-bottom:0!important}.m-md-1{margin:.25rem!important}.mt-md-1{margin-top:.25rem!important}.mr-md-1{margin-right:.25rem!important}.mb-md-1{margin-bottom:.25rem!important}.ml-md-1{margin-left:.25rem!important}.mx-md-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-md-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2{margin-top:.5rem!important}.mr-md-2{margin-right:.5rem!important}.mb-md-2{margin-bottom:.5rem!important}.ml-md-2{margin-left:.5rem!important}.mx-md-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-md-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3{margin-top:1rem!important}.mr-md-3{margin-right:1rem!important}.mb-md-3{margin-bottom:1rem!important}.ml-md-3{margin-left:1rem!important}.mx-md-3{margin-right:1rem!important;margin-left:1rem!important}.my-md-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4{margin-top:1.5rem!important}.mr-md-4{margin-right:1.5rem!important}.mb-md-4{margin-bottom:1.5rem!important}.ml-md-4{margin-left:1.5rem!important}.mx-md-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-md-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5{margin-top:3rem!important}.mr-md-5{margin-right:3rem!important}.mb-md-5{margin-bottom:3rem!important}.ml-md-5{margin-left:3rem!important}.mx-md-5{margin-right:3rem!important;margin-left:3rem!important}.my-md-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-md-0{padding:0!important}.pt-md-0{padding-top:0!important}.pr-md-0{padding-right:0!important}.pb-md-0{padding-bottom:0!important}.pl-md-0{padding-left:0!important}.px-md-0{padding-right:0!important;padding-left:0!important}.py-md-0{padding-top:0!important;padding-bottom:0!important}.p-md-1{padding:.25rem!important}.pt-md-1{padding-top:.25rem!important}.pr-md-1{padding-right:.25rem!important}.pb-md-1{padding-bottom:.25rem!important}.pl-md-1{padding-left:.25rem!important}.px-md-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-md-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2{padding-top:.5rem!important}.pr-md-2{padding-right:.5rem!important}.pb-md-2{padding-bottom:.5rem!important}.pl-md-2{padding-left:.5rem!important}.px-md-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-md-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3{padding-top:1rem!important}.pr-md-3{padding-right:1rem!important}.pb-md-3{padding-bottom:1rem!important}.pl-md-3{padding-left:1rem!important}.px-md-3{padding-right:1rem!important;padding-left:1rem!important}.py-md-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4{padding-top:1.5rem!important}.pr-md-4{padding-right:1.5rem!important}.pb-md-4{padding-bottom:1.5rem!important}.pl-md-4{padding-left:1.5rem!important}.px-md-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-md-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5{padding-top:3rem!important}.pr-md-5{padding-right:3rem!important}.pb-md-5{padding-bottom:3rem!important}.pl-md-5{padding-left:3rem!important}.px-md-5{padding-right:3rem!important;padding-left:3rem!important}.py-md-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto{margin-top:auto!important}.mr-md-auto{margin-right:auto!important}.mb-md-auto{margin-bottom:auto!important}.ml-md-auto{margin-left:auto!important}.mx-md-auto{margin-right:auto!important;margin-left:auto!important}.my-md-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0{margin-top:0!important}.mr-lg-0{margin-right:0!important}.mb-lg-0{margin-bottom:0!important}.ml-lg-0{margin-left:0!important}.mx-lg-0{margin-right:0!important;margin-left:0!important}.my-lg-0{margin-top:0!important;margin-bottom:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1{margin-top:.25rem!important}.mr-lg-1{margin-right:.25rem!important}.mb-lg-1{margin-bottom:.25rem!important}.ml-lg-1{margin-left:.25rem!important}.mx-lg-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-lg-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2{margin-top:.5rem!important}.mr-lg-2{margin-right:.5rem!important}.mb-lg-2{margin-bottom:.5rem!important}.ml-lg-2{margin-left:.5rem!important}.mx-lg-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-lg-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3{margin-top:1rem!important}.mr-lg-3{margin-right:1rem!important}.mb-lg-3{margin-bottom:1rem!important}.ml-lg-3{margin-left:1rem!important}.mx-lg-3{margin-right:1rem!important;margin-left:1rem!important}.my-lg-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4{margin-top:1.5rem!important}.mr-lg-4{margin-right:1.5rem!important}.mb-lg-4{margin-bottom:1.5rem!important}.ml-lg-4{margin-left:1.5rem!important}.mx-lg-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-lg-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5{margin-top:3rem!important}.mr-lg-5{margin-right:3rem!important}.mb-lg-5{margin-bottom:3rem!important}.ml-lg-5{margin-left:3rem!important}.mx-lg-5{margin-right:3rem!important;margin-left:3rem!important}.my-lg-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0{padding-top:0!important}.pr-lg-0{padding-right:0!important}.pb-lg-0{padding-bottom:0!important}.pl-lg-0{padding-left:0!important}.px-lg-0{padding-right:0!important;padding-left:0!important}.py-lg-0{padding-top:0!important;padding-bottom:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1{padding-top:.25rem!important}.pr-lg-1{padding-right:.25rem!important}.pb-lg-1{padding-bottom:.25rem!important}.pl-lg-1{padding-left:.25rem!important}.px-lg-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-lg-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2{padding-top:.5rem!important}.pr-lg-2{padding-right:.5rem!important}.pb-lg-2{padding-bottom:.5rem!important}.pl-lg-2{padding-left:.5rem!important}.px-lg-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-lg-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3{padding-top:1rem!important}.pr-lg-3{padding-right:1rem!important}.pb-lg-3{padding-bottom:1rem!important}.pl-lg-3{padding-left:1rem!important}.px-lg-3{padding-right:1rem!important;padding-left:1rem!important}.py-lg-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4{padding-top:1.5rem!important}.pr-lg-4{padding-right:1.5rem!important}.pb-lg-4{padding-bottom:1.5rem!important}.pl-lg-4{padding-left:1.5rem!important}.px-lg-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-lg-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5{padding-top:3rem!important}.pr-lg-5{padding-right:3rem!important}.pb-lg-5{padding-bottom:3rem!important}.pl-lg-5{padding-left:3rem!important}.px-lg-5{padding-right:3rem!important;padding-left:3rem!important}.py-lg-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto{margin-top:auto!important}.mr-lg-auto{margin-right:auto!important}.mb-lg-auto{margin-bottom:auto!important}.ml-lg-auto{margin-left:auto!important}.mx-lg-auto{margin-right:auto!important;margin-left:auto!important}.my-lg-auto{margin-top:auto!important;margin-bottom:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0{margin-top:0!important}.mr-xl-0{margin-right:0!important}.mb-xl-0{margin-bottom:0!important}.ml-xl-0{margin-left:0!important}.mx-xl-0{margin-right:0!important;margin-left:0!important}.my-xl-0{margin-top:0!important;margin-bottom:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1{margin-top:.25rem!important}.mr-xl-1{margin-right:.25rem!important}.mb-xl-1{margin-bottom:.25rem!important}.ml-xl-1{margin-left:.25rem!important}.mx-xl-1{margin-right:.25rem!important;margin-left:.25rem!important}.my-xl-1{margin-top:.25rem!important;margin-bottom:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2{margin-top:.5rem!important}.mr-xl-2{margin-right:.5rem!important}.mb-xl-2{margin-bottom:.5rem!important}.ml-xl-2{margin-left:.5rem!important}.mx-xl-2{margin-right:.5rem!important;margin-left:.5rem!important}.my-xl-2{margin-top:.5rem!important;margin-bottom:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3{margin-top:1rem!important}.mr-xl-3{margin-right:1rem!important}.mb-xl-3{margin-bottom:1rem!important}.ml-xl-3{margin-left:1rem!important}.mx-xl-3{margin-right:1rem!important;margin-left:1rem!important}.my-xl-3{margin-top:1rem!important;margin-bottom:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4{margin-top:1.5rem!important}.mr-xl-4{margin-right:1.5rem!important}.mb-xl-4{margin-bottom:1.5rem!important}.ml-xl-4{margin-left:1.5rem!important}.mx-xl-4{margin-right:1.5rem!important;margin-left:1.5rem!important}.my-xl-4{margin-top:1.5rem!important;margin-bottom:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5{margin-top:3rem!important}.mr-xl-5{margin-right:3rem!important}.mb-xl-5{margin-bottom:3rem!important}.ml-xl-5{margin-left:3rem!important}.mx-xl-5{margin-right:3rem!important;margin-left:3rem!important}.my-xl-5{margin-top:3rem!important;margin-bottom:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0{padding-top:0!important}.pr-xl-0{padding-right:0!important}.pb-xl-0{padding-bottom:0!important}.pl-xl-0{padding-left:0!important}.px-xl-0{padding-right:0!important;padding-left:0!important}.py-xl-0{padding-top:0!important;padding-bottom:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1{padding-top:.25rem!important}.pr-xl-1{padding-right:.25rem!important}.pb-xl-1{padding-bottom:.25rem!important}.pl-xl-1{padding-left:.25rem!important}.px-xl-1{padding-right:.25rem!important;padding-left:.25rem!important}.py-xl-1{padding-top:.25rem!important;padding-bottom:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2{padding-top:.5rem!important}.pr-xl-2{padding-right:.5rem!important}.pb-xl-2{padding-bottom:.5rem!important}.pl-xl-2{padding-left:.5rem!important}.px-xl-2{padding-right:.5rem!important;padding-left:.5rem!important}.py-xl-2{padding-top:.5rem!important;padding-bottom:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3{padding-top:1rem!important}.pr-xl-3{padding-right:1rem!important}.pb-xl-3{padding-bottom:1rem!important}.pl-xl-3{padding-left:1rem!important}.px-xl-3{padding-right:1rem!important;padding-left:1rem!important}.py-xl-3{padding-top:1rem!important;padding-bottom:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4{padding-top:1.5rem!important}.pr-xl-4{padding-right:1.5rem!important}.pb-xl-4{padding-bottom:1.5rem!important}.pl-xl-4{padding-left:1.5rem!important}.px-xl-4{padding-right:1.5rem!important;padding-left:1.5rem!important}.py-xl-4{padding-top:1.5rem!important;padding-bottom:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5{padding-top:3rem!important}.pr-xl-5{padding-right:3rem!important}.pb-xl-5{padding-bottom:3rem!important}.pl-xl-5{padding-left:3rem!important}.px-xl-5{padding-right:3rem!important;padding-left:3rem!important}.py-xl-5{padding-top:3rem!important;padding-bottom:3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto{margin-top:auto!important}.mr-xl-auto{margin-right:auto!important}.mb-xl-auto{margin-bottom:auto!important}.ml-xl-auto{margin-left:auto!important}.mx-xl-auto{margin-right:auto!important;margin-left:auto!important}.my-xl-auto{margin-top:auto!important;margin-bottom:auto!important}}.text-justify{text-align:justify!important}.text-nowrap{white-space:nowrap!important}.text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text-left{text-align:left!important}.text-right{text-align:right!important}.text-center{text-align:center!important}@media (min-width:576px){.text-sm-left{text-align:left!important}.text-sm-right{text-align:right!important}.text-sm-center{text-align:center!important}}@media (min-width:768px){.text-md-left{text-align:left!important}.text-md-right{text-align:right!important}.text-md-center{text-align:center!important}}@media (min-width:992px){.text-lg-left{text-align:left!important}.text-lg-right{text-align:right!important}.text-lg-center{text-align:center!important}}@media (min-width:1200px){.text-xl-left{text-align:left!important}.text-xl-right{text-align:right!important}.text-xl-center{text-align:center!important}}.text-lowercase{text-transform:lowercase!important}.text-uppercase{text-transform:uppercase!important}.text-capitalize{text-transform:capitalize!important}.font-weight-normal{font-weight:400}.font-weight-bold{font-weight:700}.font-italic{font-style:italic}.text-white{color:#fff!important}.text-primary{color:#007bff!important}a.text-primary:focus,a.text-primary:hover{color:#0062cc!important}.text-secondary{color:#868e96!important}a.text-secondary:focus,a.text-secondary:hover{color:#6c757d!important}.text-success{color:#28a745!important}a.text-success:focus,a.text-success:hover{color:#1e7e34!important}.text-info{color:#17a2b8!important}a.text-info:focus,a.text-info:hover{color:#117a8b!important}.text-warning{color:#ffc107!important}a.text-warning:focus,a.text-warning:hover{color:#d39e00!important}.text-danger{color:#dc3545!important}a.text-danger:focus,a.text-danger:hover{color:#bd2130!important}.text-light{color:#f8f9fa!important}a.text-light:focus,a.text-light:hover{color:#dae0e5!important}.text-dark{color:#343a40!important}a.text-dark:focus,a.text-dark:hover{color:#1d2124!important}.text-muted{color:#868e96!important}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.visible{visibility:visible!important}.invisible{visibility:hidden!important}
-/*# sourceMappingURL=bootstrap.min.css.map */
\ No newline at end of file
diff --git a/standalone/lib/ext/bootstrap.min.js b/standalone/lib/ext/bootstrap.min.js
deleted file mode 100644
index e1874769..00000000
--- a/standalone/lib/ext/bootstrap.min.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*!
- * Bootstrap v4.0.0-beta (https://getbootstrap.com)
- * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");!function(t){var e=jQuery.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1==e[0]&&9==e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(),function(){function t(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function e(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function n(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=function(){function t(t,e){for(var n=0;n0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(s.end)},supportsTransitionEnd:function(){return Boolean(s)},typeCheckConfig:function(t,i,o){for(var r in o)if(o.hasOwnProperty(r)){var s=o[r],a=i[r],l=a&&n(a)?"element":e(a);if(!new RegExp(s).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+s+'".')}}};return s=o(),t.fn.emulateTransitionEnd=r,l.supportsTransitionEnd()&&(t.event.special[l.TRANSITION_END]=i()),l}(jQuery),s=(function(t){var e="alert",i=t.fn[e],s={DISMISS:'[data-dismiss="alert"]'},a={CLOSE:"close.bs.alert",CLOSED:"closed.bs.alert",CLICK_DATA_API:"click.bs.alert.data-api"},l={ALERT:"alert",FADE:"fade",SHOW:"show"},h=function(){function e(t){n(this,e),this._element=t}return e.prototype.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},e.prototype.dispose=function(){t.removeData(this._element,"bs.alert"),this._element=null},e.prototype._getRootElement=function(e){var n=r.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l.ALERT)[0]),i},e.prototype._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},e.prototype._removeElement=function(e){var n=this;t(e).removeClass(l.SHOW),r.supportsTransitionEnd()&&t(e).hasClass(l.FADE)?t(e).one(r.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150):this._destroyElement(e)},e.prototype._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.alert");o||(o=new e(this),i.data("bs.alert",o)),"close"===n&&o[n](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DISMISS,h._handleDismiss(new h)),t.fn[e]=h._jQueryInterface,t.fn[e].Constructor=h,t.fn[e].noConflict=function(){return t.fn[e]=i,h._jQueryInterface}}(jQuery),function(t){var e="button",i=t.fn[e],r={ACTIVE:"active",BUTTON:"btn",FOCUS:"focus"},s={DATA_TOGGLE_CARROT:'[data-toggle^="button"]',DATA_TOGGLE:'[data-toggle="buttons"]',INPUT:"input",ACTIVE:".active",BUTTON:".btn"},a={CLICK_DATA_API:"click.bs.button.data-api",FOCUS_BLUR_DATA_API:"focus.bs.button.data-api blur.bs.button.data-api"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(s.DATA_TOGGLE)[0];if(i){var o=t(this._element).find(s.INPUT)[0];if(o){if("radio"===o.type)if(o.checked&&t(this._element).hasClass(r.ACTIVE))e=!1;else{var a=t(i).find(s.ACTIVE)[0];a&&t(a).removeClass(r.ACTIVE)}if(e){if(o.hasAttribute("disabled")||i.hasAttribute("disabled")||o.classList.contains("disabled")||i.classList.contains("disabled"))return;o.checked=!t(this._element).hasClass(r.ACTIVE),t(o).trigger("change")}o.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(r.ACTIVE)),e&&t(this._element).toggleClass(r.ACTIVE)},e.prototype.dispose=function(){t.removeData(this._element,"bs.button"),this._element=null},e._jQueryInterface=function(n){return this.each(function(){var i=t(this).data("bs.button");i||(i=new e(this),t(this).data("bs.button",i)),"toggle"===n&&i[n]()})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(a.CLICK_DATA_API,s.DATA_TOGGLE_CARROT,function(e){e.preventDefault();var n=e.target;t(n).hasClass(r.BUTTON)||(n=t(n).closest(s.BUTTON)),l._jQueryInterface.call(t(n),"toggle")}).on(a.FOCUS_BLUR_DATA_API,s.DATA_TOGGLE_CARROT,function(e){var n=t(e.target).closest(s.BUTTON)[0];t(n).toggleClass(r.FOCUS,/^focus(in)?$/.test(e.type))}),t.fn[e]=l._jQueryInterface,t.fn[e].Constructor=l,t.fn[e].noConflict=function(){return t.fn[e]=i,l._jQueryInterface}}(jQuery),function(t){var e="carousel",s="bs.carousel",a="."+s,l=t.fn[e],h={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},c={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},u={NEXT:"next",PREV:"prev",LEFT:"left",RIGHT:"right"},d={SLIDE:"slide"+a,SLID:"slid"+a,KEYDOWN:"keydown"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a,TOUCHEND:"touchend"+a,LOAD_DATA_API:"load.bs.carousel.data-api",CLICK_DATA_API:"click.bs.carousel.data-api"},f={CAROUSEL:"carousel",ACTIVE:"active",SLIDE:"slide",RIGHT:"carousel-item-right",LEFT:"carousel-item-left",NEXT:"carousel-item-next",PREV:"carousel-item-prev",ITEM:"carousel-item"},p={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},_=function(){function l(e,i){n(this,l),this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(i),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(p.INDICATORS)[0],this._addEventListeners()}return l.prototype.next=function(){this._isSliding||this._slide(u.NEXT)},l.prototype.nextWhenVisible=function(){document.hidden||this.next()},l.prototype.prev=function(){this._isSliding||this._slide(u.PREV)},l.prototype.pause=function(e){e||(this._isPaused=!0),t(this._element).find(p.NEXT_PREV)[0]&&r.supportsTransitionEnd()&&(r.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},l.prototype.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},l.prototype.to=function(e){var n=this;this._activeElement=t(this._element).find(p.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(d.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var o=e>i?u.NEXT:u.PREV;this._slide(o,this._items[e])}},l.prototype.dispose=function(){t(this._element).off(a),t.removeData(this._element,s),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},l.prototype._getConfig=function(n){return n=t.extend({},h,n),r.typeCheckConfig(e,n,c),n},l.prototype._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(d.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(d.MOUSEENTER,function(t){return e.pause(t)}).on(d.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(d.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},l.prototype._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},l.prototype._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(p.ITEM)),this._items.indexOf(e)},l.prototype._getItemByDirection=function(t,e){var n=t===u.NEXT,i=t===u.PREV,o=this._getItemIndex(e),r=this._items.length-1;if((i&&0===o||n&&o===r)&&!this._config.wrap)return e;var s=(o+(t===u.PREV?-1:1))%this._items.length;return-1===s?this._items[this._items.length-1]:this._items[s]},l.prototype._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),o=this._getItemIndex(t(this._element).find(p.ACTIVE_ITEM)[0]),r=t.Event(d.SLIDE,{relatedTarget:e,direction:n,from:o,to:i});return t(this._element).trigger(r),r},l.prototype._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(p.ACTIVE).removeClass(f.ACTIVE);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(f.ACTIVE)}},l.prototype._slide=function(e,n){var i=this,o=t(this._element).find(p.ACTIVE_ITEM)[0],s=this._getItemIndex(o),a=n||o&&this._getItemByDirection(e,o),l=this._getItemIndex(a),h=Boolean(this._interval),c=void 0,_=void 0,g=void 0;if(e===u.NEXT?(c=f.LEFT,_=f.NEXT,g=u.LEFT):(c=f.RIGHT,_=f.PREV,g=u.RIGHT),a&&t(a).hasClass(f.ACTIVE))this._isSliding=!1;else if(!this._triggerSlideEvent(a,g).isDefaultPrevented()&&o&&a){this._isSliding=!0,h&&this.pause(),this._setActiveIndicatorElement(a);var m=t.Event(d.SLID,{relatedTarget:a,direction:g,from:s,to:l});r.supportsTransitionEnd()&&t(this._element).hasClass(f.SLIDE)?(t(a).addClass(_),r.reflow(a),t(o).addClass(c),t(a).addClass(c),t(o).one(r.TRANSITION_END,function(){t(a).removeClass(c+" "+_).addClass(f.ACTIVE),t(o).removeClass(f.ACTIVE+" "+_+" "+c),i._isSliding=!1,setTimeout(function(){return t(i._element).trigger(m)},0)}).emulateTransitionEnd(600)):(t(o).removeClass(f.ACTIVE),t(a).addClass(f.ACTIVE),this._isSliding=!1,t(this._element).trigger(m)),h&&this.cycle()}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o=t.extend({},h,t(this).data());"object"===(void 0===e?"undefined":i(e))&&t.extend(o,e);var r="string"==typeof e?e:o.slide;if(n||(n=new l(this,o),t(this).data(s,n)),"number"==typeof e)n.to(e);else if("string"==typeof r){if(void 0===n[r])throw new Error('No method named "'+r+'"');n[r]()}else o.interval&&(n.pause(),n.cycle())})},l._dataApiClickHandler=function(e){var n=r.getSelectorFromElement(this);if(n){var i=t(n)[0];if(i&&t(i).hasClass(f.CAROUSEL)){var o=t.extend({},t(i).data(),t(this).data()),a=this.getAttribute("data-slide-to");a&&(o.interval=!1),l._jQueryInterface.call(t(i),o),a&&t(i).data(s).to(a),e.preventDefault()}}},o(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return h}}]),l}();t(document).on(d.CLICK_DATA_API,p.DATA_SLIDE,_._dataApiClickHandler),t(window).on(d.LOAD_DATA_API,function(){t(p.DATA_RIDE).each(function(){var e=t(this);_._jQueryInterface.call(e,e.data())})}),t.fn[e]=_._jQueryInterface,t.fn[e].Constructor=_,t.fn[e].noConflict=function(){return t.fn[e]=l,_._jQueryInterface}}(jQuery),function(t){var e="collapse",s="bs.collapse",a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"string"},c={SHOW:"show.bs.collapse",SHOWN:"shown.bs.collapse",HIDE:"hide.bs.collapse",HIDDEN:"hidden.bs.collapse",CLICK_DATA_API:"click.bs.collapse.data-api"},u={SHOW:"show",COLLAPSE:"collapse",COLLAPSING:"collapsing",COLLAPSED:"collapsed"},d={WIDTH:"width",HEIGHT:"height"},f={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},p=function(){function a(e,i){n(this,a),this._isTransitioning=!1,this._element=e,this._config=this._getConfig(i),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var o=t(f.DATA_TOGGLE),s=0;s0&&this._triggerArray.push(l)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}return a.prototype.toggle=function(){t(this._element).hasClass(u.SHOW)?this.hide():this.show()},a.prototype.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u.SHOW)){var n=void 0,i=void 0;if(this._parent&&((n=t.makeArray(t(this._parent).children().children(f.ACTIVES))).length||(n=null)),!(n&&(i=t(n).data(s))&&i._isTransitioning)){var o=t.Event(c.SHOW);if(t(this._element).trigger(o),!o.isDefaultPrevented()){n&&(a._jQueryInterface.call(t(n),"hide"),i||t(n).data(s,null));var l=this._getDimension();t(this._element).removeClass(u.COLLAPSE).addClass(u.COLLAPSING),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(u.COLLAPSED).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(u.COLLAPSING).addClass(u.COLLAPSE).addClass(u.SHOW),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(r.supportsTransitionEnd()){var d="scroll"+(l[0].toUpperCase()+l.slice(1));t(this._element).one(r.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[d]+"px"}else h()}}}},a.prototype.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u.SHOW)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",r.reflow(this._element),t(this._element).addClass(u.COLLAPSING).removeClass(u.COLLAPSE).removeClass(u.SHOW),this._triggerArray.length)for(var o=0;o0},l.prototype._getPopperConfig=function(){var t={placement:this._getPlacement(),modifiers:{offset:{offset:this._config.offset},flip:{enabled:this._config.flip}}};return this._inNavbar&&(t.modifiers.applyStyle={enabled:!this._inNavbar}),t},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(s),o="object"===(void 0===e?"undefined":i(e))?e:null;if(n||(n=new l(this,o),t(this).data(s,n)),"string"==typeof e){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},l._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(d.DATA_TOGGLE)),i=0;i0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},a.prototype._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},a.prototype._checkScrollbar=function(){this._isBodyOverflowing=document.body.clientWidth=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var o=this._offsets.length;o--;)this._activeTarget!==this._targets[o]&&t>=this._offsets[o]&&(void 0===this._offsets[o+1]||t .dropdown-menu .active"},l=function(){function e(t){n(this,e),this._element=t}return e.prototype.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(s.ACTIVE)||t(this._element).hasClass(s.DISABLED))){var n=void 0,o=void 0,l=t(this._element).closest(a.NAV_LIST_GROUP)[0],h=r.getSelectorFromElement(this._element);l&&(o=t.makeArray(t(l).find(a.ACTIVE)),o=o[o.length-1]);var c=t.Event(i.HIDE,{relatedTarget:this._element}),u=t.Event(i.SHOW,{relatedTarget:o});if(o&&t(o).trigger(c),t(this._element).trigger(u),!u.isDefaultPrevented()&&!c.isDefaultPrevented()){h&&(n=t(h)[0]),this._activate(this._element,l);var d=function(){var n=t.Event(i.HIDDEN,{relatedTarget:e._element}),r=t.Event(i.SHOWN,{relatedTarget:o});t(o).trigger(n),t(e._element).trigger(r)};n?this._activate(n,n.parentNode,d):d()}}},e.prototype.dispose=function(){t.removeData(this._element,"bs.tab"),this._element=null},e.prototype._activate=function(e,n,i){var o=this,l=t(n).find(a.ACTIVE)[0],h=i&&r.supportsTransitionEnd()&&l&&t(l).hasClass(s.FADE),c=function(){return o._transitionComplete(e,l,h,i)};l&&h?t(l).one(r.TRANSITION_END,c).emulateTransitionEnd(150):c(),l&&t(l).removeClass(s.SHOW)},e.prototype._transitionComplete=function(e,n,i,o){if(n){t(n).removeClass(s.ACTIVE);var l=t(n.parentNode).find(a.DROPDOWN_ACTIVE_CHILD)[0];l&&t(l).removeClass(s.ACTIVE),n.setAttribute("aria-expanded",!1)}if(t(e).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0),i?(r.reflow(e),t(e).addClass(s.SHOW)):t(e).removeClass(s.FADE),e.parentNode&&t(e.parentNode).hasClass(s.DROPDOWN_MENU)){var h=t(e).closest(a.DROPDOWN)[0];h&&t(h).find(a.DROPDOWN_TOGGLE).addClass(s.ACTIVE),e.setAttribute("aria-expanded",!0)}o&&o()},e._jQueryInterface=function(n){return this.each(function(){var i=t(this),o=i.data("bs.tab");if(o||(o=new e(this),i.data("bs.tab",o)),"string"==typeof n){if(void 0===o[n])throw new Error('No method named "'+n+'"');o[n]()}})},o(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}}]),e}();t(document).on(i.CLICK_DATA_API,a.DATA_TOGGLE,function(e){e.preventDefault(),l._jQueryInterface.call(t(this),"show")}),t.fn.tab=l._jQueryInterface,t.fn.tab.Constructor=l,t.fn.tab.noConflict=function(){return t.fn.tab=e,l._jQueryInterface}}(jQuery),function(t){if("undefined"==typeof Popper)throw new Error("Bootstrap tooltips require Popper.js (https://popper.js.org)");var e="tooltip",s=".bs.tooltip",a=t.fn[e],l=new RegExp("(^|\\s)bs-tooltip\\S+","g"),h={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)"},c={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},u={animation:!0,template:'',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip"},d={SHOW:"show",OUT:"out"},f={HIDE:"hide"+s,HIDDEN:"hidden"+s,SHOW:"show"+s,SHOWN:"shown"+s,INSERTED:"inserted"+s,CLICK:"click"+s,FOCUSIN:"focusin"+s,FOCUSOUT:"focusout"+s,MOUSEENTER:"mouseenter"+s,MOUSELEAVE:"mouseleave"+s},p={FADE:"fade",SHOW:"show"},_={TOOLTIP:".tooltip",TOOLTIP_INNER:".tooltip-inner",ARROW:".arrow"},g={HOVER:"hover",FOCUS:"focus",CLICK:"click",MANUAL:"manual"},m=function(){function a(t,e){n(this,a),this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}return a.prototype.enable=function(){this._isEnabled=!0},a.prototype.disable=function(){this._isEnabled=!1},a.prototype.toggleEnabled=function(){this._isEnabled=!this._isEnabled},a.prototype.toggle=function(e){if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p.SHOW))return void this._leave(null,this);this._enter(null,this)}},a.prototype.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},a.prototype.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var n=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(n);var i=t.contains(this.element.ownerDocument.documentElement,this.element);if(n.isDefaultPrevented()||!i)return;var o=this.getTipElement(),s=r.getUID(this.constructor.NAME);o.setAttribute("id",s),this.element.setAttribute("aria-describedby",s),this.setContent(),this.config.animation&&t(o).addClass(p.FADE);var l="function"==typeof this.config.placement?this.config.placement.call(this,o,this.element):this.config.placement,h=this._getAttachment(l);this.addAttachmentClass(h);var c=!1===this.config.container?document.body:t(this.config.container);t(o).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(o).appendTo(c),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new Popper(this.element,o,{placement:h,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:_.ARROW}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(o).addClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var u=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===d.OUT&&e._leave(null,e)};r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(this.tip).one(r.TRANSITION_END,u).emulateTransitionEnd(a._TRANSITION_DURATION):u()}},a.prototype.hide=function(e){var n=this,i=this.getTipElement(),o=t.Event(this.constructor.Event.HIDE),s=function(){n._hoverState!==d.SHOW&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(o),o.isDefaultPrevented()||(t(i).removeClass(p.SHOW),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[g.CLICK]=!1,this._activeTrigger[g.FOCUS]=!1,this._activeTrigger[g.HOVER]=!1,r.supportsTransitionEnd()&&t(this.tip).hasClass(p.FADE)?t(i).one(r.TRANSITION_END,s).emulateTransitionEnd(150):s(),this._hoverState="")},a.prototype.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},a.prototype.isWithContent=function(){return Boolean(this.getTitle())},a.prototype.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},a.prototype.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0]},a.prototype.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(_.TOOLTIP_INNER),this.getTitle()),e.removeClass(p.FADE+" "+p.SHOW)},a.prototype.setElementContent=function(e,n){var o=this.config.html;"object"===(void 0===n?"undefined":i(n))&&(n.nodeType||n.jquery)?o?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[o?"html":"text"](n)},a.prototype.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},a.prototype._getAttachment=function(t){return c[t.toUpperCase()]},a.prototype._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==g.MANUAL){var i=n===g.HOVER?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,o=n===g.HOVER?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(o,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=t.extend({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},a.prototype._fixTitle=function(){var t=i(this.element.getAttribute("data-original-title"));(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},a.prototype._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?g.FOCUS:g.HOVER]=!0),t(n.getTipElement()).hasClass(p.SHOW)||n._hoverState===d.SHOW?n._hoverState=d.SHOW:(clearTimeout(n._timeout),n._hoverState=d.SHOW,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===d.SHOW&&n.show()},n.config.delay.show):n.show())},a.prototype._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?g.FOCUS:g.HOVER]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=d.OUT,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===d.OUT&&n.hide()},n.config.delay.hide):n.hide())},a.prototype._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},a.prototype._getConfig=function(n){return(n=t.extend({},this.constructor.Default,t(this.element).data(),n)).delay&&"number"==typeof n.delay&&(n.delay={show:n.delay,hide:n.delay}),n.title&&"number"==typeof n.title&&(n.title=n.title.toString()),n.content&&"number"==typeof n.content&&(n.content=n.content.toString()),r.typeCheckConfig(e,n,this.constructor.DefaultType),n},a.prototype._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},a.prototype._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(l);null!==n&&n.length>0&&e.removeClass(n.join(""))},a.prototype._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},a.prototype._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(p.FADE),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},a._jQueryInterface=function(e){return this.each(function(){var n=t(this).data("bs.tooltip"),o="object"===(void 0===e?"undefined":i(e))&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new a(this,o),t(this).data("bs.tooltip",n)),"string"==typeof e)){if(void 0===n[e])throw new Error('No method named "'+e+'"');n[e]()}})},o(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return"bs.tooltip"}},{key:"Event",get:function(){return f}},{key:"EVENT_KEY",get:function(){return s}},{key:"DefaultType",get:function(){return h}}]),a}();return t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=a,m._jQueryInterface},m}(jQuery));!function(r){var a="popover",l=".bs.popover",h=r.fn[a],c=new RegExp("(^|\\s)bs-popover\\S+","g"),u=r.extend({},s.Default,{placement:"right",trigger:"click",content:"",template:''}),d=r.extend({},s.DefaultType,{content:"(string|element|function)"}),f={FADE:"fade",SHOW:"show"},p={TITLE:".popover-header",CONTENT:".popover-body"},_={HIDE:"hide"+l,HIDDEN:"hidden"+l,SHOW:"show"+l,SHOWN:"shown"+l,INSERTED:"inserted"+l,CLICK:"click"+l,FOCUSIN:"focusin"+l,FOCUSOUT:"focusout"+l,MOUSEENTER:"mouseenter"+l,MOUSELEAVE:"mouseleave"+l},g=function(s){function h(){return n(this,h),t(this,s.apply(this,arguments))}return e(h,s),h.prototype.isWithContent=function(){return this.getTitle()||this._getContent()},h.prototype.addAttachmentClass=function(t){r(this.getTipElement()).addClass("bs-popover-"+t)},h.prototype.getTipElement=function(){return this.tip=this.tip||r(this.config.template)[0]},h.prototype.setContent=function(){var t=r(this.getTipElement());this.setElementContent(t.find(p.TITLE),this.getTitle()),this.setElementContent(t.find(p.CONTENT),this._getContent()),t.removeClass(f.FADE+" "+f.SHOW)},h.prototype._getContent=function(){return this.element.getAttribute("data-content")||("function"==typeof this.config.content?this.config.content.call(this.element):this.config.content)},h.prototype._cleanTipClass=function(){var t=r(this.getTipElement()),e=t.attr("class").match(c);null!==e&&e.length>0&&t.removeClass(e.join(""))},h._jQueryInterface=function(t){return this.each(function(){var e=r(this).data("bs.popover"),n="object"===(void 0===t?"undefined":i(t))?t:null;if((e||!/destroy|hide/.test(t))&&(e||(e=new h(this,n),r(this).data("bs.popover",e)),"string"==typeof t)){if(void 0===e[t])throw new Error('No method named "'+t+'"');e[t]()}})},o(h,null,[{key:"VERSION",get:function(){return"4.0.0-beta"}},{key:"Default",get:function(){return u}},{key:"NAME",get:function(){return a}},{key:"DATA_KEY",get:function(){return"bs.popover"}},{key:"Event",get:function(){return _}},{key:"EVENT_KEY",get:function(){return l}},{key:"DefaultType",get:function(){return d}}]),h}(s);r.fn[a]=g._jQueryInterface,r.fn[a].Constructor=g,r.fn[a].noConflict=function(){return r.fn[a]=h,g._jQueryInterface}}(jQuery)}();
\ No newline at end of file
diff --git a/standalone/lib/ext/canvas2svg.js b/standalone/lib/ext/canvas2svg.js
deleted file mode 100644
index f71d3598..00000000
--- a/standalone/lib/ext/canvas2svg.js
+++ /dev/null
@@ -1,1214 +0,0 @@
-/*!!
- * Canvas 2 Svg v1.0.19
- * A low level canvas to SVG converter. Uses a mock canvas context to build an SVG document.
- *
- * Licensed under the MIT license:
- * http://www.opensource.org/licenses/mit-license.php
- *
- * Author:
- * Kerry Liu
- *
- * Copyright (c) 2014 Gliffy Inc.
- */
-
-;(function () {
- "use strict";
-
- var STYLES, ctx, CanvasGradient, CanvasPattern, namedEntities;
-
- //helper function to format a string
- function format(str, args) {
- var keys = Object.keys(args), i;
- for (i=0; i 1) {
- options = defaultOptions;
- options.width = arguments[0];
- options.height = arguments[1];
- } else if ( !o ) {
- options = defaultOptions;
- } else {
- options = o;
- }
-
- if (!(this instanceof ctx)) {
- //did someone call this without new?
- return new ctx(options);
- }
-
- //setup options
- this.width = options.width || defaultOptions.width;
- this.height = options.height || defaultOptions.height;
- this.enableMirroring = options.enableMirroring !== undefined ? options.enableMirroring : defaultOptions.enableMirroring;
-
- this.canvas = this; ///point back to this instance!
- this.__document = options.document || document;
-
- // allow passing in an existing context to wrap around
- // if a context is passed in, we know a canvas already exist
- if (options.ctx) {
- this.__ctx = options.ctx;
- } else {
- this.__canvas = this.__document.createElement("canvas");
- this.__ctx = this.__canvas.getContext("2d");
- }
-
- this.__setDefaultStyles();
- this.__stack = [this.__getStyleState()];
- this.__groupStack = [];
-
- //the root svg element
- this.__root = this.__document.createElementNS("http://www.w3.org/2000/svg", "svg");
- this.__root.setAttribute("version", 1.1);
- this.__root.setAttribute("xmlns", "http://www.w3.org/2000/svg");
- this.__root.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
- this.__root.setAttribute("width", this.width);
- this.__root.setAttribute("height", this.height);
-
- //make sure we don't generate the same ids in defs
- this.__ids = {};
-
- //defs tag
- this.__defs = this.__document.createElementNS("http://www.w3.org/2000/svg", "defs");
- this.__root.appendChild(this.__defs);
-
- //also add a group child. the svg element can't use the transform attribute
- this.__currentElement = this.__document.createElementNS("http://www.w3.org/2000/svg", "g");
- this.__root.appendChild(this.__currentElement);
- };
-
-
- /**
- * Creates the specified svg element
- * @private
- */
- ctx.prototype.__createElement = function (elementName, properties, resetFill) {
- if (typeof properties === "undefined") {
- properties = {};
- }
-
- var element = this.__document.createElementNS("http://www.w3.org/2000/svg", elementName),
- keys = Object.keys(properties), i, key;
- if (resetFill) {
- //if fill or stroke is not specified, the svg element should not display. By default SVG's fill is black.
- element.setAttribute("fill", "none");
- element.setAttribute("stroke", "none");
- }
- for (i=0; i 0) {
- if (this.__currentElement.nodeName === "path") {
- if (!this.__currentElementsToStyle) this.__currentElementsToStyle = {element: parent, children: []};
- this.__currentElementsToStyle.children.push(this.__currentElement)
- this.__applyCurrentDefaultPath();
- }
-
- var group = this.__createElement("g");
- parent.appendChild(group);
- this.__currentElement = group;
- }
-
- var transform = this.__currentElement.getAttribute("transform");
- if (transform) {
- transform += " ";
- } else {
- transform = "";
- }
- transform += t;
- this.__currentElement.setAttribute("transform", transform);
- };
-
- /**
- * scales the current element
- */
- ctx.prototype.scale = function (x, y) {
- if (y === undefined) {
- y = x;
- }
- this.__addTransform(format("scale({x},{y})", {x:x, y:y}));
- };
-
- /**
- * rotates the current element
- */
- ctx.prototype.rotate = function (angle) {
- var degrees = (angle * 180 / Math.PI);
- this.__addTransform(format("rotate({angle},{cx},{cy})", {angle:degrees, cx:0, cy:0}));
- };
-
- /**
- * translates the current element
- */
- ctx.prototype.translate = function (x, y) {
- this.__addTransform(format("translate({x},{y})", {x:x,y:y}));
- };
-
- /**
- * applies a transform to the current element
- */
- ctx.prototype.transform = function (a, b, c, d, e, f) {
- this.__addTransform(format("matrix({a},{b},{c},{d},{e},{f})", {a:a, b:b, c:c, d:d, e:e, f:f}));
- };
-
- /**
- * Create a new Path Element
- */
- ctx.prototype.beginPath = function () {
- var path, parent;
-
- // Note that there is only one current default path, it is not part of the drawing state.
- // See also: https://html.spec.whatwg.org/multipage/scripting.html#current-default-path
- this.__currentDefaultPath = "";
- this.__currentPosition = {};
-
- path = this.__createElement("path", {}, true);
- parent = this.__closestGroupOrSvg();
- parent.appendChild(path);
- this.__currentElement = path;
- };
-
- /**
- * Helper function to apply currentDefaultPath to current path element
- * @private
- */
- ctx.prototype.__applyCurrentDefaultPath = function () {
- var currentElement = this.__currentElement;
- if (currentElement.nodeName === "path") {
- currentElement.setAttribute("d", this.__currentDefaultPath);
- } else {
- console.error("Attempted to apply path command to node", currentElement.nodeName);
- }
- };
-
- /**
- * Helper function to add path command
- * @private
- */
- ctx.prototype.__addPathCommand = function (command) {
- this.__currentDefaultPath += " ";
- this.__currentDefaultPath += command;
- };
-
- /**
- * Adds the move command to the current path element,
- * if the currentPathElement is not empty create a new path element
- */
- ctx.prototype.moveTo = function (x,y) {
- if (this.__currentElement.nodeName !== "path") {
- this.beginPath();
- }
-
- // creates a new subpath with the given point
- this.__currentPosition = {x: x, y: y};
- this.__addPathCommand(format("M {x} {y}", {x:x, y:y}));
- };
-
- /**
- * Closes the current path
- */
- ctx.prototype.closePath = function () {
- if (this.__currentDefaultPath) {
- this.__addPathCommand("Z");
- }
- };
-
- /**
- * Adds a line to command
- */
- ctx.prototype.lineTo = function (x, y) {
- this.__currentPosition = {x: x, y: y};
- if (this.__currentDefaultPath.indexOf('M') > -1) {
- this.__addPathCommand(format("L {x} {y}", {x:x, y:y}));
- } else {
- this.__addPathCommand(format("M {x} {y}", {x:x, y:y}));
- }
- };
-
- /**
- * Add a bezier command
- */
- ctx.prototype.bezierCurveTo = function (cp1x, cp1y, cp2x, cp2y, x, y) {
- this.__currentPosition = {x: x, y: y};
- this.__addPathCommand(format("C {cp1x} {cp1y} {cp2x} {cp2y} {x} {y}",
- {cp1x:cp1x, cp1y:cp1y, cp2x:cp2x, cp2y:cp2y, x:x, y:y}));
- };
-
- /**
- * Adds a quadratic curve to command
- */
- ctx.prototype.quadraticCurveTo = function (cpx, cpy, x, y) {
- this.__currentPosition = {x: x, y: y};
- this.__addPathCommand(format("Q {cpx} {cpy} {x} {y}", {cpx:cpx, cpy:cpy, x:x, y:y}));
- };
-
-
- /**
- * Return a new normalized vector of given vector
- */
- var normalize = function (vector) {
- var len = Math.sqrt(vector[0] * vector[0] + vector[1] * vector[1]);
- return [vector[0] / len, vector[1] / len];
- };
-
- /**
- * Adds the arcTo to the current path
- *
- * @see http://www.w3.org/TR/2015/WD-2dcontext-20150514/#dom-context-2d-arcto
- */
- ctx.prototype.arcTo = function (x1, y1, x2, y2, radius) {
- // Let the point (x0, y0) be the last point in the subpath.
- var x0 = this.__currentPosition && this.__currentPosition.x;
- var y0 = this.__currentPosition && this.__currentPosition.y;
-
- // First ensure there is a subpath for (x1, y1).
- if (typeof x0 == "undefined" || typeof y0 == "undefined") {
- return;
- }
-
- // Negative values for radius must cause the implementation to throw an IndexSizeError exception.
- if (radius < 0) {
- throw new Error("IndexSizeError: The radius provided (" + radius + ") is negative.");
- }
-
- // If the point (x0, y0) is equal to the point (x1, y1),
- // or if the point (x1, y1) is equal to the point (x2, y2),
- // or if the radius radius is zero,
- // then the method must add the point (x1, y1) to the subpath,
- // and connect that point to the previous point (x0, y0) by a straight line.
- if (((x0 === x1) && (y0 === y1))
- || ((x1 === x2) && (y1 === y2))
- || (radius === 0)) {
- this.lineTo(x1, y1);
- return;
- }
-
- // Otherwise, if the points (x0, y0), (x1, y1), and (x2, y2) all lie on a single straight line,
- // then the method must add the point (x1, y1) to the subpath,
- // and connect that point to the previous point (x0, y0) by a straight line.
- var unit_vec_p1_p0 = normalize([x0 - x1, y0 - y1]);
- var unit_vec_p1_p2 = normalize([x2 - x1, y2 - y1]);
- if (unit_vec_p1_p0[0] * unit_vec_p1_p2[1] === unit_vec_p1_p0[1] * unit_vec_p1_p2[0]) {
- this.lineTo(x1, y1);
- return;
- }
-
- // Otherwise, let The Arc be the shortest arc given by circumference of the circle that has radius radius,
- // and that has one point tangent to the half-infinite line that crosses the point (x0, y0) and ends at the point (x1, y1),
- // and that has a different point tangent to the half-infinite line that ends at the point (x1, y1), and crosses the point (x2, y2).
- // The points at which this circle touches these two lines are called the start and end tangent points respectively.
-
- // note that both vectors are unit vectors, so the length is 1
- var cos = (unit_vec_p1_p0[0] * unit_vec_p1_p2[0] + unit_vec_p1_p0[1] * unit_vec_p1_p2[1]);
- var theta = Math.acos(Math.abs(cos));
-
- // Calculate origin
- var unit_vec_p1_origin = normalize([
- unit_vec_p1_p0[0] + unit_vec_p1_p2[0],
- unit_vec_p1_p0[1] + unit_vec_p1_p2[1]
- ]);
- var len_p1_origin = radius / Math.sin(theta / 2);
- var x = x1 + len_p1_origin * unit_vec_p1_origin[0];
- var y = y1 + len_p1_origin * unit_vec_p1_origin[1];
-
- // Calculate start angle and end angle
- // rotate 90deg clockwise (note that y axis points to its down)
- var unit_vec_origin_start_tangent = [
- -unit_vec_p1_p0[1],
- unit_vec_p1_p0[0]
- ];
- // rotate 90deg counter clockwise (note that y axis points to its down)
- var unit_vec_origin_end_tangent = [
- unit_vec_p1_p2[1],
- -unit_vec_p1_p2[0]
- ];
- var getAngle = function (vector) {
- // get angle (clockwise) between vector and (1, 0)
- var x = vector[0];
- var y = vector[1];
- if (y >= 0) { // note that y axis points to its down
- return Math.acos(x);
- } else {
- return -Math.acos(x);
- }
- };
- var startAngle = getAngle(unit_vec_origin_start_tangent);
- var endAngle = getAngle(unit_vec_origin_end_tangent);
-
- // Connect the point (x0, y0) to the start tangent point by a straight line
- this.lineTo(x + unit_vec_origin_start_tangent[0] * radius,
- y + unit_vec_origin_start_tangent[1] * radius);
-
- // Connect the start tangent point to the end tangent point by arc
- // and adding the end tangent point to the subpath.
- this.arc(x, y, radius, startAngle, endAngle);
- };
-
- /**
- * Sets the stroke property on the current element
- */
- ctx.prototype.stroke = function () {
- if (this.__currentElement.nodeName === "path") {
- this.__currentElement.setAttribute("paint-order", "fill stroke markers");
- }
- this.__applyCurrentDefaultPath();
- this.__applyStyleToCurrentElement("stroke");
- };
-
- /**
- * Sets fill properties on the current element
- */
- ctx.prototype.fill = function () {
- if (this.__currentElement.nodeName === "path") {
- this.__currentElement.setAttribute("paint-order", "stroke fill markers");
- }
- this.__applyCurrentDefaultPath();
- this.__applyStyleToCurrentElement("fill");
- };
-
- /**
- * Adds a rectangle to the path.
- */
- ctx.prototype.rect = function (x, y, width, height) {
- if (this.__currentElement.nodeName !== "path") {
- this.beginPath();
- }
- this.moveTo(x, y);
- this.lineTo(x+width, y);
- this.lineTo(x+width, y+height);
- this.lineTo(x, y+height);
- this.lineTo(x, y);
- this.closePath();
- };
-
-
- /**
- * adds a rectangle element
- */
- ctx.prototype.fillRect = function (x, y, width, height) {
- var rect, parent;
- rect = this.__createElement("rect", {
- x : x,
- y : y,
- width : width,
- height : height
- }, true);
- parent = this.__closestGroupOrSvg();
- parent.appendChild(rect);
- this.__currentElement = rect;
- this.__applyStyleToCurrentElement("fill");
- };
-
- /**
- * Draws a rectangle with no fill
- * @param x
- * @param y
- * @param width
- * @param height
- */
- ctx.prototype.strokeRect = function (x, y, width, height) {
- var rect, parent;
- rect = this.__createElement("rect", {
- x : x,
- y : y,
- width : width,
- height : height
- }, true);
- parent = this.__closestGroupOrSvg();
- parent.appendChild(rect);
- this.__currentElement = rect;
- this.__applyStyleToCurrentElement("stroke");
- };
-
-
- /**
- * Clear entire canvas:
- * 1. save current transforms
- * 2. remove all the childNodes of the root g element
- */
- ctx.prototype.__clearCanvas = function () {
- var current = this.__closestGroupOrSvg(),
- transform = current.getAttribute("transform");
- var rootGroup = this.__root.childNodes[1];
- var childNodes = rootGroup.childNodes;
- for (var i = childNodes.length - 1; i >= 0; i--) {
- if (childNodes[i]) {
- rootGroup.removeChild(childNodes[i]);
- }
- }
- this.__currentElement = rootGroup;
- //reset __groupStack as all the child group nodes are all removed.
- this.__groupStack = [];
- if (transform) {
- this.__addTransform(transform);
- }
- };
-
- /**
- * "Clears" a canvas by just drawing a white rectangle in the current group.
- */
- ctx.prototype.clearRect = function (x, y, width, height) {
- //clear entire canvas
- if (x === 0 && y === 0 && width === this.width && height === this.height) {
- this.__clearCanvas();
- return;
- }
- var rect, parent = this.__closestGroupOrSvg();
- rect = this.__createElement("rect", {
- x : x,
- y : y,
- width : width,
- height : height,
- fill : "#FFFFFF"
- }, true);
- parent.appendChild(rect);
- };
-
- /**
- * Adds a linear gradient to a defs tag.
- * Returns a canvas gradient object that has a reference to it's parent def
- */
- ctx.prototype.createLinearGradient = function (x1, y1, x2, y2) {
- var grad = this.__createElement("linearGradient", {
- id : randomString(this.__ids),
- x1 : x1+"px",
- x2 : x2+"px",
- y1 : y1+"px",
- y2 : y2+"px",
- "gradientUnits" : "userSpaceOnUse"
- }, false);
- this.__defs.appendChild(grad);
- return new CanvasGradient(grad, this);
- };
-
- /**
- * Adds a radial gradient to a defs tag.
- * Returns a canvas gradient object that has a reference to it's parent def
- */
- ctx.prototype.createRadialGradient = function (x0, y0, r0, x1, y1, r1) {
- var grad = this.__createElement("radialGradient", {
- id : randomString(this.__ids),
- cx : x1+"px",
- cy : y1+"px",
- r : r1+"px",
- fx : x0+"px",
- fy : y0+"px",
- "gradientUnits" : "userSpaceOnUse"
- }, false);
- this.__defs.appendChild(grad);
- return new CanvasGradient(grad, this);
-
- };
-
- /**
- * Parses the font string and returns svg mapping
- * @private
- */
- ctx.prototype.__parseFont = function () {
- var regex = /^\s*(?=(?:(?:[-a-z]+\s*){0,2}(italic|oblique))?)(?=(?:(?:[-a-z]+\s*){0,2}(small-caps))?)(?=(?:(?:[-a-z]+\s*){0,2}(bold(?:er)?|lighter|[1-9]00))?)(?:(?:normal|\1|\2|\3)\s*){0,3}((?:xx?-)?(?:small|large)|medium|smaller|larger|[.\d]+(?:\%|in|[cem]m|ex|p[ctx]))(?:\s*\/\s*(normal|[.\d]+(?:\%|in|[cem]m|ex|p[ctx])))?\s*([-,\'\"\sa-z0-9]+?)\s*$/i;
- var fontPart = regex.exec( this.font );
- var data = {
- style : fontPart[1] || 'normal',
- size : fontPart[4] || '10px',
- family : fontPart[6] || 'sans-serif',
- weight: fontPart[3] || 'normal',
- decoration : fontPart[2] || 'normal',
- href : null
- };
-
- //canvas doesn't support underline natively, but we can pass this attribute
- if (this.__fontUnderline === "underline") {
- data.decoration = "underline";
- }
-
- //canvas also doesn't support linking, but we can pass this as well
- if (this.__fontHref) {
- data.href = this.__fontHref;
- }
-
- return data;
- };
-
- /**
- * Helper to link text fragments
- * @param font
- * @param element
- * @return {*}
- * @private
- */
- ctx.prototype.__wrapTextLink = function (font, element) {
- if (font.href) {
- var a = this.__createElement("a");
- a.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href", font.href);
- a.appendChild(element);
- return a;
- }
- return element;
- };
-
- /**
- * Fills or strokes text
- * @param text
- * @param x
- * @param y
- * @param action - stroke or fill
- * @private
- */
- ctx.prototype.__applyText = function (text, x, y, action) {
- var font = this.__parseFont(),
- parent = this.__closestGroupOrSvg(),
- textElement = this.__createElement("text", {
- "font-family" : font.family,
- "font-size" : font.size,
- "font-style" : font.style,
- "font-weight" : font.weight,
- "text-decoration" : font.decoration,
- "x" : x,
- "y" : y,
- "text-anchor": getTextAnchor(this.textAlign),
- "dominant-baseline": getDominantBaseline(this.textBaseline)
- }, true);
-
- textElement.appendChild(this.__document.createTextNode(text));
- this.__currentElement = textElement;
- this.__applyStyleToCurrentElement(action);
- parent.appendChild(this.__wrapTextLink(font,textElement));
- };
-
- /**
- * Creates a text element
- * @param text
- * @param x
- * @param y
- */
- ctx.prototype.fillText = function (text, x, y) {
- this.__applyText(text, x, y, "fill");
- };
-
- /**
- * Strokes text
- * @param text
- * @param x
- * @param y
- */
- ctx.prototype.strokeText = function (text, x, y) {
- this.__applyText(text, x, y, "stroke");
- };
-
- /**
- * No need to implement this for svg.
- * @param text
- * @return {TextMetrics}
- */
- ctx.prototype.measureText = function (text) {
- this.__ctx.font = this.font;
- return this.__ctx.measureText(text);
- };
-
- /**
- * Arc command!
- */
- ctx.prototype.arc = function (x, y, radius, startAngle, endAngle, counterClockwise) {
- // in canvas no circle is drawn if no angle is provided.
- if (startAngle === endAngle) {
- return;
- }
- startAngle = startAngle % (2*Math.PI);
- endAngle = endAngle % (2*Math.PI);
- if (startAngle === endAngle) {
- //circle time! subtract some of the angle so svg is happy (svg elliptical arc can't draw a full circle)
- endAngle = ((endAngle + (2*Math.PI)) - 0.001 * (counterClockwise ? -1 : 1)) % (2*Math.PI);
- }
- var endX = x+radius*Math.cos(endAngle),
- endY = y+radius*Math.sin(endAngle),
- startX = x+radius*Math.cos(startAngle),
- startY = y+radius*Math.sin(startAngle),
- sweepFlag = counterClockwise ? 0 : 1,
- largeArcFlag = 0,
- diff = endAngle - startAngle;
-
- // https://github.com/gliffy/canvas2svg/issues/4
- if (diff < 0) {
- diff += 2*Math.PI;
- }
-
- if (counterClockwise) {
- largeArcFlag = diff > Math.PI ? 0 : 1;
- } else {
- largeArcFlag = diff > Math.PI ? 1 : 0;
- }
-
- this.lineTo(startX, startY);
- this.__addPathCommand(format("A {rx} {ry} {xAxisRotation} {largeArcFlag} {sweepFlag} {endX} {endY}",
- {rx:radius, ry:radius, xAxisRotation:0, largeArcFlag:largeArcFlag, sweepFlag:sweepFlag, endX:endX, endY:endY}));
-
- this.__currentPosition = {x: endX, y: endY};
- };
-
- /**
- * Generates a ClipPath from the clip command.
- */
- ctx.prototype.clip = function () {
- var group = this.__closestGroupOrSvg(),
- clipPath = this.__createElement("clipPath"),
- id = randomString(this.__ids),
- newGroup = this.__createElement("g");
-
- this.__applyCurrentDefaultPath();
- group.removeChild(this.__currentElement);
- clipPath.setAttribute("id", id);
- clipPath.appendChild(this.__currentElement);
-
- this.__defs.appendChild(clipPath);
-
- //set the clip path to this group
- group.setAttribute("clip-path", format("url(#{id})", {id:id}));
-
- //clip paths can be scaled and transformed, we need to add another wrapper group to avoid later transformations
- // to this path
- group.appendChild(newGroup);
-
- this.__currentElement = newGroup;
-
- };
-
- /**
- * Draws a canvas, image or mock context to this canvas.
- * Note that all svg dom manipulation uses node.childNodes rather than node.children for IE support.
- * http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#dom-context-2d-drawimage
- */
- ctx.prototype.drawImage = function () {
- //convert arguments to a real array
- var args = Array.prototype.slice.call(arguments),
- image=args[0],
- dx, dy, dw, dh, sx=0, sy=0, sw, sh, parent, svg, defs, group,
- currentElement, svgImage, canvas, context, id;
-
- if (args.length === 3) {
- dx = args[1];
- dy = args[2];
- sw = image.width;
- sh = image.height;
- dw = sw;
- dh = sh;
- } else if (args.length === 5) {
- dx = args[1];
- dy = args[2];
- dw = args[3];
- dh = args[4];
- sw = image.width;
- sh = image.height;
- } else if (args.length === 9) {
- sx = args[1];
- sy = args[2];
- sw = args[3];
- sh = args[4];
- dx = args[5];
- dy = args[6];
- dw = args[7];
- dh = args[8];
- } else {
- throw new Error("Invalid number of arguments passed to drawImage: " + arguments.length);
- }
-
- parent = this.__closestGroupOrSvg();
- currentElement = this.__currentElement;
- var translateDirective = "translate(" + dx + ", " + dy + ")";
- if (image instanceof ctx) {
- //canvas2svg mock canvas context. In the future we may want to clone nodes instead.
- //also I'm currently ignoring dw, dh, sw, sh, sx, sy for a mock context.
- svg = image.getSvg().cloneNode(true);
- if (svg.childNodes && svg.childNodes.length > 1) {
- defs = svg.childNodes[0];
- while(defs.childNodes.length) {
- id = defs.childNodes[0].getAttribute("id");
- this.__ids[id] = id;
- this.__defs.appendChild(defs.childNodes[0]);
- }
- group = svg.childNodes[1];
- if (group) {
- //save original transform
- var originTransform = group.getAttribute("transform");
- var transformDirective;
- if (originTransform) {
- transformDirective = originTransform+" "+translateDirective;
- } else {
- transformDirective = translateDirective;
- }
- group.setAttribute("transform", transformDirective);
- parent.appendChild(group);
- }
- }
- } else if (image.nodeName === "CANVAS" || image.nodeName === "IMG") {
- //canvas or image
- svgImage = this.__createElement("image");
- svgImage.setAttribute("width", dw);
- svgImage.setAttribute("height", dh);
- svgImage.setAttribute("preserveAspectRatio", "none");
-
- if (sx || sy || sw !== image.width || sh !== image.height) {
- //crop the image using a temporary canvas
- canvas = this.__document.createElement("canvas");
- canvas.width = dw;
- canvas.height = dh;
- context = canvas.getContext("2d");
- context.drawImage(image, sx, sy, sw, sh, 0, 0, dw, dh);
- image = canvas;
- }
- svgImage.setAttribute("transform", translateDirective);
- svgImage.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href",
- image.nodeName === "CANVAS" ? image.toDataURL() : image.getAttribute("src"));
- parent.appendChild(svgImage);
- }
- };
-
- /**
- * Generates a pattern tag
- */
- ctx.prototype.createPattern = function (image, repetition) {
- var pattern = this.__document.createElementNS("http://www.w3.org/2000/svg", "pattern"), id = randomString(this.__ids),
- img;
- pattern.setAttribute("id", id);
- pattern.setAttribute("width", image.width);
- pattern.setAttribute("height", image.height);
- if (image.nodeName === "CANVAS" || image.nodeName === "IMG") {
- img = this.__document.createElementNS("http://www.w3.org/2000/svg", "image");
- img.setAttribute("width", image.width);
- img.setAttribute("height", image.height);
- img.setAttributeNS("http://www.w3.org/1999/xlink", "xlink:href",
- image.nodeName === "CANVAS" ? image.toDataURL() : image.getAttribute("src"));
- pattern.appendChild(img);
- this.__defs.appendChild(pattern);
- } else if (image instanceof ctx) {
- pattern.appendChild(image.__root.childNodes[1]);
- this.__defs.appendChild(pattern);
- }
- return new CanvasPattern(pattern, this);
- };
-
- ctx.prototype.setLineDash = function (dashArray) {
- if (dashArray && dashArray.length > 0) {
- this.lineDash = dashArray.join(",");
- } else {
- this.lineDash = null;
- }
- };
-
- /**
- * Not yet implemented
- */
- ctx.prototype.drawFocusRing = function () {};
- ctx.prototype.createImageData = function () {};
- ctx.prototype.getImageData = function () {};
- ctx.prototype.putImageData = function () {};
- ctx.prototype.globalCompositeOperation = function () {};
- ctx.prototype.setTransform = function () {};
-
- //add options for alternative namespace
- if (typeof window === "object") {
- window.C2S = ctx;
- }
-
- // CommonJS/Browserify
- if (typeof module === "object" && typeof module.exports === "object") {
- module.exports = ctx;
- }
-
-}());
diff --git a/standalone/lib/ext/conllu/conllu.js b/standalone/lib/ext/conllu/conllu.js
deleted file mode 100644
index 5c4ac5cb..00000000
--- a/standalone/lib/ext/conllu/conllu.js
+++ /dev/null
@@ -1,743 +0,0 @@
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; h--) {
- var id = removeIds[h];
- this.sentences[i].tokens.splice(id,1);
- }
- }
- }
- this.sentences.splice(sentence_index+1, 0, newSentence);
- },
-
-
- mergeSentence : function (sentence_index) {
- var sentence = this.sentences[sentence_index];
-
- // remove each token from the next sentence and push it to the previous sentence
- while (this.sentences[sentence_index + 1].tokens[0] !== undefined){ // when the first item of the second sentence is not a token, iteration must end
- var current = this.sentences[sentence_index+1].tokens.shift();
- this.sentences[sentence_index].tokens.push(current);
- }
-
- // remove the old sentence object
- this.sentences.splice(sentence_index+1, 1);
-
- // update token id's and multiword token id's from 1 till end of merged sentence
- var id = 0;
- for (var x in this.sentences[sentence_index].tokens){
- var word = this.sentences[sentence_index].tokens[x];
-
- //if the token is a normal Token
- if (!(word instanceof MultiwordToken)){
- id++;
- word.id = id;
- }
-
- //if the token is a multi word token
- else {
- for (var subtoken in word.tokens){
- id++;
- word.tokens[subtoken].id = id;
- }
- }
- }
- }
-};
-
-
-
-
-/**
- * serial
- * The serial property is the string representation of the file.
- * The contents of the Conllu object may be updated by modifying this string. However, for better
- * performance, it is recommended to modify the object itself.
- * @type {String}
- */
-
-Object.defineProperty(Conllu.prototype,'serial',
- {
- get: function() {
- var serialArray = [];
-
- for (var i= 0; i < this.sentences.length; i++) {
- serialArray.push(this.sentences[i].serial);
- }
-
- return serialArray.join("\n");
-
-
- },
- set: function(arg) {
- var lines = arg.split("\n"); //splits input text on newline
- var sent = []; //creates dummy sentence array
-
- for (var i = 0; i < lines.length; i ++){
- if (lines[i] === ""){ //flags empty lines as end of sentence
- sent.push(lines[i]); //add empty line to dummy sentence array
- var sentCat = sent.join("\n"); //join dummy sentence array on newline
- var setSentence = new Sentence();
- setSentence.serial = sentCat; //set sentence serial property to joined dummy sentence
- this.sentences.push(setSentence); //add this sentence to conllu sentences array
- sent = []
- } else {
- sent.push(lines[i]); //adds all lines before empty line to dummy sentence array
- }
- }
- }
-
- }
-);
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Conllu = Conllu;
-}
-
-},{"./MultiwordToken.js":2,"./Sentence.js":3}],2:[function(require,module,exports){
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var TokenAggregate = require("./TokenAggregate.js").TokenAggregate;
-}
-
-/**
- * A MultiwordToken is any token which consists of subtokens
- * For example, a MultiwordToken may represent the following lines in a Conllu file:
- *
- * 2-3 haven't ...
- * 2 have ...
- * 3 n't ...
- *
- * @property tokens {Array}
- * The tokens property is the list of subtokens this MultiwordToken is responsible for.
- *
- * @extends Token
- * @inherits TokenAggregate
- *
- * @constructor
- */
-var MultiwordToken = function() {
- //constructor for Multi-word Tokens
- Token.call(this); // gives the MWT all the properties created in the Token constructor (note: not token prototype)
- this.tokens = []; // creates the array that contains the children of the MWT
- TokenAggregate.call(this,'tokens'); //gives the MWT all the properties created in the Token Aggregate constructor
-};
-MultiwordToken.prototype = new Token(); // gives new instance of MWT the properties of a new instance of Token
-
-/**
- * The id in a MultiwordToken is based on the MultiwordToken's subtokens.
- * The id will be: smallestid-largestid
- * The id cannot be updated here.
- * @type {String}
- */
-Object.defineProperty(MultiwordToken.prototype,'id',{
- get: function() {
- if (this.tokens.length < 1){
- return "?-?"; // if the multi-word token doesn't have any children (length of sub-array tokens is 0), alert. Do not allow to save.
- }
- var first = this.tokens[0]; // id of first child
- var last = this.tokens[this.tokens.length-1]; // id of last child
- id = first.id + "-" + last.id; // assign mwt id to be "smallestID-largestID"
- return String(id); //return in string version
- },
-
- set: function(value) { // does nothing
- }
-});
-
-Object.defineProperty(MultiwordToken.prototype,'serial',{
- get: function() {
- // get annotated multi word token into conllu string form
-
- var finalString = "";
-
- // handle apostrophes inside the token
- var parentForm = this.form;
- if (parentForm.includes("'")){
- parentForm = parentForm.replace("'", "\'")
- }
-
- // Find the serial property from the Token object, and use that to serialize the MWT line
- var parentSerialGetter = Object.getOwnPropertyDescriptor(Token.prototype,'serial');
- var parentMWT = parentSerialGetter.get.call(this);
-
- finalString = finalString + parentMWT; // add parent mwt to the final conllu format string for the text
-
- for (word in this.tokens){
- finalString = finalString + "\n" + this.tokens[word].serial;// iteratively add each child to the final string.
- }
-
- return finalString;
- },
-
- set: function(mwtString) {
- // set multi word token string to modifiable form
-
- // Split the initial string into separate lines as would be found in Conllu format
- var mwtLines = mwtString.split("\n");
-
- // First item in array (first line) turned into mwt "parent"
- // Find the serial property from the Token object, and use that to serialize the MWT line
- var parentSerialSetter = Object.getOwnPropertyDescriptor(Token.prototype,'serial');
- parentSerialSetter.set.call(this, mwtLines[0]);
-
- this.tokens = []; //ensure the subtokens array is clear
-
- // Iterate over the subtokens and set them using the existing Token setter. Push them to subtokens array.
- for (i = 1; i < mwtLines.length; i++){
- var subToken = new Token();
- subToken.serial = mwtLines[i];
- this.tokens.push(subToken);
- }
- }
-});
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.MultiwordToken = MultiwordToken;
-}
-
-},{"./Token.js":4,"./TokenAggregate.js":5}],3:[function(require,module,exports){
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var MultiwordToken = require("./MultiwordToken.js").MultiwordToken;
- var TokenAggregate = require("./TokenAggregate.js").TokenAggregate;
-
-}
-/**
- * A Sentence is a collection of comments, Tokens, and MultiwordTokens representing a sentence within a Conllu file.
- * For example, a Sentence may represent the following lines in a file:
- *
- * # sent_id 2
- * # ...
- * 1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
- * 2-3 haven't _ _ _ _ _ _ _ _
- * 2 have have VERB VBP Number=Sing|Person=1|Tense=Pres 0 root _ _
- * 3 not not PART RB Negative=Neg 2 neg _ _
- * 4 a a DET DT Definite=Ind|PronType=Art 4 det _ _
- * 5 clue clue NOUN NN Number=Sing 2 dobj _ SpaceAfter=No
- * 6 . . PUNCT . _ 2 punct _ _
- *
- * @property comments {Array}
- * The comments property maintains an ordered list of all comments
- *
- * @property tokens {Array}
- * The tokens property maintains an ordered list of all Tokens and Multiword tokens.
- * In the example given above, a single MultiwordToken would be responsible for lines starting with ids 1-2, 2, and 3
- *
- * @constructor
- */
-var Sentence = function() {
- /**
- * comments should be an ordered list of strings representing the comments of this sentence.
- * The strings should not include the initial '#' character - only the content of the comment.
- * @type {Array}
- */
- this.comments = [];
-
- /**
- * tokens should be an ordered list of tokens and multiword tokens.
- * We will rely on the ordering of this list to display the tokens in the correct order - not the ids
- * of the tokens. Note, however, that the ids of the tokens/multiwordtokens and subtokens should be
- * maintained by the sentence.
- * @type {Array}
- */
- this.tokens = [];
-
- TokenAggregate.call(this,'tokens');
-};
-
-Sentence.prototype = {
-
- expand : function (token_id, index) {
- var found = false;
- for (var i=0; i < this.tokens.length; i++) {
- if (found === true) {
-
- if (!(this.tokens[i] instanceof MultiwordToken)) {
- this.tokens[i].id++; //increases id's by 1 after expansion
- //console.log(this.tokens[i]);
- }
- else {
-
- this.tokens[i].tokens.forEach(function (child) {
- child.id++; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this.tokens[i].id === token_id && !(this.tokens[i] instanceof MultiwordToken)) {
- var initial = new Token(); //variable to store first half of expanded token
- var second = new Token(); //variable to store second half of expanded token
- var expandToken = new MultiwordToken(); //create new instance of mwt for expanded token//
-
- expandToken.form = this.tokens[i].form; // only duplicate form; id depends on id's of sub-tokens; other properties should be undefined
- initial.form = this.tokens[i].form.slice(0, index);
- initial.id = this.tokens[i].id; //update id of first sub-token
- second.form = this.tokens[i].form.slice(index);
- second.id = Number(this.tokens[i].id) + 1; //update id of second sub-token
- expandToken.tokens.push(initial);
- expandToken.tokens.push(second);
- this.tokens.splice((i), 1, expandToken);// inserts new word at the correct index in the array, removes original token
- //note: all information stored in initial token is lost. To be confirmed.
- found = true;
- //console.log(this.tokens[1]);
- }
-
- }
- },
-
- collapse: function(token_id) {
-
- var found = false;
- for (var i=0; i < this.tokens.length; i++) {
-
- if (found === true) {
- if (!(this.tokens[i] instanceof MultiwordToken)) {
- this.tokens[i].id = Number(this.tokens[i].id - (mwt_length-1)); //updates the id's of every token after collapse
- //note: also valid if mwt has more than 2 sub-tokens
- }
- else {
- this.tokens[i].tokens.forEach(function (child) {
- child.id = Number(child.id - (mwt_length-1));//updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this.tokens[i].id === token_id) { // note: must be a string, since the id of a mwt is a string
- if (this.tokens[i] instanceof MultiwordToken) { //collapse only applies to mwt
- var mwt_length = this.tokens[i].tokens.length;// find the length of the mwt sub-tokens array, for updating other values
- var collapsed = new Token(); // note: is not a mwt
- //collapsed.id = Number(this.tokens[i].id.slice(0,1)); // wouldn't work for mwt token 34-35, for example.
- collapsed.id = Number(this.tokens[i].tokens[0].id);// token "collapsed" can be assigned an id: takes the id of the first child of the mwt
- collapsed.form = this.tokens[i].form;
- this.tokens.splice((i), 1, collapsed);
- found = true;
- }
- //if this.tokens[i] isn't an instance of a MultiwordToken, do nothing.
- }
- }
- },
- splitComment: function (comment_index, character_index) { //new comment line from splitting point
- for (var i = 0; i < this.comments.length; i ++) {
- if (i === comment_index) {
- var newComment = this.comments[i].slice(character_index);
- this.comments[i] = this.comments[i].slice(0, character_index)
- this.comments.splice((i + 1), 0, newComment)
- }
- }
- },
-
- mergeComment: function (comment_index) { //removes comment at index 0 from comments array
- this.comments[comment_index] = this.comments[comment_index] + this.comments[comment_index+1];
- this.comments.splice(comment_index+1, 1);
-
- }
-
-};
-
-Object.defineProperty(Sentence.prototype,'serial',
- {
- get: function () {
-
- var serialArray = [];
-
- for (var i = 0; i < this.comments.length; i++) {
- serialArray.push("#" + this.comments[i]);
-
- }
-
- for (var i = 0; i < this.tokens.length; i++) {
- serialArray.push(this.tokens[i].serial);
- }
- serialArray.push(""); //add empty string for line break after sentence
- return serialArray.join("\n");
- },
- set: function (arg) {
- this.comments = [];
- this.tokens = [];
- var lines = arg.split("\n");
- for (var i = 0; i < lines.length; i++) { //identify comments in string & add to comments array
- if (lines[i].startsWith("\#")) {
- this.comments.push(lines[i]);
- this.comments[i] = this.comments[i].substring(1);
- }
- }
-
- var mwtSubIds = [];
- for (var i = 0; i < lines.length; i++){
- var fields = [];
- fields = lines[i].split("\t"); //split into subfields to identify mwt ids
- var currentLineId = fields[0];
- if (!(lines[i].startsWith("\#")) && !(lines[i] === '')) { //find non-comments/non-empty lines
- var mwtId = null;
- if (fields[0].includes("-")){
- mwtString = lines[i] + "\n";
- mwtId = fields[0];
- dashIndex = fields[0].indexOf("-");
- var first = Number(mwtId.slice(0, dashIndex)); //everything before/after slash
- var last = Number(mwtId.slice(dashIndex+1));
- var span = [];
- while(first <= last) {
- span.push(Number(first++)); //get span of mwt ids to match all mwt subtoken ids
- }
- mwtSubIds = span.map(function(id){
- return id
- });
- span = span.map(String);
- for (var j = 0; j < lines.length; j++) { //add all subtokens to mwt string
- var innerFields = [];
- innerFields = lines[j].split("\t");
- for (var x = 0; x < span.length; x++){
- if (span[x] === innerFields[0]){
- mwtString = mwtString + (lines[j] + "\n");
- }
- }
- }
- mwtString = mwtString.substring(0, mwtString.length - 1);
- var setMwt = new MultiwordToken();
- setMwt.serial = mwtString;//serialize mwt string
- this.tokens.push(setMwt);
-
- } else if (mwtSubIds.indexOf(Number(currentLineId)) === -1) {
-
- var setToken = new Token();
- setToken.serial = lines[i];
- this.tokens.push(setToken);
- }
- }
-
- }
- }
- }
-);
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Sentence = Sentence;
-}
-},{"./MultiwordToken.js":2,"./Token.js":4,"./TokenAggregate.js":5}],4:[function(require,module,exports){
-/**
- * A Token represents a single token represented in a Conllu file
- * For example, a Token may represent the following line:
- *
- * 1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
- *
- * @constructor
- */
-var Token = function() {};
-
-Token.prototype = {
- // note: id is generally managed by Sentence
- id: undefined,
- form: '',
- lemma: undefined,
- upostag: undefined,
- xpostag: undefined,
- feats: undefined,
- head: undefined,
- deprel: undefined,
- deps: undefined,
- misc: undefined
-};
-
-Object.defineProperty(Token.prototype,'serial',
- {
- get: function() {
- // takes this token object and returns a string
- // no iteration through the properties of the object, because of non-conllu properties (ex: "serialize" property)
- var id_output = "_";
- if (!(this.id === undefined) && !(this.id === "")){
- id_output = String(this.id);
- }
-
- var form_output = "_";
- if (!(this.id === undefined) && !(this.id === "")){
- form_output = String(this.form);
- }
-
- var lemma_output = "_";
- if (!(this.lemma === undefined) && !(this.lemma === "")){
- lemma_output = String(this.lemma);
- }
-
- var upostag_output = "_";
- if (!(this.upostag === undefined) && !(this.upostag === "")){
- upostag_output = String(this.upostag);
- }
-
- var xpostag_output = "_";
- if (!(this.xpostag === undefined) && !(this.xpostag === "")){
- xpostag_output = String(this.xpostag);
- }
-
- var feats_output = "_";
- if (!(this.feats === undefined) && !(this.feats === "")){
- feats_output = String(this.feats);
- }
-
- var head_output = "_";
- if (!(this.head === undefined) && !(this.head === "")){
- head_output = String(this.head);
- }
-
- var deprel_output = "_";
- if (!(this.deprel === undefined) && !(this.deprel === "")){
- deprel_output = String(this.deprel);
- }
-
- var deps_output = "_";
- if (!(this.deps === undefined) && !(this.deps === "")){
- deps_output = String(this.deps);
- }
-
- var misc_output = "_";
- if (!(this.misc === undefined) && !(this.misc === "")){
- misc_output = String(this.misc);
- }
-
- return (id_output + "\t" + form_output + "\t" + lemma_output + "\t" + upostag_output + "\t" + xpostag_output + "\t" + feats_output + "\t" + head_output + "\t" + deprel_output + "\t" + deps_output + "\t" + misc_output);
- },
-
- set: function(arg) {
- //takes a string and sets this object's value to match the string.
-
- var fields = arg.split("\t");
-
- this.id = Number(fields[0]);
- if (this.id === "_")
- this.id = undefined;
-
- this.form = fields[1];
- if (this.form === "_")
- this.form = undefined;
-
- this.lemma = fields[2];
- if (this.lemma === "_")
- this.lemma = undefined;
-
- this.upostag = fields[3];
- if (this.upostag === "_")
- this.upostag = undefined;
-
- this.xpostag = fields[4];
- if (this.xpostag === "_")
- this.xpostag = undefined;
-
- this.feats = fields[5];
- if (this.feats === "_")
- this.feats = undefined;
-
- this.head = fields[6];
- if (this.head === "_")
- this.head = undefined;
-
- this.deprel = fields[7];
- if (this.deprel === "_")
- this.deprel = undefined;
-
- this.deps = fields[8];
- if (this.deps === "_")
- this.deps = undefined;
-
- this.misc = fields[9];
- if (this.misc === "_")
- this.misc = undefined;
- }
- }
-);
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Token = Token;
-}
-
-
-},{}],5:[function(require,module,exports){
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var MultiwordToken = require("./MultiwordToken.js").MultiwordToken;
-
-}
-/**
- * A TokenAggregate is responsible to managing a collection of Tokens.
- * Specifically, it provides utilities for splitting and merging Tokens in an ordered list.
- *
- * This function is meant to be called on an existing object in order to give it TokenAggregate capabilities.
- * The name of the property containing the Token list is given in the constructor, enabling us to use this
- * functionality on any object containing a Token list, regardless of the name of that list.
- *
- * For example:
- *
- * var obj = { tokens: [{id: 1, form: 'token1'}, {id: 2, form:'token2'}] };
- * TokenAggregate.call(obj,'tokens');
- * obj.split(1,3);
- * obj.merge(1);
- *
- * @param token_array
- * @constructor
- */
-var TokenAggregate = function(token_array) {
- // Note: access the token array using: this[token_array] (instead of this.token_array)
-
- /**
- * split splits a token into two tokens.
- * This function finds the token with the given id, and splits it at that index.
- * For example, if we have tokens [{id: 1, form: 'token1'}, {id: 2, form:'token2'}],
- * calling split(1,2) would result in [{id: 1, form: 'to'},{id: 2, form:'ken1'}, {id: 3, form:'token2'}]
- * @param token_id
- * @param string_index
- */
- this.split = function(token_id, string_index) {
- var found = false;
- for (var x=0; x< this[token_array].length; x++) {
- if (found === true) {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (!(this[token_array][x] instanceof MultiwordToken)) {
- this[token_array][x].id++; //gives cheeky +1 to the id's coming after the split. Makes space for our split (at least in id domain)
- }
- else {
- this[token_array][x].tokens.forEach(function (child) {
- child.id++; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this[token_array][x].id === token_id) {
- var splitter = this[token_array][x];//find the splitter who is at the given token_id & assign to variable
- var word = new Token(); // makes the new word an instance of Token
-
- // updates new word's id
- if (String(token_id).includes("-")){ // if the given token is a MWT parent (of the form "2-3")
- word.id = (splitter.tokens[splitter.tokens.length-1].id); // give the new word the index of the last sub-token (what about + 1 ??)
- }
- else { // if the given token is a normal token
- word.id = token_id; // why not +1?? Was like this already and seems to work...
- }
-
- //updates new word's form and splitter's form, and inserts new word into array
- word.form = splitter.form.slice(string_index);
- splitter.form = splitter.form.slice(0, string_index);
- this[token_array].splice((x + 1), 0, word);// inserts new word at the correct index in the array
-
- found = true;
- } else {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (this[token_array][x] instanceof MultiwordToken) {
- var prev_length = this[token_array][x].tokens.length;
- this[token_array][x].split(token_id, string_index);
- if(prev_length !== this[token_array][x].tokens.length) {
- found = true;
- }
- }
- }
- }
- };
-
-
-
- /**
- * merge removes the next word and links it to the current word.
- * For example, if we have [{id: 1, form: 'to'},{id: 2, form:'ken1'}, {id: 3, form:'token2'}]
- * calling merge(1) would result in [{id:1, form: 'token1'}, {id: 2, form:'token2'}]
- * @param token_id
- */
- this.merge = function(token_id) {
- found = false;
- for (var x in this[token_array]) {
- if (found === true) {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (!(this[token_array][x] instanceof MultiwordToken)) {
- this[token_array][x].id = this[token_array][x].id - 1; //updates the id's of every token after the merge
- }
- else {
- this[token_array][x].tokens.forEach(function (child) {
- child.id = child.id - 1; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this[token_array][x].id === token_id) {
- var merger = this[token_array][x];
- var gone = this[token_array][Number(x) + 1];
- merger.form = merger.form + gone.form;
- this[token_array].splice((Number(x) + 1), 1);
- found = true;
- }else {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (this[token_array][x] instanceof MultiwordToken) {
- var prev_length = this[token_array][x].tokens.length;
- this[token_array][x].merge(token_id);
- if(prev_length !== this[token_array][x].tokens.length) {
- found = true;
- }
- }
- }
- }
- };
-};
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.TokenAggregate = TokenAggregate;
-}
-
-},{"../lib/MultiwordToken.js":2,"./MultiwordToken.js":2,"./Token.js":4}],"conllu":[function(require,module,exports){
-exports.Conllu = require('./lib/Conllu.js').Conllu;
-exports.MultiwordToken = require('./lib/MultiwordToken.js').MultiwordToken;
-exports.Sentence = require('./lib/Sentence.js').Sentence;
-exports.Token = require('./lib/Token.js').Token;
-
-
-},{"./lib/Conllu.js":1,"./lib/MultiwordToken.js":2,"./lib/Sentence.js":3,"./lib/Token.js":4}]},{},[]);
diff --git a/standalone/lib/ext/conllu/conllu/README.md b/standalone/lib/ext/conllu/conllu/README.md
deleted file mode 100755
index cb11746d..00000000
--- a/standalone/lib/ext/conllu/conllu/README.md
+++ /dev/null
@@ -1,84 +0,0 @@
-# Conllu
-Conllu is a JavaScript library capable of manipulating files in CoNLL-U format, including the creation and manipulation of multi-word tokens in a sentence.
-
-## Installation
-
-#### Node.js
-
-Conllu is available on npm.
-
-`npm install conllu`
-
-Then, require the conllu library.
-
-`var conllu = require('conllu')`
-
-## Overview
-
-###Conllu object
-The Conllu object is the highest level object, and allows manipulation at the full file level. The object comprises an array of sentences as well as functions allowing for getting information from an existing conllu file, splitting and merging sentences, and exporting into conllu format.
-
- To create a Conllu object from an existing file:
-
- c = new conllu.Conllu()
- c.serial = fs.readFileSync('example.conllu','utf8')
-
-The Conllu object should now contain a property `sentences` which is an array of Sentence objects representing, in order, each sentence of the conllu file.
-
-To split a sentence, call the method splitSentence on the conllu object. The sentence index corresponds to the sentence in the conllu object's sentence array that is to be split, with the token id corrresponding to the token at which the split should occur, with the start of the new sentence beginning with the first token after the specified token id:
-
-`c.splitSentence(sentenceIndex, tokenId)`
-
-Merging two sentences only requires specifying the index of the sentence in conllu.sentences which is to be merged with the sentence directly following it:
-
-`c.mergeSentence(sentenceIndex)
-`
-###Sentence object
-The Sentence object represents a sentence in the conllu file, and comprises two arrays, one for tokens and one for comments. It contains internally consistent token id numbering, starting with 1 for the first word. Comments which often initiate the sentence (see conllu documentation) are also contained within this object. It is possible to change, split, merge, add or delete such comments.
-
-To create a sentence object:
-
-`s = new conllu.Sentence()`
-
-The Sentence object contains a `comments` property, which is an array of comments (as strings) found in the sentence.
-
-It also contains a `tokens` property which is an array representing the list of Token and MultiwordToken objects that the sentence is composed of.
-
-To split a token in a sentence, call split on the sentence object using the token id of the token to be split, as well as the string index of the token's form property at the point of the split:
-
-`s.split(tokenId, stringIndex)`
-
-To merge two tokens in a sentence, call merge on the sentence object using the token id of the token to be merged with the next proceeding token:
-
-`s.merge(tokenId)`
-
-Similarly, to split and merge comments, call splitComment and mergeComment on the sentence object. splitComment takes the arguments of the comment index in sentence's comment array, as well as the string index of the split point. mergeComment takes the index of the comment that is to be merged with the next following comment in the sentence's comments array:
-
-`splitComment(commentIndex, stringIndex)`
-
-`mergeComment(commentIndex)`
-
-To expand a token to a multiword token, call expand on the sentence object specifying both the token id of the token to be expanded, as well as the string index of the split point (e.g. "haven't" would be split between "have" and "n't"):
-
-`s.expand(tokenId, stringIndex)`
-
-To collapse a multiword token, call collapse on the sentence object at the token id of the token to be collapsed:
-
-`s.collapse(tokenId)`
-
-
-###Token object
-The Token object is representative of the individual word. It is possible to split a token into separate parts, for example to rectify tokenization errors. It is also possible to merge tokens into a single token object.
-
-`t = new conllu.Token()`
-
-A token object contains the properties `id`, `form`, `lemma`, `upostag`, `xpostag`, `feats`, `head`, `deprel`, and `deps`, representing each of the columns of a conllu file.
-
-###MultiwordToken object
-The MultiwordToken object is specific to tokens composed of multiple semantic parts. The expand and collapse functions in the sentence object apply to this object. It is composed of a parent, which is the full word found in the text; and of children, which are the semantically independent sub-parts. The id of a multi-word token is simply the range of its children's ids. Children id's follow from the preceding tokens in the sentence.
-
-`mwt = new conllu.MultiwordToken()`
-
-## License
-
-Conllu uses a CC BY-SA license.
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/conllu.js b/standalone/lib/ext/conllu/conllu/conllu.js
deleted file mode 100644
index 5c4ac5cb..00000000
--- a/standalone/lib/ext/conllu/conllu/conllu.js
+++ /dev/null
@@ -1,743 +0,0 @@
-require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= 0; h--) {
- var id = removeIds[h];
- this.sentences[i].tokens.splice(id,1);
- }
- }
- }
- this.sentences.splice(sentence_index+1, 0, newSentence);
- },
-
-
- mergeSentence : function (sentence_index) {
- var sentence = this.sentences[sentence_index];
-
- // remove each token from the next sentence and push it to the previous sentence
- while (this.sentences[sentence_index + 1].tokens[0] !== undefined){ // when the first item of the second sentence is not a token, iteration must end
- var current = this.sentences[sentence_index+1].tokens.shift();
- this.sentences[sentence_index].tokens.push(current);
- }
-
- // remove the old sentence object
- this.sentences.splice(sentence_index+1, 1);
-
- // update token id's and multiword token id's from 1 till end of merged sentence
- var id = 0;
- for (var x in this.sentences[sentence_index].tokens){
- var word = this.sentences[sentence_index].tokens[x];
-
- //if the token is a normal Token
- if (!(word instanceof MultiwordToken)){
- id++;
- word.id = id;
- }
-
- //if the token is a multi word token
- else {
- for (var subtoken in word.tokens){
- id++;
- word.tokens[subtoken].id = id;
- }
- }
- }
- }
-};
-
-
-
-
-/**
- * serial
- * The serial property is the string representation of the file.
- * The contents of the Conllu object may be updated by modifying this string. However, for better
- * performance, it is recommended to modify the object itself.
- * @type {String}
- */
-
-Object.defineProperty(Conllu.prototype,'serial',
- {
- get: function() {
- var serialArray = [];
-
- for (var i= 0; i < this.sentences.length; i++) {
- serialArray.push(this.sentences[i].serial);
- }
-
- return serialArray.join("\n");
-
-
- },
- set: function(arg) {
- var lines = arg.split("\n"); //splits input text on newline
- var sent = []; //creates dummy sentence array
-
- for (var i = 0; i < lines.length; i ++){
- if (lines[i] === ""){ //flags empty lines as end of sentence
- sent.push(lines[i]); //add empty line to dummy sentence array
- var sentCat = sent.join("\n"); //join dummy sentence array on newline
- var setSentence = new Sentence();
- setSentence.serial = sentCat; //set sentence serial property to joined dummy sentence
- this.sentences.push(setSentence); //add this sentence to conllu sentences array
- sent = []
- } else {
- sent.push(lines[i]); //adds all lines before empty line to dummy sentence array
- }
- }
- }
-
- }
-);
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Conllu = Conllu;
-}
-
-},{"./MultiwordToken.js":2,"./Sentence.js":3}],2:[function(require,module,exports){
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var TokenAggregate = require("./TokenAggregate.js").TokenAggregate;
-}
-
-/**
- * A MultiwordToken is any token which consists of subtokens
- * For example, a MultiwordToken may represent the following lines in a Conllu file:
- *
- * 2-3 haven't ...
- * 2 have ...
- * 3 n't ...
- *
- * @property tokens {Array}
- * The tokens property is the list of subtokens this MultiwordToken is responsible for.
- *
- * @extends Token
- * @inherits TokenAggregate
- *
- * @constructor
- */
-var MultiwordToken = function() {
- //constructor for Multi-word Tokens
- Token.call(this); // gives the MWT all the properties created in the Token constructor (note: not token prototype)
- this.tokens = []; // creates the array that contains the children of the MWT
- TokenAggregate.call(this,'tokens'); //gives the MWT all the properties created in the Token Aggregate constructor
-};
-MultiwordToken.prototype = new Token(); // gives new instance of MWT the properties of a new instance of Token
-
-/**
- * The id in a MultiwordToken is based on the MultiwordToken's subtokens.
- * The id will be: smallestid-largestid
- * The id cannot be updated here.
- * @type {String}
- */
-Object.defineProperty(MultiwordToken.prototype,'id',{
- get: function() {
- if (this.tokens.length < 1){
- return "?-?"; // if the multi-word token doesn't have any children (length of sub-array tokens is 0), alert. Do not allow to save.
- }
- var first = this.tokens[0]; // id of first child
- var last = this.tokens[this.tokens.length-1]; // id of last child
- id = first.id + "-" + last.id; // assign mwt id to be "smallestID-largestID"
- return String(id); //return in string version
- },
-
- set: function(value) { // does nothing
- }
-});
-
-Object.defineProperty(MultiwordToken.prototype,'serial',{
- get: function() {
- // get annotated multi word token into conllu string form
-
- var finalString = "";
-
- // handle apostrophes inside the token
- var parentForm = this.form;
- if (parentForm.includes("'")){
- parentForm = parentForm.replace("'", "\'")
- }
-
- // Find the serial property from the Token object, and use that to serialize the MWT line
- var parentSerialGetter = Object.getOwnPropertyDescriptor(Token.prototype,'serial');
- var parentMWT = parentSerialGetter.get.call(this);
-
- finalString = finalString + parentMWT; // add parent mwt to the final conllu format string for the text
-
- for (word in this.tokens){
- finalString = finalString + "\n" + this.tokens[word].serial;// iteratively add each child to the final string.
- }
-
- return finalString;
- },
-
- set: function(mwtString) {
- // set multi word token string to modifiable form
-
- // Split the initial string into separate lines as would be found in Conllu format
- var mwtLines = mwtString.split("\n");
-
- // First item in array (first line) turned into mwt "parent"
- // Find the serial property from the Token object, and use that to serialize the MWT line
- var parentSerialSetter = Object.getOwnPropertyDescriptor(Token.prototype,'serial');
- parentSerialSetter.set.call(this, mwtLines[0]);
-
- this.tokens = []; //ensure the subtokens array is clear
-
- // Iterate over the subtokens and set them using the existing Token setter. Push them to subtokens array.
- for (i = 1; i < mwtLines.length; i++){
- var subToken = new Token();
- subToken.serial = mwtLines[i];
- this.tokens.push(subToken);
- }
- }
-});
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.MultiwordToken = MultiwordToken;
-}
-
-},{"./Token.js":4,"./TokenAggregate.js":5}],3:[function(require,module,exports){
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var MultiwordToken = require("./MultiwordToken.js").MultiwordToken;
- var TokenAggregate = require("./TokenAggregate.js").TokenAggregate;
-
-}
-/**
- * A Sentence is a collection of comments, Tokens, and MultiwordTokens representing a sentence within a Conllu file.
- * For example, a Sentence may represent the following lines in a file:
- *
- * # sent_id 2
- * # ...
- * 1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
- * 2-3 haven't _ _ _ _ _ _ _ _
- * 2 have have VERB VBP Number=Sing|Person=1|Tense=Pres 0 root _ _
- * 3 not not PART RB Negative=Neg 2 neg _ _
- * 4 a a DET DT Definite=Ind|PronType=Art 4 det _ _
- * 5 clue clue NOUN NN Number=Sing 2 dobj _ SpaceAfter=No
- * 6 . . PUNCT . _ 2 punct _ _
- *
- * @property comments {Array}
- * The comments property maintains an ordered list of all comments
- *
- * @property tokens {Array}
- * The tokens property maintains an ordered list of all Tokens and Multiword tokens.
- * In the example given above, a single MultiwordToken would be responsible for lines starting with ids 1-2, 2, and 3
- *
- * @constructor
- */
-var Sentence = function() {
- /**
- * comments should be an ordered list of strings representing the comments of this sentence.
- * The strings should not include the initial '#' character - only the content of the comment.
- * @type {Array}
- */
- this.comments = [];
-
- /**
- * tokens should be an ordered list of tokens and multiword tokens.
- * We will rely on the ordering of this list to display the tokens in the correct order - not the ids
- * of the tokens. Note, however, that the ids of the tokens/multiwordtokens and subtokens should be
- * maintained by the sentence.
- * @type {Array}
- */
- this.tokens = [];
-
- TokenAggregate.call(this,'tokens');
-};
-
-Sentence.prototype = {
-
- expand : function (token_id, index) {
- var found = false;
- for (var i=0; i < this.tokens.length; i++) {
- if (found === true) {
-
- if (!(this.tokens[i] instanceof MultiwordToken)) {
- this.tokens[i].id++; //increases id's by 1 after expansion
- //console.log(this.tokens[i]);
- }
- else {
-
- this.tokens[i].tokens.forEach(function (child) {
- child.id++; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this.tokens[i].id === token_id && !(this.tokens[i] instanceof MultiwordToken)) {
- var initial = new Token(); //variable to store first half of expanded token
- var second = new Token(); //variable to store second half of expanded token
- var expandToken = new MultiwordToken(); //create new instance of mwt for expanded token//
-
- expandToken.form = this.tokens[i].form; // only duplicate form; id depends on id's of sub-tokens; other properties should be undefined
- initial.form = this.tokens[i].form.slice(0, index);
- initial.id = this.tokens[i].id; //update id of first sub-token
- second.form = this.tokens[i].form.slice(index);
- second.id = Number(this.tokens[i].id) + 1; //update id of second sub-token
- expandToken.tokens.push(initial);
- expandToken.tokens.push(second);
- this.tokens.splice((i), 1, expandToken);// inserts new word at the correct index in the array, removes original token
- //note: all information stored in initial token is lost. To be confirmed.
- found = true;
- //console.log(this.tokens[1]);
- }
-
- }
- },
-
- collapse: function(token_id) {
-
- var found = false;
- for (var i=0; i < this.tokens.length; i++) {
-
- if (found === true) {
- if (!(this.tokens[i] instanceof MultiwordToken)) {
- this.tokens[i].id = Number(this.tokens[i].id - (mwt_length-1)); //updates the id's of every token after collapse
- //note: also valid if mwt has more than 2 sub-tokens
- }
- else {
- this.tokens[i].tokens.forEach(function (child) {
- child.id = Number(child.id - (mwt_length-1));//updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this.tokens[i].id === token_id) { // note: must be a string, since the id of a mwt is a string
- if (this.tokens[i] instanceof MultiwordToken) { //collapse only applies to mwt
- var mwt_length = this.tokens[i].tokens.length;// find the length of the mwt sub-tokens array, for updating other values
- var collapsed = new Token(); // note: is not a mwt
- //collapsed.id = Number(this.tokens[i].id.slice(0,1)); // wouldn't work for mwt token 34-35, for example.
- collapsed.id = Number(this.tokens[i].tokens[0].id);// token "collapsed" can be assigned an id: takes the id of the first child of the mwt
- collapsed.form = this.tokens[i].form;
- this.tokens.splice((i), 1, collapsed);
- found = true;
- }
- //if this.tokens[i] isn't an instance of a MultiwordToken, do nothing.
- }
- }
- },
- splitComment: function (comment_index, character_index) { //new comment line from splitting point
- for (var i = 0; i < this.comments.length; i ++) {
- if (i === comment_index) {
- var newComment = this.comments[i].slice(character_index);
- this.comments[i] = this.comments[i].slice(0, character_index)
- this.comments.splice((i + 1), 0, newComment)
- }
- }
- },
-
- mergeComment: function (comment_index) { //removes comment at index 0 from comments array
- this.comments[comment_index] = this.comments[comment_index] + this.comments[comment_index+1];
- this.comments.splice(comment_index+1, 1);
-
- }
-
-};
-
-Object.defineProperty(Sentence.prototype,'serial',
- {
- get: function () {
-
- var serialArray = [];
-
- for (var i = 0; i < this.comments.length; i++) {
- serialArray.push("#" + this.comments[i]);
-
- }
-
- for (var i = 0; i < this.tokens.length; i++) {
- serialArray.push(this.tokens[i].serial);
- }
- serialArray.push(""); //add empty string for line break after sentence
- return serialArray.join("\n");
- },
- set: function (arg) {
- this.comments = [];
- this.tokens = [];
- var lines = arg.split("\n");
- for (var i = 0; i < lines.length; i++) { //identify comments in string & add to comments array
- if (lines[i].startsWith("\#")) {
- this.comments.push(lines[i]);
- this.comments[i] = this.comments[i].substring(1);
- }
- }
-
- var mwtSubIds = [];
- for (var i = 0; i < lines.length; i++){
- var fields = [];
- fields = lines[i].split("\t"); //split into subfields to identify mwt ids
- var currentLineId = fields[0];
- if (!(lines[i].startsWith("\#")) && !(lines[i] === '')) { //find non-comments/non-empty lines
- var mwtId = null;
- if (fields[0].includes("-")){
- mwtString = lines[i] + "\n";
- mwtId = fields[0];
- dashIndex = fields[0].indexOf("-");
- var first = Number(mwtId.slice(0, dashIndex)); //everything before/after slash
- var last = Number(mwtId.slice(dashIndex+1));
- var span = [];
- while(first <= last) {
- span.push(Number(first++)); //get span of mwt ids to match all mwt subtoken ids
- }
- mwtSubIds = span.map(function(id){
- return id
- });
- span = span.map(String);
- for (var j = 0; j < lines.length; j++) { //add all subtokens to mwt string
- var innerFields = [];
- innerFields = lines[j].split("\t");
- for (var x = 0; x < span.length; x++){
- if (span[x] === innerFields[0]){
- mwtString = mwtString + (lines[j] + "\n");
- }
- }
- }
- mwtString = mwtString.substring(0, mwtString.length - 1);
- var setMwt = new MultiwordToken();
- setMwt.serial = mwtString;//serialize mwt string
- this.tokens.push(setMwt);
-
- } else if (mwtSubIds.indexOf(Number(currentLineId)) === -1) {
-
- var setToken = new Token();
- setToken.serial = lines[i];
- this.tokens.push(setToken);
- }
- }
-
- }
- }
- }
-);
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Sentence = Sentence;
-}
-},{"./MultiwordToken.js":2,"./Token.js":4,"./TokenAggregate.js":5}],4:[function(require,module,exports){
-/**
- * A Token represents a single token represented in a Conllu file
- * For example, a Token may represent the following line:
- *
- * 1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
- *
- * @constructor
- */
-var Token = function() {};
-
-Token.prototype = {
- // note: id is generally managed by Sentence
- id: undefined,
- form: '',
- lemma: undefined,
- upostag: undefined,
- xpostag: undefined,
- feats: undefined,
- head: undefined,
- deprel: undefined,
- deps: undefined,
- misc: undefined
-};
-
-Object.defineProperty(Token.prototype,'serial',
- {
- get: function() {
- // takes this token object and returns a string
- // no iteration through the properties of the object, because of non-conllu properties (ex: "serialize" property)
- var id_output = "_";
- if (!(this.id === undefined) && !(this.id === "")){
- id_output = String(this.id);
- }
-
- var form_output = "_";
- if (!(this.id === undefined) && !(this.id === "")){
- form_output = String(this.form);
- }
-
- var lemma_output = "_";
- if (!(this.lemma === undefined) && !(this.lemma === "")){
- lemma_output = String(this.lemma);
- }
-
- var upostag_output = "_";
- if (!(this.upostag === undefined) && !(this.upostag === "")){
- upostag_output = String(this.upostag);
- }
-
- var xpostag_output = "_";
- if (!(this.xpostag === undefined) && !(this.xpostag === "")){
- xpostag_output = String(this.xpostag);
- }
-
- var feats_output = "_";
- if (!(this.feats === undefined) && !(this.feats === "")){
- feats_output = String(this.feats);
- }
-
- var head_output = "_";
- if (!(this.head === undefined) && !(this.head === "")){
- head_output = String(this.head);
- }
-
- var deprel_output = "_";
- if (!(this.deprel === undefined) && !(this.deprel === "")){
- deprel_output = String(this.deprel);
- }
-
- var deps_output = "_";
- if (!(this.deps === undefined) && !(this.deps === "")){
- deps_output = String(this.deps);
- }
-
- var misc_output = "_";
- if (!(this.misc === undefined) && !(this.misc === "")){
- misc_output = String(this.misc);
- }
-
- return (id_output + "\t" + form_output + "\t" + lemma_output + "\t" + upostag_output + "\t" + xpostag_output + "\t" + feats_output + "\t" + head_output + "\t" + deprel_output + "\t" + deps_output + "\t" + misc_output);
- },
-
- set: function(arg) {
- //takes a string and sets this object's value to match the string.
-
- var fields = arg.split("\t");
-
- this.id = Number(fields[0]);
- if (this.id === "_")
- this.id = undefined;
-
- this.form = fields[1];
- if (this.form === "_")
- this.form = undefined;
-
- this.lemma = fields[2];
- if (this.lemma === "_")
- this.lemma = undefined;
-
- this.upostag = fields[3];
- if (this.upostag === "_")
- this.upostag = undefined;
-
- this.xpostag = fields[4];
- if (this.xpostag === "_")
- this.xpostag = undefined;
-
- this.feats = fields[5];
- if (this.feats === "_")
- this.feats = undefined;
-
- this.head = fields[6];
- if (this.head === "_")
- this.head = undefined;
-
- this.deprel = fields[7];
- if (this.deprel === "_")
- this.deprel = undefined;
-
- this.deps = fields[8];
- if (this.deps === "_")
- this.deps = undefined;
-
- this.misc = fields[9];
- if (this.misc === "_")
- this.misc = undefined;
- }
- }
-);
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Token = Token;
-}
-
-
-},{}],5:[function(require,module,exports){
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var MultiwordToken = require("./MultiwordToken.js").MultiwordToken;
-
-}
-/**
- * A TokenAggregate is responsible to managing a collection of Tokens.
- * Specifically, it provides utilities for splitting and merging Tokens in an ordered list.
- *
- * This function is meant to be called on an existing object in order to give it TokenAggregate capabilities.
- * The name of the property containing the Token list is given in the constructor, enabling us to use this
- * functionality on any object containing a Token list, regardless of the name of that list.
- *
- * For example:
- *
- * var obj = { tokens: [{id: 1, form: 'token1'}, {id: 2, form:'token2'}] };
- * TokenAggregate.call(obj,'tokens');
- * obj.split(1,3);
- * obj.merge(1);
- *
- * @param token_array
- * @constructor
- */
-var TokenAggregate = function(token_array) {
- // Note: access the token array using: this[token_array] (instead of this.token_array)
-
- /**
- * split splits a token into two tokens.
- * This function finds the token with the given id, and splits it at that index.
- * For example, if we have tokens [{id: 1, form: 'token1'}, {id: 2, form:'token2'}],
- * calling split(1,2) would result in [{id: 1, form: 'to'},{id: 2, form:'ken1'}, {id: 3, form:'token2'}]
- * @param token_id
- * @param string_index
- */
- this.split = function(token_id, string_index) {
- var found = false;
- for (var x=0; x< this[token_array].length; x++) {
- if (found === true) {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (!(this[token_array][x] instanceof MultiwordToken)) {
- this[token_array][x].id++; //gives cheeky +1 to the id's coming after the split. Makes space for our split (at least in id domain)
- }
- else {
- this[token_array][x].tokens.forEach(function (child) {
- child.id++; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this[token_array][x].id === token_id) {
- var splitter = this[token_array][x];//find the splitter who is at the given token_id & assign to variable
- var word = new Token(); // makes the new word an instance of Token
-
- // updates new word's id
- if (String(token_id).includes("-")){ // if the given token is a MWT parent (of the form "2-3")
- word.id = (splitter.tokens[splitter.tokens.length-1].id); // give the new word the index of the last sub-token (what about + 1 ??)
- }
- else { // if the given token is a normal token
- word.id = token_id; // why not +1?? Was like this already and seems to work...
- }
-
- //updates new word's form and splitter's form, and inserts new word into array
- word.form = splitter.form.slice(string_index);
- splitter.form = splitter.form.slice(0, string_index);
- this[token_array].splice((x + 1), 0, word);// inserts new word at the correct index in the array
-
- found = true;
- } else {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (this[token_array][x] instanceof MultiwordToken) {
- var prev_length = this[token_array][x].tokens.length;
- this[token_array][x].split(token_id, string_index);
- if(prev_length !== this[token_array][x].tokens.length) {
- found = true;
- }
- }
- }
- }
- };
-
-
-
- /**
- * merge removes the next word and links it to the current word.
- * For example, if we have [{id: 1, form: 'to'},{id: 2, form:'ken1'}, {id: 3, form:'token2'}]
- * calling merge(1) would result in [{id:1, form: 'token1'}, {id: 2, form:'token2'}]
- * @param token_id
- */
- this.merge = function(token_id) {
- found = false;
- for (var x in this[token_array]) {
- if (found === true) {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (!(this[token_array][x] instanceof MultiwordToken)) {
- this[token_array][x].id = this[token_array][x].id - 1; //updates the id's of every token after the merge
- }
- else {
- this[token_array][x].tokens.forEach(function (child) {
- child.id = child.id - 1; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this[token_array][x].id === token_id) {
- var merger = this[token_array][x];
- var gone = this[token_array][Number(x) + 1];
- merger.form = merger.form + gone.form;
- this[token_array].splice((Number(x) + 1), 1);
- found = true;
- }else {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (this[token_array][x] instanceof MultiwordToken) {
- var prev_length = this[token_array][x].tokens.length;
- this[token_array][x].merge(token_id);
- if(prev_length !== this[token_array][x].tokens.length) {
- found = true;
- }
- }
- }
- }
- };
-};
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.TokenAggregate = TokenAggregate;
-}
-
-},{"../lib/MultiwordToken.js":2,"./MultiwordToken.js":2,"./Token.js":4}],"conllu":[function(require,module,exports){
-exports.Conllu = require('./lib/Conllu.js').Conllu;
-exports.MultiwordToken = require('./lib/MultiwordToken.js').MultiwordToken;
-exports.Sentence = require('./lib/Sentence.js').Sentence;
-exports.Token = require('./lib/Token.js').Token;
-
-
-},{"./lib/Conllu.js":1,"./lib/MultiwordToken.js":2,"./lib/Sentence.js":3,"./lib/Token.js":4}]},{},[]);
diff --git a/standalone/lib/ext/conllu/conllu/index.js b/standalone/lib/ext/conllu/conllu/index.js
deleted file mode 100755
index 846f1b9c..00000000
--- a/standalone/lib/ext/conllu/conllu/index.js
+++ /dev/null
@@ -1,5 +0,0 @@
-exports.Conllu = require('./lib/Conllu.js').Conllu;
-exports.MultiwordToken = require('./lib/MultiwordToken.js').MultiwordToken;
-exports.Sentence = require('./lib/Sentence.js').Sentence;
-exports.Token = require('./lib/Token.js').Token;
-
diff --git a/standalone/lib/ext/conllu/conllu/lib/Conllu.js b/standalone/lib/ext/conllu/conllu/lib/Conllu.js
deleted file mode 100755
index 1117f89e..00000000
--- a/standalone/lib/ext/conllu/conllu/lib/Conllu.js
+++ /dev/null
@@ -1,138 +0,0 @@
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Sentence = require("./Sentence.js").Sentence;
- var MultiwordToken = require("./MultiwordToken.js").MultiwordToken;
-}
-/**
- * Conllu
- * A Conllu represents the contents of a Conllu file.
- * It is, in essence, a list of the sentences found in the file.
- *
- * @constructor
- */
-var Conllu = function() {
- this.sentences = [];
-};
-
-Conllu.prototype = {
-
-
- splitSentence : function (sentence_index, token_id) {
-
- for (var i = 0; i < this.sentences.length; i++) {
-
- if (i === sentence_index) {
- var newSentence = new Sentence;
- currentId = 0;
- newId = 1;
- removeIds = [];
- for (var j = token_id; j < this.sentences[i].tokens.length; j++) {
- if (!(this.sentences[i].tokens[j] instanceof MultiwordToken)) {
- newSentence.tokens.push(this.sentences[i].tokens[j]);
- newSentence.tokens[currentId].id = newId;
- newId = newId + 1;
- currentId = currentId + 1;
- removeIds.push(j)
- } else {
- newSentence.tokens.push(this.sentences[i].tokens[j]);
- newSentence.tokens[currentId].tokens.forEach (function (child) {
- child.id = newId;
- newId = newId + 1;
- removeIds.push(j);
- });
- currentId = currentId + 1
- }
- }
- for (var h = removeIds.length-1; h >= 0; h--) {
- var id = removeIds[h];
- this.sentences[i].tokens.splice(id,1);
- }
- }
- }
- this.sentences.splice(sentence_index+1, 0, newSentence);
- },
-
-
- mergeSentence : function (sentence_index) {
- var sentence = this.sentences[sentence_index];
-
- // remove each token from the next sentence and push it to the previous sentence
- while (this.sentences[sentence_index + 1].tokens[0] !== undefined){ // when the first item of the second sentence is not a token, iteration must end
- var current = this.sentences[sentence_index+1].tokens.shift();
- this.sentences[sentence_index].tokens.push(current);
- }
-
- // remove the old sentence object
- this.sentences.splice(sentence_index+1, 1);
-
- // update token id's and multiword token id's from 1 till end of merged sentence
- var id = 0;
- for (var x in this.sentences[sentence_index].tokens){
- var word = this.sentences[sentence_index].tokens[x];
-
- //if the token is a normal Token
- if (!(word instanceof MultiwordToken)){
- id++;
- word.id = id;
- }
-
- //if the token is a multi word token
- else {
- for (var subtoken in word.tokens){
- id++;
- word.tokens[subtoken].id = id;
- }
- }
- }
- }
-};
-
-
-
-
-/**
- * serial
- * The serial property is the string representation of the file.
- * The contents of the Conllu object may be updated by modifying this string. However, for better
- * performance, it is recommended to modify the object itself.
- * @type {String}
- */
-
-Object.defineProperty(Conllu.prototype,'serial',
- {
- get: function() {
- var serialArray = [];
-
- for (var i= 0; i < this.sentences.length; i++) {
- serialArray.push(this.sentences[i].serial);
- }
-
- return serialArray.join("\n");
-
-
- },
- set: function(arg) {
- var lines = arg.split("\n"); //splits input text on newline
- var sent = []; //creates dummy sentence array
-
- for (var i = 0; i < lines.length; i ++){
- if (lines[i] === ""){ //flags empty lines as end of sentence
- sent.push(lines[i]); //add empty line to dummy sentence array
- var sentCat = sent.join("\n"); //join dummy sentence array on newline
- var setSentence = new Sentence();
- setSentence.serial = sentCat; //set sentence serial property to joined dummy sentence
- this.sentences.push(setSentence); //add this sentence to conllu sentences array
- sent = []
- } else {
- sent.push(lines[i]); //adds all lines before empty line to dummy sentence array
- }
- }
- }
-
- }
-);
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Conllu = Conllu;
-}
diff --git a/standalone/lib/ext/conllu/conllu/lib/MultiwordToken.js b/standalone/lib/ext/conllu/conllu/lib/MultiwordToken.js
deleted file mode 100755
index 48cfe59a..00000000
--- a/standalone/lib/ext/conllu/conllu/lib/MultiwordToken.js
+++ /dev/null
@@ -1,104 +0,0 @@
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var TokenAggregate = require("./TokenAggregate.js").TokenAggregate;
-}
-
-/**
- * A MultiwordToken is any token which consists of subtokens
- * For example, a MultiwordToken may represent the following lines in a Conllu file:
- *
- * 2-3 haven't ...
- * 2 have ...
- * 3 n't ...
- *
- * @property tokens {Array}
- * The tokens property is the list of subtokens this MultiwordToken is responsible for.
- *
- * @extends Token
- * @inherits TokenAggregate
- *
- * @constructor
- */
-var MultiwordToken = function() {
- //constructor for Multi-word Tokens
- Token.call(this); // gives the MWT all the properties created in the Token constructor (note: not token prototype)
- this.tokens = []; // creates the array that contains the children of the MWT
- TokenAggregate.call(this,'tokens'); //gives the MWT all the properties created in the Token Aggregate constructor
-};
-MultiwordToken.prototype = new Token(); // gives new instance of MWT the properties of a new instance of Token
-
-/**
- * The id in a MultiwordToken is based on the MultiwordToken's subtokens.
- * The id will be: smallestid-largestid
- * The id cannot be updated here.
- * @type {String}
- */
-Object.defineProperty(MultiwordToken.prototype,'id',{
- get: function() {
- if (this.tokens.length < 1){
- return "?-?"; // if the multi-word token doesn't have any children (length of sub-array tokens is 0), alert. Do not allow to save.
- }
- var first = this.tokens[0]; // id of first child
- var last = this.tokens[this.tokens.length-1]; // id of last child
- id = first.id + "-" + last.id; // assign mwt id to be "smallestID-largestID"
- return String(id); //return in string version
- },
-
- set: function(value) { // does nothing
- }
-});
-
-Object.defineProperty(MultiwordToken.prototype,'serial',{
- get: function() {
- // get annotated multi word token into conllu string form
-
- var finalString = "";
-
- // handle apostrophes inside the token
- var parentForm = this.form;
- if (parentForm.includes("'")){
- parentForm = parentForm.replace("'", "\'")
- }
-
- // Find the serial property from the Token object, and use that to serialize the MWT line
- var parentSerialGetter = Object.getOwnPropertyDescriptor(Token.prototype,'serial');
- var parentMWT = parentSerialGetter.get.call(this);
-
- finalString = finalString + parentMWT; // add parent mwt to the final conllu format string for the text
-
- for (word in this.tokens){
- finalString = finalString + "\n" + this.tokens[word].serial;// iteratively add each child to the final string.
- }
-
- return finalString;
- },
-
- set: function(mwtString) {
- // set multi word token string to modifiable form
-
- // Split the initial string into separate lines as would be found in Conllu format
- var mwtLines = mwtString.split("\n");
-
- // First item in array (first line) turned into mwt "parent"
- // Find the serial property from the Token object, and use that to serialize the MWT line
- var parentSerialSetter = Object.getOwnPropertyDescriptor(Token.prototype,'serial');
- parentSerialSetter.set.call(this, mwtLines[0]);
-
- this.tokens = []; //ensure the subtokens array is clear
-
- // Iterate over the subtokens and set them using the existing Token setter. Push them to subtokens array.
- for (i = 1; i < mwtLines.length; i++){
- var subToken = new Token();
- subToken.serial = mwtLines[i];
- this.tokens.push(subToken);
- }
- }
-});
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.MultiwordToken = MultiwordToken;
-}
diff --git a/standalone/lib/ext/conllu/conllu/lib/Sentence.js b/standalone/lib/ext/conllu/conllu/lib/Sentence.js
deleted file mode 100755
index 52dbfa5e..00000000
--- a/standalone/lib/ext/conllu/conllu/lib/Sentence.js
+++ /dev/null
@@ -1,218 +0,0 @@
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var MultiwordToken = require("./MultiwordToken.js").MultiwordToken;
- var TokenAggregate = require("./TokenAggregate.js").TokenAggregate;
-
-}
-/**
- * A Sentence is a collection of comments, Tokens, and MultiwordTokens representing a sentence within a Conllu file.
- * For example, a Sentence may represent the following lines in a file:
- *
- * # sent_id 2
- * # ...
- * 1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
- * 2-3 haven't _ _ _ _ _ _ _ _
- * 2 have have VERB VBP Number=Sing|Person=1|Tense=Pres 0 root _ _
- * 3 not not PART RB Negative=Neg 2 neg _ _
- * 4 a a DET DT Definite=Ind|PronType=Art 4 det _ _
- * 5 clue clue NOUN NN Number=Sing 2 dobj _ SpaceAfter=No
- * 6 . . PUNCT . _ 2 punct _ _
- *
- * @property comments {Array}
- * The comments property maintains an ordered list of all comments
- *
- * @property tokens {Array}
- * The tokens property maintains an ordered list of all Tokens and Multiword tokens.
- * In the example given above, a single MultiwordToken would be responsible for lines starting with ids 1-2, 2, and 3
- *
- * @constructor
- */
-var Sentence = function() {
- /**
- * comments should be an ordered list of strings representing the comments of this sentence.
- * The strings should not include the initial '#' character - only the content of the comment.
- * @type {Array}
- */
- this.comments = [];
-
- /**
- * tokens should be an ordered list of tokens and multiword tokens.
- * We will rely on the ordering of this list to display the tokens in the correct order - not the ids
- * of the tokens. Note, however, that the ids of the tokens/multiwordtokens and subtokens should be
- * maintained by the sentence.
- * @type {Array}
- */
- this.tokens = [];
-
- TokenAggregate.call(this,'tokens');
-};
-
-Sentence.prototype = {
-
- expand : function (token_id, index) {
- var found = false;
- for (var i=0; i < this.tokens.length; i++) {
- if (found === true) {
-
- if (!(this.tokens[i] instanceof MultiwordToken)) {
- this.tokens[i].id++; //increases id's by 1 after expansion
- //console.log(this.tokens[i]);
- }
- else {
-
- this.tokens[i].tokens.forEach(function (child) {
- child.id++; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this.tokens[i].id === token_id && !(this.tokens[i] instanceof MultiwordToken)) {
- var initial = new Token(); //variable to store first half of expanded token
- var second = new Token(); //variable to store second half of expanded token
- var expandToken = new MultiwordToken(); //create new instance of mwt for expanded token//
-
- expandToken.form = this.tokens[i].form; // only duplicate form; id depends on id's of sub-tokens; other properties should be undefined
- initial.form = this.tokens[i].form.slice(0, index);
- initial.id = this.tokens[i].id; //update id of first sub-token
- second.form = this.tokens[i].form.slice(index);
- second.id = Number(this.tokens[i].id) + 1; //update id of second sub-token
- expandToken.tokens.push(initial);
- expandToken.tokens.push(second);
- this.tokens.splice((i), 1, expandToken);// inserts new word at the correct index in the array, removes original token
- //note: all information stored in initial token is lost. To be confirmed.
- found = true;
- //console.log(this.tokens[1]);
- }
-
- }
- },
-
- collapse: function(token_id) {
-
- var found = false;
- for (var i=0; i < this.tokens.length; i++) {
-
- if (found === true) {
- if (!(this.tokens[i] instanceof MultiwordToken)) {
- this.tokens[i].id = Number(this.tokens[i].id - (mwt_length-1)); //updates the id's of every token after collapse
- //note: also valid if mwt has more than 2 sub-tokens
- }
- else {
- this.tokens[i].tokens.forEach(function (child) {
- child.id = Number(child.id - (mwt_length-1));//updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this.tokens[i].id === token_id) { // note: must be a string, since the id of a mwt is a string
- if (this.tokens[i] instanceof MultiwordToken) { //collapse only applies to mwt
- var mwt_length = this.tokens[i].tokens.length;// find the length of the mwt sub-tokens array, for updating other values
- var collapsed = new Token(); // note: is not a mwt
- //collapsed.id = Number(this.tokens[i].id.slice(0,1)); // wouldn't work for mwt token 34-35, for example.
- collapsed.id = Number(this.tokens[i].tokens[0].id);// token "collapsed" can be assigned an id: takes the id of the first child of the mwt
- collapsed.form = this.tokens[i].form;
- this.tokens.splice((i), 1, collapsed);
- found = true;
- }
- //if this.tokens[i] isn't an instance of a MultiwordToken, do nothing.
- }
- }
- },
- splitComment: function (comment_index, character_index) { //new comment line from splitting point
- for (var i = 0; i < this.comments.length; i ++) {
- if (i === comment_index) {
- var newComment = this.comments[i].slice(character_index);
- this.comments[i] = this.comments[i].slice(0, character_index)
- this.comments.splice((i + 1), 0, newComment)
- }
- }
- },
-
- mergeComment: function (comment_index) { //removes comment at index 0 from comments array
- this.comments[comment_index] = this.comments[comment_index] + this.comments[comment_index+1];
- this.comments.splice(comment_index+1, 1);
-
- }
-
-};
-
-Object.defineProperty(Sentence.prototype,'serial',
- {
- get: function () {
-
- var serialArray = [];
-
- for (var i = 0; i < this.comments.length; i++) {
- serialArray.push("#" + this.comments[i]);
-
- }
-
- for (var i = 0; i < this.tokens.length; i++) {
- serialArray.push(this.tokens[i].serial);
- }
- serialArray.push(""); //add empty string for line break after sentence
- return serialArray.join("\n");
- },
- set: function (arg) {
- this.comments = [];
- this.tokens = [];
- var lines = arg.split("\n");
- for (var i = 0; i < lines.length; i++) { //identify comments in string & add to comments array
- if (lines[i].startsWith("\#")) {
- this.comments.push(lines[i]);
- this.comments[i] = this.comments[i].substring(1);
- }
- }
-
- var mwtSubIds = [];
- for (var i = 0; i < lines.length; i++){
- var fields = [];
- fields = lines[i].split("\t"); //split into subfields to identify mwt ids
- var currentLineId = fields[0];
- if (!(lines[i].startsWith("\#")) && !(lines[i] === '')) { //find non-comments/non-empty lines
- var mwtId = null;
- if (fields[0].includes("-")){
- mwtString = lines[i] + "\n";
- mwtId = fields[0];
- dashIndex = fields[0].indexOf("-");
- var first = Number(mwtId.slice(0, dashIndex)); //everything before/after slash
- var last = Number(mwtId.slice(dashIndex+1));
- var span = [];
- while(first <= last) {
- span.push(Number(first++)); //get span of mwt ids to match all mwt subtoken ids
- }
- mwtSubIds = span.map(function(id){
- return id
- });
- span = span.map(String);
- for (var j = 0; j < lines.length; j++) { //add all subtokens to mwt string
- var innerFields = [];
- innerFields = lines[j].split("\t");
- for (var x = 0; x < span.length; x++){
- if (span[x] === innerFields[0]){
- mwtString = mwtString + (lines[j] + "\n");
- }
- }
- }
- mwtString = mwtString.substring(0, mwtString.length - 1);
- var setMwt = new MultiwordToken();
- setMwt.serial = mwtString;//serialize mwt string
- this.tokens.push(setMwt);
-
- } else if (mwtSubIds.indexOf(Number(currentLineId)) === -1) {
-
- var setToken = new Token();
- setToken.serial = lines[i];
- this.tokens.push(setToken);
- }
- }
-
- }
- }
- }
-);
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Sentence = Sentence;
-}
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/lib/Token.js b/standalone/lib/ext/conllu/conllu/lib/Token.js
deleted file mode 100755
index bf66afe8..00000000
--- a/standalone/lib/ext/conllu/conllu/lib/Token.js
+++ /dev/null
@@ -1,136 +0,0 @@
-/**
- * A Token represents a single token represented in a Conllu file
- * For example, a Token may represent the following line:
- *
- * 1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
- *
- * @constructor
- */
-var Token = function() {};
-
-Token.prototype = {
- // note: id is generally managed by Sentence
- id: undefined,
- form: '',
- lemma: undefined,
- upostag: undefined,
- xpostag: undefined,
- feats: undefined,
- head: undefined,
- deprel: undefined,
- deps: undefined,
- misc: undefined
-};
-
-Object.defineProperty(Token.prototype,'serial',
- {
- get: function() {
- // takes this token object and returns a string
- // no iteration through the properties of the object, because of non-conllu properties (ex: "serialize" property)
- var id_output = "_";
- if (!(this.id === undefined) && !(this.id === "")){
- id_output = String(this.id);
- }
-
- var form_output = "_";
- if (!(this.id === undefined) && !(this.id === "")){
- form_output = String(this.form);
- }
-
- var lemma_output = "_";
- if (!(this.lemma === undefined) && !(this.lemma === "")){
- lemma_output = String(this.lemma);
- }
-
- var upostag_output = "_";
- if (!(this.upostag === undefined) && !(this.upostag === "")){
- upostag_output = String(this.upostag);
- }
-
- var xpostag_output = "_";
- if (!(this.xpostag === undefined) && !(this.xpostag === "")){
- xpostag_output = String(this.xpostag);
- }
-
- var feats_output = "_";
- if (!(this.feats === undefined) && !(this.feats === "")){
- feats_output = String(this.feats);
- }
-
- var head_output = "_";
- if (!(this.head === undefined) && !(this.head === "")){
- head_output = String(this.head);
- }
-
- var deprel_output = "_";
- if (!(this.deprel === undefined) && !(this.deprel === "")){
- deprel_output = String(this.deprel);
- }
-
- var deps_output = "_";
- if (!(this.deps === undefined) && !(this.deps === "")){
- deps_output = String(this.deps);
- }
-
- var misc_output = "_";
- if (!(this.misc === undefined) && !(this.misc === "")){
- misc_output = String(this.misc);
- }
-
- return (id_output + "\t" + form_output + "\t" + lemma_output + "\t" + upostag_output + "\t" + xpostag_output + "\t" + feats_output + "\t" + head_output + "\t" + deprel_output + "\t" + deps_output + "\t" + misc_output);
- },
-
- set: function(arg) {
- //takes a string and sets this object's value to match the string.
-
- var fields = arg.split("\t");
-
- this.id = Number(fields[0]);
- if (this.id === "_")
- this.id = undefined;
-
- this.form = fields[1];
- if (this.form === "_")
- this.form = undefined;
-
- this.lemma = fields[2];
- if (this.lemma === "_")
- this.lemma = undefined;
-
- this.upostag = fields[3];
- if (this.upostag === "_")
- this.upostag = undefined;
-
- this.xpostag = fields[4];
- if (this.xpostag === "_")
- this.xpostag = undefined;
-
- this.feats = fields[5];
- if (this.feats === "_")
- this.feats = undefined;
-
- this.head = fields[6];
- if (this.head === "_")
- this.head = undefined;
-
- this.deprel = fields[7];
- if (this.deprel === "_")
- this.deprel = undefined;
-
- this.deps = fields[8];
- if (this.deps === "_")
- this.deps = undefined;
-
- this.misc = fields[9];
- if (this.misc === "_")
- this.misc = undefined;
- }
- }
-);
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.Token = Token;
-}
-
diff --git a/standalone/lib/ext/conllu/conllu/lib/TokenAggregate.js b/standalone/lib/ext/conllu/conllu/lib/TokenAggregate.js
deleted file mode 100755
index 4e0ea60d..00000000
--- a/standalone/lib/ext/conllu/conllu/lib/TokenAggregate.js
+++ /dev/null
@@ -1,130 +0,0 @@
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- var Token = require("./Token.js").Token;
- var MultiwordToken = require("./MultiwordToken.js").MultiwordToken;
-
-}
-/**
- * A TokenAggregate is responsible to managing a collection of Tokens.
- * Specifically, it provides utilities for splitting and merging Tokens in an ordered list.
- *
- * This function is meant to be called on an existing object in order to give it TokenAggregate capabilities.
- * The name of the property containing the Token list is given in the constructor, enabling us to use this
- * functionality on any object containing a Token list, regardless of the name of that list.
- *
- * For example:
- *
- * var obj = { tokens: [{id: 1, form: 'token1'}, {id: 2, form:'token2'}] };
- * TokenAggregate.call(obj,'tokens');
- * obj.split(1,3);
- * obj.merge(1);
- *
- * @param token_array
- * @constructor
- */
-var TokenAggregate = function(token_array) {
- // Note: access the token array using: this[token_array] (instead of this.token_array)
-
- /**
- * split splits a token into two tokens.
- * This function finds the token with the given id, and splits it at that index.
- * For example, if we have tokens [{id: 1, form: 'token1'}, {id: 2, form:'token2'}],
- * calling split(1,2) would result in [{id: 1, form: 'to'},{id: 2, form:'ken1'}, {id: 3, form:'token2'}]
- * @param token_id
- * @param string_index
- */
- this.split = function(token_id, string_index) {
- var found = false;
- for (var x=0; x< this[token_array].length; x++) {
- if (found === true) {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (!(this[token_array][x] instanceof MultiwordToken)) {
- this[token_array][x].id++; //gives cheeky +1 to the id's coming after the split. Makes space for our split (at least in id domain)
- }
- else {
- this[token_array][x].tokens.forEach(function (child) {
- child.id++; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this[token_array][x].id === token_id) {
- var splitter = this[token_array][x];//find the splitter who is at the given token_id & assign to variable
- var word = new Token(); // makes the new word an instance of Token
-
- // updates new word's id
- if (String(token_id).includes("-")){ // if the given token is a MWT parent (of the form "2-3")
- word.id = (splitter.tokens[splitter.tokens.length-1].id); // give the new word the index of the last sub-token (what about + 1 ??)
- }
- else { // if the given token is a normal token
- word.id = token_id; // why not +1?? Was like this already and seems to work...
- }
-
- //updates new word's form and splitter's form, and inserts new word into array
- word.form = splitter.form.slice(string_index);
- splitter.form = splitter.form.slice(0, string_index);
- this[token_array].splice((x + 1), 0, word);// inserts new word at the correct index in the array
-
- found = true;
- } else {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (this[token_array][x] instanceof MultiwordToken) {
- var prev_length = this[token_array][x].tokens.length;
- this[token_array][x].split(token_id, string_index);
- if(prev_length !== this[token_array][x].tokens.length) {
- found = true;
- }
- }
- }
- }
- };
-
-
-
- /**
- * merge removes the next word and links it to the current word.
- * For example, if we have [{id: 1, form: 'to'},{id: 2, form:'ken1'}, {id: 3, form:'token2'}]
- * calling merge(1) would result in [{id:1, form: 'token1'}, {id: 2, form:'token2'}]
- * @param token_id
- */
- this.merge = function(token_id) {
- found = false;
- for (var x in this[token_array]) {
- if (found === true) {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (!(this[token_array][x] instanceof MultiwordToken)) {
- this[token_array][x].id = this[token_array][x].id - 1; //updates the id's of every token after the merge
- }
- else {
- this[token_array][x].tokens.forEach(function (child) {
- child.id = child.id - 1; //updates the id's of the children in every multi-word token.
- //the parent in a multi-word token updates automatically based on the children.
- });
- }
- }
- else if (this[token_array][x].id === token_id) {
- var merger = this[token_array][x];
- var gone = this[token_array][Number(x) + 1];
- merger.form = merger.form + gone.form;
- this[token_array].splice((Number(x) + 1), 1);
- found = true;
- }else {
- var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken; //TODO: figure out how to move this
- if (this[token_array][x] instanceof MultiwordToken) {
- var prev_length = this[token_array][x].tokens.length;
- this[token_array][x].merge(token_id);
- if(prev_length !== this[token_array][x].tokens.length) {
- found = true;
- }
- }
- }
- }
- };
-};
-
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.TokenAggregate = TokenAggregate;
-}
diff --git a/standalone/lib/ext/conllu/conllu/package.json b/standalone/lib/ext/conllu/conllu/package.json
deleted file mode 100644
index 209dcf1f..00000000
--- a/standalone/lib/ext/conllu/conllu/package.json
+++ /dev/null
@@ -1,92 +0,0 @@
-{
- "_args": [
- [
- "conllu",
- "/home/maryszmary/Documents/ud-annotatrix/conllu"
- ]
- ],
- "_from": "conllu@latest",
- "_id": "conllu@0.1.1",
- "_inCache": true,
- "_installable": true,
- "_location": "/conllu",
- "_nodeVersion": "4.2.6",
- "_npmOperationalInternal": {
- "host": "packages-12-west.internal.npmjs.com",
- "tmp": "tmp/conllu-0.1.1.tgz_1480007912259_0.4644815940409899"
- },
- "_npmUser": {
- "email": "gwinnie32@gmail.com",
- "name": "magdalena"
- },
- "_npmVersion": "3.5.2",
- "_phantomChildren": {},
- "_requested": {
- "name": "conllu",
- "raw": "conllu",
- "rawSpec": "",
- "scope": null,
- "spec": "latest",
- "type": "tag"
- },
- "_requiredBy": [
- "#USER"
- ],
- "_resolved": "https://registry.npmjs.org/conllu/-/conllu-0.1.1.tgz",
- "_shasum": "c0350b02a0b1e6412d7f6cee4935ef496a7cf68e",
- "_shrinkwrap": null,
- "_spec": "conllu",
- "_where": "/home/maryszmary/Documents/ud-annotatrix/conllu",
- "bugs": {
- "url": "https://github.com/FrancessFractal/conllu/issues"
- },
- "contributors": [
- {
- "name": "Magdalena Parks",
- "url": "https://github.com/FrancessFractal"
- },
- {
- "name": "Allison Adams",
- "url": "https://github.com/aadams297"
- },
- {
- "name": "Manon Knoertzer",
- "url": "https://github.com/Manon78"
- }
- ],
- "dependencies": {},
- "description": "Conllu is a JavaScript library capable of manipulating files in the CoNLL-U format.",
- "devDependencies": {
- "chai": "^3.5.0",
- "mocha": "^3.1.2",
- "rewire": "^2.5.2"
- },
- "directories": {
- "test": "test"
- },
- "dist": {
- "shasum": "c0350b02a0b1e6412d7f6cee4935ef496a7cf68e",
- "tarball": "https://registry.npmjs.org/conllu/-/conllu-0.1.1.tgz"
- },
- "gitHead": "586499c882360914b9ce3c710663bf09ff691d46",
- "homepage": "https://github.com/FrancessFractal/conllu#readme",
- "license": "CC-BY-SA-4.0",
- "main": "index.js",
- "maintainers": [
- {
- "name": "magdalena",
- "email": "gwinnie32@gmail.com"
- }
- ],
- "name": "conllu",
- "optionalDependencies": {},
- "readme": "ERROR: No README data found!",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/FrancessFractal/conllu.git"
- },
- "scripts": {
- "test": "./node_modules/mocha/bin/mocha"
- },
- "version": "0.1.1"
-}
diff --git a/standalone/lib/ext/conllu/conllu/test/conllu_test.js b/standalone/lib/ext/conllu/conllu/test/conllu_test.js
deleted file mode 100755
index 4f092983..00000000
--- a/standalone/lib/ext/conllu/conllu/test/conllu_test.js
+++ /dev/null
@@ -1,92 +0,0 @@
-'use strict';
-
-var rewire = require('rewire');
-var module = rewire('../lib/Conllu.js');
-var Conllu = module.Conllu;
-
-var conllu_gold = require("../test/example1/conllu_obj.js").conllu;
-
-var chai = require("chai");
-var assert = chai.assert;
-var Sentence = function () {};
-
-describe("Conllu", function () {
- var conllu;
- beforeEach(function () {
- // Stub for Sentence
- module.__set__('Sentence', Sentence);
-
- // Stub for MultiwordToken
- var MultiwordToken = function () {
-
- };
- module.__set__('MultiwordToken', MultiwordToken);
- conllu = new Conllu();
- });
-
- describe("object inheritance", function () {
- it("should be an instance of Conllu", function () {
- assert.instanceOf(conllu, Conllu);
- });
- });
-
- describe("property 'sentences'", function () {
- it("should be a property", function () {
- assert.property(conllu, 'sentences');
- });
-
- // The sentences should not be shared with other instances of Conllu
- it("should be a direct property", function () {
- assert(conllu.hasOwnProperty('sentences'));
- });
-
- it("should be an array", function () {
- assert.typeOf(conllu.sentences, 'array');
- });
-
- it("should be empty", function () {
- assert.lengthOf(conllu.sentences, 0);
- });
- });
-
- describe("property 'serial'", function () {
- it("should be a property", function () {
- assert.property(conllu, 'serial');
- });
-
- describe("get", function () {
- beforeEach(function () {
- // create dummy sentences whose serial properties match the conllu file
- conllu.sentences = conllu_gold.sentences;
- });
-
- it("should return the sentences' serial properties concatenated with new lines. ", function () {
- assert.strictEqual(conllu.serial, conllu_gold.serial);
- });
- });
-
- describe("seting to conllu gold file contents", function () {
- beforeEach( function () {
- conllu.serial = conllu_gold.serial;
- });
-
- it("should have "+conllu_gold.sentences.length+" sentences", function () {
- assert.lengthOf(conllu.sentences, conllu_gold.sentences.length);
- });
-
- conllu_gold.sentences.forEach(function (sentence_gold, index) {
- context("sentence "+index, function () {
-
- it("should be an instance of Sentence", function () {
- assert.instanceOf(conllu.sentences[index], Sentence);
- });
-
- it("should have serial set to "+sentence_gold.serial, function () {
- assert.strictEqual(conllu.sentences[index].serial, sentence_gold.serial);
- });
- });
- });
- });
- });
-
-});
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/conllu.conllu b/standalone/lib/ext/conllu/conllu/test/example1/conllu.conllu
deleted file mode 100755
index 38f3b970..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/conllu.conllu
+++ /dev/null
@@ -1,18 +0,0 @@
-# sent_id 1
-# ...
-1 They they PRON PRP Case=Nom|Number=Plur 2 nsubj 4:nsubj _
-2 buy buy VERB VBP Number=Plur|Person=3|Tense=Pres 0 root _ _
-3 and and CONJ CC _ 2 cc _ _
-4 sell sell VERB VBP Number=Plur|Person=3|Tense=Pres 2 conj 0:root _
-5 books book NOUN NNS Number=Plur 2 dobj 4:dobj SpaceAfter=No
-6 . . PUNCT . _ 2 punct _ _
-
-# sent_id 2
-# ...
-1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
-2-3 haven't _ _ _ _ _ _ _ _
-2 have have VERB VBP Number=Sing|Person=1|Tense=Pres 0 root _ _
-3 not not PART RB Negative=Neg 2 neg _ _
-4 a a DET DT Definite=Ind|PronType=Art 4 det _ _
-5 clue clue NOUN NN Number=Sing 2 dobj _ SpaceAfter=No
-6 . . PUNCT . _ 2 punct _ _
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/conllu_obj.js b/standalone/lib/ext/conllu/conllu/test/example1/conllu_obj.js
deleted file mode 100755
index 565b495e..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/conllu_obj.js
+++ /dev/null
@@ -1,198 +0,0 @@
-
-var fs = require('fs');
-
-var conllu = {
- serial: fs.readFileSync('test/example1/conllu.conllu').toString(),
- sentences: [
- {
- text: "They buy and sell books.",
- serial: fs.readFileSync('test/example1/sent0/serial.txt').toString(),
- comments: [" sent_id 1", " ..."],
- tokens: [
- {
- serial: fs.readFileSync('test/example1/sent0/token0.txt').toString(),
- id: 1,
- form: "They",
- lemma: "they",
- upostag: "PRON",
- xpostag: "PRP",
- feats: "Case=Nom|Number=Plur",
- head: "2",
- deprel: "nsubj",
- deps: "4:nsubj",
- misc: undefined
- },
- {
- serial: fs.readFileSync('test/example1/sent0/token1.txt').toString(),
- id: 2,
- form: "buy",
- lemma: "buy",
- upostag: "VERB",
- xpostag: "VBP",
- feats: "Number=Plur|Person=3|Tense=Pres",
- head: "0",
- deprel: "root",
- deps: undefined,
- misc: undefined
- },
- {
- serial: fs.readFileSync('test/example1/sent0/token2.txt').toString(),
- id: 3,
- form: "and",
- lemma: "and",
- upostag: "CONJ",
- xpostag: "CC",
- feats: undefined,
- head: "2",
- deprel: "cc",
- deps: undefined,
- misc: undefined
- },
- {
- serial: fs.readFileSync('test/example1/sent0/token3.txt').toString(),
- id: 4,
- form: "sell",
- lemma: "sell",
- upostag: "VERB",
- xpostag: "VBP",
- feats: "Number=Plur|Person=3|Tense=Pres",
- head: "2",
- deprel: "conj",
- deps: "0:root",
- misc: undefined
- },
- {
- serial: fs.readFileSync('test/example1/sent0/token4.txt').toString(),
- id: 5,
- form: "books",
- lemma: "book",
- upostag: "NOUN",
- xpostag: "NNS",
- feats: "Number=Plur",
- head: "2",
- deprel: "dobj",
- deps: "4:dobj",
- misc: "SpaceAfter=No"
- },
- {
- serial: fs.readFileSync('test/example1/sent0/token5.txt').toString(),
- id: 6,
- form: ".",
- lemma: ".",
- upostag: "PUNCT",
- xpostag: ".",
- feats: undefined,
- head: "2",
- deprel: "punct",
- deps: undefined,
- misc: undefined
- }
- ]
- },
- {
- text: "I haven't a clue.",
- serial: fs.readFileSync('test/example1/sent1/serial.txt').toString(),
- comments: [" sent_id 2"," ..."],
- tokens: [
- {
- serial: fs.readFileSync('test/example1/sent1/token0.txt').toString(),
- id: 1,
- form: "I",
- lemma: "I",
- upostag: "PRON",
- xpostag: "PRP",
- feats: "Case=Nom|Number=Sing|Person=1",
- head: 2,
- deprel: "nsubj",
- deps: undefined,
- misc: undefined
- },
- {
- serial: fs.readFileSync('test/example1/sent1/token1.txt').toString(),
- id: "2-3",
- form: "haven't",
- lemma: "",
- upostag: "",
- xpostag: "",
- feats: "",
- head: undefined,
- deprel: "",
- deps: undefined,
- misc: undefined,
- tokens: [
- {
- serial: fs.readFileSync('test/example1/sent1/token1/token0.txt').toString(),
- id: 2,
- form: "have",
- lemma: "have",
- upostag: "VERB",
- xpostag: "VBP",
- feats: "Number=Sing|Person=1|Tense=Pres",
- head: 0,
- deprel: "root",
- deps: undefined,
- misc: undefined
- },
- {
- serial: fs.readFileSync('test/example1/sent1/token1/token1.txt').toString(),
- id: 3,
- form: "not",
- lemma: "not",
- upostag: "PART",
- xpostag: "RB",
- feats: "Negative=Neg",
- head: 2,
- deprel: "neg",
- deps: undefined,
- misc: undefined
- }
- ]
- },
- {
- serial: fs.readFileSync('test/example1/sent1/token2.txt').toString(),
- id: 4,
- form: "a",
- lemma: "a",
- upostag: "DET",
- xpostag: "DT",
- feats: "Definite=Ind|PronType=Art",
- head: 4,
- deprel: "det",
- deps: undefined,
- misc: undefined
- },
- {
- serial: fs.readFileSync('test/example1/sent1/token3.txt').toString(),
- id: 5,
- form: "clue",
- lemma: "clue",
- upostag: "NOUN",
- xpostag: "NN",
- feats: "Number=Sing",
- head: 2,
- deprel: "dobj",
- deps: undefined,
- misc: "SpaceAfter=No"
- },
- {
- serial: fs.readFileSync('test/example1/sent1/token4.txt').toString(),
- id: 6,
- form: ".",
- lemma: ".",
- upostag: "PUNCT",
- xpostag: ".",
- feats: undefined,
- head: 2,
- deprel: "punct",
- deps: undefined,
- misc: undefined
- }
- ]
- }
- ]
-};
-
-// if using Node.js export module
-if (typeof exports !== 'undefined' && this.exports !== exports) {
- exports.conllu = conllu;
-}
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent0/serial.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent0/serial.txt
deleted file mode 100755
index 2c8a65af..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent0/serial.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-# sent_id 1
-# ...
-1 They they PRON PRP Case=Nom|Number=Plur 2 nsubj 4:nsubj _
-2 buy buy VERB VBP Number=Plur|Person=3|Tense=Pres 0 root _ _
-3 and and CONJ CC _ 2 cc _ _
-4 sell sell VERB VBP Number=Plur|Person=3|Tense=Pres 2 conj 0:root _
-5 books book NOUN NNS Number=Plur 2 dobj 4:dobj SpaceAfter=No
-6 . . PUNCT . _ 2 punct _ _
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token0.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent0/token0.txt
deleted file mode 100755
index e5a936ff..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token0.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 They they PRON PRP Case=Nom|Number=Plur 2 nsubj 4:nsubj _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token1.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent0/token1.txt
deleted file mode 100755
index c587636c..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token1.txt
+++ /dev/null
@@ -1 +0,0 @@
-2 buy buy VERB VBP Number=Plur|Person=3|Tense=Pres 0 root _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token2.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent0/token2.txt
deleted file mode 100755
index 34398539..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token2.txt
+++ /dev/null
@@ -1 +0,0 @@
-3 and and CONJ CC _ 2 cc _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token3.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent0/token3.txt
deleted file mode 100755
index 8253f871..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token3.txt
+++ /dev/null
@@ -1 +0,0 @@
-4 sell sell VERB VBP Number=Plur|Person=3|Tense=Pres 2 conj 0:root _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token4.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent0/token4.txt
deleted file mode 100755
index 9b9d53c5..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token4.txt
+++ /dev/null
@@ -1 +0,0 @@
-5 books book NOUN NNS Number=Plur 2 dobj 4:dobj SpaceAfter=No
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token5.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent0/token5.txt
deleted file mode 100755
index 62d9885d..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent0/token5.txt
+++ /dev/null
@@ -1 +0,0 @@
-6 . . PUNCT . _ 2 punct _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/serial.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/serial.txt
deleted file mode 100755
index 7b01a8a5..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/serial.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-# sent_id 2
-# ...
-1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
-2-3 haven't _ _ _ _ _ _ _ _
-2 have have VERB VBP Number=Sing|Person=1|Tense=Pres 0 root _ _
-3 not not PART RB Negative=Neg 2 neg _ _
-4 a a DET DT Definite=Ind|PronType=Art 4 det _ _
-5 clue clue NOUN NN Number=Sing 2 dobj _ SpaceAfter=No
-6 . . PUNCT . _ 2 punct _ _
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token0.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/token0.txt
deleted file mode 100755
index e7e55ccd..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token0.txt
+++ /dev/null
@@ -1 +0,0 @@
-1 I I PRON PRP Case=Nom|Number=Sing|Person=1 2 nsubj _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1.txt
deleted file mode 100755
index 722d95c8..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-2-3 haven't _ _ _ _ _ _ _ _
-2 have have VERB VBP Number=Sing|Person=1|Tense=Pres 0 root _ _
-3 not not PART RB Negative=Neg 2 neg _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1/token0.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1/token0.txt
deleted file mode 100755
index 5521f008..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1/token0.txt
+++ /dev/null
@@ -1 +0,0 @@
-2 have have VERB VBP Number=Sing|Person=1|Tense=Pres 0 root _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1/token1.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1/token1.txt
deleted file mode 100755
index 01ce1e5b..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token1/token1.txt
+++ /dev/null
@@ -1 +0,0 @@
-3 not not PART RB Negative=Neg 2 neg _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token2.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/token2.txt
deleted file mode 100755
index 121e8e10..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token2.txt
+++ /dev/null
@@ -1 +0,0 @@
-4 a a DET DT Definite=Ind|PronType=Art 4 det _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token3.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/token3.txt
deleted file mode 100755
index fc267f45..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token3.txt
+++ /dev/null
@@ -1 +0,0 @@
-5 clue clue NOUN NN Number=Sing 2 dobj _ SpaceAfter=No
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token4.txt b/standalone/lib/ext/conllu/conllu/test/example1/sent1/token4.txt
deleted file mode 100755
index 62d9885d..00000000
--- a/standalone/lib/ext/conllu/conllu/test/example1/sent1/token4.txt
+++ /dev/null
@@ -1 +0,0 @@
-6 . . PUNCT . _ 2 punct _ _
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/multiwordtoken_test.js b/standalone/lib/ext/conllu/conllu/test/multiwordtoken_test.js
deleted file mode 100755
index 12bc6784..00000000
--- a/standalone/lib/ext/conllu/conllu/test/multiwordtoken_test.js
+++ /dev/null
@@ -1,115 +0,0 @@
-
-var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken;
-var TokenAggregate = require("../lib/TokenAggregate.js").TokenAggregate;
-var Token = require("../lib/Token.js").Token;
-
-chai = require("chai");
-var assert = chai.assert;
-var conllu_gold = require("../test/example1/conllu_obj.js").conllu;
-
-describe("A MultiwordToken created by an empty construcor", function() {
- var mwt;
- beforeEach(function () {
- mwt = new MultiwordToken();
- });
-
- describe("object inheritance", function () {
- it("should be an instance of MultiwordToken", function () {
- assert.instanceOf(mwt, MultiwordToken);
- });
-
- it("should be an instance of Token", function () {
- assert.instanceOf(mwt, Token);
- });
-
- it("should inherit method split", function () {
- assert.property(mwt, 'split');
- assert.typeOf(mwt.split, 'function');
- });
-
- it("should inherit method merge", function () {
- assert.property(mwt, 'merge');
- assert.typeOf(mwt.merge, 'function');
- });
- });
-
- describe("property 'id'", function () {
- it("should be a property", function () {
- assert.property(mwt, 'id');
- });
-
- var tests = [
- {
- text: '1, 2, 3',
- tokens: [{id: 1}, {id: 2}, {id: 3}],
- id: '1-3'
- },
- {
- text: '3, 4',
- tokens: [{id: 3}, {id: 4}],
- id: '3-4'
- }
- ];
-
- describe("should be based on its subtokens", function () {
- tests.forEach(function (test) {
- context("with subtokens "+test.text, function () {
- beforeEach(function () {
- mwt.tokens = test.tokens;
- });
-
- it("should have id '"+test.id+"'", function () {
- assert.strictEqual(mwt.id,test.id);
- })
- })
- })
- });
- });
-
- describe("property 'serial'", function () {
- it("should be a property", function () {
- assert.property(mwt, 'serial');
- });
-
- describe("get", function () {
- conllu_gold.sentences.forEach(function (sent_gold) {
- sent_gold.tokens.forEach(function (mwt_gold) {
- if(mwt_gold.hasOwnProperty('tokens')) {
- beforeEach(function () {
- mwt.form = mwt_gold.form;
- mwt.lemma = mwt_gold.lemma;
- mwt.upostag = mwt_gold.upostag;
- mwt.xpostag = mwt_gold.xpostag;
- mwt.feats = mwt_gold.feats;
- mwt.head = mwt_gold.head;
- mwt.deprel = mwt_gold.deprel;
- mwt.deps = mwt_gold.deps;
- mwt.misc = mwt_gold.misc;
-
- mwt_gold.tokens.forEach(function (token_gold) {
- var token = new Token();
- token.id = token_gold.id;
- token.form = token_gold.form;
- token.lemma = token_gold.lemma;
- token.upostag = token_gold.upostag;
- token.xpostag = token_gold.xpostag;
- token.feats = token_gold.feats;
- token.head = token_gold.head;
- token.deprel = token_gold.deprel;
- token.deps = token_gold.deps;
- token.misc = token_gold.misc;
- mwt.tokens.push(token);
- });
- });
-
- it("Token " + mwt_gold.form, function () {
- assert.strictEqual(mwt.serial, mwt_gold.serial);
- });
- }
- });
- });
- });
- });
-
-});
-
diff --git a/standalone/lib/ext/conllu/conllu/test/sentence_test.js b/standalone/lib/ext/conllu/conllu/test/sentence_test.js
deleted file mode 100755
index ca34cd93..00000000
--- a/standalone/lib/ext/conllu/conllu/test/sentence_test.js
+++ /dev/null
@@ -1,307 +0,0 @@
-
-var rewire = require('rewire');
-
-var module = rewire("../lib/Sentence.js");
-var Token = function () {};
-module.__set__('Token', Token);
-
-var MultiwordToken = function () {
- this.tokens = [];
-};
-MultiwordToken.prototype = new Token();
-module.__set__('MultiwordToken', MultiwordToken);
-
-var TokenAggregate = function () {
- this.__token_aggregate__ = true;
-};
-module.__set__('TokenAggregate', TokenAggregate);
-
-var Sentence = module.Sentence;
-
-
-chai = require("chai");
-var assert = chai.assert;
-var conllu_gold = require("../test/example1/conllu_obj.js").conllu;
-
-var assertTokensEquivalent = function (tokens, gold_tokens, parent) {
- if (parent === undefined) {
- parent = '';
- } else {
- parent = ' of '+parent;
- }
-
- assert.lengthOf(tokens, gold_tokens.length, 'expected tokens array to have length '+gold_tokens.length);
- gold_tokens.forEach(function (gold_token, index) {
-
- // every token should be an instance of Token and should have matching properties (except for id)
- assert.instanceOf(tokens[index],
- Token,
- 'expected token '+index+parent+' to be a Token');
-
- assert.strictEqual(tokens[index].form,
- gold_token.form,
- 'expected token '+index+parent+' to have form '+gold_token.form);
- assert.strictEqual(tokens[index].lemma,
- gold_token.lemma,
- 'expected token '+index+parent+' to have lemma '+gold_token.lemma);
- assert.strictEqual(tokens[index].upostag,
- gold_token.upostag,
- 'expected token '+index+parent+' to have upostag '+gold_token.upostag);
- assert.strictEqual(tokens[index].xpostag,
- gold_token.xpostag,
- 'expected token '+index+parent+' to have xpostag '+gold_token.xpostag);
- assert.strictEqual(tokens[index].feats,
- gold_token.feats,
- 'expected token '+index+parent+' to have feats '+gold_token.feats);
- assert.strictEqual(tokens[index].head,
- gold_token.head,
- 'expected token '+index+parent+' to have head '+gold_token.head);
- assert.strictEqual(tokens[index].deprel,
- gold_token.deprel,
- 'expected token '+index+parent+' to have deprel '+gold_token.deprel);
- assert.strictEqual(tokens[index].deps,
- gold_token.deps,
- 'expected token '+index+parent+' to have deps '+gold_token.deps);
- assert.strictEqual(tokens[index].misc,
- gold_token.misc,
- 'expected token '+index+parent+' to have misc '+gold_token.misc);
-
- // if gold has a tokens property, it reperesents a MultiwordToken
- if(gold_token.hasOwnProperty('tokens')) {
- assert.instanceOf(tokens[index],
- MultiwordToken,
- 'expected token '+index+' to be a MultiwordToken');
-
- assert.lengthOf(tokens[index].tokens,
- gold_token.tokens.length,
- 'expected MultiwordToken '+index+'('+gold_token.form+') to have '+gold_token.tokens.length+' subtokens');
-
-
- gold_token.tokens.forEach(function (subtok_gold, subindex) {
- assert.instanceOf(tokens[index].tokens[subindex],
- Token,
- 'expected subtoken '+subindex+' of MultiwordToken '+index+'('+gold_token.form+') to be a Token');
- });
-
- assertTokensEquivalent(tokens[index].tokens, gold_token.tokens, 'token '+index+' ('+gold_token.form+')');
- } else {
- // Do not check id of MultiwordTokens, since it is a computed property
- assert.strictEqual(tokens[index].id,
- gold_token.id,
- 'expected token '+index+parent+' to have id '+gold_token.id);
- }
- });
-};
-
-
-describe("A Sentence object created by an empty construcor", function() {
- var sentence;
- beforeEach(function() {
- sentence = new Sentence();
- });
-
- describe("object inheritance", function () {
-
- it("should inherit from TokenAggregate's constructor", function () {
- assert.property(sentence,'__token_aggregate__');
- assert.strictEqual(sentence.__token_aggregate__,true);
- });
- });
-
- describe("property 'comments'", function () {
- it("should be a property", function () {
- assert.property(sentence, 'comments');
- });
-
- it("should be a direct property", function () {
- assert(sentence.hasOwnProperty('comments'));
- });
-
- it("should be an array", function () {
- assert.typeOf(sentence.comments, 'array');
- });
-
- it("should be empty", function () {
- assert.lengthOf(sentence.comments, 0);
- });
- });
-
- describe("property 'tokens'", function () {
- it("should be a property", function () {
- assert.property(sentence, 'tokens');
- });
-
- it("should be a direct property", function () {
- assert(sentence.hasOwnProperty('tokens'));
- });
-
- it("should be an array", function () {
- assert.typeOf(sentence.tokens, 'array');
- });
-
- it("should be empty", function () {
- assert.lengthOf(sentence.tokens, 0);
- });
- });
-
- describe("method 'expand'", function () {
- it("should be a property", function () {
- assert.property(sentence, 'expand');
- });
-
- it("should be a function", function () {
- assert.typeOf(sentence.expand, 'function');
- });
-
- var tests = [
- {
- sentence: "I haven't a clue.",
- token: 2,
- index: 4,
- before: [{id: 1, form: 'I'}, {id: 2, form: 'haven\'t'}, {id: 3, form: 'a'}, {id: 4, form: 'clue'},{id:5, form: '.'}],
- after: [{id: 1, form: 'I'},
- {
- id: '2-3',
- form: 'haven\'t',
- tokens: [{id: 2, form: 'have'}, {id: 3, form: 'n\'t'}]
- }, {id: 4, form: 'a'}, {id: 5, form: 'clue'},{id:6, form: '.'}]
- }
- ];
-
- tests.forEach(function(test) {
- context("Sentence: "+test.sentence, function () {
- beforeEach(function () {
- test.before.forEach(function (obj, index) {
- if(obj.hasOwnProperty('tokens')) {
- sentence.tokens[index] = new MultiwordToken();
- sentence.tokens[index].id = obj.id;
- sentence.tokens[index].form = obj.form;
- } else {
- sentence.tokens[index] = new Token();
- sentence.tokens[index].id = obj.id;
- sentence.tokens[index].form = obj.form;
- }
- });
- sentence.expand(test.token,test.index);
- });
-
- describe("tokens property after calling expand("+test.token+","+test.index+")", function () {
- it('should have tokens matching gold', function () {
- assert.property(sentence,'tokens');
- assert.typeOf(sentence.tokens,'array');
- assertTokensEquivalent(sentence.tokens, test.after);
- });
- });
- });
- });
- });
-
- describe("method 'collapse'", function () {
- it("should be a property", function () {
- assert.property(sentence, 'collapse');
- });
-
- it("should be a function", function () {
- assert.typeOf(sentence.collapse, 'function');
- });
-
-
- var tests = [
- {
- sentence: "I haven't a clue.",
- token: '2-3',
- before: [{id: 1, form: 'I'},
- {
- id: '2-3',
- form: 'haven\'t',
- tokens: [{id: 2, form: 'have'}, {id: 3, form: 'n\'t'}]
- }, {id: 4, form: 'a'}, {id: 5, form: 'clue'},{id:6, form: '.'}],
- after: [{id: 1, form: 'I'}, {id: 2, form: 'haven\'t'}, {id: 3, form: 'a'}, {id: 4, form: 'clue'},{id:5, form: '.'}]
- }
- ];
-
- tests.forEach(function(test) {
- context("Sentence: "+test.sentence, function () {
- beforeEach(function () {
- test.before.forEach(function (obj, index) {
- if(obj.hasOwnProperty('tokens')) {
- sentence.tokens[index] = new MultiwordToken();
- sentence.tokens[index].form = obj.form;
- obj.tokens.forEach(function (t, index2) {
- sentence.tokens[index].tokens[index2] = new Token();
- sentence.tokens[index].tokens[index2].id = t.id;
- sentence.tokens[index].tokens[index2].form = t.form;
- })
- } else {
- sentence.tokens[index] = new Token();
- sentence.tokens[index].id = obj.id;
- sentence.tokens[index].form = obj.form;
- }
- });
- sentence.collapse(test.token.id);
- });
-
- describe("tokens property after calling collapse("+test.token+")", function () {
- it('should have tokens matching gold', function () {
- assert.property(sentence,'tokens');
- assert.typeOf(sentence.tokens,'array');
- assertTokensEquivalent(sentence.tokens, test.after);
- });
- });
- });
- });
- });
-
- describe("property 'serial'", function () {
- it("should be a property", function () {
- assert.property(sentence, 'serial');
- });
-
- describe("get", function () {
- conllu_gold.sentences.forEach(function (sent_gold) {
- context("Sentence: "+sent_gold.text, function () {
- beforeEach(function () {
- // create dummy sentences whose serial properties match the conllu file
- sentence.tokens = sent_gold.tokens;
- sentence.comments = sent_gold.comments;
- });
-
- it("Should equal "+sent_gold.serial, function () {
- assert.strictEqual(sentence.serial, sent_gold.serial);
- });
- });
- });
- });
-
- describe("set", function () {
- conllu_gold.sentences.forEach(function (sent_gold) {
- context("Sentence: " + sent_gold.text, function () {
- beforeEach(function () {
- sentence.serial = sent_gold.serial;
- });
-
- it("should have "+sent_gold.comments.length+" comments", function () {
- assert.lengthOf(sentence.comments, sent_gold.comments.length);
- });
-
- sent_gold.comments.forEach(function (comment_gold, index) {
- it('comment '+index+" should be "+comment_gold, function () {
- assert.strictEqual(sentence.comments[index],comment_gold);
- });
- });
-
- it("should have "+sent_gold.tokens.length+" tokens", function () {
- assert.lengthOf(sentence.tokens, sent_gold.tokens.length);
- });
-
- sent_gold.tokens.forEach(function (token_gold, index) {
- it('token '+index+" should have serial "+token_gold.serial, function () {
- assert.strictEqual(sentence.tokens[index].serial, token_gold.serial);
- });
- });
- });
- });
- });
- });
-
-});
\ No newline at end of file
diff --git a/standalone/lib/ext/conllu/conllu/test/token_test.js b/standalone/lib/ext/conllu/conllu/test/token_test.js
deleted file mode 100755
index 0eddf738..00000000
--- a/standalone/lib/ext/conllu/conllu/test/token_test.js
+++ /dev/null
@@ -1,111 +0,0 @@
-
-var Token = require("../lib/Token.js").Token;
-
-chai = require("chai");
-var assert = chai.assert;
-var conllu_gold = require("../test/example1/conllu_obj.js").conllu;
-
-describe("A Token object created by an empty constructor", function () {
- var token;
- beforeEach(function () {
- token = new Token();
- });
-
- it("should be an instance of Token", function () {
- assert.instanceOf(token, Token);
- });
-
- it("should have ID field undefined", function() {
- assert.property(token,'id', "The Token does not have a property called 'id'.");
- assert.isUndefined(token.id, "The 'id' property is not undefined.");
- });
-
- it("should have FORM property be an empty string", function() {
- assert.property(token, 'form', "The Token does not have a property called 'form'");
- assert.isString(token.form,"The 'form' property is not a string");
- assert.strictEqual(token.form,'',"The 'form' property is not empty");
- });
-
- it("should have LEMMA property undefined", function() {
- assert.property(token,'lemma', "The Token does not have a property called 'lemma'.");
- assert.isUndefined(token.lemma, "The 'lemma' property is not undefined.");
- });
-
- it("should have UPOSTAG property undefined", function() {
- assert.property(token,'upostag', "The Token does not have a property called 'upostag'.");
- assert.isUndefined(token.upostag, "The 'upostag' property is not undefined.");
- });
-
- it("should have XPOSTAG property undefined", function() {
- assert.property(token,'xpostag', "The Token does not have a property called 'xpostag'.");
- assert.isUndefined(token.xpostag, "The 'xpostag' property is not undefined.");
- });
-
- it("should have FEATS property undefined", function() {
- assert.property(token,'feats', "The Token does not have a property called 'feats'.");
- assert.isUndefined(token.feats, "The 'feats' property is not undefined.");
- });
-
- it("should have HEAD property undefined", function() {
- assert.property(token,'head', "The Token does not have a property called 'head'.");
- assert.isUndefined(token.head, "The 'head' property is not undefined.");
- });
-
- it("should have DEPREL property undefined", function() {
- assert.property(token,'deprel', "The Token does not have a property called 'deprel'.");
- assert.isUndefined(token.deprel, "The 'deprel' property is not undefined.");
- });
-
- it("should have DEPS property undefined", function() {
- assert.property(token,'deps', "The Token does not have a property called 'deps'.");
- assert.isUndefined(token.deps, "The 'deps' property is not undefined.");
- });
-
- it("should have MISC property undefined", function() {
- assert.property(token,'misc', "The Token does not have a property called 'misc'.");
- assert.isUndefined(token.misc, "The 'misc' property is not undefined.");
- });
-
-
- describe("property 'serial'", function () {
- it("should be a property", function () {
- assert.property(token, 'serial');
- });
-
- describe("get", function () {
- it("Token generated from empty constructor", function () {
- assert.strictEqual(token.serial,'_\t_\t_\t_\t_\t_\t_\t_\t_\t_')
- });
-
-
- conllu_gold.sentences.forEach(function (sent_gold) {
- sent_gold.tokens.forEach(function (token_gold) {
- if ( ! token_gold.hasOwnProperty('tokens')) {
- describe(token_gold.form, function () {
- beforeEach(function () {
- token.id = token_gold.id;
- token.form = token_gold.form;
- token.lemma = token_gold.lemma;
- token.upostag = token_gold.upostag;
- token.xpostag = token_gold.xpostag;
- token.feats = token_gold.feats;
- token.head = token_gold.head;
- token.deprel = token_gold.deprel;
- token.deps = token_gold.deps;
- token.misc = token_gold.misc;
- });
-
- it("serial", function () {
- assert.strictEqual(token.serial, token_gold.serial);
- });
-
- });
- }
- });
- });
- });
- });
-
-});
-
-
diff --git a/standalone/lib/ext/conllu/conllu/test/tokenaggregate_test.js b/standalone/lib/ext/conllu/conllu/test/tokenaggregate_test.js
deleted file mode 100755
index a090e5c8..00000000
--- a/standalone/lib/ext/conllu/conllu/test/tokenaggregate_test.js
+++ /dev/null
@@ -1,251 +0,0 @@
-
-var TokenAggregate = require("../lib/TokenAggregate.js").TokenAggregate;
-var Token = require("../lib/Token.js").Token;
-var MultiwordToken = require("../lib/MultiwordToken.js").MultiwordToken;
-
-chai = require("chai");
-var assert = chai.assert;
-
-describe("A TokenAggregate object", function() {
- var tokens;
- var ta;
- beforeEach(function () {
- tokens = 'tokens';
- var A = function() {
- this[tokens] = [];
- TokenAggregate.call(this,tokens);
- };
- ta = new A();
- });
-
- describe("method 'split'", function () {
- it("should be a property", function () {
- assert.property(ta, 'split');
- });
-
- it("should be a function", function () {
- assert.typeOf(ta.split, 'function');
- });
-
- var tests = [
- {
- sentence: "I haven't a clue.",
- token: 4,
- index: 4,
- before: [{id: 1, form: 'I'}, {id: 2, form: 'haven\'t'}, {id: 3, form: 'a'}, {id: 4, form: 'clue.'}],
- after: [{id: 1, form: 'I'}, {id: 2, form: 'haven\'t'}, {id: 3, form: 'a'}, {id: 4, form: 'clue'},{id:5, form: '.'}]
- },
- {
- sentence: "This is asentence.",
- token: 3,
- index: 1,
- before: [{id: 1, form: 'This'}, {id: 2, form: 'is'}, {id: 3, form: 'asentence'}, {id: 4, form: '.'}],
- after: [{id: 1, form: 'This'}, {id: 2, form: 'is'}, {id: 3, form: 'a'},{id: 4, form: 'sentence'}, {id: 5, form: '.'}]
- },
- {
- sentence: "Example with unusual token ids",
- token: 8,
- index: 2,
- before: [{id: 6, form: 'Example'}, {id:7, form:'with'}, {id:8, form:'unusual'}, {id:9, form:'token'},{id:10, form:'ids'}],
- after: [{id: 6, form: 'Example'}, {id:7, form:'with'}, {id:8, form:'un'}, {id:9, form:'usual'}, {id:10, form:'token'},{id:11, form:'ids'}]
- }
- ];
-
- tests.forEach(function (test) {
- context("Sentence: "+test.sentence, function () {
- beforeEach(function () {
- test.before.forEach(function (obj, index) {
- if(obj.hasOwnProperty('tokens')) {
- ta.tokens[index] = new MultiwordToken();
- ta.tokens[index].id = obj.id;
- ta.tokens[index].form = obj.form;
- } else {
- ta.tokens[index] = new Token();
- ta.tokens[index].id = obj.id;
- ta.tokens[index].form = obj.form;
- }
- });
- ta.split(test.token, test.index);
- });
-
- describe("tokens property after calling split("+test.token+","+test.index+")", function () {
-
-
- it("should be length "+test.after.length, function () {
- assert.lengthOf(ta.tokens,test.after.length);
- });
-
-
- test.after.forEach(function (gold,index) {
- describe("Token in position "+index, function () {
-
- it("should have form "+gold.form, function () {
- assert.strictEqual(ta.tokens[index].form,gold.form);
- });
-
- it("should be an instance of Token", function () {
- assert.instanceOf(ta.tokens[index],Token);
- });
-
- if(gold.hasOwnProperty('tokens')) {
-
- it("should be an instance of MultiwordToken", function () {
- assert.instanceOf(ta.tokens[index],MultiwordToken);
- });
-
- it("should have "+gold.tokens.length+" subtokens", function () {
- assert.lengthOf(ta.tokens[index].tokens,gold.tokens.length);
- });
-
-
- for (var mindex in gold.tokens) {
- describe("Subtoken in position "+mindex, function () {
- it("should be an instance of Token", function () {
- assert.instanceOf(ta.tokens[index].tokens[mindex],Token);
- });
-
- it("should have id "+gold.tokens[mindex].id, function () {
- assert.strictEqual(ta.tokens[index].tokens[mindex].id,gold.tokens[mindex].id)
- });
-
- it("should have form "+gold.tokens[mindex].form, function () {
- assert.strictEqual(ta.tokens[index].tokens[mindex].form,gold.tokens[mindex].form);
- });
- });
- };
-
- } else {
- it("should not be an instance of MultiwordToken", function () {
- assert.notInstanceOf(ta.tokens[index],MultiwordToken);
- });
-
- // We do not check the id of MultiwordTokens because it is a computed field,
- // and this is just meant to test that all id and form values are set properly.
- it("should have id "+gold.id, function () {
- assert.strictEqual(ta.tokens[index].id,gold.id)
- });
- }
- });
- });
- });
- });
- });
- });
-
- describe("method 'merge'", function () {
- it("should be a property", function () {
- assert.property(ta, 'merge');
- });
-
- it("should be a function", function () {
- assert.typeOf(ta.merge, 'function');
- });
-
- tests = [
- {
- sentence: "I haven't a clue.",
- token: 4,
- before: [{id: 1, form: 'I'}, {id: 2, form: 'haven\'t'}, {id: 3, form: 'a'}, {id: 4, form: 'clue'},{id:5, form: '.'}],
- after: [{id: 1, form: 'I'}, {id: 2, form: 'haven\'t'}, {id: 3, form: 'a'}, {id: 4, form: 'clue.'}]
- },
- {
- sentence: "This is a sentence.",
- token: 3,
- index: 1,
- before: [{id: 1, form: 'This'}, {id: 2, form: 'is'}, {id: 3, form: 'a'},{id: 4, form: 'sentence'}, {id: 5, form: '.'}],
- after: [{id: 1, form: 'This'}, {id: 2, form: 'is'}, {id: 3, form: 'asentence'}, {id: 4, form: '.'}]
- },
- {
- sentence: "Example with unusual token ids",
- token: 8,
- index: 2,
- before: [{id: 6, form: 'Example'}, {id:7, form:'with'}, {id:8, form:'un'}, {id:9, form:'usual'}, {id:10, form:'token'},{id:11, form:'ids'}],
- after: [{id: 6, form: 'Example'}, {id:7, form:'with'}, {id:8, form:'unusual'}, {id:9, form:'token'},{id:10, form:'ids'}]
- }
- ];
-
- tests.forEach(function (test) {
- context("Sentence: "+test.sentence, function () {
- beforeEach(function () {
- test.before.forEach(function (obj, index) {
- if(obj.hasOwnProperty('tokens')) {
- ta.tokens[index] = new MultiwordToken();
- ta.tokens[index].id = obj.id;
- ta.tokens[index].form = obj.form;
- } else {
- ta.tokens[index] = new Token();
- ta.tokens[index].id = obj.id;
- ta.tokens[index].form = obj.form;
- }
- });
- ta.merge(test.token);
- });
-
- describe("tokens property after calling merge("+test.token+")", function () {
-
-
- it("should be length "+test.after.length, function () {
- assert.lengthOf(ta.tokens,test.after.length);
- });
-
-
- test.after.forEach(function (gold,index) {
- describe("Token in position "+index, function () {
-
- it("should have form "+gold.form, function () {
- assert.strictEqual(ta.tokens[index].form,gold.form);
- });
-
- it("should be an instance of Token", function () {
- assert.instanceOf(ta.tokens[index],Token);
- });
-
- if(gold.hasOwnProperty('tokens')) {
-
- it("should be an instance of MultiwordToken", function () {
- assert.instanceOf(ta.tokens[index],MultiwordToken);
- });
-
- it("should have "+gold.tokens.length+" subtokens", function () {
- assert.lengthOf(ta.tokens[index].tokens,gold.tokens.length);
- });
-
-
- for (var mindex in gold.tokens) {
- describe("Subtoken in position "+mindex, function () {
- it("should be an instance of Token", function () {
- assert.instanceOf(ta.tokens[index].tokens[mindex],Token);
- });
-
- it("should have id "+gold.tokens[mindex].id, function () {
- assert.strictEqual(ta.tokens[index].tokens[mindex].id,gold.tokens[mindex].id)
- });
-
- it("should have form "+gold.tokens[mindex].form, function () {
- assert.strictEqual(ta.tokens[index].tokens[mindex].form,gold.tokens[mindex].form);
- });
- });
- }
-
- } else {
- it("should not be an instance of MultiwordToken", function () {
- assert.notInstanceOf(ta.tokens[index],MultiwordToken);
- });
-
- // We do not check the id of MultiwordTokens because it is a computed field,
- // and this is just meant to test that all id and form values are set properly.
- it("should have id "+gold.id, function () {
- assert.strictEqual(ta.tokens[index].id,gold.id)
- });
- }
- });
- });
- });
- });
- });
- });
-
-});
-
-
-
diff --git a/standalone/lib/ext/cytoscape.min.js b/standalone/lib/ext/cytoscape.min.js
deleted file mode 100644
index c1a4a69b..00000000
--- a/standalone/lib/ext/cytoscape.min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.cytoscape=t():e.cytoscape=t()}(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,"a",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=118)}([function(e,t,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=n(4),a=i?i.navigator:null,o=i?i.document:null,s=r(""),l=r({}),u=r(function(){}),c="undefined"==typeof HTMLElement?"undefined":r(HTMLElement),d=function(e){return e&&e.instanceString&&h.fn(e.instanceString)?e.instanceString():null},h={defined:function(e){return null!=e},string:function(e){return null!=e&&(void 0===e?"undefined":r(e))==s},fn:function(e){return null!=e&&(void 0===e?"undefined":r(e))===u},array:function(e){return Array.isArray?Array.isArray(e):null!=e&&e instanceof Array},plainObject:function(e){return null!=e&&(void 0===e?"undefined":r(e))===l&&!h.array(e)&&e.constructor===Object},object:function(e){return null!=e&&(void 0===e?"undefined":r(e))===l},number:function(e){return null!=e&&(void 0===e?"undefined":r(e))===r(1)&&!isNaN(e)},integer:function(e){return h.number(e)&&Math.floor(e)===e},bool:function(e){return null!=e&&(void 0===e?"undefined":r(e))===r(!0)},htmlElement:function(e){return"undefined"===c?void 0:null!=e&&e instanceof HTMLElement},elementOrCollection:function(e){return h.element(e)||h.collection(e)},element:function(e){return"collection"===d(e)&&e._private.single},collection:function(e){return"collection"===d(e)&&!e._private.single},core:function(e){return"core"===d(e)},style:function(e){return"style"===d(e)},stylesheet:function(e){return"stylesheet"===d(e)},event:function(e){return"event"===d(e)},thread:function(e){return"thread"===d(e)},fabric:function(e){return"fabric"===d(e)},emptyString:function(e){return void 0===e||null===e||!(""!==e&&!e.match(/^\s+$/))},nonemptyString:function(e){return!(!e||!h.string(e)||""===e||e.match(/^\s+$/))},domElement:function(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement},boundingBox:function(e){return h.plainObject(e)&&h.number(e.x1)&&h.number(e.x2)&&h.number(e.y1)&&h.number(e.y2)},promise:function(e){return h.object(e)&&h.fn(e.then)},touch:function(){return i&&("ontouchstart"in i||i.DocumentTouch&&o instanceof DocumentTouch)},gecko:function(){return i&&("undefined"!=typeof InstallTrigger||"MozAppearance"in o.documentElement.style)},webkit:function(){return i&&("undefined"!=typeof webkitURL||"WebkitAppearance"in o.documentElement.style)},chromium:function(){return i&&"undefined"!=typeof chrome},khtml:function(){return a&&a.vendor.match(/kde/i)},khtmlEtc:function(){return h.khtml()||h.webkit()||h.chromium()},ms:function(){return a&&a.userAgent.match(/msie|trident|edge/i)},windows:function(){return a&&a.appVersion.match(/Win/i)},mac:function(){return a&&a.appVersion.match(/Mac/i)},linux:function(){return a&&a.appVersion.match(/Linux/i)},unix:function(){return a&&a.appVersion.match(/X11/i)}};e.exports=h},function(e,t,n){"use strict";var r=n(0),i=n(2),a={MAX_INT:Number.MAX_SAFE_INTEGER||9007199254740991,trueify:function(){return!0},falsify:function(){return!1},zeroify:function(){return 0},noop:function(){},error:function(e){console.error?(console.error.apply(console,arguments),console.trace&&console.trace()):(console.log.apply(console,arguments),console.trace&&console.trace())},clone:function(e){return this.extend({},e)},copy:function(e){return null==e?e:r.array(e)?e.slice():r.plainObject(e)?this.clone(e):e},copyArray:function(e){return e.slice()},clonePosition:function(e){return{x:e.x,y:e.y}},uuid:function(e,t){for(t=e="";e++<36;t+=51*e&52?(15^e?8^Math.random()*(20^e?16:4):4).toString(16):"-");return t}};a.makeBoundingBox=i.makeBoundingBox.bind(i),a._staticEmptyObject={},a.staticEmptyObject=function(){return a._staticEmptyObject},a.extend=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n=0&&(e[r]!==t||(e.splice(r,1),n));r--);},a.clearArray=function(e){e.splice(0,e.length)},a.push=function(e,t){for(var n=0;n0?1:e<0?-1:0},r.dist=function(e,t){return Math.sqrt(r.sqdist(e,t))},r.sqdist=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},r.qbezierAt=function(e,t,n,r){return(1-r)*(1-r)*e+2*(1-r)*r*t+r*r*n},r.qbezierPtAt=function(e,t,n,i){return{x:r.qbezierAt(e.x,t.x,n.x,i),y:r.qbezierAt(e.y,t.y,n.y,i)}},r.lineAt=function(e,t,n,i){var a={x:t.x-e.x,y:t.y-e.y},o=r.dist(e,t),s={x:a.x/o,y:a.y/o};return n=null==n?0:n,i=null!=i?i:n*o,{x:e.x+s.x*i,y:e.y+s.y*i}},r.lineAtDist=function(e,t,n){return r.lineAt(e,t,void 0,n)},r.triangleAngle=function(e,t,n){var i=r.dist(t,n),a=r.dist(e,n),o=r.dist(e,t);return Math.acos((i*i+a*a-o*o)/(2*i*a))},r.bound=function(e,t,n){return Math.max(e,Math.min(n,t))},r.makeBoundingBox=function(e){if(null==e)return{x1:1/0,y1:1/0,x2:-1/0,y2:-1/0,w:0,h:0};if(null!=e.x1&&null!=e.y1){if(null!=e.x2&&null!=e.y2&&e.x2>=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},r.updateBoundingBox=function(e,t){e.x1=Math.min(e.x1,t.x1),e.x2=Math.max(e.x2,t.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,t.y1),e.y2=Math.max(e.y2,t.y2),e.h=e.y2-e.y1},r.expandBoundingBoxByPoint=function(e,t,n){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},r.expandBoundingBox=function(e,t){return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},r.boundingBoxesIntersect=function(e,t){return!(e.x1>t.x2)&&(!(t.x1>e.x2)&&(!(e.x2t.y2)&&!(t.y1>e.y2)))))))},r.inBoundingBox=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},r.pointInBoundingBox=function(e,t){return this.inBoundingBox(e,t.x,t.y)},r.boundingBoxInBoundingBox=function(e,t){return r.inBoundingBox(e,t.x1,t.y1)&&r.inBoundingBox(e,t.x2,t.y2)},r.roundRectangleIntersectLine=function(e,t,n,r,i,a,o){var s=this.getRoundRectangleRadius(i,a),l=i/2,u=a/2,c=void 0,d=n-l+s-o,h=r-u-o,p=n+l-s+o,f=h;if(c=this.finiteLinesIntersect(e,t,n,r,d,h,p,f,!1),c.length>0)return c;var v=n+l+o,g=r-u+s-o,m=v,y=r+u-s+o;if(c=this.finiteLinesIntersect(e,t,n,r,v,g,m,y,!1),c.length>0)return c;var b=n-l+s-o,x=r+u+o,w=n+l-s+o,E=x;if(c=this.finiteLinesIntersect(e,t,n,r,b,x,w,E,!1),c.length>0)return c;var P=n-l-o,T=r-u+s-o,C=P,S=r+u-s+o;if(c=this.finiteLinesIntersect(e,t,n,r,P,T,C,S,!1),c.length>0)return c;var D=void 0,k=n-l+s,_=r-u+s;if(D=this.intersectLineCircle(e,t,n,r,k,_,s+o),D.length>0&&D[0]<=k&&D[1]<=_)return[D[0],D[1]];var M=n+l-s,I=r-u+s;if(D=this.intersectLineCircle(e,t,n,r,M,I,s+o),D.length>0&&D[0]>=M&&D[1]<=I)return[D[0],D[1]];var N=n+l-s,B=r+u-s;if(D=this.intersectLineCircle(e,t,n,r,N,B,s+o),D.length>0&&D[0]>=N&&D[1]>=B)return[D[0],D[1]];var z=n-l+s,L=r+u-s;return D=this.intersectLineCircle(e,t,n,r,z,L,s+o),D.length>0&&D[0]<=z&&D[1]>=L?[D[0],D[1]]:[]},r.inLineVicinity=function(e,t,n,r,i,a,o){var s=o,l=Math.min(n,i),u=Math.max(n,i),c=Math.min(r,a),d=Math.max(r,a);return l-s<=e&&e<=u+s&&c-s<=t&&t<=d+s},r.inBezierVicinity=function(e,t,n,r,i,a,o,s,l){var u={x1:Math.min(n,o,i)-l,x2:Math.max(n,o,i)+l,y1:Math.min(r,s,a)-l,y2:Math.max(r,s,a)+l};return!(eu.x2||tu.y2)},r.solveQuadratic=function(e,t,n,r){n-=r;var i=t*t-4*e*n;if(i<0)return[];var a=Math.sqrt(i),o=2*e;return[(-t+a)/o,(-t-a)/o]},r.solveCubic=function(e,t,n,r,i){t/=e,n/=e,r/=e;var a=void 0,o=void 0,s=void 0,l=void 0,u=void 0,c=void 0,d=void 0,h=void 0;return o=(3*n-t*t)/9,s=-27*r+t*(9*n-t*t*2),s/=54,a=o*o*o+s*s,i[1]=0,d=t/3,a>0?(u=s+Math.sqrt(a),u=u<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=s-Math.sqrt(a),c=c<0?-Math.pow(-c,1/3):Math.pow(c,1/3),i[0]=-d+u+c,d+=(u+c)/2,i[4]=i[2]=-d,d=Math.sqrt(3)*(-c+u)/2,i[3]=d,void(i[5]=-d)):(i[5]=i[3]=0,0===a?(h=s<0?-Math.pow(-s,1/3):Math.pow(s,1/3),i[0]=2*h-d,void(i[4]=i[2]=-(h+d))):(o=-o,l=o*o*o,l=Math.acos(s/Math.sqrt(l)),h=2*Math.sqrt(o),i[0]=-d+h*Math.cos(l/3),i[2]=-d+h*Math.cos((l+2*Math.PI)/3),void(i[4]=-d+h*Math.cos((l+4*Math.PI)/3))))},r.sqdistToQuadraticBezier=function(e,t,n,r,i,a,o,s){var l=1*n*n-4*n*i+2*n*o+4*i*i-4*i*o+o*o+r*r-4*r*a+2*r*s+4*a*a-4*a*s+s*s,u=9*n*i-3*n*n-3*n*o-6*i*i+3*i*o+9*r*a-3*r*r-3*r*s-6*a*a+3*a*s,c=3*n*n-6*n*i+n*o-n*e+2*i*i+2*i*e-o*e+3*r*r-6*r*a+r*s-r*t+2*a*a+2*a*t-s*t,d=1*n*i-n*n+n*e-i*e+r*a-r*r+r*t-a*t,h=[];this.solveCubic(l,u,c,d,h);for(var p=[],f=0;f<6;f+=2)Math.abs(h[f+1])<1e-7&&h[f]>=0&&h[f]<=1&&p.push(h[f]);p.push(1),p.push(0);for(var v=-1,g=void 0,m=void 0,y=void 0,b=0;b=0?yl?(e-i)*(e-i)+(t-a)*(t-a):u-d},r.pointInsidePolygonPoints=function(e,t,n){for(var r=void 0,i=void 0,a=void 0,o=void 0,s=0,l=0;l=e&&e>=a||r<=e&&e<=a))continue;(e-r)/(a-r)*(o-i)+i>t&&s++}return s%2!=0},r.pointInsidePolygon=function(e,t,n,i,a,o,s,l,u){var c=new Array(n.length),d=void 0;null!=l[0]?(d=Math.atan(l[1]/l[0]),l[0]<0?d+=Math.PI/2:d=-d-Math.PI/2):d=l;for(var h=Math.cos(-d),p=Math.sin(-d),f=0;f0){var g=this.expandPolygon(c,-u);v=this.joinLines(g)}else v=c;return r.pointInsidePolygonPoints(e,t,v)},r.joinLines=function(e){for(var t=new Array(e.length/2),n=void 0,r=void 0,i=void 0,a=void 0,o=void 0,s=void 0,l=void 0,u=void 0,c=0;c=0&&v<=1&&m.push(v),g>=0&&g<=1&&m.push(g),0===m.length)return[];var y=m[0]*s[0]+e,b=m[0]*s[1]+t;if(m.length>1){if(m[0]==m[1])return[y,b];return[y,b,m[1]*s[0]+e,m[1]*s[1]+t]}return[y,b]},r.findCircleNearPoint=function(e,t,n,r,i){var a=r-e,o=i-t,s=Math.sqrt(a*a+o*o);return[e+a/s*n,t+o/s*n]},r.findMaxSqDistanceToOrigin=function(e){for(var t=1e-6,n=void 0,r=0;rt&&(t=n);return t},r.midOfThree=function(e,t,n){return t<=e&&e<=n||n<=e&&e<=t?e:e<=t&&t<=n||n<=t&&t<=e?t:n},r.finiteLinesIntersect=function(e,t,n,r,i,a,o,s,l){var u=e-i,c=n-e,d=o-i,h=t-a,p=r-t,f=s-a,v=d*h-f*u,g=c*h-p*u,m=f*c-d*p;if(0!==m){var y=v/m,b=g/m;return-.001<=y&&y<=1.001&&-.001<=b&&b<=1.001?[e+y*c,t+y*p]:l?[e+y*c,t+y*p]:[]}return 0===v||0===g?this.midOfThree(e,n,o)===o?[o,s]:this.midOfThree(e,n,i)===i?[i,a]:this.midOfThree(i,o,n)===n?[n,r]:[]:[]},r.polygonIntersectLine=function(e,t,n,i,a,o,s,l){var u=[],c=void 0,d=new Array(n.length),h=!0;5===arguments.length&&(h=!1);var p=void 0;if(h){for(var f=0;f0){var v=r.expandPolygon(d,-l);p=r.joinLines(v)}else p=d}else p=n;for(var g=void 0,m=void 0,y=void 0,b=void 0,x=0;x "+t(r.target)),null!=r.connectedNodes){var h=r.connectedNodes;o=t(h[0])+" <-> "+t(h[1])}return null!=r.parent&&(o=t(r.parent)+" > "+o),null!=r.ancestor&&(o=t(r.ancestor)+" "+o),null!=r.child&&(o+=" > "+t(r.child)),null!=r.descendant&&(o+=" "+t(r.descendant)),o}(o),this.length>1&&e0&&i.plainObject(t[0])&&!i.element(t[0])){c=!0;for(var d=[],h=new o,p=0,f=t.length;p0){for(var R=new u(n,d),V=0;V0&&(e&&this.cy().notify({type:"remove",eles:E}),E.emit("remove"));for(var P=0;P=0;s--)!function(i){var s=o[i];c(a,function(e,t,n,r,a,l){if(s.type===n&&(!r||s.namespace===r)&&(!a||e.qualifierCompare(s.qualifier,a))&&(!l||s.callback===l))return o.splice(i,1),!1},e,t,n,r)}(s);return this},u.emit=u.trigger=function(e,t,n){var r=this.listeners,o=r.length;return this.emitting++,a.array(t)||(t=[t]),h(this,function(e,a){null!=n&&(r=[{event:a.event,type:a.type,namespace:a.namespace,callback:n}],o=r.length);for(var s=0;s0?d.wheelSensitivity:1,motionBlur:void 0!==d.motionBlur&&d.motionBlur,motionBlurOpacity:void 0===d.motionBlurOpacity?.05:d.motionBlurOpacity,pixelRatio:o.number(d.pixelRatio)&&d.pixelRatio>0?d.pixelRatio:void 0,desktopTapThreshold:void 0===d.desktopTapThreshold?4:d.desktopTapThreshold,touchTapThreshold:void 0===d.touchTapThreshold?8:d.touchTapThreshold},d.renderer));var v=function(e,n,r){t.notifications(!1);var a=t.mutableElements();a.length>0&&a.remove(),null!=e&&(o.plainObject(e)||o.array(e))&&t.add(e),t.one("layoutready",function(e){t.notifications(!0),t.emit(e),t.notify({type:"load",eles:t.mutableElements()}),t.one("load",n),t.emit("load")}).one("layoutstop",function(){t.one("done",r),t.emit("done")});var s=i.extend({},t._private.options.layout);s.eles=t.elements(),t.layout(s).run()};!function(e,t){if(e.some(o.promise))return s.all(e).then(t);t(e)}([d.style,d.elements],function(e){var n=e[0],r=e[1];p.styleEnabled&&t.style().append(n),v(r,function(){t.startAnimationLoop(),p.ready=!0,o.fn(d.ready)&&t.on("ready",d.ready);for(var e=0;e=e.deqFastCost*g)break}else if(a){if(f>=e.deqCost*u||f>=e.deqAvgCost*l)break}else if(v>=e.deqNoDrawCost*(1e3/60))break;var m=e.deq(t,h,d);if(!(m.length>0))break;for(var y=0;y0&&(e.onDeqd(t,c),!a&&e.shouldRedraw(t,c,h,d)&&i())},o=e.priority||r.noop;n.beforeRender(a,o(t))}}}}},function(e,t,n){"use strict";var r=n(1),i=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort(function(e,t){return r.sort.descending(e.selector,t.selector)}),a=function e(t,n){return(e.lookup=e.lookup||function(){for(var e={},t=void 0,n=0;n0;){var y=function(e,t){if(0!==e.length){for(var n=0,r=t[e[0]],i=1;ic&&(c=t)},get:function(e){return u[e]}},h=0;h0?C.edgesTo(T)[0]:T.edgesTo(C)[0];var S=n(P);T=T.id(),x[T]>x[p]+S&&(x[T]=x[p]+S,w.nodes.indexOf(T)<0?w.push(T):w.updateItem(T),b[T]=0,y[T]=[]),x[T]==x[p]+S&&(b[T]=b[T]+b[p],y[T].push(p))}else for(var E=0;E0;)for(var T=m.pop(),E=0;E0;){var m=f.pop(),y=p(m),b=m.id();if(c[b]=y,y!==1/0)for(var x=m.neighborhood().intersect(h),v=0;v0)for(n.unshift(t);u[i.id()];){var a=u[i.id()];n.unshift(a.edge),n.unshift(a.node),i=a.node}return o.collection(n)}}}};e.exports=a},function(e,t,n){"use strict";var r=n(0),i={floydWarshall:function(e){e=e||{};var t=this.cy();if(null!=e.weight&&r.fn(e.weight))var n=e.weight;else var n=function(e){return 1};if(null!=e.directed)var i=e.directed;else var i=!1;for(var a=this.edges().stdFilter(function(e){return!e.isLoop()}),o=this.nodes(),s=o.length,l={},u=0;uy&&(c[g][m]=y,p[g][m]=m,f[g][m]=a[u])}if(!i)for(var u=0;uy&&(c[g][m]=y,p[g][m]=m,f[g][m]=a[u])}for(var b=0;b0&&this.spawn(n).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes.has(e)},toggleClass:function(e,t){for(var n=e.match(/\S+/g)||[],r=this,i=[],a=0,o=r.length;a0&&this.spawn(i).updateStyle().emit("class"),r},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var n=this;if(null==t)t=250;else if(0===t)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},t),n}};e.exports=i},function(e,t,n){"use strict";var r=(n(0),n(6)),i={allAre:function(e){var t=new r(e);return this.every(function(e){return t.matches(e)})},is:function(e){var t=new r(e);return this.some(function(e){return t.matches(e)})},some:function(e,t){for(var n=0;n0;){var d=i.shift();t(d),a.add(d.id()),l&&r(i,a,d)}return e}function i(e,t,n){if(n.isParent())for(var r=n._private.children,i=0;i1&&void 0!==arguments[1])||arguments[1],i)},l.forEachUp=function(e){return r(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a)},l.forEachUpAndDown=function(e){return r(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],o)},l.ancestors=l.parents,e.exports=l},function(e,t,n){"use strict";var r=n(3),i=void 0,a=void 0;i=a={data:r.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:r.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:r.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:r.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:r.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:r.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}},i.attr=i.data,i.removeAttr=i.removeData,e.exports=a},function(e,t,n){"use strict";function r(e){return function(t){var n=this;if(void 0===t&&(t=!0),0!==n.length&&n.isNode()&&!n.removed()){for(var r=0,i=n[0],a=i._private.edges,o=0;ot}),minIndegree:i("indegree",function(e,t){return et}),minOutdegree:i("outdegree",function(e,t){return et})}),a.extend(o,{totalDegree:function(e){for(var t=0,n=this.nodes(),r=0;r0&&a>0&&(r=t/a*e,i=n/a*e),{biasDiff:r,biasComplementDiff:i}}if(e.isParent()){var r=e._private,i=e.children(),a="include"===e.pstyle("compound-sizing-wrt-labels").value,o={width:{val:e.pstyle("min-width").pfValue,left:e.pstyle("min-width-bias-left"),right:e.pstyle("min-width-bias-right")},height:{val:e.pstyle("min-height").pfValue,top:e.pstyle("min-height-bias-top"),bottom:e.pstyle("min-height-bias-bottom")}},s=i.boundingBox({includeLabels:a,includeOverlays:!1,useCache:!1}),l=r.position;0!==s.w&&0!==s.h||(s={w:e.pstyle("width").pfValue,h:e.pstyle("height").pfValue},s.x1=l.x-s.w/2,s.x2=l.x+s.w/2,s.y1=l.y-s.h/2,s.y2=l.y+s.h/2);var u=o.width.left.value;"px"===o.width.left.units&&o.width.val>0&&(u=100*u/o.width.val);var c=o.width.right.value;"px"===o.width.right.units&&o.width.val>0&&(c=100*c/o.width.val);var d=o.height.top.value;"px"===o.height.top.units&&o.height.val>0&&(d=100*d/o.height.val);var h=o.height.bottom.value;"px"===o.height.bottom.units&&o.height.val>0&&(h=100*h/o.height.val);var p=n(o.width.val-s.w,u,c),f=p.biasDiff,v=p.biasComplementDiff,g=n(o.height.val-s.h,d,h),m=g.biasDiff,y=g.biasComplementDiff;r.autoPadding=function(e,t,n,r){if("%"!==n.units)return"px"===n.units?n.pfValue:0;switch(r){case"width":return e>0?n.pfValue*e:0;case"height":return t>0?n.pfValue*t:0;case"average":return e>0&&t>0?n.pfValue*(e+t)/2:0;case"min":return e>0&&t>0?e>t?n.pfValue*t:n.pfValue*e:0;case"max":return e>0&&t>0?e>t?n.pfValue*e:n.pfValue*t:0;default:return 0}}(s.w,s.h,e.pstyle("padding"),e.pstyle("padding-relative-to").value),r.autoWidth=Math.max(s.w,o.width.val),l.x=(-f+s.x1+s.x2+v)/2,r.autoHeight=Math.max(s.h,o.height.val),l.y=(-m+s.y1+s.y2+y)/2,t.push(e)}}(r),e._private.batchingStyle||(i.compoundBoundsClean=!0))}return this};var u=function(e){return e===1/0||e===-1/0?0:e},c=function(e,t,n,r,i){r-t!=0&&i-n!=0&&null!=t&&null!=n&&null!=r&&null!=i&&(e.x1=t |